Profile photo for Kaitlyn Hanrahan

I disagree with the consensus that you just need practice to become a great programmer. That goes without saying. That's like asking "how do I become a world class cyclist" and being told, "take more bike rides."

You need practical experience to become a good or competent programmer. It takes much more to become a great programmer. Here are some of my suggestions.

The primary thing you need is mentorship. You simply can't see your own faults and bad habits. This can come in the form of formal classes, with a professor or TA who corrects you. It could be from a code review at work. It could come from a similarly skilled peer during a pair programming session. It could even come from reviewing other programmer's code and seeing their mistakes (which you probably also sometimes make). We all have bad habits. Everyone that is pointed out so you can correct it makes you a better programmer. You could find something to improve in anyone's code.

You should take some time to read the classics. This article is a good place to start building your bookshelf: Programmers Don't Read Books -- But You Should
Also here are a few of my own favorites:
The Mythical Man-Month
The Design of Everyday Things
The Pragmatic Programmer: From Journeyman to Master
Design Patterns: Elements of Reusable Object-Oriented Software

Eventually you will need a specialization. Computer Science and even just Software Engineering are broad fields. No one can be an expert in it all. It would be like a medical doctor knowing as much about eyes as an ophthalmologist and at the same time as knowing as much about feet as an podiatrist. Whether a language, an industry (biotech, finance), a platform (windows, apple, mobile, web), or a sub-field (usability, security, localization, quality, data, networks, performance), or some combination -- you should have things that you are better at than other things.

At the same time, diversification is also necessary. If you are a world class Java programmer, I would bet that you also know other languages. It gives you perspective. Helps you make implementation decisions. Generally makes you a better programmer. I would say any "great" software engineer should have a little experience in an OO language, functional language, compiled language, scripting language, low level language, high level language.

I'm no security expert, but I still made an effort to learn the basics, go to the occasional conference (they're also just fun), and keep up with what's new in the field. I have a much stronger interest in usability. I'm an engineer, not a designer, but I still eat up design and usability publications with as much fervor as if I were one.

It also takes a bit of passion. Software is a fast moving field and it takes effort to stay on top of it. From just the new and trendy to the new standard way of doing things, you're going to need to read off the clock.

Know more than average about Programming Languages. PL is just another sub-field in CS, and some engineers will have more interest in it than others. But IMO, knowing a little more than average about programming languages is a requirement to being a great coder. A great coder picks the best languages for the job. And to do that she has to know what makes it the best language. And she has to know how to take advantage of key features in any languages that she's using.

Similarly, if there is any official "Guide" to becoming a great programmer, it is probably a PhD in PL.

To be a great anything is more of a journey than a destination. The more you know the more you will be aware that you don't know. I would be suspicious of anyone who called themselves a "great programmer".

There are a lot of similar questions here on Quora that might give you some more ideas.

Best of luck on your journey to greatness!

--------------------------------------------------------------------
Update May 26, 2015 -----------------------------------------

I feel compelled to give a reply to Aideen NasiriShargh's mention of my answer. This is a question that deserves different point of views. As we both give reference to, greatness is an elusive thing. Aideen says, "I don't call myself completely qualified to answer this question". I say, that greatness is more of a journey than a destination and "I would be suspicious of anyone who called themselves a 'great programmer'" (meant to imply that I also don't call myself a great programmer).

However, since he goes out of his way to reference and misquote me, I feel it merits a reply.

Aideen and I are coming at this question from slightly different angles and experiences. Specifically our answers differ...

(1) First, our take on Formal Education. I have great value for my Computer Science degree. I feel it complements my practical experience and allows me to write code at a level that I would never have reached with practical experience alone. Based on Aideen's third point, it seems he did not share my positive experience.

(2) Second and more relevant, who is asking this question / reading this answer. Something certainly up for interpretation.

