当前位置: 首页 > 科技观察

面对糟糕的旧代码,不要重写

时间:2023-03-20 22:19:24 科技观察

程序员有一颗工程师的心,所以当他们到了一个新的站点时,他们首先要做的就是推掉旧的一切,重新开始。是的,他们永远不会满足于简单的增量劳动。或许这种微妙的心理定位可以解释为什么程序员在进入新的项目组后宁愿扔掉旧代码重写也不愿修补。他们认为旧代码一团糟。但事实真的如此吗?你之所以认为旧代码一团糟,其实是由编程的一个基本规律决定的,那就是:写代码容易,读代码难。为什么你认为旧代码如此混乱?因为阅读代码更难。这大概就是代码Reuse难以实现的原因。这是你们小组中的每个人都喜欢将拆分后的字符串转换为具有不同功能的数组的地方。重写自己的函数比猜测旧函数是如何实现的要容易得多,也有趣得多。作为这个公理的推论,你可以问问其他程序员,他们正在努力处理的代码怎么样?“真是一团糟!”他们肯定会说。“我要重新发明轮子!”为什么你认为代码如此糟糕?“呃,看看这个功能,它有两页那么长!不知道为什么会出现这些东西!不知道这些API是干什么用的。”他们会这样回答你。有一次,Borland的创始人PhilippeKahn向记者吹嘘:QuattroPro会比MicrosoftExcel好用很多,因为它是从零开始写的,全部都是新的源代码!但是认为新代码比旧代码更好的想法简直是荒谬的。旧代码已经在运行和测试。无数的错误在被发现之前就已经存在,而程序员在发现之后可能需要几天时间才能修复它们。这个修复可能是一行代码,也可能是几个字符,无数的时间和精力都花在了这些错误修复上。当你决定放弃这些旧代码,从头开始时,你也失去了之前所有努力的结果。新代码一定比旧代码好?NO,重写可能会带来更大的风险。对于技术负责人来说,重写项目的代码也是一个极其艰难的决定。因为从公司层面来说,复制代码甚至会威胁到产品的市场竞争力。一旦你决定重写代码,你可能比竞争对手落后了2-3年——在软件行业,这个时间已经足够长了。你理想中的新代码会带来产品功能的提升▼但事实上,即使重写后的新代码能够实现旧代码的所有功能和需求,给产品带来的市场竞争力也只是边际提升。因为用于改写的新技术、新语言、新框架并没有给产品带来质的飞跃。更何况在漫长的改写过程中可能会遇到一些意想不到的情况,比如:1.缺钱:资金链断裂▼2.缺人:核心程序员的离开,最终导致的结果很差:无法实现原有产品的所有功能和要求,浪费时间和金钱,也失去了市场竞争力。▼所以重写代码意味着你将自己置于一个非常危险的境地,你可能在几年内写不出比以前更好的代码。您只是在花一大笔钱重写已经存在的代码。当您认为您面前的旧代码很糟糕时,您会怎么做?你觉得旧代码写得不好,那又怎样?它们已经上线,经受住了实际运行的考验。所以当你发现前辈留下的代码乱七八糟时,不妨静下心来,从以下三个方面来理解和改进代码:1、代码的结构有问题。如果一段网络代码突然弹出自己的对话框,应该是UI代码需要处理。这些问题是可以解决的,你得小心翼翼地搬代码、重构、改界面一次又一次。还需要细心的工程师立即仔细检查这些更改,以免打扰其他人。事实上,即使是相对较大的结构更改也可以在不丢弃代码的情况下完成。Daniel程序员JoelSpolsky回忆说,有一次在一个项目上,他和他的团队花了几个月的时间在一个点上重新架构:移动代码、清理、创建有意义的基类,以及创建模块之间的完美接口。但他们一直非常小心,不要产生新的错误,也不要丢失任何旧代码。2.代码效率不高以前Netscape的渲染代码通过的很慢。但实际上,这只会影响项目的一小部分,你可以对其进行优化甚至重写。您根本不必重写所有代码。1%的速度优化工作会给你带来99%的爆炸性提升。3.代码写得很丑。有些代码真的很难看。比如Joel曾经参与过一个项目,开始使用下划线作为初始成员变量约定,但后来改成了更标准的“M_”。所以一半的函数以“_”开头,一半以“M”开头,看起来真的很难看。但是这个问题可以在5分钟内解决,而无需从头编写整个代码。最后,你必须记住,仅仅因为你从头开始并不意味着你会写出比以前更好的代码。由于你没有参与上一个版本的创建,所以你一点经验都没有。一旦你准备推翻重写,你可能会重蹈第一个版本的覆辙,甚至会制造出更多新的问题。100offer说:面对糟糕的旧代码,KeepCalm&CarryOn!在大型商业项目中,推倒重来是非常危险的。当然,如果你是在做实验,想着随时可以重写的新算法。如果你跳槽,或者刚接手一个新项目,面对看起来极其凌乱的旧代码,请冷静下来,忍住推倒重写的冲动,想想上面的经历。题图:《重来》(Rework),中信出版社参考资料:JoelSpolskywww.joelonsoftware.comJeremyBurtonvibratingmelon.com来源:http://100offer.com/blog/posts/85