- The Thunder Island Navigator
- Posts
- Heart of Software Engineering: Lean Software Development
Heart of Software Engineering: Lean Software Development
Reduce Waste and Increase Focus
A Special Note
In the Heart of Software Engineering series, we will explore one fundamental concept in the field in each article. The series will be published regularly, but does not yet have a set schedule. For now, we aim to to get an article in this series out once roughly every two week. Some foundational topics will include: software architecture, process management, computer science fundamentals, and core technologies.
Introduction
The evolution of Lean principles from their origins in Japanese manufacturing to their integration into modern software development practices is a testament to their versatility and effectiveness. Initially developed by Toyota to minimize waste and enhance efficiency, Lean has undergone significant adaptations and has become a cornerstone of Agile frameworks in software engineering. This article explores the history of Lean, its translation into software development, and its key applications, with a particular focus on waste reduction and maintaining focus.
A Very Short History of Lean
Lean manufacturing was implemented by Toyota in Japan during the 1950s and 1960s, forming the Toyota Production System. In the late-1980s to mid-1990s, the concept of Lean spread to academia in the United States. Although some Western plants already practiced Lean-adjacent principles, it was during this time that Lean gained broader recognition.
Since 2001, with the rise of Agile frameworks in software engineering, Lean has been translated into Lean Software Development. Lean principles synergize strongly with Agile frameworks, especially Scrum, which emphasizes Lean thinking through its core value of Focus, among its other practices.
As Agile frameworks spread, Lean thinking has become foundational in software engineering practices, whether or not companies explicitly call it “Lean.”
Applications of Lean in Software Development
As Lean transitioned from manufacturing to software, various interpretations emerged. Generally, organizations fall into one of four concepts of Lean:
Lean as a fixed state or goal (being lean)
Lean as a continuous change process (becoming lean)
Lean as a set of tools or methods (doing lean/toolbox lean)
Lean as a philosophy (lean thinking)
“Lean philosophy” fits best with modern software engineering. Key aspects are the reduction of waste and the incentive to focus.
Reduction of Waste
Waste is prevalent in software engineering; teams start their day buried in waste and slowly dig out during their workday, only to face it again the next day.
Waste appears in management processes, tools, communication, and even coding. Software engineers must reduce this waste and prevent its recurrence.
In particular, one critical area that encompasses much of the other wasteful aspects in software engineering is process management.
Waste in Management Processes
Waiting on other software engineers, product owners, or managers to approve code changes before the next phase of work can begin is the traditional Waterfall engineering approach in disguise. Hours and days of productivity time can be lost when a change to a database table must first be approved web API work can begin; and, a delay in frontend work happens when approval on the web API is sitting in the queue.
It’s clear there is an immediate need to remove the wasteful parts of the process that are causing long wait times around code change approvals. However, there is still a critical need to review and approve code changes to ensure the code base maintains high quality. The waste in this situation is the lag time between completing code changes and starting new work dependent on those prior changes, not the act of reviewing and approving the code changes.
Approaching this issue from a Lean perspective, software engineers should recognize this situation and work with the organization to eliminate the waste, the lag time between submitting code changes for review and starting new work. One solution is to refine the process around how work is accomplished. Instead on completing the database, API, and frontend work separately and submitting change requests for each, group this work together, refining it enough to ensure it can be completed in a reasonable amount of time, then submit a change request once all the work is complete.
Focus
Maintaining focus is crucial for productivity. Engineers should minimize distractions and concentrate on one task at a time, especially with critical code changes. Lean emphasizes focus in order to enable the rapid development of features without sacrificing quality.
Context Switching
Switching between tasks, or "context switching," kills productivity and creates stress. It’s analogous to a CPU context switch, which incurs some lag. For people, the productivity loss is significant, especially with multiple tasks. Up to 20% of productivity time is lost when a person switches between two tasks. Switching between more than two tasks incurs a even steeper penalties and further reduces the chances an engineer will successfully complete their work.
Sven Akerman, CTO at Outlook Insight LLC, outlined the “single piece flow method” in his talk on the Ruby Rogues podcast in 2019. His team limits in-progress items to two, with a maximum of three items in development. This method has improved focus and accelerated feature delivery. Akerman says there there are some growing pains that come with a shift in mindset away from task-juggling and toward focusing on single tasks. He recognizes that many engineers have been working for a decade or more in the former mindset and a shift to the latter takes time. More importantly, a successful adoption of this principle requires full and constant support from the organization to enable the change to happen. The change won’t happen overnight, but will pay off immensely down the road.
Software engineers should avoid multitasking and focus on one task at a time, especially for critical code changes. By concentrating on a single task, engineers can immerse themselves fully, leading to higher quality output and a deeper understanding of the problem they are solving. This focused approach minimizes the cognitive load associated with switching contexts, allowing for a more seamless workflow. Additionally, prioritizing tasks ensures that the most critical and impactful work is completed first, which can significantly enhance overall project efficiency.
Final Thoughts
By adopting Lean principles, software engineering teams can significantly enhance their efficiency, productivity, and overall quality of work. Reducing waste and maintaining a focused approach are crucial for optimizing workflows and achieving better outcomes. Whether explicitly labeled as Lean or not, these practices form the bedrock of effective software development, ensuring continuous improvement and sustainable success.
If you or anyone you know wants to share their experience applying for jobs in the current job market, inside or outside software engineering, we encourage you to respond in an email to this newsletter! You may be featured in our next article.
Thank you for reading and we will see you in our next article as we continue our voyage.
Code on,
Matt Ryckman, Editor and Software Engineer
Reply