LearnWhat Makes A Great Programmer?

Treehouse
writes on May 31, 2011

Share with your friends










Submit

I remember it like it was yesterday. It was the year 2000, Dr. Pargas was standing at the front of our data structures class talking about some data structure-y topic while an SSH session was projected on the wall in front of us. Someone asked a question, and he said something along the lines of “Well, if you want to be a real computer scientist you need to start using vi”. I think he was smiling as he said it, and in hindsight his statement wasn’t even slightly true, but being young and easily influenced like I was I went back to my dorm room and immediately took up training myself how to use vi. It was rough going for quite a while, but once I started to get the hang of things I realized that I could work really quickly in vi.

Flash forward 6 years, and I was enamored with TextMate. I was working a job doing Java development, but at the same time learning Rails and working on Rails projects in my spare time. It felt like every article I read and screencast I watched was demonstrating how to accomplish text editing zen with TextMate. The fact that I was using Eclipse every day was filling me with nerd rage. So I bought a Mac and within 10 minutes of turning it on had purchased TextMate.

I can honestly say that neither text editor change made me a much better programmer.

Great tools just don’t make you that much better. Your tools are really important. They’re wonderful, in fact. But Tiger Woods would beat all of us with a junky set of clubs, Messi would outplay us without any boots on, and Rafael Nadal could probably beat any of us on a tennis court with a classic wooden racket from the 60’s. Heck, he could probably beat me with a ping pong paddle. The skills, knowledge, and experience that you’ve built up are the most important part of the equation.

So tools don’t make the programmer. What does? I think many aspects of what makes for a great programmer depend on what you’re working on and the people that you’re working with, but I’ve seen some common traits in people who have had a lot of success in software development that I felt were worth sharing. I’m not sure if these are skills that you can pick up or if they’re things that you’re born with, but I feel pretty strongly that I’d be in a great position if I worked a bit more on these traits and a bit less at switching text editors.

People First

The best programmers that I’ve known put people first. They’ve realized that the software that they’re writing is for people, even if it’s just the back end of a complicated system or a protocol that no one but other developers will ever use. They write documentation because it’s important. They help people use their code. They’re willing to work extra and deal with a bit more complexity to give the people using their software the right solution.

Appetite for Learning

Amazing programmers are ridiculously hungry for knowledge. They’re always telling you about something new or interesting. They tend to read a ton (whether online or offline) and they tend to love to try things out and learn from experiences as well. They’re not afraid of trying out new languages or new platforms.

Skillful at Problem Pattern Matching

Once you’ve been writing software for a while you start to see problems arise that look awfully similar to other problems you’ve dealt with. Being able to recognize those and transform past solutions to work in your current situation is a really valuable skill. Being able to improve on the solution each time is even better.

Note, though, that this doesn’t mean you blindly say that because a past solution could work it must work. That’s where skillfully applying problems pattern matching comes into play. You’ve got to have an eye for knowing when it’s right to apply a past solution and when it’s not.

A Little Bit Insane

My brother took a Python class his Senior year of high school, and when I asked him how he liked it, he told me I was insane to be a programmer and that it was the one of the most boring things he had ever done. To some extent, I think he’s right. I talk to computers way more than I talk to people most days. I get a huge thrill from the fact that I get to turn line after line of basically jibber jabber into working software. Not every person out there loves doing these things, but the best programmers that I’ve met absolutely love making software.

Persistent

Software development is pretty much always slower than anyone wants it to be. It takes time. Sometimes you have to just be patient enough to crank out the code you need to write. Sometimes as developers we get to write really fun code, but sometimes we get the displeasure of writing a lot of code that we’ve basically written a hundred times before. I think the best developers keep going because they can see the big picture of what they’re working on and they love the process of building that end result piece by piece.

These are a few traits that I think make for a really good programmer, but it is by no means an exhaustive list, so I’d love to hear your take. What do you think makes for a great programmer?

Thanks to espensorvik for the awesome photo!

