Software Development: What on Earth Are We Doing?

A journey into the deep, complex world of software development.

Recently, my projects and discussions have brought me face to face with the question: What is software development? This topic is currently occupying my thoughts. Many people think they understand what it is, but in reality the perception is often biased. I find Alberto Brandolini's quote particularly applicable:

Few people have done more harm to software development as a profession than those advocating that “software development is like building a house”.

I think this quote highlights the detrimental effects of oversimplifying the software development process by comparing it to building a house. First and foremost, the comparison of software development to building a house is misleading and damaging. Unlike construction, which often follows a linear and predictable path, software development is inherently iterative and adaptive. This misconception stems from a fundamental misunderstanding of the creative and exploratory nature of software development. It's about solving problems in unique contexts, not just assembling predefined components from a static blueprint.

Unlike building a house, which usually follows a linear, well-defined plan with a definite end, software development involves continuous adaptation, evolution, and iteration based on changing requirements, technological advances, and user feedback. The quote underscores the importance of recognizing and appreciating the unique challenges and methods of software development in order to avoid underestimating its requirements and intricacies.

But it seems that developing software is only equated with writing code. However, the understanding of what goes into developing a software product is often lacking. It's not uncommon for people or organizations to decide up front for instance that they need a mobile app, when a quick review might reveal that using services with a small web app would suffice.

I have observed that developers or offshore providers are often hired to implement a product without having any connection to the domain. The requirements are unclear and require intensive involvement. The consequences of implementing without considering operations, environment and costs, or availability and performance requirements are often overlooked. Nasty surprises arise when a cool product idea is crammed into a CMS like WordPress due to ignorance, lack of communication or not asking the right questions.

On the other hand, large enterprises see developers as individuals who are familiar with frameworks, know a programming language, and can poorly translate defined requirements into technology. They seek resources for their projects under this guise, believing that they need a Java developer with experience in their industry. To this, I say absolutely no! Why? Because they need someone who understands coding as a craft. That's only the foundation, but what they really need is someone who is willing to engage with the domain, ask critical questions, and develop a shared understanding of the domain and the product. Writing code is actually the smallest part.

Software development is about continuous learning, a fact that is unfortunately often forgotten. When Domain-Driven Design is applied, or at least attempted, it often boils down to mere technical concepts. I believe that strategic design is far more important. For example, event storming is great for understanding your domain and defining bounded contexts and subdomains. This makes it easier for everyone to communicate, and you can tell early on if developers are willing to engage with the domain, rather than just mechanically process tasks. If you're considering using microservices, event storming can help you define the boundaries of your services. I believe that the role of the "unthinking programmer" who simply translates business requirements into code will struggle to compete with new technologies like AI.

As we look to the future, the role of the developer is undoubtedly changing. The rise of AI and other technologies is challenging the traditional view of the developer as a mere programmer. Instead, the ability to think critically, learn continuously, and collaborate effectively is becoming increasingly important. These skills enable developers to make informed decisions, rethink and revise their approaches, and navigate the complexities of modern software development. Software development is about making decisions and being prepared to take a step back and revise. It's a process, a learning process. And above all, it's about communication and collaboration with stakeholders.

In conclusion, my experiences and reflections underscore a fundamental truth: software development is much more than writing code. It's a complex, nuanced process that requires critical thinking, continuous learning, and collaboration. As we move forward, embracing these aspects will be critical to creating software that truly meets user needs and stands the test of time.

Subscribe to Rico Fritzsche

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.