I am a beginning programmer and in 5-10 years I'd like to be an expert. I love programming because it is a distinct skill set that you can continually improve on. But then I thought, how can you continually improve? At a certain point, don't you just "know" how to program? I imagine, just like at most things one can be great at, that, at the top, the difference in skill is probably minimal. So what makes a better programmer? Clearer code? Faster understanding of concepts? Being able to write a post on SO without it being closed? (I feel like this post is doomed, but it really is a question I was wondering.)
As with any skill it is a little like a fractal picture. Looking from a distance it looks simple. The closer you get the more you realise how complex it is.
The better you are the more you realise how much there is to know and how little of it you know. As you get better (as long as you keep your desire to improve) you will find new ways of looking at programming and you will find ways of improving even old techniques.
You will get faster, better at conveying your intention through the layout of the source code, and better at problem solving.
Of course the law of diminishing returns applies. It will take you longer to improve by the same amount when you have done 10 years than when you have done 1.
how can you continually improve?
You continually improve by working hard and setting the bar a bit higher each time.
At a certain point, don't you just "know" how to program?
At a certain point (around the age of 3-5 years), all world-class athletes learn the most basic skill of their career, namely running. But that does not mean that a six year old can break any athletics world records. Again constant practice and discipline are required.
at the top, the difference in skill is probably minimal
Yes, no doubts about that. But take a closer look and you will see that the top is NOT quite a stationary thing. Every few years, the top domains change, and with it the skill sets to ride the change. You can either have your lunch, or be somebody's lunch.
So what makes a better programmer?
- attitude: ability to stick to a problem when stuck.
- attitude: ability to ask others (and help others too) when in doubt, and you are stuck for a long time. Being humble is important.
- attitude: ability to stick around enough. (most important, imho)
Things like writing clearer code and a faster understanding of concepts come easily after you have been coding for some time, and gone through the cycle of understanding and implementing something for the first few times. And in the end, the code that you write today will look bad to in a few years' time. Hanging around programmers.stackexchange and stackoverflow for some time taught me that there is a lot of scope for improvement for me. Sometimes, just reading people's answers takes you to insights you would not have otherwise reached. Such things remind (at least) me that the more you improve, the more scope for improvement there is.
Imagine what the responses would have been had you asked this question 30 or 40 years ago.
The world of development will never stop moving (if nothing else, Microsoft wants to sell new versions of C#).
Even if you somehow manage to learn all known development techniques (functional programming, coroutines, continuation passing style, lock-free data structures, ...), new ones will still arise.
New fields of development will also arise with improved hardware. Multi-touch screens, 3D displays, motion tracking, biometric sensors, and other IO technologies all create new challenges of UI and functionality.
While the fundamentals of programming may not change, a lot of other things do change and this is part of I think what you missed. Look at what kinds of architectures and hardware we have now that we didn't have 10 years ago. What kinds of software ideas will the cloud and social media create as what a computer is becomes even more blurred.
Learning domain knowledge will help as you could pick a specific type of software like a CRM or ERP. Even then there can be advances in platforms so there is usually new things to learn or changes in requirements that people will want.
There will always be room to improve as one shouldn't underestimate human creativity. Consider how creative are hackers and those that write software in an attempt to capture or beat the hackers, assuming the general meaning of hacker as someone that breaks into systems without authorization and performs malicious acts.