你永远不要去做的事1【译】

原文链接: Things You Should Never Do, Part I 

主题:重构而不是重写代码。

  Netscape6.0进入了最终公开测试阶段。并没有5.0版本。上一个主要的版本是4.0版在三年前发行。在互联网领域三年是一个相当长的时间,在这段时间里,Netcape对于它的市场份额直线下跌(plummet),一致无能为力。去批评他们在两个版本之间等了这么长时间,确实有点虚情假意(smarmy)。他们也不是故意的,不是吗?
    
    然而,确定的是,他们确实做了。像任何软件公司一样,他们做了一个最坏的战略失误:他们决定重写代码而不是重构。
    Netscape不是做这个错误决定的第一个公司。宝蓝公司(Borland)做了同样的决定:当他买了Arago并且想让他成为Win系统的数据库时,这个注定要失败的项目耗时如此之长,以致于微软Access有了可乘之机。然后他又犯了同样的错误:重写Quattro Pro 而不是重构,以致于人们惊讶于Quattor Pro有如此之少的功能。微软几乎犯了同样的错误,试着在一个Pyramid的项目中重写Word,Pyramid已被叫停,并搁置不用。幸运的是,微软没有停止对旧代码的维护,因此他没有战略上的失误,而是经历了一场经济危机。
    
        程序员,在他们心里自己是建筑师。他们到达某个地方的第一个想法是:用推土车将这个地方夷为平地(bulldoze),然后建一些华丽的建筑。他们并不喜欢增量式的修改(renovation).
        
        程序员总是想抛弃旧代码,重新再来。这里面有个微妙的原因:他们认为旧代码一团糟。然而,有个有趣的调查表明:他们很可能是错误的。这是因为读代码比写代码更难。这是一个常识,同样导致了代码很难复用。也因此你的团队中每个人都有自己的拆分字符串的方法。这比弄清楚别人的方法要容易和有趣的多。
        
        作为这个常识的推论,你可以问所有程序员关于他正在处理的代码,他会告诉你:代码真乱啊,我真想重写了。
        
        为什么代码会成为一团乱麻呢?
        
        他们会告诉你:看看这个方法,它竟然用了两页!这些代码就不应该放在这儿!我不知道一半的API是用来干什么的!
        
        在宝蓝(Borland)的新电子表格软件Quattro Pro发售之前,宝蓝的一位创始人,Kahn大肆吹捧了Quattro Pro,说它比微软的excel好多了,因为它所有的代码都是重写的而不是重构得来的。都是新代码,好像代码会生锈一样。
        
        新代码比旧代码更好简直是无稽之谈。旧代码经过使用、测试。它的许多bug已经被发现和修改了。它呆在硬盘里不会产生更多的bug。难道它会像Dodge Dart(汽车品牌)一样,呆在车库里就生锈吗?
        
        回到那个两页纸的方法。它确实只是一个显示窗体的方法,但是它不断变大,是因为bug修改。假如目标电脑没有IE,假如目标电脑内存太低,这些都是需要修改的bug。这个方法虽然丑陋,但是它能使代码在Win95上运行。
        
        每个bug的发现都需要几周时间。程序员可能花了几天时间再现bug并修复它。通常bug修改需要一行代码甚至几个字母。但是bug修改确实需要许多工作和时间。当你抛弃代码,重头再来的时候,你同样抛弃了各种bug的修改。几年的编程工作。同时,你也在抛弃你的领先的市场地位。你给了竞争者两到三年的大礼。这在软件开发中这是很长一段时间。你把自己放到了一个很危险的境地,你将在很长一段时间内完成老版本的功能,完全不能做任何战略改变,不能响应新的市场需求,开发新的功能。因为你没有可靠的代码。
        
        你正在花费相当长的时间写已经存在的代码。有其他的解决办法吗?大家都以为旧版的Netscape代码已经非常乱了。它可能确实很乱,但是它确实能在混乱的现实世界电脑上很好的运行。
        
        当程序员说他们的代码一团糟,有三点他们错了:
        
        第一,有架构问题。代码没有被正确分解。网络处理代码中弹出对话框是不正确的,应该在UI代码中弹出对话框。这些问题能一个一个的解决,小心的移动,重构代码,改变接口。这些事应该由一个程序员小心的进行,同时核对进行的修改。而其他人的工作就不会被耽误。即使是主要架构改变也不需要抛弃代码。在Juno项目中,我们花费了几个月时间重新架构:移动,清理,创建基类,在模块间新建接口。但是我们小心的进行,以现有代码做基础,我们没有引入新的bug,也没有抛弃代码。
        
        第二,程序员认为他们的代码一团糟,是因为代码效率不高。Netscape中的渲染代码被谣传说很慢。但是它通常影响项目中的一小部分。你完全可以优化甚至重写它,而不用重写整个项目。当优化速度时,通常1%的工作能获得99%的效果。
        
        第三,代码极端丑陋。在一个项目中我竟然发现了一个数据类型叫FuckedString.另一个项目开始时,按照惯例在所有变量前面加'_',后面改为标准的'm_',所以有一半的变量是'_'开头,一半'm_'开头,因此看起来很丑。坦白说,这种事情完全可以用Emacs中的宏做修改,并在5分钟内改完。
        
        当你想重写一个项目是,一定要记住完全没有原因去相信你可以比第一次做的更好。首先,你甚至可能并不拥有原来的编程团队。因此,你将会犯各种原来的错误。引入老版本中没有的新问题。
        
        “建立一个用来抛弃的版本。”这个俗语对于大型商业应用程序来说,是危险的。如果你在写实验性的代码,当你想到更好的算法时,你可能抛弃上周写的代码。这没问题。你可能想重构一个类去使它更容易使用,这也没问题。但是抛弃整个项目就是一个愚蠢而危险的错误。如果Netscape有一些工业软件经验的话,下场或许不会这么惨。
        
        
        
        
        
        
        
        
        
        
        
    
    
    
    

原文地址:https://www.cnblogs.com/zhizouxiao/p/2951553.html