Do you remember all those rushed changes that your developers implemented three years ago, and how they complained about the design damage they caused to make that happen?
It's all still in the codebase. It never disappears.
You may have forgotten it, but they still live with it every day.I'm not saying you were wrong to be in a hurry then; I'm only saying it's not over
It Does Not Heal Itself
In engineering, software or otherwise, whatever decision we make this month, we have to live with it from now on, or until someone invests additional time in reversing it.
That hack is as permanent a part of the product as any well-considered change.
It doesn't refresh with the next month, quarter, or planning period. it doesn't fade away. It doesn't heal.
There is no end-of-period reset.
Making new goals doesn't remove the baggage of prior goals.
Do the other people have to live with January 2013 for the rest of their lives? Or is it only engineering that has to deal with every dirty hack since the beginning of the organization?
I wonder if non-engineering parts of a company properly recognize this "code is forever" situation.
Hurrying Is Sometimes Wise
That doesn't mean we should never hurry or not be quick; we all want to produce a quick and meaningful effect, but if we get there by cutting corners and producing risky code, we need to productize it (to turn the working prototype into something that we expect people to trust in production).
It's good to borrow time from the future to capture a market opportunity, but we owe the future that time; we can't borrow freely forever as it costs us nothing.
I think incremental and iterative development is a good thing. I think it's reasonable that we adjust our product to keep up with changing market conditions if we can.
The problem is rushing weak code out the door frequently and often.
A continuous stream of hacks-we-must-live-with-forever will destroy our ability to produce quickly and may impact our ability to build and operate the system in a cost-effective way.
It Can Be Fixed / Managed
Some ongoing "sustaining" and "accelerating" work is needed to drive down the cost and drag of past decisions that didn't work. The "accelerating" work also sets up the product to scale and manage runtime costs.
You can have some success by intentionally working in a "portfolio" way - keeping all the important work going while shifting the onus to the more appropriate category and letting engineering work out the details.
Imagine you could set the percentages (with engineering) for this kind of portfolio:
- Advancing: Adding new features and UX improvements - all customer-facing.
- Sustaining: Solving defects, doing support work, automated testing, and refactoring. Without these, the product either cannot run (certificates renewals), won't run well (defects), can't be sure to work (testing), or may suffer past design damage indefinitely.
- Accelerating: doing work to increase development and validation speed so you can do more of the other two kinds of work successfully and quickly.
Perhaps it's a good time to put 20% more effort into sustaining, to ensure that your existing customers will renew their subscriptions.
Maybe this is a good time to put 30% more effort into new features because a trade show or sales push is coming up.
The work is slowing down, and it is frustrating. Maybe we put 40% of our effort into accelerating for a few weeks, then bring it back down to 10% or 15% of the total workload.
Are we getting bad press from defects and lack of features? Maybe we can reduce the accelerating work to 10% and put 50% each into support and 40% into advancing features.
This doesn't need a lot of close supervision from outside engineering, just a good sense of what the product needs to move forward. There are ways for engineering groups to regroup and self-organize to meet goals.
There are many ways to handle this kind of problem, and I'd love to hear how yours works and how you keep your balance as an engineering organization.