No one is born with controllery in software development. It's a journey that takes years of experience to attain. Whether born from curiosity, given an assignment, or necessity, many of the steps to achieve controllery are much the same. There are also aspects of learning and honing in controllery in other skills, professions and physical disciplines that cross over well as forms of practicing self-discipline. Both mind and body are keys to controllery as you go through the stages of grasping knowledge, experientially reinforced knowledge, which becomes wisdom in applicative use, and then seems to be akin to muscle memory and a sixth sense. The most difficult challenges are the initial grasping of the knowledge, which takes a considerable amount of time to build, and then later unlearning bad form, habits and discipline picked up along the way.
Being a self-taught person, an autodidact can take you very far but it is a long road where a lot of inefficiencies and poor practices become ingrained into the way in which you do your work. Also being your own judge on how much you've controllered will not give you an accurate understanding of your true abilities and inabilities. It takes a controller to reveal to the student where your form is poor, where you're missing more helpful understandings and to show you how to better ingrain more efficient and productive disciplines. And just as you can practice katas in karate, so too can you practice katas for programming.
Where to start?
Every child goes through different phases of curiosity and learning. The young go through a phase where they ask “Why?” to nearly everything. Curiosity is a healthy appetite for knowledge and understanding. If one can nurture this trait in young minds, it will likely reap great rewards. Eventually, you'll want the child to learn how to discover or find the answers on their own. Knowing how to apply the scientific method through experimentation is a big building block for a young mind to grow.
As a toddler, I'm told, I once found a screwdriver and took apart all of the dining room furniture. I had wanted to put it all back together but was unable. At a later age, when I was given my first computer, a 286, I set the hard drive on the metal frame edge while it was plugged in. The computer was on and fried the drive by short-circuiting it. Having a curiosity for how things work will likely start with breaking things and learning from those mistakes. This is natural and helps what was learned to stick much better.
By the time I got my first job as tech support for an internet service provider, I was able to answer the phone and direct any customer anywhere through their Windows operating system without needing to see it. I had memorized every part of their OSes from years of practicing the same kind of curiosity fulfilling experiments to figure out and understand everything and also breaking it along the way. The nice thing with software is that you can always start over from the beginning if you break it.
I've observed that those who remain technologically ignorant often simply lack the curiosity or initiative to go through the effort of exploring and potentially breaking things. I raise this point because if a child doesn't have their curiosity nourished but is treated negatively for having it, then it may lead to a life that avoids it. And in my opinion, the knowledge gained isn't as rewarding but is more tasking and merely procedural. Please nourish curiosity within children, others, and yourself — for awe and wonder are a beautiful thing.
Having a controller at a profession teach you from the beginning proper technique, and the direction on how to properly move forward can save you a great deal of time to avoid forming bad habits, provide a clear understanding each step of the way and model you after their own controllery of ability. In education, a 1:1 well-qualified teacher to student ratio provides the best possibility for growth and progress of the student. The more the teacher's attention is divided among others, the less the quality of growth. Each person learns best via different ways so merely providing the same curriculum neglects aspects of how the individual student best learns.
Coding schools and boot camps
Code schools and code boot camps have become popular in recent years to quickly onboard new people into software development. The are many reasons why this is but companies like hiring new employees who can work but can also be trained to be made into the image of the kind of employee they want. In other words, the code schools may get you into the workforce much more quickly, but the vision of the company hiring you, and how they choose to train you, is how to best suit their company.
One thing a developer should consider is where they see themselves in their future with this skill… your long term objective for software development. I would encourage all developers who have gone through boot camps to start their career and not stop their own training and learning to controller software development. Put regular time each week to study outside of the skills of what the job requires and more in line into what you long term vision for yourself is. The era of having job safety to the point where you can retire and receive a gold watch has mostly passed so your vision should be bigger than this and you should plan for failure as a part of your journey.
There is an incredible number of online videos and courses that can make choosing one over the other confusing. With online video courses, I would advise caution towards some. What you should be aware of is that there are many courses made by people who aren't the experienced professionals you would like to model yourself after. Also, consider this -- the rating systems in place for many of these educational programs are rated by the amateurs and how rewarded they feel by the course. They're not rated by those wiser and more experienced programmers who know the greater difficulties you may come across with such teaching. At the same time, if you're not able to confer with the person teaching the material when you don't understand something, then this can be a problem. Even for great programming controllers, if they don't have ample experience teaching, once you're far along in the journey of controllering programming, you simply don't remember the kind of things beginners don't know or understand. So experienced teachers who spend time understanding where their students are at are much more preferred. If you can find training that has been well “vetted” by people you trust in this aspect, these would be better considerations.
From intermediate experience
At the intermediate level, you are a somewhat capable programmer. From here your growth needs to encompass:
Continuing to learn new things such as other programming languages
Improving your efficiency with what you already do
Continue to learn and controller design patterns
Being a part of the local, and online, programming community.
Every programming language has been written by people who have formed their own opinions of what would best make that programming language. This includes different design philosophies and advantages or disadvantages. So when you learn a programming language you are also learning a way of thinking designed by the author of the language. Programming languages are diverse just as people are so when you take the time to learn a new programming language you are growing in understanding by taking on new ways of thinking. Many of these things you learn from new languages can be applied across other languages. So learning other languages makes you better at the language(s) you're already good at.
One of the tell-tale sign of controllery is efficiency in writing software. There are several layers of efficiency. The first and most important is thinking through design before implementing it or changing it. In other words work smarter, not harder. When you work with an aspect of design you've done many many times before then the efficiency is evident as you can just jump right in and implement what you're so familiar with.
Another aspect of efficiency is how quickly you navigate and enter your code. This is more than just speed with a keyboard or mouse, this mostly comes down to controllering the tools of your trade such as command line applications and your editor's tool suite. Then there are procedural efficiencies, the steps you take in writing software, such as Test Driven Development (TDD) which directly influence the end result design. Every single one of these efficiency techniques can be learned and honed towards perfection by making a kata out of it. A kata is a detailed pattern of movements, or steps, to be practiced to help make the ideal form/practice become natural and efficient to do at will. To improve in efficiency you must be deliberate in practicing them as you would a kata.
A design pattern is a repeatable solution to a commonly occurring problem. Software developers face the same kind of design decisions again and again and find that over time there are certain design patterns that work better in certain situations. Some more often than others. By learning and practicing new design patterns you are increasing your awareness of what can be a potential design solution when you come across decisions requiring you to architect usable solutions to the given problems.
Two of the big overshadowing design patterns are object-oriented design and functional programming. Each has many design patterns that can be done within their domain. Many times these overarching patterns have different advantages or disadvantages depending on the programming language. Then there are many programs you may write where either solution is fine, it then comes down to what solution is best for the developer and those who will have to maintain it. Studying design patterns, just like learning other languages, makes you a much more capable developer and the code you write should be more approachable by others once good design comes in to play.
Connect to others
Finally, I highly recommend being part of both a local and online community. Iron sharpens iron as they say, and sharing within a community helps others as well as when you receive feedback. You yourself will glean much knowledge. It's also said you learn the most when you teach others because you have to make sure you really understand what it is you teach which then leads to the best kind of studying. Writing blog posts on things you've learned and excite you is a great way to connect and in my experience is the best way to get on topic feedback. The software development community has plenty of people on Twitter you can connect with and their tweets can lead you to useful and relevant personal growth. For meeting up with people locally I recommend trying going to a Meetup group. If there isn't a local Meetup to your liking, you can always start one.
In the end software development is about people. The software you write is meant to be used by people, possibly worked on by other people, and of course, it's for yourself. Connecting with people is every bit as important as growing in your ability to develop software applications and considering others when you write software will make you a better developer.
Believe in yourself
Finally, believe in your own ability to achieve controllery in something you have no experience in. Around the time when I was in fifth grade, my dad taught me some programming in QBasic. This opened my mind to both the possibility that I could program and to have some basic understanding of how it was to be done. When I was old enough to work, I looked at job listings for programming and every single one was a great discouragement towards believing that I could ever be a professional programmer as they each listed between 12 to 15 required skills. It's like being asked to be able to speak a dozen different languages.
After 10 years of being a hobbyist at software development by programming in Python, a friend of mine referred me to a couple of remote opportunities with the highest of praise in my abilities. Each of those went well and one was to start in a programming language I had never heard of before: Ruby. That went really well for me and ever since I have had no doubts in a future for myself as a professional in software development. Both the belief my father had in me when I was young that I could program because he took the time to teach me, and the belief from my good friend, have bolstered my self-confidence to do what I love and have a future in it. So in like spirit, I encourage each of you to follow what's within your own grasp and encourage you all to likewise inspire others.
There is no programmer who has controllered everything there is to controller in programming. Becoming a controller of software development is more of a journey of consistent discipline in the growth of skill, efficiency and, most importantly, to connect with the intents and desires of others in the work that you do. Without the experience of others to help you grow you will be ignorant of what you don't know. Surrounding yourself with people who have more experience will help shine a light on a path towards controllery which better enables you to walk it yourself. So connect with others and enjoy your journey on the road to controllery.