70 Responses to “What Makes A Great Programmer?”

  1. I really thankful to get this information about programing. I didn’t know more about it before. I always read and loved this tips. Thank you very much for sharing valued tips.

  2. ブランドコピー時計大人気を海外激安通販専門店ロレックス、ブルガリ、フランク ミュラー、シャネル、カルティエ、オメガ、IWC、ルイヴィトン、オーデマ ピゲ、ブライトリング、グッチ、エルメス、パネライ、パテックフィリップ偽物(コピー商品)のブランドの腕時計の販売、通販。
    高品質2015シャネル スーパーコピー激安專門店弊社は海外大好評を博くシャネル コピー激安老舗です,2015高品質シャネル バッグ コピー,シャネル 靴 コピー,シャネル 財布 コピー品の品質はよくて、激安の大特価でご提供します。 http://www.ooobrand.com/wallet/bv/index.html

  3. スーパーコピー時計,バッグ,財布| ブランドコピーの専門店スーパーコピー豊富に揃えております、最も手頃ず価格だお気に入りの商品を購入。弊社フクショー(FUKUSHOW)ブランド腕時計、雑貨、小物最新作!エルメス バーキンスーパーコピー時計N品のみ取り扱っていまずのて、2年品質保証。エルメス食器,スーパーコピーブランド激安販売シャネル 財布スーパーコピー,スーパーコピーブランド 財布激安販売エルメス スーパーコピー,スーパーコピーブランド激安販売売スーパーコピーロレックス スーパーコピー,スーパーコピーROLEX激安販売IWC スーパーコピー,スーパーコピーIWC時計激安販売エルメス時計スーパーコピー,スーパーコピーhermes時計激安販売ボッテガ ヴェネタスーパーコピー,スーパーコピーブランド財布激安販売スーパーコピー時計スーパーコピーブランドバッグ時計コピー激安販売
    スーパーコピーブランド格安販売店はこちらへ!品々の激安価格に持ったスーパーコピーブランド 代引きの新作はお客様に提供されます。安心、迅速、確実、お客様の手元にお届け致します。★弊社は9年の豊富な経験と実績を持っております。★一流の素材を選択し、精巧な作り方でまるで本物のようなな製品を造ります。★品質を重視、納期も厳守、お客様第一主義を貫きは当社の方針です。★驚きの低価格で商品をお客様に提供致します!★早速に購入へようこそ! http://www.bagkakaku.com/louisvuitton_bag_5.html

  4. hmm i will like to be like you.nice 1

  5. John O. Morales on May 10, 2013 at 9:35 am said:

    Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

    -Martin Fowler

    For me, It means a programmer good or bad depending on the scenario and the readability of the existing code.

    Can code to make it work! even code it fast! (That’s why you’re a programmer).

    But dealing with different project / coding standard all the time, have you guys experienced “Cursing” the one who code those crap? codes with a twisted logic/unreadable/shittty performance.

    those are code smells/anti-patterns

    A Great Programmer

    Considers:

    Maintainability
    -Coupling
    -Cohesion
    Readability
    -Num of Lines/Proper Naming/Proper OOP
    – Even non-programmers can read
    – No need to comment because of proper naming.
    Complexity
    -No Unnececssary Layers
    Thread Safety
    -Static/Instance
    Reusability
    -No duplicate patterns
    Memory
    -GC/Immutable Objects/Unneccessary Instances

  6. Jeethendradv on June 12, 2011 at 7:03 pm said:

    Attitude

  7. webplanet services on June 10, 2011 at 11:04 am said:

    Ecommerce Web
    Development

    Web
    Planet offers complete E-commerce solution which include: ecommerce web
    design, SEO friendly website design, ecommerce web page development,
    ecommerce web hosting services in all over the world

    http://www.webplanet.co.in/e-commerce-website.php

     

  8. Rosegb on June 9, 2011 at 3:30 am said:

    例证中为什么用伍兹、梅西、纳达尔和我们非专业人员比呢?这不能突出他们的伟大不依赖于工具而源于自身的本质。
    其次,我不相信他们用那些可以赢我们,至少不会赢我,虽然作者使用的夸张手法,但未免牵强。

  9. nice!

  10. Great post Alan!  

  11. Agree with all the points, I would add :
    – being able to work in a team and share
    – being able to explain what you do and why you do it
    – Have the guts to say NO to unprofessional solutions

    Good post 🙂

  12. I think persistence comes from passion. Without it I see it hard to be persistent.

  13. Cold Head on June 3, 2011 at 7:56 am said:

    Worth re-iterating the 3 principle virtues of a (Perl) programmer, as told by Larry Wall:

    Laziness
    Impatience
    Hubris

  14. Nikkob on June 3, 2011 at 1:47 am said:

    To be a good programmger, I think you need to be a great abstract thinker. It let’s you see things and situations as programming requirements and logic.

  15. Pwistu on June 2, 2011 at 2:12 pm said:

    code simplicity and uniqueness

  16. knick on June 2, 2011 at 1:48 pm said:

    While I agree with most of your comments, the “trying new anguages or new platforms” part hit a nerve.  A great and EXPERIENCED programmer my look and even try something new, bit knows when to leave it at that.  Too often projects are started based on some new technology that are department just found.  There is nothing worse that learning a new way of doing things while your are constructing what is supposed to be commercial/production code.  Many inexperienced developers will insist on writing tools (library code, for example) along the way to help.  And again, their just learning the basics.  This usually ends up less-than-optimal, with the solution almost always being the NEXT new language or technology.  And it begins again.

  17. Samuel McNamara on June 2, 2011 at 1:42 am said:

    I still forget that not everyone has an inherent interest in programming. I was explaining some pointer trick that I’d figured out to a layman friend (in as digestible terms as possible, mind) and all she could say was “Oh god, but that’s so boring! Why do you like doing that?”. I had no answer, although I neglected to pose a similar question about her social psychology course.

  18. Karl M. Kettelhut on June 1, 2011 at 5:50 pm said:

    I think you’ve described well what makes a good software engineer.  But software engineers focus on the engineering (problem solving/task management) while programmers focus on the linguistics (or the syntax of the language).  Granted it normally doesn’t matter except when getting hired.  If they want a programmer and you aren’t the linguistics master, you aren’t the right person for the job.  If you’re an programmer, and they want an engineer, you aren’t the right person for them either.

  19. Great article,

    I think logic and thinking through problems carefully really helps. Also…

    Write clear, clean maintainable code.

    Strive for simplicity, don’t try to make things as hard as possible.

    Learn your tools and push them.

    Just my 2p 🙂

  20. Great article,

    I think logic and thinking through problems carefully really helps. Also…

    Write clear, clean maintainable code.

    Strive for simplicity, don’t try to make things as hard as possible.

    Learn your tools and push them.

    Just my 2p 🙂

  21. One thing that’s missing is having the ability to communicate complex ideas in simple ways, and to translate simple ideas into complex systems.  Often a project will start out with a client saying “I want to do X”, and you have to determine not only how X works, but all the nuances and exceptions, who’s using the system, how, what the system is designed for and why, and then when they see the hours spent and say “But I just wanted X!” you have to be able to communicate in a non-condescending way, just how difficult it was, and how much will be gained by using your system.

    You might be the best coder in the world, but if you can’t understand a client’s needs, and you can’t communicate the benefits you’re providing, you’re no use to anybody.

    • Anonymous on June 2, 2011 at 2:33 am said:

      Good call, @yahoo-32GD6U5CPYA3BKRB4WV75PIOW4:disqus . I was trying to point that out with it being about the people – it’s both about the people who use your software and the people you work with.

  22. Michael K Gray on June 1, 2011 at 10:07 am said:

    As a professional programmer since 1973, I will compliment you on your maturity and say that you have just about “nailed it’!

  23. Keeskoets on June 1, 2011 at 9:29 am said:

    Man, you are soooo wrong..

    It’s ONLY about the editor you use, your problem solving/programming knowledge and people skills account for nothing…

  24. I’d add *humility* to that list as well – good programmers don’t make you feel that being so isn’t an out of the world achievement!

    • I agree on humility. Dijkstra’s Humble Programmer is one of my favourite lectures about programming.
      I just commented it on my blog.

    • i agree too, i’ve met programmers that believe their knowledge is out of this world and they take pleasure in letting you know that and making you feel their “greatness” (even if its not true) and i’ve also meet programmers who know a lot but love to share their knowledge in a way they make everyone working around them feel great and inspired to do their best

  25. Yousuf Fauzan on June 1, 2011 at 7:57 am said:

    Lazyness. The need to spend 10 hours so that a 1 hour job can be done in 10 minutes.

  26. Great article. Especially the “People first” part sums my thoughts up quite well. Make it easy for someone else to use what you will create. Blogged about this myself recently (http://www.paulsprangers.com/2011/04/consider-small-things-consider-people/ ) but you explanation is a lot more concise!

  27. I feel, the way of looking towards the software/games to program matters the most.
    Considering as a challenge give me a great motivation towards it.

  28. Oyvind on June 1, 2011 at 7:22 am said:

    Good programmers automate. Either by means of tools available or by crafting the tools themselves if needs be.

  29. A great programmer for me also needs to be a great debugger, as I feel that the development of a project never ends it constantly evolves and so the debugging is also continuous.

    • If a project evolves, this is not debugging. That is called enhancing. (Unless the original really is an obvious bug to begin with. The “enhancement” of “charindex” in SQL 2005 to handle text fields greater than 8000 bytes long for example.)
      Being a good debugger is a good characteristic of a great programmer, but it relates to finding bugs and solutions in code produced by other programmers. Of course finding the bugs in one’s own code

      • Your point regarding the “charindex” is a great example and the type of debugging that I am talking about. Especially the ability to see past your own ego (generalisation I know!) and say how can this be improved so as to enrich, improve or enhance user experience.

        As to your point on evolution I continue to feel that in order to have evolution you need to first of all recognise the need for evolution. If you simply complete a project and on to the next one without ever questioning your past projects via “debugging” or “reflective practice” or how ever you want to name it, then you will never reach the point of evolution recognition.

  30. Good point, especially “People first”, many devs tend to forget this.

    I’ve also written about the path to become a better developer: http://blog.mostof.it/being-a-better-developer/

  31. Jebblue on June 1, 2011 at 6:54 am said:

    Good thoughts, thanks for taking the time to write them down.

  32. Anonymous on May 31, 2011 at 10:50 pm said:

    its not the tool, its the tool + workflow. programming is a ritual.

  33. Here’s the thing I think you missed:

    Writing straightforward code.
    Many engineers fall in love with engineering, and will take something very straightforward, and complexify it, and then generalize it, and then this will open their mind up to how it could be made faster/better/cook-waffles-for-breakfast, and they then add a whole bunch more features and complexity to it. 

    The result is an unmaintainable system that persists for decades sapping the life out of the organization dependent on it. 

    Any piece of software should be as concise and simple as possible (while still being comprehensible by junior programmers).   Call that Jessi’s rule. 

  34. The quality I never see mentioned is imagination, but it really does seem to matter. I’m not saying this in a Sesame Street “power of imagination” sorta way. More like “be able to visualize non-existent processes in your mind’s eye”. If you can keep all the gears of a bit of code you’re working on floating in a little cloud above your noggin, and then mentally re-arrange them into something that works better (or works at all) really is essential.

    But the Sesame Street meaning of imagination is useful too, because that can lead to really incredible and elegant architectures.

    The other important quality is strong deductive reasoning. This mainly helps in tracking down the source of bugs. Many, many times I’ve been able to figure out where my code must be going wrong (since it has gone wrong many, many times) by deducing where the problem must be. It’s a process of “it can’t be in this area, and it can’t be in that area, and it can’t be in that other area, so that only leaves… ah, here it is!”

  35. a cup of imagination, two tablespoons of passion, two of love, three of intelligence and three of knowledge. Pour into a bowl call development and fellowship, mix well and put in the oven. A good programmer is born.

  36. Guest on May 31, 2011 at 8:29 pm said:

    choice of text editor necessary but not sufficient for great programmerdom. I have never in my life met or even heard of a great programmer (or even a very good one) who did not use emacs, vi, or TextMate (or direct variants thereof) as their text editor of choice for serious textual heavy lifting (although they may spend more of their time in Visual Studio or Eclipse because of their suitability to a particular environment). The only exception I know to this is John Carmack, who apparently in an interview said he never invested the time to learn any of the standard text editors, and presumably stuck with whatever default one came with the NeXTStep IDE.

    Is it possible to be a great programmer while using Notepad, or even Notepad++ as your Text Editor of Choice? Sure. But remember, it’s also possible to write Half-Life in PostScript. A Great-with-a-capital-G programmer will hit an annoying limitation relatively quickly with Notepad++, and there’s no fucking way you could get them to use Notepad for any non-trivial amount of time.

    • Guest on May 31, 2011 at 8:59 pm said:

      Supposedly Bjarne Stroustrup, Brian Kernigham and Ken Thompson use Sam.

      • Guest on May 31, 2011 at 9:04 pm said:

         Fair enough – so the universe of possible text editors is four instead of three, or is a half-dozen. The point is the statement “being a great programmer has nothing to do with the tools you use” is false. There is a significant correlation, and with good reason.

        • Anonymous on May 31, 2011 at 9:24 pm said:

          Where’s that quote on the page?

          • Guest on May 31, 2011 at 9:37 pm said:

            It’s not – I never said it was. I said that statement (which is a widely-held opinion, unfortunately) is false. I believe a statement in the article came close though, when you said the professor’s statement of “if you want to be a real computer scientist you need to start using vi” is “not even slightly true”, which I think is false, since it is significantly more than slightly true. In fact the only thing he would need to modify for it to be completely true is the addition of emacs and TextMate (and apparently sam, haha).

            But as previously stated, using one of those few elite text editors is certainly not sufficient for being a great programmer, but it is necessary.

          • ADifferentGuest on June 1, 2011 at 10:09 am said:

            @Guest – I live in VisualStudio. I browse with IE9. I have 4 monitors. AND I use Windows 7.

            I also have a brand new Porsche 911 convertible, and I’m prepared to bet that I’m a much better programmer than you on your vi or TextMate or weapon of choice.

            I have always held the belief “that a great artist doesn’t blame their tools, but you couldn’t paint the Sistine Chapel with a roller”.  Tools are necessary, but far from sufficient.

            @commondream – couldn’t agree more.

          • Anonymous on June 1, 2011 at 11:59 am said:

            Deep down, I always knew driving a Porsche makes you a better programmer.

  37. Great writeup.

  38. Anonymous on May 31, 2011 at 7:52 pm said:

    Problem solving should be high on the list. Anyone can write code, but nobody can write perfect code. Getting your code working right and doing it quickly is the difference between an average programmer and a great programmer.

    • I agree no-one can write perfect code. Has anyone else experienced “Ghost in the shell”? The code isn’t working, I can’t see anything wrong with it. I put in write statements to figure out where I’m going wrong. Nothing in write statements shows a problem and the code is now working perfectly. Take out the write statements. Both “The problem returns” and “It doesn’t return”, has happened. Along with the more expected “found it” when using write statements. Even if it returns, if I still don’t find it: ignore it for now, and work on something else usually fixes it as well.

  39. In regards to the piece on tools: my father always told me: “it’s not the tools, it’s the person using them”. It’s a bit cliché but it sums it up nice and tight. 

    I imagine a good quality would be the need and desire to know how things work, inside and out. It’s the same reason why they take up programming: they’re not content with knowing how to send out emails and use Microsoft Office. They need to know how exactly the emails are sent out and what not.

    • I totally agree with “it’s not the tools, it’s the person using them”. However, any good craftsman will know how to effectively use the tools at his/her disposal. Whether that’s vi, eclipse, or visual studio. Knowing your tools well is a byproduct of your own Intellectual curiosity.

  40. Javaporter on May 31, 2011 at 7:15 pm said:

    I agree with a lot of this in theory, and I know you’re not really discounting good software, but I think you might be minimizing tools too much. To be good at your job, you have to like your job. To like your job, you have to like your tools. If I put you on Windows XP and an aging 17″ LCD monitor, could you do the same work? Probably. Maybe. Would you? Every day? 

    I love textmate (I’d love it more if it had smart text-wrap like Coda) and I can’t imagine working on a Windows box. I might not need these tools to do my job, but I’d probably find a different job if I didn’t have them. 

    • Anonymous on May 31, 2011 at 7:25 pm said:

      I’ve programmed on Windows with bad monitors most of my career, and I can say that being on a Mac with a 27″ cinema display hasn’t necessarily made me that much happier. I get some of my best programming done on my 15″ laptop display. I’ve known amazing programmers who work in Visual Studio every day, and amazing programmers who work on a Mac every day, and amazing programmers who work on 

      What’s made me super happy is having more time to spend with my family and an amazing amount of freedom to care about the people that my software helps.
      I think tools are amazingly important to what we do, especially in terms of helping us stay happy. I get frustrated with tools and services that I use all the time, and it isn’t ever fun, by definition, to be frustrated. I’m also super glad that I don’t have to program in assembly every day. But, I hope I never, ever look down on a developer because of the tools they use, because I feel certain that they can be great programmers regardless of what those tools are.

      • Good tools don’t make you happier, they make you less angry. There’s a difference. Technology has not necessarily made us happier by one bit but it has definitely silenced most of the things that plague us. Our mortal needs have been replaced by urbane ones.

        But I think that couching your ambivalence towards tools with “my family matters more” is a copout. It means you don’t care about your job as much (which is fine, there are more important things, but you can’t win a tools vs skills argument by declaring the whole job less important than family, that’s a non sequitur.)

        • Anonymous on May 31, 2011 at 9:16 pm said:

          I don’t know that discussing family in a discussion of happiness is a non sequitor. More time with my family has legitimately made me more happy in life.  I didn’t mean to be saying that my family matters more (although they do) but more to give an example of what has made me more happy in life than VIM. Being more happy in life in general has made me more happy in my job.

          I don’t know if that holds true, but it has certainly worked for me. I hate the idea that everything needs to be categorized and separate, because it never works in practice. I can’t spend a day without my family somehow interfering with my work, just like I can’t spend a day without my work interfering with my family. They’re both a big part of who I am – tons bigger than VIM or TextMate. I take my work very seriously, and I don’t think that my family making me happy doesn’t mean that I don’t care about my job as much as someone else.

          That’s not really what I was trying to delve into, though. Sorry, just meant to make a simple example of what I’ve seen to help me be happier in life. Mileage may vary for others.

          What I was hoping to get across, but I think failed miserably at, was to say that if TextMate or VIM or my monitor or my operating system or my Aeron determine my happiness I think I’m generally screwed in life and probably really limited in my career too. There’ll always be a better editor or monitor or OS or chair about to come out.

    • A nice chair and multiple monitors sure do make things more pleasant.

      • You know, even I felt the same.. But now my second monitor is practically empty!

        Here’s how to conclude if things are really needed – Imagine that you’re the last man on Earth and no-one watches if I have 2 monitors etc. Having 2nd monitor doesn’t seem so cool at all! Most of times all these things are superficial reinforcements, halucination etc.

        But  I wud love a chair that gives me massage while coding 😀

    • a coder on June 6, 2011 at 5:34 pm said:

      I don’t know, I’ve done quite a bit of coding on DEC VTs (video terminals), you know 80×25/132×25 character displays and I can say that it didn’t make a difference in whether I liked my job or not.  With the larger nicer display it has made the job nicer, more comfortable to do, but not more likable or less likable.  Kind of like the difference a mechanic would have between using power tools or hand tools.

  41. Zakabashir on May 31, 2011 at 7:07 pm said:

    Great Article, I think the traits to me are loving to solve problems, turning ideas into products, passionate to learn more everyday.

    • RagnarDanneskjöld on June 1, 2011 at 2:07 am said:

      I was just about to post the same thing. Persistence & perseverance have to be balanced off with patience. 

      One last attribute that sets great programmers apart from good ones is being principled.

      • Andreas on June 1, 2011 at 4:41 am said:

        This is interesting as I would argue that impatience is more valuable. The really great programmers that I have met have been impatient, they do anything to shave off even a few milliseconds from their workflow and from the users workflow.

        I’m not saying that they will rush code, because they won’t, but they will do almost anything to write more code faster while keeping the quality high. All because they hate waiting.

        • emma mangu on November 27, 2015 at 3:59 am said:

          the fact that they are impatient and they do things more quick at high quality means they can do more great things than that if they can wait.I am trying to become a great programmer

Leave a Reply

Learn to code with Treehouse

Start your 14 day free trial today and get access to hundreds of video courses in web development, design and business!

Learn more