In the last years, from time to time you could watch discussions on the question “should everybody learn programming” or “can everybody learn programming”. There are valid arguments on both sides, but I think the main problem on this issue is the lack of a definition what ‘programming’ means in that context. Or better: What level of programming are they talking about?
Imagine the same discussion on the question if everybody should or is able to learn mathematics. Whoever responds with a clear ‘yes’ is probably thinking of the basic addition, multiplication and percentages that everybody learns in school. Whoever responds with a clear ‘no’ is probably thinking of calculus and mathematical proofs, which many students do not master and do not need in their professional lives. With this analogy, you don’t need to be a computer scientist to see that they are arguing a topic without a common understanding of the question.
Instead of the question “can everybody learn programming” you should either ask “can everybody learn the basics of programming” or “can everybody become a professional software developer”. And you can get the answers on both questions on your own by replacing ‘programming’ with ‘math’ and ‘software developer’ with ‘mathematician’: The first one is yes, the second is no.
Not yet convinced? Fair enough, I left out the reason for my claims. Here we go.
Programming has three levels
The process of becoming a software developer includes three stages:
- Learn your first programming language
- Use programming to solve problems
- Get familiar with tools, frameworks and practices to build real-world software
The first stage is learning the basic building blocks of programming: Loops, conditions, assignments, data types, procedures. It nearly doesn’t matter which programming language you start with (some are better, some are worse as first languages) and which book you open, you will find the same building blocks. To stick to our analogy, this is like learning addition, multiplication and percentages in maths. Nearly everybody is capable of learning that part, but it is far from being a mathematician for living.
The second stage is critical: You have to be able to transfer your basic knowledge to new problems and come up with solutions on your own. This part is not about memorizing knowledge that someone is teaching you. You have to understand a problem, divide it into sub-problems that are small enough so that you have an idea how to solve them and create the solution for the overall problem out of that.
Is everybody able learn that? From my experience – no.
How were your math classes in high school? Do you remember that some kids just knew how to solve the tricky problems, and others never could no matter how hard they studied?
Luckily, in school everybody can pass the math class with a medium grade by just studying. But the top grade in maths, solving the hard problems, that’s nothing everybody can achieve. Because it’s not about learning and repeating, but coming up with an approach to an unknown problem. Either your brain is wired in a certain way that allows you to do that, or not.
Don’t get me wrong, if your brain is able to come up with own solution, you still have to practice. If it’s not, there is nothing you can do about it. It’s not fair, but that’s how it is.
Once you got use to come up with solutions for problems, there is still one step to go: In a business environment, you don’t start development at the very basics. Just like a mathematician in a bank does not invent all the formulas from scratch – he would be able to, since he mastered stage one and two, but it would take years to re-invent everything that is already known. And nobody would pay him to waste his time on that. As a software developer, even if you start a new project with an empty code base, you are going to build on top of libraries and frameworks, using tools and practices that will make you fast and productive once you learned to use them.
This step is not a challenge of skill, but it takes a lot of time and energy. That means: You can only make it if you have fun programming, otherwise you will fail on the way. And: It’s easier if you are already in an environment of professional developers instead of learning that on your own.
Having explained that, let’s get back to my original claim: Everybody can learn the basics of programming, but not everybody has the required talents to become a software developer and make a living. Therefore, should everybody learn how to code?
I think there is a point to the argument that today we are surrounded by software everywhere, and knowing the basics of programming can help you understand the potential and the limitations of all the software you interact with in your daily life. On the other hand, programming is not as essential as maths, because you cannot apply basic programming skills to anything in you daily life if you don’t become a professional software developer. Maths is the opposite, you need to calculate prices and estimate odds every day, and the better you are at it the easier your life becomes, even if you don’t work in a field related to maths.
Therefore I will rule: No, there shall not be mandatory classes in programming for every child in school. Programming is not the same level as reading and writing and maths. There should be optional computer science classes in school though, because everyone with a slight interest in computers should be able to find out how software works – either to be a software developer, or to be able to understand how software works and does not work; because every other profession is highly affected be software, be it medicine or engineering or law or general business.
The golden path
As a bonus, let me answer the obvious follow-up question: If not everybody is capable to become a software developer – should you even try?
If you feel software development could be for you: Then yes, you should try. The opportunities are overwhelming, and it’s still easy to retire to a career of management or consulting or business if you were writing software in a certain field and don’t want to continue any more.
But also, you should minimize your risk while trying. Since the is the risk to fail, try in a way so that you will fail early.
- Modify the examples from the tutorial. Come up with ideas to build something similar, but different. Do try&error, google your way through, ask for help in forums like stackoverflow. Do this step as soon as possible! Don’t waste month of doing tutorials without trying something on your own. If it turns out that you cannot come up with working solutions for your ideas, then software development is not for you and you want to know that early.
- Once you are able to start with an empty project and write a small game or application, you are ready for the last step. Learn how to use Git and how to write tests for your programs. Have a look at job offers in your area – is your first programing language something companies ask for? If not, it’s time to switch to a high-demand programming language like Java. Don’t be scared, learning the second language is way easier than the first. Find out how to use external libraries in your project, how to connect to a database and run a web server.
And then apply for a job. Don’t wait until you feel ready, consider your first job still part of step 3.
If you are young and you don’t rely on a high salary, you can go for an intership or working student position. This will make it easy to get hired, and in only one year of working aside professionals your skill and market value will go through the roof. Then start to apply for a full time position after six to nine month.
If you are already a professional working in a different area, and you cannot afford to quit your job for an intership in software development, it’s harder. You have to build your skills until you are good enough to be hired for a full-time job, without the opportunity to spend your day time on coding and get the training and support of other professionals in your company. To do so, you should start a new pet project every month and publish it to your GitHub or Bitbucket account, which you can use as are portfolio in your job applications. For each project, try to get as much feedback from experienced software developers as you can. Since you are reading job offers in the meantime, you will notice what a basic set of technologies is that you need to know to contribute in a company. Don’t try to become an expert on anything without having a job. Just make sure you have heard of all of the technologies in a certain job offer, and best case you have built all of them into one of your projects already, and then apply and try to get the job. “I don’t remember exactly how that works, but I’ve build something like that, I can look it up on my GitHub page” is a perfect answer in an interview as junior developer.
Good luck and have fun!