Programming is an art, art learned over iterations. Iterations generally start with learning a high level language and developing applications as soon as possible. This method provides an instant gratification and is addictive. Following this approach programmers train themselves in a particular technology stack professionally and start working. All sounds like a fairy tale, until one day when your application halts with a cryptic error message. Decoding which is not at all within the range of your skill set, which could be a JVM error or operating system core dump. Your world starts crumbling as you become aware of limitations of your knowledge and skills.
As observed, it is a common practice for programmers to have skills which are technology specific. I believe the main reason behind this is lack of awareness about need to keep learning and improving programming as a whole set of skills, not just in a limited context of a stack. Obvious side effect of this is ugly code and crooked patterns, which many generations of programmers have to bear with and live with a guilt of not knowing how it works while making it work. This can (or should) affect a good programmers self-esteem.
We have a problem at hand, learning programming with a top - down approach as described above is good in short run to learn high level concepts, complete projects and start earning bread and butter; But in long run this is bound to hamper development of a skilled programmer and instead shape a grumpy employee (in most cases). A programmer who works (only) for money and does not care about his craft and quality of his work.
The other end of the spectrum is to learn in complete bottom - up approach, i.e learn all concepts before writing a single line of code for a real world application. This approach is good but too idealistic. Programming can be imagined like learning rock climbing, we can learn on a climbing wall but to become a professional we need to climb real mountains.
The middle way solution seems to work, where we start with bottom-up approach and learn enough to implement something small but complete and has a real world use case. After first release go back to bottom-up approach learn more and built on top of existing application or develop something anew. This will help us fill gaps in our knowledge and build something usable while doing so. I believe finding a good balance between these approaches is the core of learning programming and becoming a skilled artist.
With this blog I will be starting a series of posts sharing my journey of exploring and implementing above approach. I will keep you posted, would be more than happy to listen your story too.