你所作的事情,也许暂时看不到成果,但不要灰心或焦虑,你不是没有成长,而是在扎根。程序员
图片来自网络算法
0 前言编程
程序员都有一颗工程师的心,因此当他们到一片新的场地想作的第一件事就是,将旧的一切推倒重来。是的,他们决不会知足于简单的增量劳动。数组
或许这种微妙的心理定位能够解释:为何程序员进入新项目组后宁愿丢掉旧代码从新写,也不肯意修修补补,他们认为旧代码简直一团糟。网络
可是,事实上真是这样吗?你之因此认为旧代码一团糟,实际上是由编程的一个基本定律决定的,那就是:写代码容易,读代码难。架构
1 为何你以为旧代码异常混乱?由于读代码更难框架
这大概就是代码Reuse难以实现的缘由,也能够解释为何你组里的每一个人都喜欢用不一样的功能将分割的字符串转换成一个数组。比起猜想旧的功能是怎样实现的,从新写一个本身的功能要简单和有趣多了。测试
做为这个公理的推论,你能够问问身边的程序员他们正在奋战的代码怎么样?“简直是一塌糊涂!”他们确定会这样说。“我简直想推倒重来!”优化
为何认为代码这么糟糕呢?“额,看看这个功能,居然有两页长!彻底不知道这些东西为何在这里!彻底不知道这些API是干什么的。”他们会这样回答你。视频
漫画:读别人代码是一种怎样的体验?
曾经,Borland的创始人 Philippe Kahn当初就是向记者们吹嘘:Quattro Pro会比Microsoft Excel要好用得多,由于它是从头开始编写的,所有都是新的源代码!
可是,认为新代码比旧代码好简直就是荒谬。旧代码是已经运行过的,测试过的。无数的bug在被发现前都上线运行过,发现以后程序员们可能在花了好些日子才修复了这些bug。这种修复多是一行代码,也多是几个字符,无数的时间和精力都花在了这些bug修复上。
当你决定抛弃这些旧代码从零开始的时候,你也丢掉所有前任努力的结果。
2 新代码必定比旧代码好?NO,重写可能会带来更大的风险
对技术领导者来讲,重写项目的代码也是一个异常艰难的决定。由于从公司层面说,重现代码甚至会威胁产品的市场竞争力。一旦决定重写代码,那么与竞品相比,你可能落后了2~3年——在软件行业,这时间可够长的。
3 你理想中的新代码会带来产品功能的提高
但事实上,即使重写的新代码能够实现旧代码的全部功能和需求,可是为产品带来的市场竞争力只有边际提高。由于重写用的新技术、新语言、新框架并无给产品带来质的飞跃。
更不用说在重写的漫长过程当中可能会遇到一些意外状况,好比:
一、缺钱:资金链的断裂
二、缺人:核心程序员离职
最终致使效果不佳:达不到原产品应有的全部功能和需求,白白浪费了时间和金钱,也丢掉了市场竞争力。
因此重写代码意味着,你在把本身置身于很是危险的境地,可能几年后你也写不出比之前更好的代码。你只是花了一大笔钱把已经存在的代码又写了一遍。
4 当你以为眼前的旧代码很烂时,该怎么办?
你以为旧代码写的很烂,那又怎样呢?它们已经上线,已经在实际运行中经受住了考验。因此当你发现前任留下的代码乱七八糟的时候,不妨冷静下来,从如下三个方面入手理解代码、改善代码:在这里顺便给你们推荐一个架构交流群:617434785,里面会分享一些资深架构师录制的视频录像
一、代码的结构有问题
若是一段网络代码忽然弹出了本身的对话框,应该是UI代码须要被处理。这些问题能够被解决掉,你要一次次当心地移动代码,重构,改变接口。还须要一位细心的工程师立马仔细地检查这些改变是否有问题,从而不打扰到其余人。事实上,甚至比较大的结构变化也能够不扔掉代码来完成。
大牛程序员Joel Spolsky回忆说,曾经在某个项目中,他和他的团队花了好几个月从新架构在一点上:把代码动来动去、清理、建立有意义的基类,并建立了模块之间的完美接口。可是他们始终很是当心翼翼,并无产生新的bug,也没有丢掉任何旧代码。
二、代码的效率不高
曾经,Netscape的渲染代码被传很是缓慢。但事实上,这只会影响该项目的一小部分,这部分是你能够优化甚至重写的。你彻底没必要重写所有代码。优化速度的1%工做量,会让你得到99%的爆炸性提升。
三、代码写得很丑
有些代码真的写的很丑,好比Joel曾参与一个项目,开始用下划线作开始的成员变量约定,但后来改用更标准的“M_”。因此一半的功能用“_”开始,一半用“M”开始,这看起来真的很丑陋。但这个问题5分钟就能解决,而不用从头开始写所有的代码。
最后,你要记住,从头开始再写一遍并不意味着你会写出比之前更好的代码。由于你没有参与到上一个版本的建立,因此你其实根本就不算有经验。一旦你准备推倒重写,你可能会再犯一遍版本一犯过的错,甚至会产生更多的新问题。
5 面对糟糕的旧代码,Keep Calm & Carry On!
在大型商业项目中,推倒重来是很是危险的行为。固然,若是你是在作实验,想到新算法能够随时重写。若是你刚接手一个新项目,面对看上去异常混乱的旧代码,请冷静下来,忍住推倒重写的冲动,想一想上面这些经验之谈。