We're often faced with the "rewrite vs. refactor" debate for legacy code bases. Here we present both business and technical considerations involved in the decision.
You may think your argument is solid, but managers have many other equally “solid” arguments for new features.
But let’s pretend they don’t
It’s like a paid vacation for the dev.
Many resources on the web for writing a business case or project proposal
BBC: CVS vs Subversion
BBC: rewrote XML serialization in a month.
Client was building software appliances (A software appliance is a software application combined with just enough OS to run on industry-standard hardware: server or VM)
Upgrading underlying Perl not a realistic option
Fixing a bug in Cat often means hunting through tons of dependencies. Mojo often just needs to be updated.
You can’t keep piling on risks unless you like “Corporate Jenga”
Less than a month if you factor in the costs of catching more bugs and writing more tests
If you don’t mention alternatives, you look sloppy.
BBC: rewrote XML serialization in a month.
When costs encroach on revenue
or there’s an external threat to your business model
Needs to be addressed long before the tipping point
Company who tried to hire us to maintain the system they were rewriting to Java
Don’t refactor code you don’t need to maintain.
Business knowledge: forgetting to assign a project to R&D and losing a tax break
Lost technical knowledge: forgetting that some routers implement SNMP incorrectly
Larger scope of work and more up front planning to layout what you’re going to keep
Buy-in: see previous “intuition” slide
Lock-in: Companies are bad at hiring
Refactor: miss your goals, you still have your software.
Rewrite: miss your goals, you may have nothing.
If management is keen on rewriting, call it a “in-place rewrite”. Better still, call it “reinventing.”
It’s not “too slow”, it’s “too slow because …”
“Orient” is processing the information. Here’s where we really need hard data, but it’s often where intuition (read: biases) kick in.
“Orient” is where we really need hard data, but it’s often where intuition (read: biases) kick in.
Functional requirements are high level
Fragility: bug/issue tracker and support staff
50% reduction in support calls: lose enough customers and you’ll hit that target. Hide your support number and you’ll hit that target.
They might lead the project or simply consult
For the sake of argument, we’ll assume few or no tests exist
EXCELLENT TIME TO GET EXPERT HELP!
Pull out template layer?
Pull out SQL?
Build a proper model?
But what if you have a critical demo?
Or what if you have one task with external dependencies beyond your control?
But what if you have a critical demo?
Or what if you have one task with external dependencies beyond your control?
Your weights and priorities will differ
But what if you have a critical demo?
Or what if you have one task with external dependencies beyond your control?
Does one ticket block another?Do you have legal considerations?
Is a very important customer demanding a feature?