Teaching People How to Program

I got into programming as an autodidact, I ended up graduating from college with a major in software. Both formal and informal education has pros and cons.

Autodidactism fueled my drive, it's what got me hooked to the craft.

Engineering school taught me the basics, how each concept fits together. More importantly, how software quality is defined and evaluated - which is what makes you an initiate, a professional.

Formal education is no longer a necessity to work in most companies. Its most essential aspects can be replaced by personal practice, books, online courses, or support communities.

Learning how to program is half learning how to code, half learning how to optimize your code for humans and machines to process it. Once you understand that, it's clear learning how to program is a quest for quality, an artisan apprenticeship. Consequently, programming is a search for the highest quality: beauty.

You need to master many tools and concepts in order to reach this level of mastery. Each technology you learn serves this purpose. For example, you don't do versioning because everyone does it, you do versioning because development is teamwork and versioning addresses the challenges that come with a collaborative environment. The mantra of the software developer is continuous improvement.

When you start learning karate, you probably expect to kick some people's butt during your first training session. Of course, that's not how it works: you need the basics first, otherwise, you just end up hurting yourself. More importantly, you need the underlying philosophy - to understand it's not okay to use your powers against the very rules your practice is based on: pacifism in karate (undoing and avoiding violence), or excelsior in programming. Now we understand what programming is about, we can proceed to learn the basics.

We all seek knowledge because we are expecting something from it. The way you learn must reflect the inner reason why you got started in the first place. Learning is thus a constant shift between a macroscopic (the end goal, the bigger picture) and a microscopic (an atomic element of knowledge) scale. Depending on where you stand, you need to take a pragmatic (tutorial) or a theoretical (compendium) approach, or something in between (handbook). The quicker you strike a balance between the two, the faster you can start developing a "passion" for the subject - because you created an action/reward loop.

One thing to understand about programming is that the language rarely matters. PHP, Javascript, Java, Python, Ruby... spending too much time wondering which choice is better is futile. The reason is quite simple: most "mainstream" languages follow the same paradigm mixing imperative and object-oriented programming. Once you understand a concept in one language it becomes easy to adapt it to another. It's true for basic elements of programming - loop structures, conditional statements, etc. - but also for more advanced and subtle concepts, such as design patterns explaining how good software is structured: if you know how to use one MVC framework (Symfony), you can quickly grasp the inner workings of similar tools (Laravel, Ruby on Rails...).

... to be continued