Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Looking back at my career and life as a programmer, there were plenty of different ways I improved my programming skills - reading code, writing code, reading books, listening to podcasts, watching screencasts and more.

My question is: What is the most effective thing you have done that improved your programming skills? What would you recommend to others that want to improve?

I do expect varied answers here and no single "one size fits all" answer - I would like to know what worked for different people.


migrated from Feb 6 '11 at 3:55

This question came from our site for professional and enthusiast programmers.

locked by Yannis Mar 13 '12 at 20:38

This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here. This question and its answers are frozen and cannot be changed. More info: help center.

Practice, practice, practice. And never be satisfied with the first thing that comes to mind. – Mark Ransom Sep 3 '10 at 5:28
+1 for Mark Ransom...The difficulty comes when you're still not satisfied with the 100th thing that came to mind! – Stimul8d Oct 21 '10 at 8:11
Not wasting any of my time on Programmers Stack Exchange site helped me improve my coding skills immensely. – Job Feb 2 '11 at 17:53
@Mark Trapp how is this not constructive? – Zoidberg Jan 22 '12 at 23:14
@WTP - Read the description. "This question is not a good fit to our Q&A format." - as someone who asked this question, I agree. It was asked in more relaxed times. – Oded Jan 23 '12 at 16:52

360 Answers 360

To me, the inflection point was that I started reading code from great open-source projects. I saw different styles, new techniques and it opened my mind so much that it was a sensation similar to traveling and living in other countries.


I definitely agree that programmers and writers have the same mantra. For writers, it is simply to write, there is no way around it. For programmers it is to well.. program. With that said I think there are a few things that all programmers should do.

Most of these areas are really about stripping away the mystery and getting you to think about what is really happening below the level you are operating at.

In no particular order:

Learn several languages Learn LISP/Scheme, asm language of your choice, C/C++, SmallTalk

Get yourself exposed to different programming languages for the same reasons it is worth learning other spoken languages. These expose you to totally different modes of thought and will get you to look at problems in an entirely new light.

Write a language.
This will get you to think about languages at a deeper level. Just get something out and working before you try and create the next big language.

Write a multi-threaded OS Writing an OS will expose you directly to hardware, memory management, threading, protected memory, and get you to understand the machine. Be prepared for immense frustration, and deep satisfaction the first time you get a machine to boot to a prompt. :)

Write a game I'm a bit biased on this one. Games are immensely practical applications that force you to not only dig into numerous computer science and code construction problems, but they force you to be practical. For real fun, try writing to an older platform such as the PS1 or even the Atari 2600 (Stella manuals can be found online). These are "tricky" architectures that will force you to really understand them before creating anything interesting.

There are clearly many other areas to work on and things to do in order to improve yourself as a programmer. Some will be very craft related, and others are going to push your boundaries of knowledge. The above list is a great example of projects to set out to accomplish. You will be forced to grow as a programmer when working on them, and they will also set your resume apart for the future.

Write a language? Are you kidding me? Clearly you're unfamilar with the term 'opportunity cost'. – Jim G. Sep 2 '09 at 15:51
Wow, that wasn't very polite. – Jeff Thompson Sep 3 '09 at 17:14
I'll have to agree with writing a game, that was one of the things that taught me the most, there are so many aspects from maths to making best use of the processor, installation, security. – Jai Sep 24 '09 at 23:18

You can read all the books, code, and open source projects you like, but you need to understand the end-user aspect of software development. You need to step out of the echo chamber. So I'll address a couple non-technical points that will help your technical career.

  1. Step away from the keyboard and interact with the end-user and see, through their eyes, how they use the software. End users are typically not technical, so they see software as a magical piece of work, while you see software as a logical set of steps. The two worlds are completely different. So what seems easy and logical to you may seem cryptic and intimidating to others.

  2. Test, test, test. A lot of the software I've seen in large corporations use test cases. Hell, they use JUnit, xUnit, and all the other unit testing languages out there. But the problem I've seen is that most programmers never see what their software looks like in Production. Learn how users (or systems, if these are batch jobs) interact with your application, library, or interface to find out what kind of abhorrent information they throw at it. This will help you generate good test cases and stop assuming your program will always be fed the correct set of data.


In no specific order...

  • Working with people far smarter than myself

  • Always listening to what others have to say, regardless if they're junior, intermediate, senior or guru. job title doesn't mean anything.

  • Learning other frameworks/languages, and seeing how they do things, and compare that to stuff that I already know

  • Reading about patterns, best practices, and then examining my old stuff and applying those patterns where necessary

  • Pair programming

  • Disagreeing with everything Joel says. ;)

