views:

1188

answers:

19

I've been programming since college, was a hobbyist programmer as a kid, but never got serious until I was a freshman. That was almost a decade and a half ago. One thing I've noticed is that when people reach a certain point in their skills they never really move beyond that. That is if they suck as a developer when you hire them, they will always suck. 10 years of C# experience doesn't necessarily make you a better developer than someone with 6 months of experience. (yeah, yeah, some people will get angry at reading this, but it's true, live with it).

So my question is, just how the hell do you get to be one of those super programming freaks that everyone worships? I've been doing coding puzzles as often as I can -- example: reverse a string in place using no swap buffers. (that is a fun one) and I've noticed myself get a little sharper. I'm not improving as fast as I wish I could so I would love to hear some tips from people here.

+1  A: 

As far as personal skill: Keep coding and reading. Stay up-to-date on upcoming and new technologies that will make coding easier or take it in an entirely new direction. Work in different types of languages that require you to think in different ways. Work with different people who have different coding styles.

As far as notoriety: Keep writing. Learn and refine the ability to communicate well. Try to write about things that have not been considered or debated at huge length. Write about what interests you. Don't be afraid to step on some toes or to take a controversial side.

As far as both: Write programs and then write about programming.

EndangeredMassa
+2  A: 

Take a peek at Jeff Atwood's recommended reading list. Those are some great books. They won't necessarily make you a "kick ass" programmer but they will expand your knowledge of computer science and get you going in the right path.

Here's a good quote from one of Jeff Atwood's blog posts Quantity Always Trumps Quality:

When it comes to software, the same rule applies. If you aren't building, you aren't learning. Rather than agonizing over whether you're building the right thing, just build it. And if that one doesn't work, keep building until you get one that does.

Bryan Roth
+4  A: 

Passion is probably a good 50% of the requirement. If you don't really give a crap about computers or software development, if you have no interest in learning new technologies or playing with new languages, you'll never be a superstar.

I also agree with what Sean said above, as a practical way to learn more and gain notoriety.

Tim Sullivan
+2  A: 

Practice practice practice. Read read read. Study study study.

I have been a major FAIL in my programming (I could produce procedural spaghetti code that did work) career until I learned to read blogs and try out things that I read in them.

While I'm not the best or most technically skilled developer, discovering online resources was the next best thing that happened to me. It really was the only time that I became really competent, proficient, and passionate with what I do.

Jon Limjap
+4  A: 

Ok...while I kinda agree with whoever down-voted this...I'll give my 2 cents.

IMHO, for the most part there is only so much that you can actually do to become a better programmer. Yes, exercising your mind, methods and skills will definitely help you to improve but you are generally always going to hit that plateau eventually...just like I could never become a professional body builder...it's just not in my genes.

The really good programmers I've known, the "hackers" as Paul Graham calls them, are typically people that just simply get it. Period. They understand the theory with little effort and generally have absurd memories allowing them to basically have a library of pre-defined code snippets at their fingertips at a moments notice.

These are the people with 6 months experience that will better than you that you spoke of. I'm not trying to tell you that you cannot improve...you can and always should. And so should the "hackers." But from what I can tell, it takes a certain kind of mind to be a TRULY good programmer and not everyone has it.

In all seriousness..read the "Hackers" essay by Paul Graham I linked to above, if anything it will give you insight on why these people are as good as they are and how you can get a little closer to that.

Adam Haile
+1  A: 

I think its all self evaluation. I personally don't believe I will ever become a kick ass developer. I feel I am good at some areas, and blow at others. I will however perpetually read/strive/attempt to attain the kick ass level.

Pat
+1  A: 

Jeff's list is good, but it isn't great as its missing the free Foundation ebook

Karl Seguin
+15  A: 

If you ever think you're at the top of the game, you lose. Continuously learn, allow yourself to make mistakes, and keep a skeptic eye towards any new "game changing" tech - you'll be amazed just how awful your code from (Now - 2 years) always looks.