While I value my CS degree, I'm not assuming the reader already has one or would benefit from starting one. If you have a degree in CS, then you are probably already heavy on the Theory side and in that case more practice is probably the best prescription for you (and you probably know that). On the other hand, from the sense I've gotten, the audience here is has a lot of people coming from the self-taught experience. In that case, you probably want to beef up your theory.

Combined with my own theory heavy background, I felt more qualified on giving some tips on filling in that side. I think one needs both to reach "greatness". I grant that my list is more theory centric than Aideen's and that this is certainly not what everyone needs. Again, this is a question that deserves multiple answers.

Again in where we are coming from, since there have been so many comments comparing our answers. When I answered this question, there were a dozen answers that simply said "you need practice" and "you need passion". When Aideen answered, my answer was the top answer by over 1,000.

I took the position that practice is a requirement for "competency", but should go without saying when the conversation moves to "greatness".

I put passion toward the end of my list for two reasons. First, while it is worth a mention, we hear a lot about following our passion and I didn't think I needed to emphasize it further. Second, "have passion" is pretty useless advice.

For the second part of my update, Aideen NasiriShargh misquoting me...

Aideen quotes me with:

I don't want to look like a jerk, but the fact that thousands of people upvoted "PhD in PL is the best Guide" and "The primary thing is having a mentor" just blew my mind off.


PhD in PL...

My original answer mentions diversification and specialization in different sub fields of Computer Science. Then, as my very last point, I mention that if one is pursuing a career in Software Engineering, then the sub-field of Programming Languages is specifically worth learning a bit more about. I give some reasons why I feel it is useful in the real (working) world.

I have the impression that Aideen only skimmed my answer, but it also seems he skimmed the question. The question details are, "Is there any guide to becoming a great programmer?".

My entire mention of getting a PhD is this one-sentence paragraph as an afterthought to my shout-out to Programming Languages:

Similarly, if there is any official "Guide" to becoming a great programmer, it is probably a PhD in PL.


I will now explicitly write out what I thought was implied in that statement.
There is no guide to becoming a great coder.

The majority of people should not pursue a PhD, but that is really getting outside the scope of this question.

Mentorship...

I've had a few discussions in comments with people about a better word for what I call "mentorship". I give 4 examples of what I mean by "mentorship" and where one might find mentorship. Not a single one is "having a mentor", as Aideen says I say. Perhaps I should have said "outside influence" rather than "mentorship". I just like the word better, and it is my answer :p

I stand by this being #1 (when you already assume practice, as I stated I do). The next most popular answer after ours (at the moment, anyway) simply lists "1. write code everyday" and "2. hang out with other people who code". So despite it "blowing your mind off", it's not so radical an idea.

In Closing, Dear Aideen,

So, Aideen, I hope I'm not sounding like a jerk now. I think your answer is a great addition to this question, with the obvious exception of the first paragraph that is simply attacking and misquoting mine. It's different from my point of view, and that's a good thing. Again, this is a general question that could have a 100 useful answers. I've enjoyed reading the others. I certainly don't think mine should be the only one and I was (pleasantly) shocked by the large and positive (except, of course, for your) response to it.

Your answer lists topics including passion, persistence, bravery, and trust. To me, this comes across more as a motivational speech than an answer to a question. Yours is better than the average expression of the same sentiment and does gets into a few specifics. However, IMO this idea has been repeated as nauseum and is not extremely actionable advice. To me, it comes across more as "this is what you should have been born with" than "these are some things you might not have thought of adding to your arsenal to help push you to the next level". So ditto to you, the fact that you received 3k upvotes "blew my mind off" (though not really, I would have never cared if you didn't first misquote me).

And in case you actually care, which I doubt you do, slightly misquoting me in a way that completely changes the meaning of my words before then insulting that new meaning, does make you a bit of a jerk. Cheers!

View 100+ other answers to this question
About · Careers · Privacy · Terms · Contact · Languages · Your Ad Choices · Press ·
© Quora, Inc. 2025