Content deleted Content added
←Replaced content with '...' Tag: blanking |
m Reverted edits by 66.211.132.146 (talk): Unexplained removal of content (HG) (3.1.22) |
||
Line 1:
{{Merge|Code refactoring|date=May 2016}}
A '''rewrite''' in [[computer programming]] is the act or result of re-implementing a large portion of existing functionality without re-use of its [[source code]] or [[writing inscription]]. When the rewrite is not using existing code at all, it is common to speak of a '''rewrite from scratch'''. When instead only parts are re-engineered, which have otherwise become complicated to handle or extend, then it is more precise to speak of [[code refactoring]].
==Motivations==
A piece of software is typically rewritten when one or more of the following apply:
*its source code is not available or is only available under an incompatible [[license]]
*its code cannot be adapted to a new target platform
*its existing code has become too difficult to handle and extend
*the task of [[debugging]] it seems too complicated
*the programmer finds it difficult to understand its source code
*developers learn new techniques or wish to do a big feature overhaul which requires much change
*developers learn that new codes written may extend content options that can fix or overwrite previous problems
*the language of the source code has to be changed
==Risks==
Several software engineers, such as [[Joel Spolsky|Joel Spolsky]]<ref>{{cite web|last1=Spolsky|first1=Joel|title=Things You Should Never Do, Part I|url=http://www.joelonsoftware.com/articles/fog0000000069.html|website=Joel on Software|accessdate=2015-01-23}}</ref> have warned against total rewrites, especially under schedule constraints or competitive pressures. While developers may initially welcome the chance to correct historical design mistakes, a rewrite also discards those parts of the design that work as required. A rewrite commits the development team to deliver not just new features, but all those that exist in the previous code, while potentially introducing new bugs or [[Software regression|regressions]] of previously fixed bugs.<ref>{{cite web | url=http://www.ronkes.nl/blog/?2005-04-15-neverrewritecode | title=Never Rewrite Code From Scratch | first=Joost | last=Ronkes Agerbeek | date=April 15, 2005 | accessdate=2008-09-11}}</ref><ref name="spolsky">{{cite web | url=http://www.joelonsoftware.com/articles/fog0000000069.html | title=Things You Should Never Do | first=Joel | last=Spolsky | authorlink=Joel Spolsky | date=April 6, 2000 | accessdate=2008-09-11}}</ref> A rewrite also interferes with the tracking of unfixed bugs in the old version.<ref>{{cite web | url=http://www.jwz.org/doc/cadt.html | title=Cascade of Attention-Deficit Teenagers | first=Jamie | last=Zawinski | authorlink=Jamie Zawinski | accessdate=2008-09-11}}</ref>
The incremental rewrite is an alternative approach, in which developers gradually replace the existing code with calls into a new implementation, expanding that implementation until it fully replaces the old one. This approach avoids a broad loss of functionality during the rewrite. [[Cleanroom software engineering]] is another approach, which requires the team to work from an exhaustive written specification of the software's functionality, without access to its code.<ref>{{cite web | url=http://www.perlmonks.org/?node_id=115511 | title=Rewriting, from scratch, a huge code base | first=Ben | last=Tilly | date=September 29, 2001 | accessdate=2008-09-11}}</ref>
==Notable examples==
[[Netscape]]'s project to improve HTML layout in [[Netscape Navigator|Navigator]] 4 has been cited as an example of a failed rewrite. The new layout engine ([[Gecko (layout engine)|Gecko]]) had developed independently from Navigator and did not integrate readily with Navigator's code; hence Navigator itself was rewritten around the new engine, breaking many existing features and delaying release by several months. Meanwhile, [[Microsoft]] focused on incremental improvements to [[Internet Explorer]] and did not face the same obstacles.<ref name="spolsky"/><ref>{{cite web | url=http://www.jwz.org/gruntle/nomo.html | title=resignation and postmortem | first=Jamie | last=Zawinski | authorlink=Jamie Zawinski | date=March 31, 1999 | accessdate=2008-09-11}}</ref> Ironically, Navigator itself was a successful cleanroom rewrite of [[NCSA Mosaic]] overseen by that program's developers. See [[Browser wars]].
==See also==
* [[Code refactoring]]
* [[Open source software development]]
* [[Technical debt]]
* [[Development hell]]
* [[Porting]]
Some projects mentioning major rewrites in their history:
{{colbegin}}
* [[Apache HTTP Server]] (1)
* [[AOL Instant Messenger]] (1)
* [[BIND]] (1)
* [[Freenet]] (1)
* [[Fusebox (programming)|Fusebox]] (2)
* [[GNU GRUB|GRUB]] (1)
* [[Majordomo (software)|Majordomo]] (1)
* [[History of Wikipedia#Hardware and software|MediaWiki]] (1)
* [[History of Mozilla Application Suite|Mozilla/Netscape]] (1)
* [[Icecast]] (0–1)
* [[netcat]] (1)
* [[OpenRPG]] (1)
* [[PHP]] (1–2)
* [[Project Xanadu]] (0–1)
* [[Sun Secure Global Desktop]] (1)
* [[vBulletin]] (2)
* [[WebObjects]] (1)
* [[Zope]] (1)
{{colend}}
==References==
<references/>
==External links==
*[http://www.c2.com/cgi/wiki?RewriteCodeFromScratch RewriteCodeFromScratch at C2 Wiki]
*[http://www.joelonsoftware.com/articles/fog0000000069.html Things You Should Never Do, Part I by Joel Spolsky]
[[Category:Computer programming]]
|