Take the 2-minute tour ×

So I've been programming for about 9ish months now, and I've taught myself some Python, some PHP and some Javascript.

I want to become better at these languages - I can hack something out, but a lot of things like OOP, using lists in the most effective ways, etc, is lost on me.

What are the best ways to become an "expert" programmer? Does it depend on the nuances of the language, or is it more general? Is there any math I should be studying alongside it? Obviously a lot depends on what you want to do with it - so far I've mostly done small scale internal applications as well as web programming. How do I find out about good program design?

share|improve this question

migrated from stackoverflow.com Nov 25 '11 at 19:28

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

closed as not constructive by Mark Trapp Nov 25 '11 at 22:37


Hi Andrew, I'm sorry this was migrated here unnecessarily, but this is too broad a scope to be a fit for the Stack Exchange style of Q&A. –  user8 Nov 25 '11 at 22:37
keep hacking for about 111 more months... –  Steven A. Lowe Oct 7 '12 at 1:35
add comment

9 Answers

The only solution is Experience. You'll become an expert when you will have coded a lot (like really a lot) in these languages. Developing projects will make you face problems, so you gonna have to find the solutions, and one day you'll have seen enough solutions to problems that you will call yourself an expert.

Coding, reading code, reviewing code, all of these will help you know how to code with a good design. You can't just rely on one snippet of code you see on the Internet to say that you know what is the good design for what you're trying to achieve. You need to look at a lot of them to know what would be the best solution to your problem.

share|improve this answer
add comment

Expertise, like friendship, is a product of time. My favourite quote on the subject (I forget the source):

"Good judgment is the result of experience. Experience is the result of bad judgment."

Put the hours in, study your craft. Strive not only for immediate solutions, but for beauty and efficiency.

share|improve this answer
+1 "not immediate solutions, but beauty & efficiency" –  Raynos Nov 25 '11 at 20:11
+1 The quote encapsulates the meaning of experience perfectly. :) –  Daveo Nov 25 '11 at 20:15
add comment

First of all it's important to understand programming at an agnostic level. Knowing the principles, concepts, methodologies and such will help you in the long term. Here are some links to some good books to help you:


Just remember when you kiss it's also better dry if you want a more solid relationship with programming. :)

share|improve this answer
add comment

1) You're in the right place. Community forums like stack exchange are an excellent way to find information.

2) Figure out OOP before moving on. It's a necessity before moving on from scripting to more advanced development. net.tutsplus.com is a good site for reference and I found this guide here: http://net.tutsplus.com/tutorials/php/object-oriented-php-for-beginners/

3) Once you've learned OOP and practiced using it, download a framework with good documentation and follow a "Getting Started" guide (a framework is a collection of tools that help you develop faster in a language). Symfony is a good one for PHP and you can follow the guide here: http://www.symfony-project.org/getting-started/1_4/en/. They also have a "Jobeet" tutorial for you to follow along with

4) Along with #3, learn the MVC (Model View Controller) pattern. This is a popular programming pattern that is used in a variety of frameworks. It is a must if you want to move from beginner to intermediate.

Good luck!

share|improve this answer
Oh and fair waring -- A lot of these items that I've listed couldn't possibly be learned in one day by a beginner. It will take some time and practice, so don't get discouraged. –  Greg H Nov 25 '11 at 19:43
I disagree with point 3. Advising someone to check out and use a framework will not help them learn programming itself. With regards to point 4 only MVC as a concept makes sense on the web but not as a pattern. –  Daveo Nov 25 '11 at 19:53
True, a framework won't help you get better at the language itself, but it will help you get better at development in general. It also provides a way to learn industry standards for web development. –  Greg H Nov 25 '11 at 20:07
And php and python are mostly used for web technologies so I assume this is where he is getting started. It's an architectural pattern that is good to learn if you're going to be doing web development. –  Greg H Nov 25 '11 at 20:09
@Daveo a framework is a guide to keep you on track. It's hard to write correct code at first without using some kind of guidance mechanism. A framework is a poor man's replacement for a real mentor. It's your training wheels on your bike, once your comfortable you stop using the framework and do it properly –  Raynos Nov 25 '11 at 20:10
add comment

Work on a code project with programmers who are better than you

Protip: this seems to work for anything you want to get better at, not just code!

But seriously, if you can find talented people who are willing to tell you when you're doing it wrong, try to work on a project with them.

Read things written by programmers who are better than you

Daveo linked to some good books. You can also find many blogs written by people who care about becoming better programmers (and are usually pretty awesome programmers themselves).

share|improve this answer
add comment

Being an expert programmer is probably a general ability to reason and solve programming problems, both common and uncommon tasks. This is probably language independent, but I'd say you should also be very fluent with at least a couple of programming languages and their tools.