Oh, and this...

10 years of C# experience doesn't necessarily make you a better developer than someone with 6 months of experience.

If you're the type of person that doesn't learn from mistakes (or is ignorant enough to not notice where the mistakes are), this is true. Experience is more than typing speed and API memorization - experience is knowing where the sweet spot is on the curve of diminishing returns, finishing something quickly enough with an acceptable amount of features implemented, yet documented and maintainable just enough to allow any developer to pick up where you left off and run with it.

Greg Hurlman
+8  A: 

I really disagree with the notion that you can't reach "superstar" status if your wiring isn't that way. I consider myself very passionate about coding and went from 'bozo' to 'semi-respectable' by coding, coding, coding.

There is a tremendous amount of evidence that suggests that super-talented people are that way because of effort, not genes.

http://www.sciam.com/article.cfm?id=the-expert-mind

A common thread that i've in these superstars is their ability to recognize coding patterns, the "I've seen this problem before" syndrome. is there anything else like that, that you guys are aware of?

(I appreciate the helpful answers I'll vote points for u guys as soon as I get an openID)

eviljack
+1  A: 

While the title of this question is poorly worded, I think the question and answers ahead of mine are valid and deserve to be seen.

My 2-cents: Find an accessible, preferably local programmer, and ask him/her to be your mentor. Master/Apprentice style relationships coupled with a strong drive to keep learning and growing is the true key to building your skills. Read everything, even the things you don't agree with. And, like all have mentioned before me, build stuff and show it to the world. When it breaks, fix it.

@Greg Hurlman:

If you ever think you're at the top of the game, you lose.

That statement is so chock-full of win it's staggering.

Rob Allen
+2  A: 

Try new things. If you know a language / operating system / IDE / repository / software suite really well, try using a different one. Work with Windows on a daily basis? Fire up Ubuntu Live CD. Do you know how to configure an Apache Web Server? Install and configure lighttpd. If you program exclusively in PHP, try Ruby or Python or C or insert language here.

Every time you try something new, you go through the process of learning the philosophy of that particular platform. This makes you flexible and keeps you sharp. Eventually you'll discover that all systems have common threads, being able to quickly recognize these commonalities will make you great.

jakemcgraw
A: 

Keep an eye out for things that seem really hard to do. Whenever you get the nagging feeling that there should be an easier or clearer way to do whatever it is you're doing, the feeling is likely to be correct. Learn the better way, rinse, repeat. :)

Rytmis
A: 

First, you have to love programming. If you don't love it, your growth will be slow and painful, if it happens at all.

Next, read! There are so many great sites and books out there. Again, this reading won't be easy unless you love programming.

Then, try making a game. Game programming is a great way to stretch your mind. Not only that, but it's fun! This may even help you to love programming more. It doesn't matter if the game is fun or not; the process of making the game is (to me, anyway) a game in itself.

Ryan Fox
A: 

Well, I'll stick my head over the ramparts and say that in my opinion, great programmers are born, not made.

There is something altogether different about their minds; their ability to visualise things, maybe, or to hold many disparate strands of information in their heads simultaneously? Who knows.

I am not one of them. I am now merely competent; my stuff works and some of it won't make you want to kill yourself if you ever have to work on it. But I totally agree with the spirit of learning, improvement and continual growth that everyone else is talking about. We are so lucky that we get challenged by new stuff every day and are in a profession in which we can constantly learn and grow. And it's fun too.

I just don't think I will ever be brilliant, and I'm OK with that; my work is about user interface and doing the right things, and people I like and respect use my applications for their day job every single day, and they like using them. As long as I can write stuff that won't kill the server when it goes live under heavy load, I'm pretty happy. I'm also hugely lucky to work with people who are much better programmers than I am, who can help out if it gets sticky.

Flubba
A: 

It's definitely true that some people have it and some people don't. There are also a lot of people somewhere in between with the potential to be better. The desire to be better is fundamental to getting there. The fact that you aren't improving as fast as you would like is a good sign.

My advise is to devote some time each week to learning new things. Don't be afraid to stretch yourself or to fail. We learn a lot from our mistakes, take advantage of that. Take some time to help people with their coding problems (another great way to learn).

The experience you build will help you when facing new challenges, which ultimately is probably the most important thing. I learn the most about people when I see how they handle tackling things they haven't experienced before.

The learning never ends. I've been programming for 28+ years.

bruceatk
+1  A: 

My 4 cents

  1. Learn to enjoy puzzles
  2. Karate philosophy - take on what you are afraid off
  3. Learn to identify orthodoxy programing from pragmatic...and run with ;) pragmatic
  4. Have fun
