Why your programmers fantasize about a big rewrite
hackernoon.com
hackernoon.com
With these rewrites do you just abandon maintaining the legacy system and focus on the new one?
I find it immensely more satisfying to "rewrite" a system using the Ship of Theseus approach (aka Strangler Pattern). If there are no tests, the first (and exciting) challenge is to put some behavioral tests in place in an attempt to protect it from the changes you are about to make.
Building something new is fun, trying to debug, build on or debug something that already exists is a lot less so.
Well that and the point in the article about how their ideas would be respected. The guy who builds a whole new system gets a lot more respect from the management team than the person who keeps it going or fixes bugs.
I couldn't care less about respect considering I'm the only developer on it and I feel my manager and I have a good, respectful relationship as is. I just hate having to do fubar math to quote how long it will take to add/update something and having to put out a number I'd be embarrassed to quote on any other project.
- the legacy system is a spaghetti code nightmare - with arcane and manual deployment process - years of band-aid hacks layered over every component - inseparable two-way dependencies across all bounded contexts - inscrutable data structures - nearly impossible to debug - utterly fragile and mostly undocumented - riddled with dead code and unused components that merely confuse the poor soul tasked with debugging - often so intertwined with dependent systems that there's a dev "environment" shared across programmers because no one can develop on their machine.
THIS is why your programmers fantasize about a big rewrite. Every time.
Maintainence is as important as new feature development.
We're not punching decks or estimating effort in terms of KLOCs, but MIS students still learn a linear model.
- full rewrite replacement
- piecemeal separation of a function (e.g. search)
- in-place migration to a desired design
- side-by-side incremental replacement of functionality
Each has it's merits, although I tend to believe developers lean toward remaking everything themselves and thus try to consciously give more consideration to alternatives. The most interesting is the side-by-side one where we could run non-mutating requests through one (Ruby) or the other (Go) for performance measurements, or through both for correctness comparisons monitoring all metrics during the migration.