Depending on who you ask, I’m decent in the kitchen. I know a lot of the basic techniques – I can mince herbs, caramelize onions, toast nuts, and dice vegetables to various sizes. I have (and understand how to use) tools from a garlic press to a food processor to copper-clad pans. I have Pink Himalayan Sea Salt in my pantry. I have at my disposal recipes for foods ranging from ice creams and pies to chilis and stews to beef wellington and black pudding.
Does that make me a chef?
Software development is a very lucrative field right now, so it’s no surprise that people are trying to figure out what they need to do in order to succeed. As a result, “How to be a Great Programmer” is a pretty popular topic for blog posts and online advice columns. And to be fair, there tend to be a lot of good ideas in these posts. Name your variables well. Write tests. Learn architecture patterns. While these are good ideas, though, they all boil down to one thing: “write good code.”
Does that make you a software developer?
I may have some technical proficiency with cooking; I have tools and ingredients and I know some nice recipes. But being a chef is a lot more than that. Chefs have to be able to create, to be inventive with their medium – nobody wants to eat at your restaurant if the food you’re cooking isn’t different. They have to be able to adjust – the soup came out too salty, or the stew’s too bitter, or the seasoning on the meat just doesn’t seem right – a good chef can figure out how to salvage these mistakes, where someone like me without that experience might just shrug and attribute it to the quality of the recipe. Chefs can step outside of any one dish and think about the meal as a whole – after all, it doesn’t matter how well-prepared the fish is if it’s overpowered by the sides.
Someone who has the tools and the techniques; someone who can follow a recipe competently and adhere to the basic rules of the kitchen, they can most certainly cook. But in order to become a chef, they have to do more – they have to master the tools and the techniques, for sure, and along the way they learn hundreds of recipes, but they also develop a capacity to go off-course. They learn to break the rules when it makes sense, and how to tweak recipes to suit their needs, and invent new tools and techniques when the old ones aren’t sufficient. At heart, chefs aren’t people who prepare food – they’re people who solve problems with food (although admittedly the primary problem is satisfying the demands of their restaurant). That extra layer is what separates people who can cook from people who lead successful lives as professional chefs.
The same applies to being a software developer. You can have the tools necessary to write code; you can learn some of the rules and guidelines; you can practice with the frameworks and follow tutorials. But to really be a software developer, you have to go beyond writing code. You have to be able to be inventive and willing to break the rules when they don’t make sense. You have to be able to deviate from what you’ve done before in order to deal with an issue. You have to understand that software developers aren’t people who write code – they’re people that use code to solve problems. Much like the layer that separates chefs from “people who can cook,” this extra dimension differentiates people who can code from people who are successful as software developers.
So if you want to learn to write good code, practice with your tools. Learn the latest frameworks and languages. Follow the tutorials and learn some programming recipes.
But if you want to be a good developer, learn to solve problems. If you encounter something you think is impossible, try to prove yourself wrong. When you don’t know how to solve a problem, don’t give up; dig deeper. Try to write code that solves other people’s problems, and practice turning their ill-defined requirements (and, trust me, they will be ill-defined) into well-defined code. Of course you’ll want to learn all the techniques and tools as well, because good software developers write good code – just don’t think it ends there.