I was recently surprised when, at the question: "What is legacy code?" someone answered: "According to Michael Feathers, legacy code is any code without automated test." (Michael Feathers is, for those who don't know, the author of "Working effectively with Legacy Code").
I laugh when at questions like these people answer with quotes taken from a book. Don't get me wrong, I'm a technologist and a scientist, and to me books carry the same importance the sun carries for all the living things. We build our knowledge of the shoulders of our forefathers; but books should be used as tools to form our own opinions and not as containers for sentences to repeat mechanically. The fact that someone who wrote a book said that legacy code is any code without test doesn't make it true; it just makes it debatable, in fact I don't share one bit of Michael's opinion about legacy code.
So let's examine what I mean by legacy code.
I think there are two types of legacy code to consider, depending on whom you are talking to:
- Business Value Legacy Code
- Technical Legacy Code
The majority of people you will be talking to about this stuff will probably be technologists: in this case they will see "Technical Legacy Code" and answers will be along the line of:
- Legacy Code is code for which we haven't got the source code
- Legacy Code is code written by someone else who was the only one knowing how it worked and now this person has left.
- Legacy Code is code hard to understand and hard to maintain
- (You can put Michael's definition here if you want)
I bet some of you feels familiar with the definitions given above. Although legitimate, however, these answers represent just a minimal part of what should be considered legacy code. I have got a different opinion and with this post I'd like to draw the attention to what I think is the true meaning of the term "legacy code".
I see software in general as a tool to produce business value. Even if software is being written for research purposes, sooner or later someone will use it to make money. I would go as far as saying that if software does not deliver business value it's useless.
So to me "legacy code" is any software which does not deliver business value.
I see software from a business value point of view, not a technical point of view. What some consider legacy code (what I call technical legacy code) to me is just ugly code.
For instance, one could have cutting-edge software, whose API has been driven by TDD, with full test coverage, SOA architecture, clean code and the whole lot, but if such software does not deliver business I would still consider it as legacy.
Similarly, but on the opposite side, one could have ugly code which delivers an enormous business value (say, a legacy auto-trading system which generates 30% of the entire revenue of a firm). Such code might be against all coding standards, it might lack tests, the source code might not be available and maybe it's a nightmare to maintain, but would I consider it legacy code? Not at all; I would consider it very valuable code in need of heavy maintainance.
The technical view of legacy code tends to lead to the conclusion that "legacy code" should be replaced by more modern and shiny code. I'd say that "legacy code" should be replaced only if it does not deliver business value, otherwise it should be maintained and improved (from a technical point of view) when possible and left alone otherwise. If some software system does not deliver business value any more it should be disposed of as soon as possible, because every minute spent with the lights on represents cost for the firm and therefore a loss in competitive advantage.
The legacy code is useless so this blog is very intelligence and understand . i like your blog . You have made an awesome attempt and is doing consistanty good. thank you ,
business broker
http://www.ubbnetwork.com/
Posted by: Account Deleted | Wednesday, 15 June 2011 at 08:37
Thank you for your kind words...
Posted by: Marco Tedone | Wednesday, 15 June 2011 at 20:07
that is just we need to analyze any question in different aspects. You are right!
Posted by: Canada Goose Parkas | Wednesday, 26 October 2011 at 07:42
I think you are missing the technologists point of you. Legacy code needs to be reverse engineered to be understood and then subjected to automated testing. This is not the same as replacing it.
Posted by: James | Thursday, 19 April 2012 at 11:56
Hi James,
Apologies if I didn't make it clear enough, but I thought I represented in more than one passage the point of view of the "technologist", as I am one of them. What I was trying to say is that I'd consider legacy code even beautiful code, which you, me or any other technologist may be able to understand easily, if it didn't deliver business value.
Regards,
Marco
Posted by: Marco Tedone | Friday, 20 April 2012 at 19:57