Slashdot Mirror


Lessons From Six Software Rewrite Stories (medium.com)

A new take on the age-old question: Should you rewrite your application from scratch, or is that "the single worst strategic mistake that any software company can make"? Turns out there are more than two options for dealing with a mature codebase. Herb Caudill: Almost two decades ago, Joel Spolsky excoriated Netscape for rewriting their codebase in his landmark essay Things You Should Never Do . He concluded that a functioning application should never, ever be rewritten from the ground up. His argument turned on two points: The crufty-looking parts of the application's codebase often embed hard-earned knowledge about corner cases and weird bugs. A rewrite is a lengthy undertaking that keeps you from improving on your existing product, during which time the competition is gaining on you.

For many, Joel's conclusion became an article of faith; I know it had a big effect on my thinking at the time. In the following years, I read a few contrarian takes arguing that, under certain circumstances, it made a lot of sense to rewrite from scratch. For example: Sometimes the legacy codebase really is messed up beyond repair, such that even simple changes require a cascade of changes to other parts of the code. The original technology choices might be preventing you from making necessary improvements. Or, the original technology might be obsolete, making it hard (or expensive) to recruit quality developers.

The correct answer, of course, is that it depends a lot on the circumstances. Yes, sometimes it makes more sense to gradually refactor your legacy code. And yes, sometimes it makes sense to throw it all out and start over. But those aren't the only choices. Let's take a quick look at six stories, and see what lessons we can draw.

