Say no to low-value features

In most code bases, you can get 80% of the business value with 20% of the features. Imagine if the time spent on the other 80% of features had been spent on high value features - you'd have four times the business value! This is what Google realized in 2011: they needed more wood behind fewer arrows. I have great respect for Google's willingness to kill products that aren't going to have major impact. So many organizations have struggling features that get blindly maintained and never get killed. This is a tragic mistake and a massive tax on the organization.

Engineers are the gatekeepers

"The difference between successful people and really successful people is that really successful people say no to almost everything" - Warren Buffett
If engineers are the ones implementing tasks, then they are also the gatekeepers of which tasks get done and in what order. However in many organizations, the prioritization process is done with minimal engineering involvement. Sometimes this is thought to save engineering time. Prioritization that excludes engineers wastes far more engineering time than it saves. Engineers should be given business objectives to meet and should be a critical part of the prioritization process to hit those objectives. Engineers must be protective of their own time by saying no to work that does not align with their goals. Any work that is worth doing will have a clear argument for how it contributes to a business objective, otherwise the business objectives need tweaking.

Measure feature value aggressively

You should have a constant pulse on the value of every feature you maintain. One metric is: what would the business lose if this feature were unavailable for 1 hour? Effort spent on a feature's automated tests, maintenance, and risk-avoidance during changes should all be proportional to its business value.

Nearly dead code is much worse than dead code

Nearly dead code must be maintained and is much harder to remove than dead code. Low-value features are nearly dead code - just waiting to be deprecated. It's not always obvious which features are low-value unless you measure their value from the start. Avoiding adding low-value features is much easier than removing them; removing them is much easier than maintaining them. When you do add a feature, release the simplest possible version in a small roll out. Measure its value against a business objective, and be ready to retract it quickly if it doesn't deliver value.

Actively seek out low-value features and remove them

All code has a carrying cost. Any time I am refactoring or maintaining code, I am looking at the code in the same area for features that might not be worth keeping. If I don't understand the business value behind something, I search until I can find one, and often propose removing the feature if it no longer seems worth its carrying cost. This exercise has the added value of increasing engineers' understanding of the code they are maintaining.


Popular posts from this blog

Crossing the Rubycon

The many benefits of working in small increments

Building up tests via context and let in Ruby