Table of Contents
Lean Software Development is an agile development methodology inspired by the principles of lean manufacturing (also known as lean production), a production philosophy that aims to minimize waste and eliminate it. The term was coined in the book of the same name written in 2003 by Mary and Tom Poppendieck, two very active project managers within the Agile community, which contains the description of the main methodological approaches and operating tools of the system.
Lean Software Development consists of seven basic principles, all of which are considered extremely important within the Agile community.
#1. Eliminate Waste
Anything that does not add value to the customer should be considered as a waste. Examples of waste: unnecessary code and functionality, delays in the software development process, uncertain requirements, bureaucracy, slow internal communication.
#2. Amplify Learning
Software development is a continuous learning process, therefore training & learning on the job, as well as information sharing (knowledge sharing) is a primary objective. Any learning tool is welcome, as long as it is effective: online programming courses, learning platforms, coding schools and so on.
#3. Decide as Late as Possible
As a measure to mitigate uncertainties, typical of modern software development, an option-based approach is favored, deferring decisions until sufficient data is acquired to be able to correct potentially inaccurate predictions and hypotheses (data-driven decision making).
#4. Deliver as Fast as Possible
In this particular historical moment, characterized by rapid and continuous changes, speed is the strong point of development: for this reason the iterations must be produced in the shortest possible time, so as to be able to receive the feedback to be included in the next one; from this it is also clear that, the shorter the iterations, the better the training and communication within the team, as well as the development of the product.
#5. Empower the Team
Adoption of the work-out technique, in which the roles between managers and operatives are reversed: managers are required to listen to the developers and learn from them the necessary know-how to be able to make the most effective choices each time, as well as provide proposals for improvement.
#6. Build Integrity In
It is important that customers have a global and well-defined perception of the system (perceived integrity): how it is advertised, delivered and distributed, how accessible it is, how intuitive it is to use, how much it costs, what problems it solves and how, etc .; furthermore, it is important that the individual components of the system work well together with a balance between flexibility, maintainability, efficiency and responsiveness (conceptual integrity).
To obtain these results, the use of refactoring is essential, adopting an approach that guarantees continuous improvement and a frequent release system (continuous deployment) that allows the software to evolve iteratively and quickly (continuous integration); it is also essential to adopt development good practices (DRY – Don’t Repeat Yourself and so on) that allow to maintain simplicity, clarity and a minimum number of functions within the code during the various refactoring, as well as an automated test paradigm (continuous testing, testing automation) to reduce regression defects and bugs.
#7. See the Whole
Software systems today are not simply the sum of their parts, but also the product of their interactions. Defects in software tend to accumulate during the development process: by segmenting the various functions into smaller sub-processes (segmentation) and standardizing the different development phases (standardization) it is possible to identify and eliminate the root causes of defects. This is particularly true in complex systems, where multiple organizations are involved in its development and there are numerous development teams: in those cases it is also important to establish well-defined relationships between different suppliers, in order to produce a system with components that interact without problems.
Lean thinking, to be successfully applied within a work group, must be well understood by all team members.
“Think big, act small, fail fast; learn fast”: these slogans, featured in the Poppendieck book, well summarize the importance of understanding the field and the suitability of implementing lean principles throughout the entire process of software development: lean principles only work well when they are implemented together, as long as you are able to develop sufficient “common sense” within the entire work environment involved.
A few years after the spread of Lean approaches applied to the manufacturing, production and software development sectors, an entrepreneur named Eric Ries tried to apply the same basic principles to the techniques for launching new products or services on the market: in a word, to the business world. That was the birth of the methodology known as Lean Startup, a radical approach for the launch of innovative ideas and activities that helps to identify a path towards a sustainable business, drastically reducing time and costs, and, consequently, the possibility of failure.
The methodology, developed in 2008, proposes a continuous design-verification-modification process, with a massive use of the web, aimed at adapting the product step by step to the needs of customers, keeping costs under control. This approach, clearly inspired by total quality (ISO 9001, PDCA) and Agile development methodologies (continuous improvement, continuous feedback), is usually used to reduce costs and waste of time, giving the project a greater chance of success.
It is important to understand that, although the guiding principles are similar, Lean Development and Lean Startup are two completely different concepts and therefore should not be confused or overlapped in any way.
That’s all for now: we hope that this little in-depth analysis will be of help to those who have decided to approach this very interesting and modern set of good practices for software development.