I have called the software industry an industry of amateurs. We are a young field, and I don’t think we’ve yet graduated into a true profession.
True professions have some defining characteristics. They have a common body of knowledge that all professionals understand and adhere to. We do not have this in the software industry. Programmers learn programming languages in school, but they’re rarely taught how to actually create a well-written program. In fact, terms like “well-written” and “good code” are highly subjective because we don't yet have a definitive description for what “good” is in our industry.
This is ironic because the waste in the software industry is some of the greatest expense to our society. We know that there's a lot of waste in our industry, but we have not yet determined how to ferret that out.
Take, by contrast, medicine or the law—or even carpentry. There are defined paths for becoming a professional in these fields. There is a known body of knowledge that all professionals have, including a common terminology as well as industry standards and practices.
You can’t become a lawyer without going to law school. You can’t become a doctor without going to medical school. And in both cases, you're required to go through a long and intensive apprenticeship or residency where you’re working with real professionals on real cases. Even carpentry has an apprenticeship model where you learn on the job from a master carpenter, and there is an external body that certifies candidates in all of these fields.
Software development has none of these things. You can go to school and study computer science or software engineering, but it's not very relevant to what you need to know in the field. Just as many professional software developers do not have a computer science degree as those who do.
Furthermore, there is no apprenticeship model in the software industry. And because schools are at least twenty years behind the times, actually doing the job while being lucky enough to apprentice with someone who’s been doing it for a while is the only way to really learn the state of the art of software development.
True professions have a defined path of entry. You can't just hang a shingle on your wall saying you're a doctor. To be a doctor, you must graduate medical school and be part of a rigorous residency program. Nurses, too, have to undergo intensive training in order to become professionals. Lawyers have to pass the bar exam and then serve an internship with an attorney.
To become a programmer, you simply have to declare yourself a programmer. I know people who call themselves programmers and only write HTML. HTML is not a programming language, but even when you know a programming language or two, it doesn't necessarily make you a professional software developer any more than memorizing some words from a medical textbook makes you a doctor.
Around half of all professional software developers are self-taught, meaning that they did not study the subject in college. In truth, all professional software developers are self-taught, because the skills we need on the job are rarely covered outside the workplace. We learn as we go.
It’s easy to become a mediocre developer. Making a computer do a task is really not that difficult. But just making the computer do a task is a very small part of being a professional software developer. We must write software in a way that communicates our designs in the code so that others who come after us can understand, maintain, and extend the software we write. We also must communicate and collaborate on a team when building software professionally, and I rarely see schools offering those courses to engineering students.
True professions have standards and practices that are defined and enforced by some kind of oversight organization. In the US, for medicine it’s the American Medical Association, and for law it’s the American Bar Association. The software industry does not yet have this. We don't even have any organizations in our industry that are candidates to become this.
Employers think that software development skills have to do with technologies, so they hire programmers with experience in specific languages or frameworks, but these are just tools. It's like hiring a carpenter based on whether they've ever used a nine-pound hammer. If you know how to swing a hammer, then the size of the hammer shouldn’t really matter much.
A good software developer can learn a new technology in a matter of days, but becoming a good software developer can take many years. The key skills have to do with problem-solving, writing maintainable code, and being a good communicator. Software development is a team effort, and being able to collaborate and communicate are critical skills in developing software.
Software development today is one of the easiest professions to get started in. Everyone has a computer. You can download programming languages like Eclipse for Java and many others for free. As long as you have the time and the patience, you can learn a programming language.
Like many professions, software development can be very challenging to master. There are a lot of mediocre programmers out there but very few true masters in software development. We are a young profession and we're still figuring it all out. We've come very far, but we still have a long way to go.