Hello friends,<p>I am a CS major but somehow I feel my programming skills are not great as to match to that of a code Ninja or Rockstar.<p>I have read most of the algorithms books, Data structures book but somehow I feel I am still falling short of being a good programmer.<p>I have the following books in mind to complete:
a) Programming Pearls
b) Programming Challenges.<p>I am not sure which one should I pick.
I have been in industry for past 3 years and know coding languages like Java, C and Python but I haven't had the courage to take part in Google code jam. This is I did and due to my silly mistake I uploaded the wrong output to the code. I was able to solve two easy and 1 hard problems.<p>In short I wan't to code with ease so that I can crack any coding problems in MS, Google, LinkedIn, Facebook etc.<p>Don't consider this post as a way to crack the interviews of these companies. I just want to be a Code Ninja.<p>Thanks!<p>Looking for your suggestions and pointers.
Spend less time worring about how to be a ninja or doing puzzle books and spend more time coding real projects.<p>In other words, get to work noob.<p>Also, most people who call themselves ninjas are full of shit.
Gack.<p>I throw up in my mouth a little bit every time I hear "Code Ninja" or "Rockstar". Whoever coined those terms should be forced to patch legacy cobol code for all eternity.<p>To better answer your question, you become great through practice and application of skill. All the reading of material in the world won't act as a fill-in for doing.<p>So do.<p>Write a webapp. It doesn't have to be a "startup", it doesn't have to be great, you don't need 5000 users and a techcrunch article about it. You just need to pick a point on the horizon and code towards it. And when you reach that point you pick another, and so on. Forever. In 30 years you will be halfway to greatness.
1) Learn some languages that force you to think differently, even if they aren't of an immediate use in the industry. I'd suggest starting with Scheme (Little Schemer + SICP) and then learning an ML family language (Haskell or OCaml). A language that incorporates elements of logic programming (Erlang or Prolog) would be useful too. You may not be lucky enough to use these languages in your day-to-day work, but there are lessons you can take home with you e.g., minimizing mutable state.<p>2) Remember to work on projects that are something more than algorithmic puzzles. Algorithmic puzzles are fun, great and are brain gymnastics, but you should also learn how to write low-level socket code (Richard Steven's "UNIX Network Programming" books are excellent in that respect), deal with concurrency (switching languages again, Java Concurrency in Practice is a great introduction).<p>3) Participate in open source projects. Dan Kegel has an excellent guide on how to contribute:<p><a href="http://kegel.com/academy/opensource.html" rel="nofollow">http://kegel.com/academy/opensource.html</a><p>Even if your contribution to an open source project is small, it will require reading and understanding a great deal of non-trivial code.<p>Finally, as moonpolysoft said, don't call yourself a ninja or a rockstar.
Why do you want to be good at programming? You'll only get there if you are driven by your intrinsic interest in the problems you are trying to solve. Becoming a 'rock star' is a side effect, not an end goal.
The way you've phrased your question suggests you don't truly have that intrinsic interest in problem solving or building. Ask yourself what your true motivation is and carefully consider whether sitting at a desk coding is really what you want to do every day.
I would say that a truly great programmer isn't necessarily technically amazing. For example, a vast knowledge of programming languages is something that anyone can learn with enough time and patience. However, it's the ability to problem solve: to look at what exists already and make something new out of it, that really makes a developer 'great'. It doesn't really matter if they know a language inside out when tackling a project - it's the ability to help themselves: use the language and any tools available / relevant to solve a problem in an innovative way.<p>It's kind of a hard thing to evaluate, I suppose. I would say that to 'become great' - you can't just sit around programming all day (although this will no doubt help). It's a kind of 'knack' for working problems out, finding new techniques, using tools in new ways etc. These are all the things that make 'great' programmers great imho, and none of them are actually directly related to programming. In my experience, people who are REALLY good at solving programming problems are REALLY good at it outside of the programming discipline too.
Thanks guys for your comments. I didn't know Code Ninja and Rockstars were not liked by the developers community per say.
I would refrain from using those terms.<p>Still I think my question remains un answered. May be I should re-phrase it as "How should I become a good programmer able to crack problems easily"?<p>What books did most of you used to aspire to be a good programmer?<p>Thanks again!
You get to be a good developer by repeatedly building software that solves problems and creates utility. Heed the advice of others who suggest learning different classes of languages that affect the way you think about problem solving. But pick something and don't toil over it too long.<p>The other part of the "doing" side of things is finding something to do. A good place to start is by solving a problem you have yourself or that you are interested in. Maybe you think all the todo list managers suck, or maybe you want a tool that helps to organize your porn collection. Great, pick a language and get to work.<p>Another secret is to hang out with smart people and other good programmers. Talk to others about their work and learn from them. The rising tide raises all ships.
These are dumb expressions ("Code Ninja", "Rockstar") but the intent is fine.<p>My recommendation is to build a bunch of interesting things that are at a higher level than one-off, design-free algorithm puzzles (well, those sorts of things aren't exactly 'design free' but they typically don't make you think about lots of tradeoffs - you find a plausible way to do something and do it).<p>I suspect that for most people this means finding an employer who solves interesting problems and getting an job there that actually involves participation in the 'good parts', so that you actually do it. My record of self-motivating after my degrees were done is pretty much zero - best to make this your day job.
Practice often... and know your language well.<p>There is a huge difference between knowing and KNOWING. Knowing your tools well enough lets you focus on the problem rather than searching how to hacking your way through. Don't be a copy paste programmer.<p>Don't be mislead by fast typers either.<p>Fast turnaround is good, but stable code is better. What's the point of finishing in 1 day instead of 2 if you'll be debugging for a week afterwards? With enough practice you'll be able to get the stable code out in the same time as the fast typer.<p>Some book recommendations:<p>-Code Complete 2.<p>-Refactoring: Improving the Design of Existing Code.<p>-Clean Code.<p>-Head first design patterns.
"Skill to do comes of doing"<p><pre><code> -- Ralph Waldo Emerson
</code></pre>
Also, as others have said, please do not aspire to "rock star" or "ninja."<p>Constantly test yourself and keep reaching.
Hey, you're not Steve Jobs, are you?<p>First, aspire to be a great engineer. Ninjas are for turtles and Rockstar is caffeinated sugar water.<p>Second, design and implement software. Write programs in areas that interest you. Then iterate and design something that your friends or family can use.<p>Finally, do your best and forget the rest. And continually get better doing it.<p>(It wouldn't hurt to read "Programming Pearls".)
I see the problem,<p>Javascript programmers are Ninjas<p>CSS experts are Wizards<p>PHP Developers are Rockstars<p>I think you are looking to be more of a Java or C Guru, Perl Hacker, or Python Developer.<p>Not sure why Python experts don't get a "cool" name, that just seems to be the way it is.
According to Malcolm Gladwell, which I agree with, it's practice and persistence. How many hours are you coding a day? How many hours are you spending learning to code smarter?
If you want to get better, build more things.<p>And don't use the terms "code ninja" or "rockstar" to describe engineers. Those terms are self aggrandizing crap that inadequate engineers use to stroke their own egos. At best using those terms marks you as being naive.