28 of 118 comments (clear)

  1. No different than writing a book by smooth+wombat · · Score: 5, Insightful

    Sometimes you have to completely rewrite everything from the beginning.

    Other times, changing a few words here and there, or a paragraph or two is all that is needed.

    --
    We will bankrupt ourselves in the vain search for absolute security. -- Dwight D. Eisenhower
    1. Re:No different than writing a book by dryeo · · Score: 2

      On this topic, I was thinking about the Thunderbird email client. It's been pretty stable, with no major changes in years as far as I can tell.
      Does that mean it's "done", or is it too complex for people to work on?
      The latter case seems to be hinted at in this blog post.

      Thunderbird is a big, complex project that isn’t easy to jump into. So, as we closed out the year I opened a bug where we can detail what documentation needs to be created or updated for new members of the community – to ensure they can dive into the project.

      Has anyone here contributed to it and if so, any comments? I love Thunderbird but when I looked at the code several years ago it was fairly daunting.

      There's a couple of problems with working on Thunderbird. It's built on Mozilla (Firefox) code base, which is huge and fast changing at times, especially lately as they replace big chunks, so right there is a huge learning curve including learning how a bunch of stuff works under the hood,
      Ant then there is the Comm-central (Thunderbird and SeaMonkey) code, which much is old and complex as well as intertwined with Mozilla code.

      They are being forced to rewrite much due to Firefox having large chunks ripped out and rewritten. Luckily they seem to have some money to hire a few full time developers, as it is a full time job just keeping up with the changes in Mozilla, including porting stuff that Mozilla has ripped out to Comm-central, keeping add-ons working while moving to the new crap etc.

      For a while it did seem pretty mature wit chunks that needed a rewrite but no one to do it. Now they're forced to keep up.
      SeaMonkey is fairing a lot worse in the keeping up stuff.

      --
      https://en.wikipedia.org/wiki/Inverted_totalitarianism
  2. Summarized in four words: "Make a New Product" by crgrace · · Score: 5, Interesting

    Nowhere in this article is any flaw in Joel's pronouncement to never rewrite found. The only of the six stories that was a rewrite of an existing product is Netscape and that was a disaster. The fact that Firefox came out years later doesn't make it any less of a disaster.

    In the rest of the cases, no one is re-writing their existing product and letting the competition catch up. No, what they are doing it making a new product and moving users over if possible. That makes sense and that is what I learned from Joel's original article.

    Making this seem like some kind of intriguing rethink of rewriting legacy code is false and click-baity.

  3. Citation needed. by mcmonkey · · Score: 5, Informative

    The articles own facts don't support the article's conclusions.

    "Netscape’s slide into irrelevance wasn’t entirely due to the rewrite—a court agreed that Microsoft had deliberately abused their monopoly. But the rewrite was certainly a contributing factor"

    The graf accompanying this section shows Netscape's market share dropping from about 80% to 50% BEFORE the rewrite. Now that drop continues from 50% to near 0% during and after the rewrite, so the rewrite certainly did not save Netscape. But the slope of the decline barely changes pre- and post-rewrite. Basically, unless there's other evidence not presented, the best conclusion is the rewrite had no effect.

    Also, "what finally ended the IE6 era wasn’t Firefox but Google Chrome."

    Except your own graf shows IE market share dropping starting in late 2002 in mirror to the rising Mozilla/Firefox. Chrome doesn't even show as a factor until 2008. The articles own facts don't support the article's conclusions.

    What really killed Netscape was releases a lousy product. 4.0 suuuuucked. (Folks on the web in '96/97 remember.) And IE at the time was releasing it's first good version, a better version. Fact is, at that time IE was better than Netscape.

    What Netscape needed was a better product, and if it took a ground-up rewrite to get that better product, then a rewrite was necessary.

    What we know now is the rewrite did not save Netscape. But we'll never know if there was some other course of action that could have saved the it. What we really should be doing is examining what was going on in '95/'96 to produce such a bad product and lose that market share in the first place, not at what rearrangements of the deck chairs was done as the ship went down.

    1. Re:Citation needed. by nmb3000 · · Score: 2

      The graf accompanying this section shows Netscape's market share dropping from about 80% to 50% BEFORE the rewrite. Now that drop continues from 50% to near 0% during and after the rewrite, so the rewrite certainly did not save Netscape. But the slope of the decline barely changes pre- and post-rewrite. Basically, unless there's other evidence not presented, the best conclusion is the rewrite had no effect.

      The decline of Navigator was caused by Internet Explorer. This is pretty easy to see on the graph, and for anyone who was around at the time, easy to remember. IE improved steadily with each release, and bundling it with Windows 95, first in the Plus! Pack and later in SP1 (in early 1996), had a massive effect. This, more than anything, caused the decline of Netscape.

      What Joel and others are saying is that starting a rewrite of the product prevented Netscape from reacting quickly to the problems with Navigator and implementing improvements and new features to compete with IE. The web browser market at the time was moving very fast and very loose, and stagnating an entire product for years was as good as a death sentence, even if there were other problems as well.

      So while it's true that the rewrite may not have directly caused the fall of Netscape, it was at the very least a significant contributing factor. In the same way as not going to the doctor when you have appendicitis doesn't actually kill you, it certainly won't help you avoid dying due to the illness.

      --
      "What do you despise? By this are you truly known." --Princess Irulan, Manual of Muad'Dib
      /)
    2. Re: Citation needed. by Bangback · · Score: 2

      Probably more importantly, IE was free while Navigator 4.0 was $49. While there were free licenses available for personal and educational use, corporations and institutions adopted IE en masse as the cheap âoegood enoughâ solution especially since Windows 95 had an extremely rapid corporate migration due to much improved networking and hardware support.

  4. Re:I disagree by ShanghaiBill · · Score: 5, Insightful

    If the person recommending the rewrite is the person who wrote the original code, they are usually right.

    If the person recommending the rewrite understands the code and has years of experience with it, they are often right.

    If the person recommending the rewrite is the new guy fresh out of uni, they are almost certainly wrong.

    Disclaimer: I was once that new guy.

  5. Re:I disagree by crgrace · · Score: 4, Interesting

    I disagree with your disagreement. Rewriting a working application is juggling with a loaded gun. You say "if you carefully learn from past mistakes" but this is almost impossible in any organization I've ever seen. All those snippets and dirty patches are not documented properly. If there are comments, they may (or may not) be out of date. Maybe there is a reason they chose a weird data structure but that guy retired 15 years ago. So you do something "proper" and find it is 10X slower. Oops.

    If I've learned anything, I've learned you gotta let sleeping dogs lie. More patients are killed by doctors in this business than anything.

  6. Don't be a Hero. by jellomizer · · Score: 3, Interesting

    Sometime you need to disconnect your software from your ego.
    A lot of full rewrites are primarily due to the fact the developer wants to be the Hero, toss out the old broken code, and make a new superior on in their own image. (Which then over times becomes old and broken)
    Also trying to keep bad code on life support, because you had invested so much into it over your time there, is just as bad, as the application barely meets the business needs anymore, and every fix is getting increasingly more complex.

    Sometimes what the code really needs, is just some reorganization. (Move your function and methods in more logical locations in your code so you visualize the problems more easier. Beautify your code, make white spaces consistent. ) Create a script to see where each function is called and where, Delete unused functions. Identify duplicate logic and merge them, or make a parametrized function of of them. It is actually amazing how a little cleanup work can turn a mess into a manageable application for decades.

    Also if designing software really try to split Logic and Interface/System call into separate portions. The routine that checks the required field, should be straight logic. Not generating HTML or Form boxes, giving the errors. Despite what your bosses say, assume the platform it is running on will be retired in 5 years, and try to plan to port the application over.

    Finally, really try to use basic core components as much as possible, avoid 3rd party tools as much as you can (this includes semi official repositories such as with pip or cargo). Don't be a Hero and make a ground breaking new interface, just use normal component.

    --
    If something is so important that you feel the need to post it on the internet... It probably isn't that important.
    1. Re:Don't be a Hero. by www.sorehands.com · · Score: 2

      Maybe it is sometimes ego. Sometimes it is being tired of fixing spaghetti code that evolved over years with a CEO that says to fix it now, without taking the time to fix it right.

      AT MSI they had a person port the code from Windows to Mac, and came out with crap that was thrown away. If done correctly, it could have been the core of the new generation and been used as core of the NLM transport module. If they did this when they ported it from DOS to Windows, the port to Mac would have been much easier. The code had comments like, "I know this is not the right way to do this, but I will fix it later, because Dick wants it now." and I saw that comment 3 years after that programmer left.

  7. Re:I disagree by jellomizer · · Score: 3, Insightful

    So you rewrite your code with a new sets of corner cases snippets, dirty patches that stick out from it.

    The problem is old code while ugly, has been made to work over the decades, you are not going to learn from the past mistakes, because in the rewrite, you will undo years of patching which explains the changes in thought.

    --
    If something is so important that you feel the need to post it on the internet... It probably isn't that important.
  8. Re:I disagree by Major_Disorder · · Score: 5, Insightful

    You forgot:
    If their title is Manager, or Consultant, they are ALWAYS wrong.

    --
    First law of people: People are generally stupid.
  9. WTF, Slashdot by SlaveToTheGrind · · Score: 4, Funny

    Two programming articles in a row? How in the world am I to satisfy my deep inner thirst for bleeding-edge news about global warming, basic income, the Model 3, and Ajit Pai?

    Keep this up and I'm going to have to go back to HuffPost. Sad!

  10. Rewriting Netscape gave IE the web. by xack · · Score: 3, Insightful

    And rewriting XUL into Web Extensions, making the rewrite mistake twice gave Chrome the web. We could have had a strong Mozilla, now we got a weak one. Imagine a Firefox released in 2000, not 2004. We could have defeated IE earlier and avoid IE6 all together.

    I hope in five years time, when Chrome has 90%+ market share Mozillians take a hard look at themselves and see that they were responsible for the chromageddon.

  11. Joel was incorrect.. by Junta · · Score: 5, Insightful

    His article hinges upon the assumption that Netscape was screwed over by the rewrite. In reality, they were almost certainly screwed on the business side to the extent no amount of technical effort could overcome their position.

    To the extent they had technical woes, it may well have been the case they couldn't sort out how to make the improvements they wanted to make given their current design.

    Now there are valid points, that 'old code' may look crusty but there is a good chance it is crusty for a reason and that sort of thinking should be ever present while making such a call, to try to understand *why* it is crusty before throwing it out. However sometimes it is for bad reasons:
    -Written against a once-presumed 'winner' of the market that becomes defunct. Your shockwave website has to be rewritten because the supporting technology is toast, and you better be scrapping your flash website soon if not already.
    -Maybe the runtime is still around, but *your* ability to find willing developers is difficult, so you have to switch languages/runtimes to align with the labor market
    -The people doing it didn't know what they were doing and did it incorrectly. Optimally, this is the same team that recognizes they painted themselves into a corner so they know what to do next time.
    -The code is full of workarounds for third party libraries that no longer apply. True this doesn't scream 'rewrite', but one of his points was that the ugliness of code is due to fixes for things long forgotten that still matter, but it's frequently the case they do still matter.

    In short, like all opinions be informed and influenced, but no simple answer is ever 100% correct no matter what. Internalize the points and evaluate in your scenario.

    --
    XML is like violence. If it doesn't solve the problem, use more.
  12. Re:The only unmatintainable code... by HornWumpus · · Score: 4, Insightful

    The classic answer to that is 'job security' == 'unpromotable'

    But that assumes you aren't going to change companies, on your schedule, and 'fuck them'.

    The truth is 'job security' == 'not promotable without an employer change'. But that's just true for many employers in any case. If that's your boss, there is no reason not to play 'knowledge is power', just don't be slow blatant about it the PHB can see it.

    --
    John McAfee 'It was like that time I hired that Bangkok prostitute; to do my taxes, while I fucked my accountant'
  13. Re:edge cases and weird bugs by bws111 · · Score: 2

    I would say nobody ever fully understands the situation originally. Thinking otherwise is hubris.

  14. Re:I disagree by ctilsie242 · · Score: 4, Insightful

    I do think refactoring is a must and needs to be part of the design cycle, just as much as getting the features that marketing already has sold to customers.

    Technical debt is a thing, and getting that heap of hacks, kludges, workarounds, and other junk out of the codebase is just as critical as doing months long sprints to appease marketing. In fact, the Agile cycle in theory has room in between sprints for doing just this and fixing stuff. However, every place I have worked at who tried to do Agile had a "permanent sprint" in place, which not just burned people out, it made code bases which were all but impossible to maintain. Especially with management always threatening to outsource or offshore the devs, to the point where the devs knew they were going to get offshored, so they didn't care about anything except making their deliverables, even if it meant that they left gaping security holes, or just horri-bad code, because that mess would be cleaned up by someone else.

    If a company actually values its code base, they will treat it just as they do any other machine... take time to take it down and service it, fix glaring problems, add actually useful code documentation (no comments about "don't touch this routine, we don't know how it works, neither will you.") Then, start seeing if you can do things like performance testing and code optimization, perhaps a pass for security checking (strncopy(), not strcopy(), etc.)

  15. Wrong reason to to rewrite by CanadianMacFan · · Score: 2

    I once worked in a government department that liked silver bullets. One of the things they tried was moving the development shop to one language, Java. That meant rewriting everything they wrote and even used. Even apps that were running without issues had to be re-written just because it was originally written in C. They even wanted to rewrite the utility formmail.pl that most sites were using at the time just because it used Perl.

    1. Re:Wrong reason to to rewrite by magzteel · · Score: 2

      I once worked in a government department that liked silver bullets. One of the things they tried was moving the development shop to one language, Java. That meant rewriting everything they wrote and even used. Even apps that were running without issues had to be re-written just because it was originally written in C. They even wanted to rewrite the utility formmail.pl that most sites were using at the time just because it used Perl.

      Perl itself is an example. The grand rewrite to Perl 6 is still a work in progress.
      I think it killed Perl in the process.

  16. Re:I disagree by DickBreath · · Score: 2

    I have been through three successful rewrites of a product. The first (when I was the new guy) was rewriting it from text mode to a fancier text UI (mid 80s). The second was in the mid 90s when it clearly needed to become a GUI application. The third was in the late 2000s when it clearly needed to become a web based application.

    One that that can help is to rewrite in modules. Build the base modules first. You can then migrate customers who only use those modules and are not in an immediate rush to upgrade to the other modules that are not yet rewritten in the new technology.

    Be sure to develop a good, no excellent conversion path for customer data.

    --

    I'll see your senator, and I'll raise you two judges.
  17. Re:I disagree by apoc.famine · · Score: 4, Interesting

    Technical debt is a thing...

    Best place I ever worked knew that, and worked to quantify it. That helps a lot when you're trying to figure out whether or not to refactor. In a couple cases, it became apparent that a partial refactor was going to accomplish something like 90% of a full one, with 10% of the effort.

    Quantifying your pain-points with even back-of-the-envelope calculations can really help you make good decisions about how to move forward.

    --
    Velociraptor = Distiraptor / Timeraptor
  18. Re:edge cases and weird bugs by apoc.famine · · Score: 2

    And almost everyone who codes stumbles across some old code and asks, "Who the hell wrote it like this?" And then realizes it was them a long time ago, and that there was probably a reason for it but they have no idea what it was.

    --
    Velociraptor = Distiraptor / Timeraptor
  19. Re:I disagree by Darinbob · · Score: 2

    Half the time the people who wrote it don't even realize they made a mistake. I've done it myself, looking at old code and thinking "what moron did this?", looking at who made the code commit, and realizing it was me.

  20. Re:The only unmatintainable code... by Beeftopia · · Score: 2

    foo(a, b); // Compute the dot product of the inputs and bias

    dotProduct(inputs, bias);

    Which is better?

    The best is:

    // Compute the dot product of the inputs and bias
    dotProduct(inputs, bias);

  21. This killed my software by Anonymous Coward · · Score: 2, Interesting

    Maybe add this as a seventh cautionary tale.

    I developed an application for reserving lab equipment for one of the largest server manufacturers in the world. It was capable of automated inventory, software and image deployment, and automated permissions handling that worked with an out-of-band IPMI interface and was capable of getting data as detailed as PCI bus info, CPU and memory information of virtually any server that runs IPMI. I wasn't the first to attempt an inventory management system like this within our company, but it was the most ambitious and long-lived solution by far and was used by 4000+ employees for thousands of servers and virtual machines at its height in over a dozen sites world-wide.

    Unfortunately, it was never an official job duty. I did it during free time at work and during a painful point in my personal life where I sunk most of my waking hours into the project. It was developed on a LAMP server when I was still a very novice programmer and despite how gross and hacky the code was, the software ran exceptionally well, had a professional-looking UI, didn't require any kind of management beyond ensuring the hardware was functional and any auto-generated tickets by my application were solved and gained it gained a lot of positive attention. I had an instance at each location and a master one collecting data from those for backup purposes.

    I'd always intended to rewrite the code, but life priorities and job duty changes made progress very slow on that, so despite the issues with the code, I continued updating it and maintaining it to support new products and features for nearly 8 years. The issues with my earlier novice programming skills started creating more and more problems however as I didn't develop it to be modular initially and every change I made to the UI to support the new features I was adding was piling up the problems I had to fix each time. I decided to begin learning NodeJS as I knew by this time that PHP's limitations in presenting real-time data would eventually be an issue and that it wouldn't scale very well as-is.

    I began the slow and arduous process of learning a language I'd dabbled in, but never been a huge fan of. Javascript, especially when it comes to programming non-blocking code for things that must happen in a very specific order, but where some parts must be run in parallel, can be an incredibly obtuse language to program with. Javascript starts great until you start using hundreds of modules and libraries and see how splintered the community has become. It's like modding with Skyrim. I spent more time testing mods than actually playing the game. Here, I spent more time learning and testing how to make all the modules work together smoothly than actually programming the software itself, frequently finding certain combinations didn't work properly as documented and requiring extensive troubleshooting.

    I'd made steady, but very slow progress as I didn't have a lot of free time to learn the language and I was basically learning as I was developing. The final nail in the coffin was that the company decided a spreadsheet-based solution without any automation, inventory or user management was the way to go... They felt that the IT labs functionality being tied to a single developer's presence was a bad idea. To be fair, I'd been trying to hand over the project to others and act as more of a project manager for awhile, but no one stuck with it long enough to even submit a single commit. The move to the new solution was a complete and utter disaster. Hardware and pieces parts gets swapped, moved, used, etc and as time goes on, the data just gets more and more stale as people complain they can't find what they need. I was happy to just be done with it as it was mandated that all IT were supposed to move away from my application, but I've found myself in an odd scenario as people are going behind IT's back to run my software and I'm having to continue providing support for it despite my desire to escape it since I have no interest in developing an application that will eventually just get hard-blocked by IT.

  22. Re:The only unmatintainable code... by Megane · · Score: 2

    Even better would be to explain why you need to compute the dot product.

    --
    #naabhaprzrag, #sverubfr-000, #agi-fcbafberq, negvpyr[pynff*=' negvpyr-ary-'] { qvfcynl: abar !vzcbegnag; }
  23. Mixed bag by seniorcoder · · Score: 2

    Over my 40 year career (thankfully retired now), I participated in 3 total rewrites.

    The first two never produced anything and sucked up huge amounts of development resources.
    The reason was identical both times:
    New management wanted to take over a successful product and make a name for themselves.
    They never really understood the original product and nor did the (largely) new development staff thay used.

    The third rewrite project was a success.
    The original management used most of the original development team to rebuild, from the ground up, the product.
    While the rewrite took slightly longer than the estimates, the results were better than predicted.
    The company was subsequently sold to a huge bank for hundreds of millions of dollars.
    The team that built the original product and also did the rewrite still consider themselves a team, despite the fact
    that most of us no longer work together.
    IT'S ALL ABOUT THE TEAM
    Full credit goes to the management for team building, which is the most important aspect of managing just about anything.