I don’t know how many times I’ve wasted time, energy, and patience trying to solve a problem only to discover the problem I thought I had was not the problem I had. Maybe what I came up with was a good solution to a different problem, but it wasn’t the problem I had. This is more likely to happen when the stakes are higher and the problems more complex.
One of my big projects early in my career, which I called “Boxcar,” at Indeed was to finish development of a prototype for a service-oriented architecture. There were some really clever parts in this system (conceived by someone else, not me), but the cleverest part had nothing to do with the solution and everything to do with the problem definition.
The problem of distributing work reliably is surprisingly hard, and it’s one that many people have attempted to solve over the years. It will never be perfectly solved, and one reason for that is that people are trying to solve the wrong problem. What these technical architects are trying to do is to distribute load uniformly across a pool of slightly unreliable servers with optimal performance. Solving that problem would indeed be valuable, but it’s not actually the problem we need to solve. The problem we actually need to solve is easier, and that’s what made Boxcar so great.
The problem we solved was instead how to distribute load across a pool of slightly unreliable servers without overloading any individual server and achieving pretty good performance, probably. Note the two ways the problem statement was weakened. Instead of distributing the load uniformly, we’re trying to avoid overloading any single server. The former certainly achieves the latter, bit it’s not necessary.
Imagine we have a pool of four servers, and our current load is 20% of the total pool capacity. I guess it would be cool to have 5% of the load on each of the four, but 20/0/0/0 or 15/0/0/5 would all do fine also. Yes, a server that’s running at 5% will service requests faster than one that’s running at 20%, but the difference isn’t really meaningful. Nor is it guaranteed. Performance is complicated, and there are a lot of confounding variables.
By defining the problem down, we were able to create something that in practice had superior performance. Software engineering is rife with problems like this, where if you aim for perfect, you’ll never get there, but you can get a lot of value out of 99% perfect. There’s a mismatch here between the business goals and the technical problem definition. Often the business managers and the technical people are speaking almost the same language, but it’s that “almost” that’s a killer.
For a couple of years, I had this recurring experience of watching two people vigorously arguing about how to solve a problem and slowly realizing that the reason they couldn’t agree was because they were trying to solve subtly different problems. Maybe one had four features in mind and the other was thinking the same four and another one. Maybe their feature lists were exactly the same, but one was anticipating 10,000 simultaneous users and the other was anticipating 500,000. Maybe they had the same feature list and the same anticipated load, but one of them thought they could fix certain errors in the back end while the other thought they had to be prevented from happening in the first place. They were frequently sufficiently smart, sufficiently capable people, but could not agree on where to go because one person is thinking Cape Town, and the other is thinking Melbourne.
This is about more than just translating business requirements into technical implementations. This is a huge part of the value of an MVP. An MVP is not just about the refining the solution. It’s also about making sure the problem is what you think it is.
Experienced professionals have learned not to get too deep into trying to design a solution before asking, “what problem are you trying to solve?” It’s really easy to think that you’re all on the same page when you start a project only to discover six months and five person years later that what was obviously the problem to you was something different from what was obviously the problem to everyone else. It’s not just enough to say what the problem is. You have to describe all of what you think the problem is and also what it is not. Don’t get me wrong, you’ll probably solve it eventually, but it’ll take a lot more time, energy, and patience. Spend a few days nailing down your problem definition so you can save some of those five person years on solving more problems.