I know it seems really gratuitous and potentially reputation whoring, but if you separated those items out to one per answer people could vote up which ones they agreed with, allowing for a more specific end vote "solution" of this question. – davebug Sep 16 '08 at 23:10
Watch how smarter people handle mistakes - that's when I learn the most from them – Mike Robinson Feb 2 '09 at 21:38
if this is a list in no particular order, shouldn't it be an unordered list rather than an ordered one? :P – Jon W Aug 31 '09 at 19:03
I agree with mmyers - just because you disagree with someone doesn't mean you're ignoring them. Actually, it's the opposite - in order to disagree with them you're actually paying attention to them. – Cristián Romo Oct 10 '09 at 21:46
I don't cart-blanche disagree with everything Joel says, I think much of the time he has some interesting things to say. My comment was tongue in cheek. There's a lot of stuff that I agree with when it comes to Joel, but about once a month he makes me shake my head and ask "What? Are you serious?!". Which I love, as I find those the most challenging things that force me to really check my position and what I believe. – cranley Oct 19 '09 at 17:14

Reading "Clean Code — A Handbook of Agile Software Craftmanship" by Robert C. Martin. It made me aware of lots of characteristics of good and clean code that I din't even think of before. Absolute must-read!


May be this sounds muddled, but I think it's important:

  1. Code guidelines - formerly I named my vars like a = b * c, instead of more readable employeeSalary = avgSalary * fte, reused a code by copy-paste and did many other bad things in the code. My code was like a mess of unreadable routine. Learning of writing a beautiful code was not easy to me, but as soon as my code was more readable by me and in a team, I understand that I did less bugs. Now I write a beautiful code (thanks to Resharper) easy as one-two-three.

  2. Usability and design - usually developers forget about this important thing. But knowledge about it may help to improve programming skills. How? This is fully connected to 'code guidelines' described above. A beauty not only in the code, but in user interface that you develop, has a good influence on developer's happiness, which in turn affects the quality of the code.


I answer this question like teachers from language classes. If you want to speak Russian, you must speak Russian. If you want to read Russian, you must read Russian books. If you want to write Russian, you must write Russian!

So if you want to write high quality programs, you must code. But writing high-quality code isn't the only measure of a good programmer. You must do a lot of other things, but I think you get the idea of the things you must do to become a pro.


After doing lots of the things mentioned here: get a good programmers editor (editplus for me), learn several programming languages (C++ and Lisp cover a whole spectrum of techniques), learn regexps (actually pretty simple, compared with other stuff, but amazingly powerful), learn about top-down parsers (that way you forget the idea that regexps can solve everything), I found the biggest help from an unexpected place:

Learn Mathematics.


This is not about learning calculus formulas or other stuff that is taught to engineers. That's not the mathematician mindset. This is about being able to think and write a correct proof for some theorem, sometimes grabbing ideas from the most unexpected places, or doing stuff that looks like a crazy workaround to the untrained mind. And advanced linear algebra course can be a great Mathematics intro.

After this, your programming mind literally grows bigger, by a huge amount. You can hold bigger and more complex pieces of code in your head, and it actually looks very simple. After some really hard Mathematics proofs, some complex algorithms look trivial to you in comparison.

