Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. Join them; it only takes a minute:

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? – rightfold 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

Once I decided that my fingers are slower then my thoughts. I spent a week improving my typing skills.

The result was awesome! Programming became a pleasure after that.


Reading others' code and learning TDD.


Hmmm - I think that the #1 single most important thing to improve my programming happened more than 10 years ago when I read the GoF Design Patterns book Although my skills have greatly improved since then by learning TDD, database design, IOC, DI, Agile processes, etc.

But those have all been a lot of small steps - the GoF book was a huge leap.


Write a new IT book, if you want to improve your knowlege and skills.


Taking the AP Computer Science courses in high school helped me the most out of anything.

I say that because prior to that I was self taught and would code in QBASIC as a hobby. I mostly just did my own thing, paying no attention to coding practices or readability. But in computer science I was taught C++ and the fundamentals of OOP.

Obviously I've done a lot to improve my skills since then, but some level of formal training can be extremely helpful to provide a little structure in your coding style. And on top of that I'm glad I had a good teacher to learn from.


Learning to say I'll get back to you on that when when pressured to answer the question How quickly can we do that ?


Pay particular attention to your life outside of work, and invest as much or more time in friends/family as sitting coding. How can you be good at work if your needs arent met outside of work?


Leaning Object Oriented Programming when I moved from C to C++
And the principle of SoC


Joining StackOverflow and seeing the huge number of outstanding programmers in the community. It was a kick up the bum and an inspiration at the same time.


Listening to DotNetRocks.

A number of years ago, after I started listening to each show during my commute, this podcast really unlocked a whole world of knowledge that expanded my understanding of software development, patterns, architecture, books, and the Microsoft community in general.

The quality may vary, but they still put out a lot of good stuff.


Reverse engineering. Looking inside massive compiled proprietary applications, and web applications from only the client side gives you a great view of how things are currently being done in the real world. Also teaches you what to avoid when programming.


Getting to 10,000 hours of programming... Experience and just do do do...


Mentioned several times and voted up, but without a doubt - working with smart(er) people and better developers has had the most impact for me. It gave me a chance to learn from them something I didn't know or how to do better what I already did know and motivated to work on my craft as a developer.

Also, there's a great book by Chad Fowler - "Passionate Programmer" - covers very well a lot of points discussed here, and I think very relevant to the discussion.

Coincidentally, my 2nd one would be being passionate about / liking what you're working on - nothing as motivating as labor of love. Once this happens, you do want to make your end product better, and this leads to trying better yourself as a developer.


I have some dissatisfactions against many inefficiencies in the internet world. These inefficiencies are usually gone if you start paying some money to the service provider, eg., where it provides more services.. But being a cheap guy, I started my own pet projects trying to mimic the provided services.

Lucky me, Google app engine provide free resources, from which i can start experimenting.

So I guess start with your own need and displeasure as (internet) user, and see what can you improve.. (i am stuck with app engine jdo relationship now

Necessity is the mother of invention.... – Zoot Jan 12 '11 at 17:38

Studying "Software Engineering" at a Technical University.


Sorry if this answer is a duplicate (as I did not read most of the old answers with score less than 2) - in any case it combines some stuff from others (yes, I did upvote them):

  1. Look back at your old code, and rewrite it (from scratch if it is horrible enough)
  2. Read about design patterns and notice the ones you are prone to
  3. do not re-invent the wheel. Ever. If there is a perfectly good freely available library for something USE IT, do not re-write it (unless you can convince the original programmer to accept your re-writing as the next major version). Using good libraries written by other people will teach you more than writing a shoddy one yourself.

I spent roughly six weeks working through one of Charles Petzolds great books, Programming in the Key of C#.

I went through it front to back, things i used to struggle on became a breeze and now I'm borrowing books about programming from the University library as often as i can.

For me the best thing to do was to just keep going, unless your forcefully try to learn something you're never going to make any advancements. It takes effort and patience which is well rewarded.


One thing that really improved my programming skills was watching and applying Misko Hevery's Clean Code Talks from the Google Tech Talks (available on Youtube, here's a playlist). They're presented in Java, but instill principles that can be applied to any OO language.

By getting into test-first-design I realised that code maintenance and maintainability was multitudes more important than just getting the first working version out. By applying TFD & TDD my code became cleaner, easier to maintain and had far fewer bugs than my non-TDD/hacked code.

I agree with the other comments about reading other people's code to improve your own coding, but one beneficial method was to print out some open source code and look over it with your development team and perform some code analysis. Find ways to improve certain code, find ways of refactoring the code to be more efficient and easier to understand. Look acutely at the variable and method names chosen in that code. Do the names of the variables and methods explain their function? Ask questions!