There is no magical recipe to become an expert, except with hard work: read tutorials, google a lot, listen to experts, work on problems, code a lot, work in existing projects with other people, and generally acquire lots of real world experience.

All this is language independent advice.

share|improve this answer
add comment

There are of course several approaches that will lead to success. As already said Experience is the most important one, but it depends on you how much time you need to call yourself an expert. However the timespan will be measured in years or even decades.

I began learning programming 15 years ago, and I think the best improvements in my skills were due to the following reasons:

  1. Pressure is bad. Keep a good mood and forget unsolvable problems today just to return to them tomorrow (and wondering why it seemed so complicated the day before).

    I began programming when I was a kid and no one forced me to learn anything. Do not get me wrong: You do not need to start as a kid to master a programming language. Your very own motivation - without forcing yourself to achieve an unrealistic goal in a too short amount of time - will be the key to success.

    You also will not have to write your own operating system like Linus did. Neither does anyone expect you to have a successful website visited by hundreds of users a day. Simple excerpts of your projects will show (your boss, your customer, your colleagues ... ) that you know what you do.

  2. Stick to a topic until you (almost) mastered it. Learn the basics.

    Mastery is something which is not achievable. It is unlikely to know everything. But be sure to learn the basics, and do not underestimate the concepts of programming languages, paradigms or certain syntactic rules or best practices.

    But please: do not just accept it if you hear or read NEVER or ALWAYS. Whenever someone talks about never doing something, do not hesitate to ask why. There is a reason why there are rules. But only the reason will tell you if it is a good thing for your situation or not. What is good in one language can be problematic in another.

  3. Keep moving forward.

    Do not stay at the same topic for decades. After 10 years of Javascript, there will be very few people who can teach you something new. But in 10 years no one will be talking about Javascript ... why? ah now you got me. Predictions concerning the future are always prone to errors ;)

    However after some months or years of collecting experience in one field you will see that the stuff you learn will not be as much as at the beginning of your "mission". There will be a time when people start to ask you for help when they have problems (real problems, not the please do my homework stuff).

    This is a good indicator that you have become some sort of an expert. At this point ask yourself if there is still the potential to develop yourself. Or maybe there is something new you want to lay your hands on, but no one lets you because you are just the perfect chicken for this cage.

  4. Go out with your friends, wife, dog ...

    It will give your mind a rest. Problems like Android vs. Iphone, Flash vs. Silverlight, App vs Program ... will become a matter of what is best for your needs and not the center of your existence.

    Having a social life (do not confound with Facebook though) will also help keeping or even improving your soft skills. If you know how to get your colleagues to agree to the best (not necessarily your) solution can be worth more than knowing hundreds of programming languages.

  5. Use your brain

    Do not write me a letter in 10 years telling me that I messed up your life. If you are happy with a totally different strategy or find out becoming a farmer or president of the USA is worth it spending the rest of your time: do it.

share|improve this answer
add comment

I suggest becoming a member of sites like Topcoder or Usacogate, where you can step by step learn and solve algorithmic problems. For example, completing Usacogate training won't make you a computer science professional, but it gives you tons of skill for tackling many real-life problems. It teaches you testing and requires you to provide efficient solutions.

Yet another option to gain more experience is to learn a language of a different paradigm. For example, Haskell is a functional programming language. Learning it can help you approach problems from a different point of view even in other languages. For example, Python can be programmed in a very functional style.

share|improve this answer
add comment

Contrary to some of the answers, experience is not the only requirement to becoming an "expert". I think most people in every industry (not just programming) do not become expert in their field. They become competent and efficient, but they do not become anywhere near as good as they could be.

The reason is that experience is not enough. You need expert advice. You need to learn how to do things from someone who is an expert.

Fortunately for us, there are many resources for programmers to become expert. Probably the best one is books. Another outstanding resource is programmers.StackExchange.

Spend most of your time writing code, but also spend some of it reading and integrating the knowledge from books like Clean Code http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882. You can find the best books by analyzing the reviews on Amazon, checking this site, and Stack Overflow.

If you invest enough time to learn and use the information in 2 or 3 books per year, it will greatly increase your skill. Also, figure out a way to record and remind yourself of everything that you learn. Otherwise it will be difficult to really know and use the information.

Pay attention to the topics that expert programmers are interested in: design patterns, unit testing, career choice, etc. Look at the world (or at least your job) from the perspective of an expert programmer.

When you are given a task to code, stop and think about it for a little while. Ask yourself some questions. What have I learned that can help me? What are the risks? What is the best approach? What are some different algorithms I can use? How much time will it take for the program to execute? What is likely to be the CPU bottleneck? What functionality could change or be added?

Hope this helps.

share|improve this answer
add comment