However, there is a caveat: most Mathematics teachers will want you to be both the programmer, and the computer. You write the proof by hand, and perform all calculations of any application by hand, otherwise it has no merit. Most of them still don't understand the power of computers. In the same way, most programmers will disregard Mathematics as 'that bunch of calculus formulas with no direct relation to programming'. If you get the good bits from both worlds, you will be a better programmer than 99.99% of them all.

  1. USACO (
  2. TopCoder (
  3. Codeforces (
  4. CodeChef (
  5. Project Euler (

Doing these problems help you face challenging tasks. And makes you confident with most of the stuff out there.


Reinventing the wheel many times, in the form of implementing all the kind of algorithms and programs I could find interesting, was very useful for me. Chess programs, device drivers, data structures, network servers, and so forth. About design skills, I think reading many RFCs is a great help.


Become an active member of SO. Really!

  • To dive into problems other people are facing and where you could give advice based on your available knowlegde but most of the times the questions push you to take it one or two steps further.

And off course also:

  • Reading good books, make the examples, discuss them with colleagues, and go on...
  • Make a proof of concept about a certain goal you want to reach, not doing it in production code but just a kindergarten project where you try all sorts of different scenarios
  • Scraping the internet for good examples, clarifications, good blogs
  • Clearly define with the (inhouse) customer what they really need, we all know this fabulous picture, it makes so much difference to communicate the desired functionality, get the details clear, discuss business rules, use-cases and their deviations.

And last but not least:

  • Don't let your (proud) ego stand in the way of learning from your own mistakes and from others

Have an open mind. Be interested in other technologies. Don't be overly religious about your current favorite language or platform.


In the last year of my Computer Science undergrad degree, I took a compiler writing course. It was a full year course and in that course we created a pascal compiler from scratch. I wrote everything in C and I did not use lex or yacc.

That project advanced my programming abilities more than anything else that I have ever done.

Beyond that, the most important thing I've found that improved my coding abilities is to improve my analysis and design abilities. If your analysis and design skills are poor, you will be a bad programmer.


This isn't really specific to programming, but I like to hang out with people who are smarter than me and are willing to help. Whenever I come to them with a problem and ask them how they would solve it, their logic is what improves me. Learning to think in different ways, finding shortcuts (while still understanding why they work), and just improving yourself by watching others is the best way to get better at almost any skill.


Work for a small company - lesser layers of management and others bossing around - more responsibilities, more learning! This way, one can learn more in less time cos' small companies generally have a lot of work to be done in the least amount of time possible. No matter how you chose to implement the solution - that is where the 'learning' part comes in. Ask the great folk here at SO to verify your solutions and I always had people suggest most elegant solutions here.

I am with a small company, pay is crap but I have no boss. I am given requirements and I go about achieving those goals in the most elegant/efficient manner.


I think one of the things that made a big difference to me was writing a long tutorial on something I had been working on as a hobby for a while. It really helped me organise my thoughts and tidy up the tutorial code as I knew other programmers would be looking at it and either learning from it or pointing out to me that I'm an idiot through it. I think doing it as a single chunk was really helpful too as it gave me a much deeper understanding of the field I was working in.

Also when I went freelance and was working for myself, that forced me to up my game. I didn't enjoy it that much and I went back to working full time after only a year or so, but it was still a very educational time.


Reading other's code.

There are many open source written by expert programmers. Read their code, get to know their idea.


From a programmer I met on a flash conference and I totally agree with him.

  1. Never think you know everything you should.
  2. As soon as you reached the state of "Woow I am the greatest programmer in the world in [fill in area]" bang your head on the wall untill you don't remember it.

Using Excel

Using Excel every day helped me think about problem solving, with basic logical operators, IF() NOT() AND()

It also helped with the whole point of functions and variables, and showed me how to layout data that should be in a database. VLOOKUP()


Writing your "programs" on sheets of papers b/c the access of a computer was the heaven's bliss and actually almost that rare... or storing the program on a cassette tape since the computer didn't have a floppy disk, or writing plain hex since there was not even a normal assembler. That's what makes you realize you do love programming and you are born with enough passion to do it.

But most of all reading books and later reading (others') source code, just try and play it in your head. Unfortunately, lots of nowadays open source code has quite appalling quality, however understand why (or if) it's appalling make a good starting point.


Writing code on a paper or a whiteboard as against using the compiler. Apart from the syntax, I could realize so many nitty-grittys which the compiler\IDE does for us.


Practice coding and algorithm in all kinds of online judge system such as USACO, topcoder, poj and so on.


I wrote some coding standards documents for our company, presented them in a course and then set about reviewing code against them.

This involved time spent researching and investigating and documenting. It then involved time spent trying to format it into a manner than could be communicated and presented clearly. Finally, it involved reading other people's code, and learning to separate the good bits from the bad bits.


Watched Bucky's Tutorial videos on YouTube -

  1. Try and make errors..
  2. learn how to search.
  3. try to solve other developers problems.
  4. read and try to understand the concepts not the details.

Learning symbolic logic, particularly predicate and deductive logic. While studying philosophy I was able to immerse myself in this area of study and it actually pointed me to studying mathematics and learning to program.

This helped me learn programming since I almost saw it as a real world application of this logic. Specifically deductive/truth-functional logic helped me easily grasp boolean values, binary/ternary operations, and conditional statements, among other things. Studying predicate logic has helped me understand areas concerned with scope, object-relational mapping, and program flow.

This study of logic also pushed me into mathematics which also helped in a plethora of ways.


Many great answers here. However, one of the most effective things for me personally was to join Stack Overflow. There are many people here that are smarter then me, and I learn a lot from their very thorough questions and answers

+1 -- Agreed... – Frank V Dec 16 '10 at 21:51

Over the duration of my career I learn one important thing that if its a difficult task programmers tends to do everything together. take small breath ,forget about the deadline ,break it in small bits and don't think about what you have to do after that (the next bit).

I forget to implement it sometimes. but when i do it do wonders for me.


Debugging other people's programs. Teaching / tutoring. Playing with a lot of different languages. Reading books and tutorials and browsing the net. The greatest shortcoming of my professional development as a programmer was working in isolation. I could be wrong, but I think one of the best things you can do is find better programmers (individuals and teams) to work with and learn from.


Network with other programmers. Nothing beats human interaction.


Not the answer you're looking for? Browse other questions tagged or ask your own question.