Chapter 1. What does it mean to be a professional?
A professional is someone you hire when you lack the expertise, time, or resources to solve a problem on your own.
The key element here is solving a problem, not having the expertise. A hobbyist doing something for fun, or a performer showcasing their mastery for others to admire, can be equally skilled. What distinguishes a professional is the purpose of solving their customer's problems.
And this requires a radically different mindset.
Three mindsets: passive, active, and proactive.
Imagine hiring a chef to prepare meals for you.
The PASSIVE approach would be to blindly follow instructions. You'd have to know not only what dish you want but also how to prepare it, and provide a detailed recipe to the chef.
Because it's you who knows the recipe the best, you may even have to micromanage the process a bit along the way, tasting, checking how well done the dish is, and so on.
In this case, you probably wouldn't even call your hire a chef. Apart from the rare instances where you are the expert on the matter and just need unqualified help to save you some time, this mode of working is undesirable. And even the benefit of saving time seems dubious, considering how time-consuming it would be to prepare such painstakingly detailed instructions.
The ACTIVE approach would be to receive a set of high-level requirements (what kind of dish, how well done, spicy or not, which allergens to avoid) and prepare a delightful meal without further detailed instructions or micromanagement.
In this mode, you still need to precisely know what you want, but you don't need to understand how to achieve it - your chef will handle it, likely much better than you ever could on your own.
This approach has practical uses. For example, it's what you typically expect when you go to a restaurant. But it may prove insufficient for more complex or extensive cases, where you have only a vague understanding of what you want.
The PROACTIVE approach would be to receive success criteria, such as "I want to organize an all-night wedding party for 30 people", or "I need to provide healthy, balanced catering for school kids, with meals not repeating over the course of a month", then take care of the entire process end-to-end.
In this scenario, you don't really know what combination of dishes would work best - you just know the end result you want to achieve. And it is up to the chef to not only prepare delicious individual dishes but also to decide on the complete meal plan.
This demands more from the chef and is often more expensive for you as the client. But it yields the best results, as the chef is now focused on your holistic success, not just individual dishes. When hiring a professional, this is where you most often want to be.
And it's particularly true for complex, team-oriented endeavors such as software development.
The nature of modern software development.
As Marc Andreessen famously said in 2011, software is eating the world.
Modern companies depend on software as never before. Even if they don't sell it directly as a product, software is still fundamental to driving their operations and growth. It's critical for their customers, employees, suppliers, and partners. It's the engine that runs the business - and the network that connects it with other businesses. It's the cornerstone of the company's success.
At the same time, the software got bigger. Much bigger. And the software development process got incomparably more complex: Huge teams. The whole portfolios of products. A vast network of interconnected APIs. Complex distributed architectures. Tens or even hundreds of external vendors. Constant progress at a crazy pace. Cutthroat competition and continuously changing user tastes. No manager, analyst, or architect is able to micromanage it all. The responsibility for the company's success has to be distributed.
This means that every developer needs to be a proactive chef, not just tech leads and managers.
Raising the bar for professional software developers.
The concept that a developer shouldn't just churn out code like a robot isn't new. Terms like "cowboy coder" or "code monkey" predate my 20+ years-long programming career. However, their original definitions were limited. They referred to a programmer who simply writes code according to given specifications, avoiding more conceptual, design, or architectural work.
Nowadays, that definition doesn't cut it anymore.
With the complexity, teamwork, and user-centricity of modern software development, the game has completely changed. It's no longer sufficient to design, architect, and code the technical aspects of a system effectively. Professional developers must act as proactive chefs. We're hired to generate business value. To help our companies grow and thrive. To help them achieve - and sustain - their success.
Therefore, my modern, revised definition of a code monkey is: A code monkey is a developer who contributes only to developing software, not to the holistic success of the company.
This definition is more ambitious. It demands a completely new mindset and a different, broader set of skills. It might even seem intimidating. But it's achievable, and becoming a true professional is immensely more satisfying than being just a micromanaged, mindless drone.
However, to make this leap, you first need to understand what makes companies successful.