There are a lot of articles on the net about how to be a better programmer, but this post is about how I see the path towards becoming better in our daily activity: programming.
I'll start this post by publicly declaring that I don't consider myself a good programmer. I know that there is a lot I don't know. There are areas where I am not as good as I wish I was. And sometimes I do feel sad that I am not a great programmer. But then again, there is this article about self esteem Why I feel like a fraud.
Saying that, I really don't know why I got promoted to Senior. Am I better than average developers? Or was I worse than average, and now I am average? I don't know, I will just try to focus on improving myself, and if my superiors consider me good enough for another promotion, great.
The way I see it, there is no way you can become a great programmer in a year or two. Hardly in three years. No matter how many books you may read you need experience, and that comes with time.
Experience is all the stuff you accumulated in your head, solutions to common or less common problems. How to deal with certain stuff. So when your next task comes, you may solve part of it using knowledge gained from your experience.
On the other hand practice is all the stuff you do, all the ifs you write that become in the end an automatism that you don't even have to think how to write them. You don't have to think to end a line with ;, it comes naturally. Also by practice you gain experience. The more you practice the more actions become automatisms and the more experienced you become.
Only by programming at your day job is not going to make you good at it. Only by going to college to learn programming is not going to prepare you for your future career of software developer. What is required is devotion. If you are not devoted drop it, go learn law.
Your path should start when you're in high school, writing some small apps just for fun, then comes college, you have to have ambition to make apps and try release them on the world wild web (you'll have to fight with the frustration), be part of open source if you like it. College is when you have to come in contact with professionally written code, to learn about how code should be actually written.
Unfortunately a lot of starting programmer get thrown into programming life unprepared. They get into a company as juniors, and only then discover how software is actually done.. in best case.
Being surrounded by a lot of geek folks, that have the experience is a marvelous thing. You can learn "the stuff". You're a junior and don't know how exception handling should be done correctly? They will give you a crash course on that. How to organize files in big projects? You can learn by studying the solution organization. Have little experience with N Layer architectures? As a student it seems like a logical and great thing to do, but only out in the real world are visible the problems that come with it. Also this are the guys you can brain storm when you need a solution to a problem and have some hard time to find it. And here comes a little advice: don't be afraid to ask advices, it can save you so much time!
Over time you gain knowledge (experience) that you can pass on, and that is a nice feeling when you can help others.
Ok, but I was saying that day job programming is not enough for being good. I showed the path as far as I know it. But on this path there is also the continuous practice at work and home. Spending nights trying to finish your next "killer app", thrilled by some new technology you discovered recently. You don't get to use a wide range of technologies at the job, so playing home with all the "goodies" is a must. You like mobile development but at the job you do only ASP.NET? No one is stopping you from writing an app for Android or iPhone. Play with it, may be in a year there will be a project in your company and you could jump in. You never know. That what experience is all about. The more experience you have the more options you have.
To read a lot of articles an how-to on the net is natural. But how about books? How many books did you read in the last year?
If you think you can learn WPF or ASP.NET without reading a good book, stop. Not even having around you ten colleagues that are experts in that technologies. Yes, you will learn the basics, some tricks. But at every step you'll have to ask for help, or even worse, make mistakes because you thought you know how to do something.
Before starting a new technology take a book. Read it from start to end. Do Some examples along the way. After half a year or a year, when you think you know the technology, read the book again from start to end. You will find things that you missed the first time or forgot about. And don't forget to check "what's new" in the new versions of the technologies you work with. All that will help you master the technologies. It's par of the practice process.
And let's not forget about the technologies we dislike but we have to work with at the job, or when the project enters the stabilization stage before final release. It's a tedious process, but you have to do it. You have to prove that you are good at it too. A good programmer must be able to do a software product from the start till the end.
One more thing I consider very important is the company you are working in. Let's say the company hires a junior developer. In a year he gains enough experience to be promoted to developer. This is the fastest evolution. And I say evolution because the programmer learns the process of doing real world software. But to grow further that is not enough. Many programmer are self motivated to learn, many are not. Along with the promotion there is usually a raise in the salary. The companies suppose that this is the motivative factor for the programmers to get better and better. But this is so not true.. Think for yourself, the last time you got a salary raise, how much time you were thrilled and were saying to you that you have to work even harder to be promoted next year too? A month after the raise? Two months? And what was after that? Again frustration that you are given to do stuff that is boring (ok, may be you have a different thought but the essence is the same).
Encouraging the employees to take certifications is a good start I think.
I posted a link to The surprising truth about what motivates us in a previous post. After watching it I stood and tried to figure out what a software company could do to motivate a programmer, and so far I haven't come up with a good answer. Here is one idea that came up: how about suggesting to the teams to come up with an idea that they like, a project just for fun, and work on that one outside working hours (whenever they fill like it), but with support from the company - may be some hosting, helping with organization, logistics if necessary, small stuff that does not require a lot of involvement. If your company owns a 10 store building may be build a giant tetris game? It's old but still geeky.
One demotivational factor is working overtime. No matter if it's payed or not.
I end here this article, as my inspiration for today has been exhausted. I hope to see some comments from you on ways to become better, share them with the world!