The U.S. president Barack Obama wants to learn programming and so does former New York City major Michael Bloomberg. Germany’s chancelor Angela Merkel does not, but reports tell us that her cell phone connection was spied on by the U.S.A. As long as it doesn’t turn out to specifically have been Barrack Obama’s code which cracked Angela Merkel’s cell phone, I’ll stay out of politics and focus on the question: Should you learn to code?
The short answer: No. Don’t waste your time.
The long answer: It depends on your age and your goals.
The confusion arises from different goals you might have for learning how to program. I see the following possible reasons one might want to learn coding:
- To gain basic literacy in an increasingly technical world
- To prepare oneself for a career in software development
- To better understand or work with software companies
Coding skills help you with 1. and 2. They won’t be of much help with 3.
There are actually two different things you may want to learn, and people confuse them and call them both “coding”.
- There is programming (coding) as a single-person activity, in which you instruct a computer to do things for you. For example, by entering a couple of formulas into a spreadsheet. Or some code that fixes up a random mess of files on your drive. Or some code that charts some graph with interesting data.
- Then there is software development, a team activity, that you carry out to develop software for yourself or others to use. Almost all non-trivial software was developed by a team; many skills are needed to develop the software, programming ability is only one. Understanding customers, designing user experiences, operating a service are others.
Programming as a single-person activity is called “programming in the small” while programming in a team is called “programming in the large” or “software engineering”. As a professor of software engineering I feel a need to educate people that both activities are very different. For programming in the small, all that matters are your coding skills. For programming in the large your social skills come to the forefront. Programming in the large projects are intense team efforts where coordination and communication issues trump programming problems.
You can learn basic coding skills with one or two courses. To actually put these skills to practical use will require more work, typically consisting of a lot of trial and error while you swear at your computer screen. If you are beginner, you are in the painful world of syntax errors (the computer tells you it doesn’t understand what you want) and if you are an intermediate developer you are in the world of software bugs (the computer is doing something but not what you want). You want to do this, if you want to gain basic literacy with computers to more easily navigate our increasingly technical world. It will allow you to things that go beyond the obvious you can do through an end-user interface.
If you want to become a programmer and earn your living this way, you’ll need much more than a couple of programming classes. You’ll need time and practical experience, because much of the complexity in computer programming is random, so you have to memorize it until you see the patterns emerge (or not, as many times there aren’t any). In addition to good courses and a lot of persistence and pain tolerance, to become a good software developer, you’ll also need to understand how software development works. As mentioned, software development is a communication and coordination problem, and you’ll learn absolutely nothing about it while trying to solve coding problems in isolation. So, if you want to learn outside a job, try joining an open source project, where you’ll be able to learn about team work.
If you want to take a non-programming position in a high-tech company, I don’t think it is necessary to get there through a programming job. You can gain the necessary understanding of software development communication and coordination problems by joining an open source project in a non-programming role. You’ll be able to gain an understanding of what’s real and what’s not so that you’ll be able to tell if someone in a company is trying to pull a fast one on you. It is this ability to relate product requirements or software architecture discussions to reality that will help you better understand software companies, work inside of them, or employ them. I don’t see how knowing how to code “quick sort” or any other introductory course algorithm helps you understand whether a product feature is nonsense or choosing a particular open source library is a good idea.
If you are a top-notch programmer, you will have acquired skills that will help you understand project, product, or engineering management decisions. However, this is about the most arduous way of acquiring these skills. I don’t understand why someone would want to climb the north face if there is an easier way up the mountain, like helping an open source project in a non-coding role.
If you want to become a programmer, you’ll have to learn to code, but it will take a fair bit of time. If you want to solve programming puzzles at home, a few courses will do. If you want to gain a better intuition at how to handle unruly ATMs and other weird user interfaces, some programming courses may also get your thinking straight (or twisted, depends on your perspective). If you want to be able to work in high-tech in a non-programming role, I recommed you try helping an open source project to learn about communication and coordination problems in software development.
So, what gives? U.S. President Obama should not learn to code; it is not worth his time. (He should also leave my Chancelor’s cell phone alone.) Depending on your job goals in high-tech, you may or may not have to.