Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
Rate it:
Open Preview
8%
Flag icon
Because we don’t talk about modernizing old tech, organizations fall into the same traps over and over again. Failure is predictable because so many software engineers think the conversations about modernizing legacy technology are not relevant to their careers.
8%
Flag icon
We are horrified to discover that most people do not actually care how healthy a piece of technology is as long as it performs the function they need it to with a reasonable degree of accuracy in a timeframe that doesn’t exhaust their patience. In technology, “good enough” reigns
10%
Flag icon
The first mistake software engineers make with legacy modernization is assuming technical advancement is linear.
14%
Flag icon
Changing technology should be about real value and trade-offs, not faulty assumptions that newer is by default more advanced.
20%
Flag icon
The lesson to learn here is the systems that feel familiar to people always provide more value than the systems that have structural elegances but run contrary to expectations.
21%
Flag icon
Engineers tend to overestimate the value of order and neatness. The only thing that really matters with a computer system is its effectiveness at performing its practical application.
21%
Flag icon
“the single worst strategic mistake that any software company can make.”
21%
Flag icon
Unfortunately, when confronted with the troubles of existing systems, engineering teams tend to build the most momentum around starting from scratch.
22%
Flag icon
So programmers prefer full rewrites over iterating legacy systems because rewrites maintain an attractive level of ambiguity while the existing systems are well known and, therefore, boring.
22%
Flag icon
It’s no accident that proposals for full rewrites tend to include introducing some language, design pattern, or technology that is new to the engineering team. Very few rewrite plans take the form of redesigning the system using the same language or merely fixing a well-defined structural issue.
23%
Flag icon
A big red flag is raised for me when people talk about the phases of their modernization plans in terms of which technologies they are going to use rather than what value they will add.
23%
Flag icon
Modernizations should be based on adding value, not chasing new technology.
23%
Flag icon
Familiar interfaces help speed up adoption.
24%
Flag icon
Technical debt is most likely to happen when assumptions or requirements have changed and the organization resorts to a quick fix rather than budgeting the time and resources to adapt.
26%
Flag icon
Large problems are always tackled by breaking them down into smaller problems. Solve enough small problems, and eventually the large problem collapses and can be resolved.
29%
Flag icon
These are the kinds of situations where people become frustrated and start convincing themselves that the best thing to do is throw the whole thing out and build it from scratch.
29%
Flag icon
When both observability and testing are lacking on your legacy system, observability comes first. Tests tell you only what won’t fail; monitoring tells you what is failing.
30%
Flag icon
The most relevant guide for legacy modernizations is Michael Feathers’ Working Effectively with Legacy Code.
31%
Flag icon
Software can have serious bugs and still be wildly successful. Lotus 1-2-3 famously mistook 1900 for a leap year, but it was so popular that versions of Excel to this day have to be programmed to honor that mistake to ensure backward compatibility. And because Excel’s popularity ultimately dwarfed that of Lotus 1-2-3, the bug is now part of the ECMA Office Open XML specification.
36%
Flag icon
Building a modern infrastructure is not a goal.
37%
Flag icon
In all likelihood, the business side of the organization does not understand what’s wrong with the existing system. Rolling out features they already have is not something they will celebrate.
37%
Flag icon
If you’re thinking about rearchitecting a system and cannot tie the effort back to some kind of business goal, you probably shouldn’t be doing it at all.
37%
Flag icon
the number-one killer of big efforts is not technical failure. It’s loss of momentum.
39%
Flag icon
If you are running a team tasked with just cleaning up the debt and migrating onto more suitable technologies, it means the existing organization has failed to adapt.
46%
Flag icon
Left to their own devices, software engineers will almost invariably over-engineer things to tackle bigger, more complex, long-view problems instead of the problems directly in front of them.
49%
Flag icon
When organizations stop aiming for perfection and accept that all systems will occasionally fail, they stop letting their technology rot for fear of change and invest in responding faster to failure.
54%
Flag icon
Problem-solving versus problem-setting is the difference between being reactive and being responsive.
56%
Flag icon
A good rule of thumb is questions that begin with why produce more abstract statements, while questions that begin with how generate answers that are more specific and actionable.
58%
Flag icon
Individual incentives have a role in design choices. People will make design decisions based on how a specific choice—using a shiny new tool or process—will shape their future.
58%
Flag icon
To save face, reorgs and full rewrites become preferable solutions, even though they are more expensive and often less effective.
58%
Flag icon
“The greatest single common factor behind many poorly designed systems now in existence has been the availability of a design organization in need of work.”
59%
Flag icon
When an organization has no clear career pathway for software engineers, they grow their careers by building their reputations externally.
59%
Flag icon
By defining what the expectations were for every experience level of engineering and hiring managers who would coach and advocate for their engineers, engineers could earn promotions and opportunities without the need to show off.
59%
Flag icon
Well-integrated, high-functioning software that is easy to understand usually blends in. Simple solutions do not do much to enhance one’s personal brand. They are rarely worth talking about.
59%
Flag icon
Introducing new languages or tools to optimize performance for the sake of optimizing performance
59%
Flag icon
Most of the systems I work on rescuing are not badly built. They are badly maintained.
60%
Flag icon
Conway argued against aspiring for a universally correct architecture. He wrote in 1968, “It is an article of faith among experienced system designers that given any system design, someone someday will find a better one to do the same job. In other words, it is misleading and incorrect to speak of the design for a specific job, unless this is understood in the context of space, time, knowledge, and technology.”
60%
Flag icon
Joel Spolsky once described rewriting software as the single worst strategic mistake any organization could make, but he attributed its nearly universal appeal to a clever maxim that code is easier to write than read.9
60%
Flag icon
A hundred errors on a legacy system is not failure-prone if it handles two million requests over that period. When looking at legacy systems, we tend to overrepresent failures.
60%
Flag icon
The systems we like to rewrite from scratch also tend to be complex with many layers of abstraction and integrations.
60%
Flag icon
Our perception of risk cues up another cognitive bias that makes rewrites more appealing than incremental improvements
60%
Flag icon
When success seems certain, we gravitate toward more conservative, risk-averse solutions. When failure seems more likely, we switch mentalities completely. We go bold, take more risks.11
60%
Flag icon
We are swapping a system that works and needs to be adjusted for an expensive and difficult migration to something unproven.
65%
Flag icon
Legacy modernizations are ultimately transitions and require leaders with high tolerance for ambiguity.
66%
Flag icon
It is impossible to improve a large, complex, debt-ridden system without breaking it.
76%
Flag icon
As an industry, we reflect on success but study failure. Sometimes obsessively. I’m suggesting that if you’re modeling your project after another team or another organization’s success, you should devote some time to actually researching how that success came to be in the first place.
78%
Flag icon
The most valuable skill a leader can have is knowing when to get out of the way.
83%
Flag icon
Automation that fails either silently or with unclear error messages at best wastes a lot of valuable engineering time and at worst triggers unpredictable and dangerous side effects.
85%
Flag icon
Future-proofing means constantly rethinking and iterating on the existing system. People don’t go into building a service thinking that they will neglect it until it’s a huge liability for their organization. People fail to maintain services because they are not given the time or resources to maintain them.
85%
Flag icon
Legacy modernizations themselves are anti-patterns.
« Prev 1