Kaizen, in Japanese, means improvement. In modern business, the definition of Kaizen has been expanded to mean continuous or ongoing improvement. Typically, this is as far as understanding in the software profession goes for that concept. True Kaizen goes much farther, as a brief overview of its origins will illustrate.
Kaizen began after World War II, but not in the high-tech realm. Kaizen started in manufacturing, specifically automotive manufacturing at Toyota. During this time, Toyota implemented quality circles where workers would analyze the work they were doing on a regular basis and come up with ways that it could be improved. This activity of regular reflection and change with the intent of improving was the birth of Kaizen.
Kaizen became popular in the Western world, particularly the United States, in the 1980s. In 1985, the publication of Masaaki Imai’s book “Kaizen: Japanese Spirit of Improvement” exposed manufacturing enterprises to the concepts of Kaizen. This began a movement to embrace the concepts in order to improve manufacturing efficiency and profitability.
Kaizen began converging with software development as Agile development methodologies began to take shape with the Agile Manifesto in early 2001. In 2003, with the release of the book “Lean Software Development,” which drew heavily from the principles of lean manufacturing, Kaizen was established as a foundational principle of software development.
Unfortunately, as a good programmer, you may consider Kaizen something you should do to achieve “quality,” but you may not understand what needs to be done or how to do it. You need an understanding of what Kaizen means to you at your current level of experience and what actions are appropriate to help you engage effectively in Kaizen.
True Kaizen is more than management jargon. It is deeper than an initiative or a project. It is a culture and personal philosophy that guides organizations and individuals to higher levels of quality, efficiency, and success. You practice Kaizen when learning new techniques, refactoring code for easier maintenance or better performance, or eliminating bugs from software.
Kaizen is a focus on reduction. It seeks to eliminate muda, or that which is useless waste, from a process or practice. Bugs are useless waste. Inefficient routines are useless waste. Overburdened processes laden with red tape and bureaucracy are useless waste. To be true to Kaizen, you must seek out these deficiencies and root them out of your code, out of your systems, and out of your thinking.
When practicing Kaizen, you seek improvement in all that you do. No activity or endeavor ever reaches perfection, but through Kaizen, all processes and products improve.
Kaizen is achieved one step at a time as you master the states of Shu (the state of following), Ha (the state of innovation), and Ri (the state of flow). Each state builds upon the mastery of the one before it. Each progression from one state to the next is a further progression for you into Kaizen.
Let’s explore each of the stages of Kaizen to help you determine which state you are currently in. Through the examples provided, you’ll learn the actions that you should take in order to contribute to Kaizen based on where you are in your career as a programmer.
Shu: the State of Following
At the beginning of your career as a programmer, you enter the state of Shu. To master this state, begin by watching and following the forms, programming techniques, and problem-solving strategies of the more experienced programmers and mentors that are guiding you. Each iteration of “Hello, World!” that you diligently type when you start on the path of a new language is the first step to mastering Shu. Shu is precise repetition of the forms of syntax and function.
Shu allows no deviation. You receive instruction and study in the area in which you are seeking to become proficient; you strive to match the form before you. Kaizen in Shu is the replication of the work of the master in form and function. The forms of the master exist in books that teach language syntax, courses on programming, and the code of colleagues and supervisors. These forms have been developed by experienced programmers and refined to teach you the syntax of a language step by step. With each step, your programming capabilities grow.
The programmer builds strength and reflexes through this replication. As you become familiar with the syntax of a language, how to reproduce it, and what it does, you become more capable of solving problems. You instinctively know which feature or function of a language does what you are trying to accomplish. You also learn efficient ways to solve problems. The patterns you imitate are designed to teach you efficient programming solutions. When you are able to recall them precisely, the code you write is more efficient, which eliminates waste in the form of both processing time and maintenance time for your applications.
When you have mastered Shu, you will be able to replicate any form your mentor asks of you. You will not deviate. Your code will be indistinguishable from your mentor’s code. This is desirable because the code your mentor has produced is a model of quality, performance, and maintainability that you were not capable of producing on your own prior to your course of study with your mentor. When you achieve predictability and precision, you have achieved Kaizen in the state of Shu.
My first experience with Shu came when I copied programs from books and magazines into the memory of my Atari 800XL computer. I had no working disk drive, so each program was ephemeral. When it stopped running or the computer was powered off, the program I had written disappeared. This experience taught me to be very careful and precise when mimicking the programs I studied.
If I was successful, I had a working program to enjoy. If I failed, all the work I had completed was useless and had to be redone.
Painful learning, but a valuable experience.
As you start your path of learning, you have more resources available to you than I did. From W3Schools for budding web developers, to Codecademy and Udemy, many free or low-cost courses for beginning to learn programming are available to you. I recommend starting with some of the free tutorials online. They will walk you through the beginning steps and help you memorize the syntax you need to learn to start becoming proficient in the programming language of your choice.
Once you are comfortable with the basics, head over to GitHub. This is a repository of open source projects, which allow you to download the source code. Find a basic application project that you would like to learn how to code. Download the source code and start reproducing it in your code editor.
This may sound like a simple exercise, but copying the code precisely is more difficult than it seems. You will also have questions as you undertake this effort when you encounter new techniques. Take notes and research the topics you have questions about, or ask your mentor to explain the concepts after you have completed transcribing the code. You will find yourself rapidly gaining insight into how the programming language works.
Once you have learned the syntax of your chosen programming language, you will seek to expand your knowledge and uncover more about why it functions in the way it does. You are ready to progress from Shu, the state of following, to Ha, the state of innovation.
Ha: the State of Innovation
Once you have mastered Shu, you will possess an understanding of how a form behaves. You will understand what it does and how efficiently it does it. You will know timings of the processing. You will know outputs, file sizes, and CPU utilization. It is this understanding that will allow you to progress to the state of Ha, the state of innovation.
Innovation in programming comes from the combination of forms, syntax, and algorithms into larger systems. You learn design patterns to solve problems. These patterns emerge organically from your experience, from exposure to the patterns of other programmers working closely with you, and through formal study of historical solutions.
In Ha, you are departing from mimicry and are advancing your skills. This growth improves the value of your work—true Kaizen.
If you do not have a mentor or do not follow a formal course of study, you will still learn patterns, although the path to Kaizen will be slower. Your experience, in this case, will advance through experimentation. Through these experiments, you will see which approaches are worthwhile and which approaches are not. The learning will be slow.
If you learn from others or use a formal course to study patterns, you will progress toward Kaizen much faster. Depending on your situation, this may or may not be the right course for you. If your goal is to advance your skills as rapidly as possible, this path is often not the most direct to that goal. However, if you are seeking to deepen your knowledge and time is not a factor, learning through experimentation may be the right choice.
Before I first began to study programming in college, my method was through experimentation on my own. I would come up with an idea for something I wanted a program to do, and I would start with a blank page. I would work, compile, debug, and refactor as I tried to accomplish the functionality I had set out to build. As I ran into areas I was not familiar with, I would have to stop, research those, and become familiar with them.
I did not produce features at a rapid pace, but I did gain a thorough understanding of how different aspects of the programming language, BASIC, worked. It once took me nearly a month to create a simple program that accepted a person’s name, a phone number, and an address and displayed it on the screen formatted like a Rolodex card. My throughput was painfully slow, but at the end, I had learned quite a bit about BASIC and how to solve problems with it.
Once I took on my first professional programming position, my experience changed dramatically. Time became an essential factor in my learning. IBM was not willing to wait for my learning to progress at such a slow pace. Instead, they sent me to training to rapidly improve my skills.
I learned SQL via a week-long Oracle training course. When I returned to work after the training, the next week I produced a report that I had been struggling with. The formalized coursework condensed my learning into a much smaller window, but I felt my understanding was a good bit more superficial than the learning I had undertaken on my own.
In both cases, I was able to apply the knowledge I had acquired to solve more complex problems and deliver better solutions than I had been able to before I had completed the study. I moved toward Kaizen in improved skill and speed. In the first instance, though, I felt that I had a deeper grasp of what I was building. In the second, I reached a required proficiency level more quickly, but my capabilities were narrower. In the first, I was a generalist; in the second, a specialist.
Once you are comfortable with innovation, whether you are a generalist or a specialist, you will be ready for the next state, the state of flow.
Ri: the State of Flow
When you enter the state of Ri, you will have reached a place where the forms you have mastered and the innovations you have wrought have elevated your abilities. These elevated abilities allow you to contribute at the highest level to Kaizen.
You flow with the challenges presented to you. You seek to make each system better than the last. You strive for better performance and less maintenance. You strive for simplified, rather than complex, systems without sacrificing function. You are at the peak of your technical ability, but never forget there is more to learn.
In the state of Ri, you contribute to the Kaizen of less advanced programmers. You guide programmers experiencing Ha. You provide advice so that programmers in Ha improve their systems and experience growth in their capabilities.
You construct the forms that programmers experiencing Shu seek to imitate. In Ri, you use your experience to improve the forms that the novice programmer begins with on their path to mastery. In this way, the path to mastery is shortened or improved, so the programmers that emerge from it are even more highly skilled than you were at that point in your career.
In my current role, my experience allows me to provide mentorship to junior programmers. I pair with them as they write code to answer their questions and review what they have produced. I offer them guidance that allows them to produce more efficient or maintainable code. There are two ways Kaizen improves due to this process:
First, the junior programmer gains knowledge from me. They learn a technique or obtain a skill that they did not have before. They have the opportunity to ask questions and, from my answers, better understand the solution. From then on, they can more effectively wield the tools at their disposal.
Second, their improved capability improves the organization’s Kaizen through enhanced efficiency. Junior programmers that produce better code reduce processing time and cost, and reduce the time it takes to maintain systems. This allows the organization to focus its energy and resources on new undertakings that allow it to generate more revenue.
In addition to mentorship, my experience means I will be called on to create standards for architecture and processes that improve the efficiency of the organization. These are the process and procedural forms that entry-level programmers learn to memorize and follow to become effective in their roles. These are the foundations or forms that programmers in Shu base their learning on.
In Ri, you will likely fill one of two roles: team lead or architect. As an architect, you create the blueprints for your systems. You consider best practices and the nuances of the solution to be built. Your architecture provides an efficient way for other programmers to build quality systems. Kaizen improves due to your contribution to this increased efficiency.
As a team lead, you are the go-to person for junior programmers. Your experience allows you to answer questions and solve problems quickly. You provide direction to other team members with the goal of producing higher-quality systems, which spreads Kaizen throughout the organization.
Use What You’ve Learned to Master Kaizen
Throughout your career, you will advance through the learning states of Shu, Ha, and Ri. In each state, your contribution to Kaizen will be different.
In Shu, you are focused on your internal Kaizen. You learn the forms and foundations of quality and seek to become a master of mimicry. When you can precisely mimic the forms you have studied, you will be ready to advance to the next state, Ha.
In Ha, you focus on Kaizen through innovation. You seek to use and combine the forms you have mastered in new ways. You seek the advice of mentors and study the works of others to gain deeper understanding and improve your innovations. You continually look for ways that your innovations can improve the processes and organizations they are a part of. When you have mastered the art of innovation, your contributions flow, and you are ready to move on to the state of Ri.
In Ri, you become the mentor, architect, or leader that your experience has been leading you to. You provide the vision of systems to build. You mentor junior programmers to help them advance in skills and knowledge. You lead teams, answering questions and solving problems, all in a state of flow that continually adds to the Kaizen of your organization.
Kaizen is continuous improvement. It is the accumulation of small improvements and the reduction of waste that, over time, amount to astounding accomplishments. Your accomplishments will come in the advancement of your knowledge from novice to master. You will learn and be able to solve problems that were well beyond your capabilities when you started. You will create new solutions that are unique and drastically improve current systems. In the end, your accomplishments will lead you to help and inspire others to achieve higher levels of Kaizen.
Each small step toward improvement is a contribution to Kaizen. What step will you take today?