We often see the development of a system as something that should have a beginning and an end. We create a timeline for construction — a short window of opportunity to ensure that everything we could possibly need makes it into the system. We’re going to cram all of the features we can think of into a project. Now, I’m not talking about Agile vs. Waterfall. Although agile favors prioritization and evolution, most software initially built in an “agile” way, will remain stagnant for long periods of time after successfully delivering something usable. The system is expected to “just work” for many years, maybe with a little bit of maintenance. The project is an inconvenient period of construction that, once complete, gets out of our way as we head back to work with our new tools. After several years, we might decide to repeat the process. We’ll have a big wish list of all the things that users have been complaining about. We’ll take that and start another project to re-implement the system with our new ideas and maybe even some new technology. Is software like a hammer or a saw that we should use until it wears out? Once it is no longer working for us, we’ll just get a better one.
Software, unlike our physical tools, has a unique characteristic — it can evolve. It’s malleable. No tool in history has had this degree of flexibility. The fact that it can be modified and improved is one of its biggest strengths. It can change with us to meet demand and can learn new ways of making us better at what we do. It can evolve and change the way we work, allowing us to focus more on our most important tasks. It’s also easier than ever to deploy our changes more frequently. With modern software platforms and tools supporting automated deployment and continuous delivery, our systems can be updated even as they are being used! This flexibility for change, combined with an ability to easily and reliably deploy is incredibly powerful. Modern businesses are heavily dependent on software. But I have yet to see a perfect system. There are often existing inefficiencies that are affecting employees, costing money, time, or even compromising agility. Being dependent on these flawed systems handicaps businesses and puts them at risk of being left behind or disrupted by those with better tools. We often tolerate these flawed systems and hope to someday build a new system will to replace it.
Most products that we depend on, SaaS applications for example, improve frequently for their customers. But many organizations aren’t regularly improving internal custom software that is absolutely core to the success of the business. Technology is intended to give competitive advantages, multiply the effectiveness of our employees, reduce risk of mistakes, give additional insight into decision-making, etc. If I told you that I knew a secret that could make your employees 5% more effective at their jobs, would you want to know what it is? You’d probably click that link. That system that everyone is complaining about might be costing us thousands of hours in lost productivity, cleverly disguised as a few minutes a day, spread across thousands of employees. Many opportunities for improvement already exist in some of the stagnant software that you are depending on today. If we can identify them and their costs, we’d be crazy to tolerate them. And yet we often do. I like to think of a solution as an employee. It could be your best employee. One that works tirelessly day and night, makes everyone who comes into contact with it more effective, and has the ability to continually learn new tricks. A system that you don’t invest in and evolve is more like an employee that is actively disengaged, preventing your other employees from reaching their true potential. Maybe even discouraging them. If you’re like most businesses, you’re not sending your system to Mars. It’s not going away for long periods of time, untouchable and completely dependent on the decisions we made before it left Earth. Our systems are always within reach and available for change.
We need to recognize that it’s impossible to see the future and build a perfect system up-front that will work gracefully to handle all possible future growth and change to our businesses. Our systems are always missing out on some type of improvement, with the gaps growing over time. They can only remain effective and relevant if they are effectively evolved. I see creating a system as the beginning spark. It should be thought of as just a starting point for a long-term contributor toward an ever-improving business. If we think in these terms and recognize that our system must be adapting and evolving alongside us, we can recognize that any initial project is really all about properly setting the stage for future enhancements.
We can free ourselves from the pressure of trying to get everything right in a single tragic attempt. Our projects should become much more centered around prioritization for delivering value to the business. An initial project can focus on a minimum viable product. Subsequent projects or iterations are about continuing to evolve to provide features that maximize value. Understanding the types of changes we should be making requires constant feedback from users and metrics to determine where real value lies. For a system to remain relevant long-term, we must also place a higher importance on quality. It is extremely important that our system is able to react quickly to change. Messes that make change difficult can not be tolerated. Our code should be constantly kept healthy. Our systems should be well-tested and deployment should be so reliable and frequent as to be seen as a non-event. We should be seeing value from change so often that the idea of not updating would be unthinkable.
We need to think about software more as an ever-evolving, ever-improving tool and less as a tool that needs updates every few years. By planning for evolution, we can break these cycles of building giant monolithic systems, using them until we hate them, and then when our inefficiency becomes intolerable, initiating another project to “catch-up” and modernize. There is a trend in modern software toward continuous updates. Google has all but done away with version numbers with Chrome and has done a great job of continuously updating in the background. Microsoft is working on ensuring that Windows 10 will be updated monthly with new features and enhancements. Forward-thinking enterprises also need to start thinking in this way in order to stay competitive. The businesses that are able to evolve fastest will dominate. Our systems should be thought of from the start as companions that will evolve alongside us. If we continue to invest in making them better, they will frequently provide us new value and hopefully help us to avoid ever having to play catch-up to our competitors.
Originally posted by Mark Thiessen at Mutable Thought.