Back in April, I had the good fortune to speak at Craft Conf in lovely Budapest. It's a fantastic conference that I would recommend.
During that conference, Randy Shoup talked about his experience migrating from monoliths to microservices at EBay and Google. David, one of the audience members asked an interesting question at the end of Randy's talk. (I'm sorry that I didn't get the full name of the questioner… if you are reading this, please leave a comment to let me know who you are.)
"Isn't the concept of microservices contradictory with the lean/agile principles of a) collective code ownership, and b) optimizing whole processes and systems instead of small units?"
Randy already did a great job of responding to the first part of that question, so please view the video to hear his answer there. He didn't have time to respond to the second part so I don't know what his answer would be, but I will tell you mine.
Start From The "Why"
Let's start by answering the question with a question. Why do we pursue Lean development in the first place? Your specific answer may vary, but I bet it relates back to "better use of capital" or "turning ideas into profit sooner." Both of these are statements about efficiency: efficient use of capital and efficient use of time.
One of the first Lean changes is to reorganize people and processes around the value streams. That is a big upheaval! It often means moving from a functional structure to a cross-functional structure. (And I don't mean matrixing!) Just moving to that cross-functional structure will deliver big improvements to cycle time and process efficiency. After that, teams in each value stream can further optimize to reduce their cycle time.
The next focus is on reducing "inventory." For development, we consider any unreleased code or stories to be inventory. So, work-in-progress code, features that have been finished but not deployed, and the entirety of the backlog all count as inventory.
Reducing inventory always has the effect of making more problems visible. Maybe there are process bottlenecks to address, or maybe there are high defect rates at certain steps (like failed deployments to production, or a lot of rejected builds.)
This is the start of the real optimization loop: reduce the inventory until a new problem is revealed. Solve the problem in a way that allows you to further reduce inventory.
Which is the Value Stream?
David's question seems to originate from the view that the value stream is the request handling process. So if a single request hits a dozen services, then one value stream cuts across multiple organizational boundaries. That would indeed be problematic.
However, I think the more useful viewpoint is that the value stream is "the software delivery process" itself. This is based on the premise that the value stream delivers "things customers would pay for." Well, a customer wouldn't pay for a single request to be handled. They would, however, pay for a whole new feature in your product.
Viewed that way, each service in production is the terminal point of its own value stream. So, Lean does not conflict with a microservice architecture. But could a microservice architecture conflict with Lean?
Return to "Why"
We asked, "Why Lean?" Now, let's ask "Why microservices?" The answer is always "We want to preserve flexibility as we scale the organization." Microservices are about embracing change at a macroscopic level. That has nothing to do with capital efficiency!
So are these ideas contradictory? To answer that, I need to dig into another aspect of Lean efforts: infrastructure.
Efficiency, Specialization, and Infrastructure
In the early days of aviation, airplanes were made of canvas and wood. They could land at pretty much any meadow that didn't have cows or sheep in the way. Pilots navigated by sight and landmarks, including giant concrete arrows on the ground. Planes couldn't go very fast, fly very high, carry many passengers, or haul a lot of cargo.
The maximum takeoff weight of an Airbus A380 is now 1.2 million pounds. It requires a specially reinforced runway of at least 9,020 feet and typically carries 525 passengers. It flies at an altitude of more than 8 miles. This is not an airplane that you navigate by eyeballing landmarks.
This aircraft is amazingly efficient. Achieving that efficiency requires extensive infrastructure. Radar on the plane and on the ground. Multiple comms systems. An extensive array of radio beacons and air traffic controllers on the ground and dozens of satellites in space, all sending signals to the on-board network of flight management systems. Billions of lines of code running across these devices. Airports with jetbridges that have multiple connections to the aircraft. Special vehicles to tow the plane, push the plane out, haul bags, fuel, de-ice, remove waste water… the list goes on and on.
In short, this is not just an airplane. It is part of an elaborate air transportation system.
It should be pretty obvious that the incredible efficiency of modern airliners comes at the expense of flexibility. Not just in terms of the individual aircraft, but in terms of changes to any part of the whole system.
You can see this play out in any technological arena. As we increase the systems' efficiency, we accumulate infrastructure that both enables the efficient operation and also constrains the system to its current mode of operation.
In Lean initiatives, there is a gradual shift from draining inventory and solving existing problems into creating infrastructure to add efficiency. It's not a bright line or a milestone to reach, but it is noticeable. As you get further into the infrastructure-efficiency realm, you must recognize two effects:
- You will get better at certain actions.
- Other actions become much, much harder.
As an example, suppose you are optimizing the value stream for delivering applications. (A reasonable thing to do.) You will eventually find that you need an automated way to move code into production. You may choose to build golden master images, or automate deployment via scripts, or use Docker to deploy the same configuration everywhere. You may commit to VSphere, Xen, OpenStack, or whatever. As you make these decisions, you make it easier to move code using the chosen stack and much, much harder to do it any other way.
Full Circle
So, with all that background, I'm finally ready to address the question of whether microservices and Lean are in conflict.
Given that:
- You want maneuverability from microservices.
- Your value stream is delivering features into production.
- You pursue Lean past the inventory-draining phase.
- Further efficiency improvements require you to commit to infrastructure and an extended system.
- That extended system will not be easy to change, no matter what you choose or how you build it.
Then the answer is "no."