epatel
+21  A: 
  1. Surround yourself with people smarter than you.
  2. Do some programming in your free time using different technologies than your day job.
  3. Always keep learning. A good developer will try to learn at least one new technology/language each year in reasonable detail.
  4. Exercise and eat right. Being healthy does wonders for keeping your mind sharp.
Carl Russmann
+1 for 1 and 4. Don't be afraid of smarter people and programming will improve your skills and brain but not your overall health.
TheVillageIdiot
A: 

Here's something that's as close to the truth as you will get.

In college, anyone can get at least a "B" in any subject (excluding the professors who are truly jerks) if they try hard enough. It doesn't take aptitude, just effort. Sometimes an insane amount of effort, but still you can do it if you try.

There are some courses that you can only get an "A" in if you work hard and you have an aptitude for the subject. That is the situation here.

If you are naturally an A player, then all the extra work everyone here talks about can help you become an A+ player. If you are natrually a B player, then you will never become an A+ player, although you can fake it enough to fool most people if that is important to you. If you are a B player, then enough work can get you to be an A player, and that's probably good enough in most cases.

Many people will want to deny the reality of that truth, but the sun will come up tomorrow even if you don't believe it. Post back into this thread in 5 or 10 years and let us know how it came out following all the above advice.

malcolm gladwell's book: outliers, pretty much slices and dices the theory that some people are "just born with it".
eviljack
Anyone can write a book and say anything that they want to say. For that person to say it doesn't make it true, anymore than what I say.Before you sign onto any "we are all born the same" argument, ask yourself if you think "GREAT" musicians or artists or writers or poets are born or made.I could study art from now til the day I die and still not be able to produce a painting that anyone would pay a penny for. Or have you known someone who could sing without taking singing lessons.Use your brain. Just because you read something doesn't make it true.
+2  A: 

reverse a string in place using no swap buffers

You're not even trying!

Do something manly. Design an image format. Or web server. Or compression scheme. File system. Kernel. Artificial intelligence. Programming language. Computer vision system.

Something you find interesting, but never learned about. Don't read about it: just jump straight in. Experiment. Make mistakes. Reinvent the wheel.

Don't ask for help. Stay away from tutorials. Stay away from the theory. Don't pull a solution off the shelf.

If this sounds counter-intuitive, consider that:

  • We learn best from mistakes.
  • This gives you an opportunity to practise coming up with solutions creatively, rather than regurgitating and adapting old solutions.
  • You are forced to evaluate your ideas. You can't evaluate them until you develop a good understanding of your tools and of the idea you wish to evaluate. This leads to a deeper understanding of the topic than you would otherwise develop. (Feel free to read about the tools you are using, just don't read about the problem you're trying to solve.)

Once you're done (and I mean you've made a few attempts and actually have something decent to show for it), it's time to start reading about the problem and how others have solved it (or talking with people). At this point, instead of saying to yourself "yeah, that makes sense" while you read, you'll say "yeah, exactly", or "well, to some extent", or "wow, that's clever".

In other words, you'll think much more critically about what you read, and you'll find it much easier to understand and remember because you already have a large "mental framework" to attach it to. You'll feel good about those things which you discovered independently, and you'll walk away with a heap of new knowledge.

Artelius