Defining software development

Let’s take a look at the typical Agile Software development workflow. First, we would like to clarify what we mean by software development. Paulo has a BSc in Computer Engineering, and a Msc in software Engineering, and all of us have been working with software development for the last 16 years. You would think it would be easy for us to describe what software development is. It turns out, though, that whenever we try to explain what software development is, we use the terms “like” and “similar to”, or we compare it to another industry. 


A quick search about software development online (“software development is”, and “software development is not”) and we realize we are not alone:

Software development is engineering…
Software development is mostly an art…
Software development is science…
Software Development is like Manufacturing…
Software development is a design activity…
Software development is similar to rock-climbing…
Software development is, and has always been, a religion…
Software development is not an engineering discipline…
Software Development is not Anarchy…
Software development is not science…
Software development is not like manufacturing…
Software development is not like many of the "hard" engineering disciplines…
Software development is not a simple process to be achieved in one day, it is a complex process…
Software development is not a Jenga game…
Software development is not a production or a manufacturing activity…
Software development is not a religious experience…
Software development is not an art…

Perhaps this indicates that software development means different things to different people. There is nothing wrong with that.

Lately, our industry has been more inquisitive about software development and the role of the software  developer. Much of this is due to the Agile movement. In the last decade eXtreme Programming, and more recently the software craftsmanship movements have, in many ways, rekindled the debate about software  development.

This debate has been very good for software development. It has generated many new ideas on how to go about developing software , organizing teams, respecting people and evolving practices.

Prior to the influence of Agile, Birrell, N.D 1985 ’s book APractical Handbook for Software Development has a concise definition for software development:
Software development is the process of creating a computer software. It includes preparing a design, coding the program, and fixing the bugs. The final goal of software development is to translate user needs to software product.
The nice thing about his definition is that it does not compare software development with something else: engineering, science, art, rock climbing or religion. But in order to agree with the definition, you have to consider that coding the program has many activities. For example, writing tests, automating, and integrating are all part of coding the program. Similarly, preparing a design is more than just the design of the system; it should also include the requirements definition, user experience design, and even how to break the work into smaller workable pieces.
 
The problem with this definition is that it has a very narrow final goal: “The final goal of software development is to translate user needs to software product.” Similarly to Lean Thinking, we would rather look at the goal beyond the simple building of a product. The goal is to enable continuous improvement of teams and processes, in addition to delivering the software product.
In Lean thinking this is the Kaizen concept (translated to English as “continuous improvement”). In Japanese language Kaizen means “change for good”. 

The authors of ScalingLean & Agile Development have a good description for Kaizen:

Kaizen is both a personal mindset and a practice. As a mindset, it suggests, “My work is to do my work and to improve my work” and “continuously improve for its own sake.” More formally as a practice, kaizen implies:
1. Choose and practice techniques the team and/or product group has agreed to try, until they are well understood
2. Experiment until you find a better way
3. Repeat forever