Stop Optimizing for Output: Why Software Engineering is a Discovery Problem
The Factory Fallacy
Most engineering organizations misdiagnose software delivery as a production problem. They treat building software like operating a factory: crank the handle faster, and more features will drop off the conveyor belt. This intuition is fundamentally flawed. In software, copying code is free. Everything you spend time building is unprecedented. Therefore, engineering is not a production process; it is an exercise in continuous discovery. When you push a team for raw speed, you inevitably throttle their velocity.
Here is the data‑backed thesis for why traditional management levers fail, and how optimizing for learning naturally generates speed as a byproduct.
Failed Management Levers
- Adding Personnel: Fred Brooks established this decades ago in The Mythical Man‑Month: adding manpower to a late software project makes it later.
- Adding Pressure: Mandating urgency forces engineers to drop tests and bypass refactoring. You might buy a week of output today, but you finance it with months of debugging tomorrow. Software delivery is a marathon; cutting corners introduces debt that permanently impairs throughput.
- Adding Process Gates: Imposing checkpoints and Change Approval Boards (CABs) creates the illusion of control. In reality, it merely introduces queues. Data from the State of DevOps Report (documented in Accelerate) is unambiguous: heavy review gates are empirically worse than having no change‑approval process at all. You do not gain control by slowing down.
Factory Heuristic vs Discovery Heuristic
| Factory Heuristic (Output) | Discovery Heuristic (Learning) |
|---|---|
| Maximize resource utilization | Minimize feedback latency |
| Enforce process gates and CABs | Shift control to automated pipelines |
| Large, quarterly batched releases | Continuous, small‑step deployments |
| Measure velocity and lines of code | Measure time from idea to validation |
The Vector: Optimize for Learning
If your discipline is discovery, your goal is to accelerate your speed of learning. You must ascertain quickly if you are on the right track and correct course if you are not. When you optimize for learning, quality rises, unplanned rework plummets, and speed materializes naturally.
1. Work Experimentally
Treat every meaningful change as a hypothesis. Frame the work as:
“I hypothesize this code will produce X result. Let us deploy and measure it.”
The scientific method is the most powerful engine for navigating uncertainty. Apply it rigorously to your architecture and product decisions.
2. Compress Feedback Cycles
Your rate of learning is capped by how fast you can validate a hypothesis. If a flawed architectural design takes three months to expose itself, you only learn four times a year. If it takes twenty minutes, you can learn twenty times a day. Automated testing and continuous‑delivery pipelines exist for this exact purpose: rapid intelligence gathering.
3. Isolate the Variables
You can only extract signal from an experiment if you know what caused the outcome. A massive quarterly release is an experiment corrupted by a hundred uncontrolled variables. If it fails, you have bought an unplanned mystery. Deploying in small, iterative steps isolates variables, ensuring immediate clarity on what broke and why.
Realigning Metrics
The metrics you track dictate the behavior of your system. Stop measuring utilization, sprint velocity, or lines of code. These track busyness, not progress. Instead, measure the latency of validation:
- How long does it take for an idea to reach the user?
- How quickly can we confirm if it works?
Speed is not a command you can issue to a tired engineering squad. It is the natural byproduct of a system calibrated for rigorous, high‑frequency learning.
Comments
No comments yet. Start the discussion.