You can't stop the business, or why rewrites fail
swizec.com
swizec.com
1. when we did the rewrite, we ran into a lot of the same constraints we ran into on the original application, and we didn't come up with significantly better solutions 2. we had to continue using and improving the original tool to serve it's original use case, and the dual maintenance was terrible
But there was a huge positive as well. Without worrying about breaking the original use case, we could hack on the new tool all we wanted without regard for stability or reverse compatibility. We got a thorough understanding of how to serve the new use case and why the original tool was designed the way it was
We ended up taking the best stuff from the new tool and bringing it to the original tool, and made the original one better. I am not sure that it was the best use of time, but I'm also pretty sure that we would have never been able to modify the tool as well as we did without the benefit of the rewrite
Speak with people who work in large corps and you might here similar stories. Problem is people online naturally can't go too deep to avoid doxxing.
Maybe good for your understanding, but this is pure waste.
The hard part, of course, being that you need competent engineers who know just how modular is the right amount and how to achieve that. This can fail horribly when you go leftpad on the modularity. But I believe it's the only way to build something that lasts.
I think the same applies to rewrites--systems with very well-known/understood requirements will be easier to rewrite than systems with soft requirements that have evolved a lot over time.
The only time you should remotely take it seriously as an option is if the person proposing it also happens to be the most experienced with the existing system by a wide margin. Almost no sane subject matter expert would ever suggest it. In the case they do, they might be right. But being right in this case would almost always indicate that the business itself should be totally transformed.
Doing this way also often ends in failure though because it takes longer and often the rewrite stops midway (business requirements change, key person leaves, organisation rework) and now you have two competing architectures in your product.
[1] https://martinfowler.com/bliki/StranglerFigApplication.html
The plan was that once all the code had been ported over, the Java app could just go away. I skipped over some of the details here, but this was a nice way to port the app over without feeling in a rush, and without having that big stressful "throw the giant switch" moment. Ultimately, the company decided to scrap the original app altogether and rewrite from scratch because a lot of the original app was irrelevant to the new direction we were taking... but I got about 20% of the original app ported over in a week or so.
There will be problems regardless of whether you're trying to do a gradual rewrite and carry over API paths one by one, or do a big bang rewrite, where you replace the whole thing. I actually recently watched a conference talk called "Top 5 techniques for building the worst microservice system ever", which also touches upon the issues with rewrites: https://youtu.be/88_LUw1Wwe4?t=775
But as long as you're okay with the loss of some functionality or changes to some of it (hopefully for the better), then it should be a bit more doable.
Rewrite/relaunch did increase revenue a lot, but not enough to justify the 5 year investment of R&D. Pain.
"Recently I thought of a small tweak that might help things a little. If I rename the post to “Strangler Fig Application”, and use the term “Strangler Fig” as much as possible, then hopefully that would reduce the violent connotation by reinforcing the metaphorical link that is the whole point of the name. Because it's a small change, maybe it will spread enough to be worthwhile, and it's not much effort, so seems worth a try." - M. Fowler https://martinfowler.com/bliki/StranglerFigApplication.html
The “business” is everyone working together.
Sales, ops, tech are all the business.
I appreciate this word has a specific meaning in tech circles but its use distances you from “the business” you’re part of.
Basically, if you plan to rewrite something, plan on getting it released to production on the same schedule that you would release everything else (maybe a month longer? but not much). If you can't do that, you cannot do the rewrite.
A friend of mine worked for a business that had a product that was supposed to be built to a specification provided by a regulatory body, but fundamentally hadn’t been.
The product team was bogged down firefighting regulator requests, chronically hacking in modifications (on modifications) to give the appearance that it was built to spec, but it fundamentally wasn’t - stemming from core design choices.
There was almost zero product velocity and changes regularly failed. After years, it burnt out one team and got handed to a fresh team, dropping most of the gained experience on the floor.
The opportunity cost of those fundamental design decisions had been extremely high - years spent covering up mistakes, rather than addressing them at the root - because it was quicker/easier/preferable. The result was that every patch to get them over the latest regulatory hurdle had hardened the software which, by the end, was so brittle that enhancing the product was impractical.
The business survived. The product sucked. The team hated the experience. It’s a sad, yet familiar story.
What’s the alternative? Refactor, and re-factor often. You could always be refactoring (rewriting) toward deeper insight. As you gain experience in a domain, you could ducktape new requirements on (for a higher future cost), or you could use your insights to better design your software (for a higher now cost). It depends on whether you would like your software to remain responsive to change. A primary quality of software is its changeability. I recommend keeping your software responsive to change.
This requires a note: this is not achieved with technical practice (e.g. something like dependency injection) but with the code and models being enough self contained, and well defined, isolated key steps/blocks of the business logics you’re coding
Thinking as a reader, I’d also like add to your note: and this does not mean microservices (another technical practice) automatically gives you this either.
The microservices (optionally) come after discovering and choosing a useful model for your solution. Put time into this bit, not the technical practices.
We had the tribal knowledge in-house to successfully rewrite them in a better, leaner stack. The end result was a much faster and easier-to-maintain system. Features that took weeks to build could be built in 1 or 2 days.
Rewrites are hard, but they can be done if you have a good team that know what they are doing. You should take a really hard look before moving ahead with a rewrite, but you shouldn't fear it when it's necessary.
Maybe there is an analogy somewhere with a root canal; they are no walk in the park but when you have to do it, you have to do it - and a good professional will be able to do a root canal safely.
In the spring of 1998, Netscape launched Open Source with the Mozilla project. Six months later, under pressure from Web standards advocates and others, Netscape and Mozilla tossed the Netscape Communicator 5.x beta code base and started over, a re-write based on a nascent engine that would come to be called Gecko.
That re-write did indeed take much longer than expected as Netscape wasn't able to release Netscape 6 for about two full years which was an awful long time to be without a web browser release.
And Netscape 6 wasn't terribly successful except that a few of us took that code in 2002 and turned it into Firefox which shipped in 2004 and quickly grew to hundreds of millions of users and a half a billion dollar a year business that's maintained at those levels of revenue for more than a decade.
So, re-writes can work, just not necessarily the way one might expect them to work.
I'm very curious if this is the biggest reason behind why people advocate for Joel Spolsky-style "never re-write it" approach. Because I would very much like to do a start from scratch on my own codebase, and it doesn't have any of those availability limitations. But I still haven't been able to make space to do it without stopping the world because we have customers who are currently using the code who expect new features and support.
Are we saying that the balance only tips towards "don't rewrite it" when your code runs an always available service though? If your code is merely a product that works on a release schedule, is it now ok to splinter off a Project Phoenix team to make the new hotness? Very curious what people's experience is.
I also am downvoted. It's Reddit 0.5 and has been for quite a while, which is quite funny, when you think about reddit's current path.
You didn't make any points and what you said didn't make any sense. Firefox and Chrome didn't come out anywhere near the same time. Firefox came out almost half a decade before Chrome. Chrome won because it was a breath of fresh air after dealing with Netscape, then Firefox. The dev-tooling was amazing (even in the early versions, IIRC) while firefox required installing a separate extension (which your customers almost never had installed).
IE 'won' because Netscape wasn't updated. It was the defacto browser that was still being updated.
So a lot of Chrome's success was us devs telling customers "go install Chrome and tell me what the error is in the console," instead of "go install this extension and navigate all these screens/tabs ... no, not that one." Then there was the heavy advertisement on Google.com (but that was a little later IIRC).
That's a lot later than I remembered! I thought I was using it earlier but I guess my memory is wrong.
People had Gmail and it synced shit too. People used Google and got pushed to use it.
It's absolutely disingenuous to pretend Firefox lost the upper hand it had because of - bad decisions from Netscape ages ago - chrome being objectively better.
> Then there was the heavy advertisement on Google.com (but that was a little later IIRC).
You recall wrong. The stats showed Firefox on the way to overtake IE until chrome showed up strong and unavoidable, prompting people and being the default.
Your experience with the Dev tools is fine but most power users who wanted customization preferreed Firefox and recommended it to their non tech friends and installing and add-ons is not harder than installing chrome. So it's basically anecdote against anecdote.
IE won because it was the default.
> Chrome won because it was a breath of fresh air after dealing with Netscape, then Firefox
A fresh of uncustomizable air, right?
You drove the wrong conclusions from the market movement and wanted to chuck it down to developer decisions.
Clearly you haven't paid attention. But even if you're fixated on the default install aspect, the Google pestering you aspect should give you a clue about the power of their reach. You know, Google, the default search engine for mostly everyone?
Chromebooks didn’t come out until 2011, they aren’t really a part of this discussion.
> It’s important to remember that when you start from scratch there is absolutely no reason to believe that you are going to do a better job than you did the first time. First of all, you probably don’t even have the same programming team that worked on version one, so you don’t actually have “more experience”. You’re just going to make most of the old mistakes again, and introduce some new problems that weren’t in the original version.
https://www.joelonsoftware.com/2000/04/06/things-you-should-...
What is generally referred to here is any business system that has (my number) at least a man-year of work invested, and will probably take three man months at minimum to rewrite.
These systems are everywhere. A midsize company can have hundreds. They can be excel spreadsheets and access databases.
System rewrites, despite theoretically having more stable requirements, are probably even worse than the usual software project failure rate, because they will be underinvested, the new/additional requirements will be 2x the effort per the usual
I don't agree with this as a general rule. All the communication, specification and validation of the features is already done in the old system and can be reused, the actual implementation didn't take 104 weeks in the old system and should take even less in the new.
But 2 week estimate to rewrite a billing system? After 6 weeks "window to try our new business model was gone"?
https://en.wikipedia.org/wiki/Second-system_effect
2.0 is the hardest version to write.
But it turns out my career has seen a bunch of rewrite projects, and they were all spectacularly successful.
So as with all advice: YMMV. ¯\_(ツ)_/¯