Legacy systems are hard. Being able to work effectively with them is something they don't really teach you in school. Probably because it's entirely frustrating, complicated, and a big turn off even for seasoned programmers. It's a bit of a black art and there's little joy or glory in being good at it. Except perhaps that the job market for your specialty is pretty small and will always be in demand.<p>For a good read on the subject, try "Working Effectively with Legacy Code" by Micheal C. Feathers.<p>I prefer the term "technical baggage," over "technical debt." This is mainly because debt refers to an economic means of borrowing a sum of future purchasing power. This breaks down when referring to the cost of engineering decisions. The cost of maintaining legacy systems tends to increase with time and you cannot calculate any sum to borrow based on assets or secured revenue. The decisions you make now will haunt your business for a long time to come. Poor technical decisions are simply something you will have to learn to live with.<p>When dealing with legacy systems from a business perspective, the question one has to ask is, "how valuable is it to maintain and enhance the existing system going forward?" In other words, when will the costs of continuing development of your legacy system outweigh the revenue it generates? For large systems found in banks and insurance companies it can be a very long time. For small businesses it is much shorter than you think.<p>FWIW, it seemed to me that Netscape simply made the decision to start from scratch too late. The revenue they were generating from their old code base had trickled off too long and dipped below their operating costs before the warning signs went up. I don't think it makes a compelling argument against re-writing.<p>As someone supporting a legacy system, it sometimes makes sense to re-write the system. Treat the existing system as a prototype and derive the minimum viable product from it to start with. Spin it off as a new product, set an shut-off date for the old software, and convert your customers. Obviously this doesn't work for every scenario; so YMMV. Just be smart about it and use evidence to back up your assumptions. Sometimes simply writing a legacy compatibility layer and porting the most painful bits of code slowly is the key. Re-writing certainly isn't for everyone.