I've been having this on my mind for a while. How do programmers gain their experience? What are the most decisive factors? Is it the books? Or the job? The education? What turned you from the beginning programmer to the knowledgeable one?
The Wikipedia article on the word experience starts off like so:
Experience as a general concept comprises knowledge of or skill in or observation of some thing or some event gained through involvement in or exposure to that thing or event.
In order to become an experienced programmer, you will need to experience a lot of programming. In other words, work a lot with programming, hands on.
You can learn techniques, ways of thinking, methods and so on from reading. All these will help you become a better programmer. But experience is also about having experienced. To have been there, to recognize situations, feel it in your gut. That gut-feeling comes from actively working with it.
Fixing other people's code - especially if the code is huge and/or old. There is no better way to figure out what is a good way to write something and what isn't.
I think that it varies from person to person. I feel like I learned the process of programming and the science behind it in school, but didn't really become 'experienced' until I had an actual programming job in the real world.
Combination of trying things and reading about things. Some of that trying can be in school or on the job but the key point is that it be practical in using the knowledge rather than just a loud of bull.
What matured me was various trials by fire where I had to do things I hadn't done before and develop problem solving and system building skills.
Take part in an open source project (see http://www.hanselman.com/blog/ExampleHowToContributeAPatchToAnOpenSourceProjectLikeDasBlog.aspx for a good explanation for how to start)
This will not only give you experience in real world applications but will give you exposure to the community.
Programmers gain experience by doing. Books are okay, but unless you do more than just follow the book, you aren't learning anything. I've learned the most by setting out trying to do something and having to look up thing after thing to solve various problems. Each problem you solve will stick in your mind better than just reading about it.
I find that being part of a project from day 1 in it's design is the most beneficial in terms of experience.
It is this basic architecture and design which will ultimately determine if a project will succeed/fail.
All the coding in the world can't make up for poor design! (although thats what we probably spend 90% of our time doing)
Dave Hoover and Adewale Oshineye wrote an excellent book on Apprenticeship Patterns:
http://www.amazon.com/Apprenticeship-Patterns-Guidance-Aspiring-Craftsman/dp/0596518382
They're particularly relevant to novice developers, but pretty good for experienced devs too!
My two patterns of choice, and the ones which have made the most difference to me, are:
Be the worst. If you are the best person in your team you're not learning anything from the others. Find a team in which you can learn from everyone.
Breakable toys. Have your own pet project - open-source or otherwise - in which you can safely practice technologies and techniques which you're learning.
I also really value feedback. I don't worry too much about addressing weaknesses if the team can back me up, but anything which makes me less able to work with teams, or any way in which I can use my strengths better, is golden. It's pretty hard - the human brain has a natural preference for validation, rather than feedback which changes your mental models - but if you can get over the courage needed to ask for it, it's utterly worth it.
From experience there are basically three ways to gain knowledge in programming
- A - Reading about it : Reading blogs, books, forums etc
- B - Reading code : about 5 hours of A will yield the same return as 1 hour of reading someone else's code. However reading code alone is of limited use until you are made aware of what to look for, hence A is first and this comes after.
- C - Programming : For every 5 hours of B you will get the same benefits by programming your own stuff for one hour. Again, without knowledge and something to compare against you will never really move forward in your skills. Hence, programming comes third in this list.
I use to think that Programming was king until I met programmers with 30 years experience that still have no idea how to code the basic principles of their trade. Sure they know all about encapsulation and polymorphism but reading the code yields a completely different image of their comprehension.