Creating 3D scene with phong/gourad lights and phong shading rendering terrain using only... setpixel - it was my university project, it was hard but I learned much

+1: because of doing your own sw rasterizer – Stringer Bell May 18 '10 at 14:18

Learn languages other than object oriented languages.

One of the most effective things for me was one of my undergrad classes where we worked with functional languages, logic programming and constraint programming (in my case it was ML, Prolog, and the prof's own constraint language). With languages like Java and C# being all the rage today, it's easy to have a one track mind when it comes to programming, but I found it extremely beneficial to learn something totally different.

The other big thing for me was working with others that have more experience. When I was working as an intern I learned a LOT by reading code of the most experienced developers. Also learned by having the more experienced developers rewriting my poor code, so I saw first hand better ways to accomplish what I was trying to write.


1) Learned to use a good text editor for everything (Emacs)! You can become so much more efficient if you never have to take your hands away from the keyboard! Keybindings have made me a faster programmer! 2) Learned to use Bash to it's full capability. I can do things twice as fast because I do not have to code everything. I can write two small programs and send the output of one as the input to another using pipes. It is surprising how many good programmers don't know how much time can be saved using the shell.


Learning from mistakes and refactoring old code

  • Make mistakes and take criticism as an opportunity to learn
  • Learn how to read code and understand the original intent
  • Learn when to ask for help (and when NOT to ask for help!)
  • When to read books vs start hacking.
  • Break the build...but please fix it :)
+1: Some really good advice here. – Jim G. Jun 2 '10 at 19:53

also innovative about doing something new. this is not a matter that you know much more and have a small knowledge. i am agree to doing practice. and also be passionate about your work.

Improvement + Innovative + Practice = successful programmer.


Learn to justify (in your head) other people's code. It's just too easy to hit programmer's block because of existing code is written badly and needs refactoring. Instead of immediately re-writing and re-testing everything, try to find some perspective from which that code would seem more reasonable. Your perception of code depends a lot on how you look at it. It can be hopelessly bad, or be slightly out-of-date at the same time.

Example: for a long time I hated visual studio .sln and .vcproj files "poluting" my folder structure. It bugged me that my main folder should start with some application specific configuration files. I saw other people's projects that had folder structures like:


And it made sence to me, simple and elegant. But still, for own "ultimate" projects, it was too poluting...

Well, finally I found a perspective, from which this folder structure made sence - think of it as a generic file listing. Those .sln and .vcproj are just some standard, that is common enough to be chosen for declaring all the files in all subfolders. Kind a like declaration of functions in c++ header files. It's just there for Your convenience, and at the same time it can be used for pre-compiling executable binaries from c++ code. Sure, it's xml-format is improssible to read or modify, but for now we can ignore that. As long as it saves time for us to start new projects we can live with it.


Interesting projects in new technologies (to you) are the best way to learn. I picked up C++ and Python because they were the best options for specific projects.


I accepted the patterns revolution


I know patterns always existed but we were not conscious of them in the way we are now.

Patterns always existed. It's just that they now have names... – Oded Aug 7 '10 at 7:35
Please see edit – Carnotaurus Aug 7 '10 at 8:57
In what way did you accept a patterns revolution? Was it also reading about design patterns from specific authors? Was there any specific reading or action you're trying to recommend? – Kimball Robinson Aug 11 '10 at 18:05

On a long term: Constantly trying to adopt new technologies and development techniques. Also, reading Design Patterns by Gamma et al.

On a very short term: Getting away from my computer for a while. I often get the best ideas when I am NOT staring at the screen. Works almost every time I am having a hard problem to solve.

+1 for getting away from the screen. Not sure if that's improving skills, but it sure helps solve problems. +1 for Design Patterns as well, if I could vote twice. – LarsH Nov 3 '10 at 15:13

I implemented User Threads, a mutex library, and an I/O library for the 3rd homework assignment in the Operating Systems course I took last semester. It basically required us to implement a major part of the kernel from scratch (the whole thing was supposed to run in user space, and we weren't allowed to make any changes to the actual kernel) and managing all the data structures, scheduling issues, concurrency corner cases, and hacking around the native scheduling mechanisms was a very difficult task. After finishing it I definitely felt a noticeable "level up" in my programming skills.


Testing. It made me think about my design, which wasn’t much modular at the time, everything bound together by singletons and similar stuff. Testing forced me to uncouple the code, which was a huge change I am still getting the benefits of.


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