程序员都有一颗工程师的心,所以当他们到一片新的场地想做的第一件事就是,将旧的一切推倒重来。是的,他们决不会满足于简单的增量劳动。

或许这种微妙的心理定位可以解释:为什么程序员进入新项目组后宁愿丢掉旧代码重新写,也不愿意修修补补。他们认为旧代码简直一团糟。

但是,事实上真是这样吗?你之所以认为旧代码一团糟,其实是由编程的一个基本定律决定的,那就是:写代码容易,读代码难。

为什么你觉得旧代码异常混乱?因为读代码更难。

这大概就是代码Reuse难以实现的原因。 这就是你组里的每个人都喜欢用不同的功能将分割的字符串转换成一个数组。比起猜测旧的功能是怎样实现的,重新写一个自己的功能要简单和有趣多了。

作为这个公理的推论,你可以问问身边的程序员他们正在奋战的代码怎么样?「简直是一塌糊涂!」他们肯定会这样说。「我简直想推倒重来!」

为什么认为代码这么糟糕呢?「额,看看这个功能,竟然有两页长!完全不知道这些东西为什么在这里!完全不知道这些API是干什么的。」他们会这样回答你。

曾经,Borland的创始人 Philippe Kahn 当初就是向记者们吹嘘:Quattro Pro会比Microsoft Excel要好用得多,因为它是从头开始编写的,全部都是新的源代码!

但是,认为新代码比旧代码好简直就是荒谬。旧代码是已经运行过的,测试过的。无数的bug在被发现前都上线运行过,发现之后程序员们可能在花了好些日子才修复了这些bug。这种修复可能是一行代码,也可能是几个字符,无数的时间和精力都花在了这些bug修复上。

当你决定抛弃这些旧代码从零开始的时候,你也丢掉全部前任努力的结果。

新代码一定比旧代码好?NO,重写可能会带来更大的风险。

对技术领导者来说,重写项目的代码也是一个异常艰难的决定。因为从公司层面说,重现代码甚至会威胁产品的市场竞争力。一旦决定重写代码,那么与竞品相比,你可能落后了2~3年——在软件行业,这时间可够长的。

你理想中的新代码会带来产品功能的提升▼

但事实上,即便重写的新代码可以实现旧代码的所有功能和需求,但是为产品带来的市场竞争力只有边际提升。因为重写用的新技术、新语言、新框架并没有给产品带来质的飞跃。

更不用说在重写的漫长过程中可能会遇到一些意外情况,比如:

1、缺钱:资金链的断裂

2、缺人:核心程序员离职

最终导致效果不佳:达不到原产品应有的所有功能和需求,白白浪费了时间和金钱,也丢掉了市场竞争力。

所以重写代码意味着,你在把自己置身于非常危险的境地,可能几年后你也写不出比以前更好的代码。你只是花了一大笔钱把已经存在的代码又写了一遍。

当你觉得眼前的旧代码很烂时,该怎么办?

你觉得旧代码写的很烂,那又怎样呢?它们已经上线,已经在实际运行中经受住了考验。所以当你发现前任留下的代码乱七八糟的时候,不妨冷静下来,从以下三个方面入手理解代码、改善代码:

1、代码的结构有问题

如果一段网络代码突然弹出了自己的对话框,应该是UI代码需要被处理。这些问题可以被解决掉,你要一次次小心地移动代码,重构,改变接口。还需要一位细心的工程师立马仔细地检查这些改变是否有问题,从而不打扰到其他人。事实上,甚至比较大的结构变化也可以不扔掉代码来完成。

大牛程序员Joel Spolsky回忆说,曾经在某个项目中,他和他的团队花了好几个月重新架构在一点上:把代码动来动去、清理、创建有意义的基类,并创建了模块之间的完美接口。但是他们始终非常小心翼翼,并没有产生新的bug、也没有丢掉任何旧代码。

2、代码的效率不高

曾经,Netscape的渲染代码被传非常缓慢。但事实上,这只会影响该项目的一小部分,这部分是你可以优化甚至重写的。你完全不必重写全部代码。优化速度的1%工作量,会让你获得99%的爆炸性提高。

3、代码写得很丑

有些代码真的写的很丑,比如Joel曾参与一个项目,开始用下划线做开始的成员变量约定,但后来改用更标准的「M_」。所以一半的功能用「_」开始,一半用「M」开始,这看起来真的很丑陋。但这个问题5分钟就能解决,而不用从头开始写全部的代码。

最后,你要记住,从头开始再写一遍并不意味着你会写出比以前更好的代码。因为你没有参与到上一个版本的创建,所以你其实根本就不算有经验。一旦你准备推倒重写,你可能会再犯一遍版本一犯过的错,甚至会产生更多的新问题。

面对糟糕的旧代码,Keep Calm & Carry On !

在大型商业项目中,推倒重来是非常危险的行为。当然,如果你是在做实验,想到新算法可以随时重写。

如果你跳槽、或刚接手一个新项目,面对看上去异常混乱的旧代码,请冷静下来,忍住推倒重写的冲动,想想上面这些经验之谈。

谢谢大家的阅读,喜欢就随手点个赞,这将是我继续分享下去的最强动力。

程序员,为什么千万不要重写代码?相关推荐

  1. 程序员 PK 刘畊宏 | 我用代码实现刘畊宏龙拳

    程序员来挑战刘畊宏健身操了,我用代码实现了刘畊宏的龙拳和周大侠,对比原版,来看看代码版本健身操怎么样. 周大侠 | 程序员挑战 5千万 粉丝的健身操:https://b23.tv/K2nKMjR 程序 ...

  2. [转]为什么程序员总是写糟糕的代码?这3个原因

    原文请看:为什么程序员总是写糟糕的代码?这3个原因 我最近一直在想我们作为一个行业为什么总是产出糟糕代码的原因. 1.明显原因-- 我一下子想到的最明显的原因是,有好的程序员,也有不那么好的程序员,有 ...

  3. 优秀的PHP程序员至少应该了解PHP代码的优缺点(转)

    我在SitePoint做面试官的时候一定会问的问题是:你认为PHP代码的优劣体现在哪里?因为这个问题可以让我大体知道应聘者是哪种类型的程序员,而不是单纯地考察他对PHP函数的掌握程度(这一点Zend的 ...

  4. 最受Linux程序员欢迎的7个代码编辑器的介绍及下载地址

    Linux平台上的代码编辑器太少了,Linux程序员经常抱怨,自从他们使用了免费开源的系统平台后,作为一名程序员,却并没有在代码编辑器上得到足够的重视.下面我们分享了7个最受Linux程序员欢迎的代码 ...

  5. 企业有了程序员为什么还要用 低代码/无代码

    一.备受"争议"的无代码/低代码开发 在看这篇内容时,我们要知道,技术无时无刻不在进行发展,IT技术更是如此,快速的技术更新使得程序员在进行应用开发时效率更高:我记得在十多年前,开 ...

  6. 别以为程序员的工作就是写代码

    大家好,我是鱼皮,今天给大家分享一个开发小经验. 很多没有实际工作过的同学,可能都会认为程序员的工作只有写代码 + 和产品经理 "拉扯",也会习惯性地用代码量来评价一个程序员的工作 ...

  7. 拒绝经验过剩,“程序员的工作只能是代码”?

    似乎软件工程师都有一个自然而然的成长过程:从缺乏经验的新手,发展到中级工程师,进而成为经验过剩的工程师.一旦软件工程师进入经验过剩阶段,他们对代码的兴趣就会降低!那么哪些迹象表明你已经经验过剩了呢? ...

  8. 程序员不能只会敲代码还要会投资理财

    程序员不能只会敲代码,还要会理财或者说投资. 当我们步入职场,随着我们工作经验的增长我们的薪资相应的也会快速提高,很多人可能思维上还没有改变过来,不知道如何利用自己的闲钱去保值或者增值.当然现在互联网 ...

  9. c语言输出我爱你程序,程序员表白教程,这些代码用过的都成功了!

    原标题:程序员表白教程,这些代码用过的都成功了! 作为一名程序员,如何用自己的技术向喜欢的人表白? 这篇程序员表白教程,可以让你创造出不一样的浪漫! 你值得拥有! 1. I Love You Batc ...

最新文章

  1. MySQL支持的分区类型
  2. Intel Realsense D435 如何设置曝光参数(exposure)
  3. 【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解
  4. Java学习小程序(9)冒泡排序算法实现
  5. leetcode1047. 删除字符串中的所有相邻重复项(栈的日常应用)
  6. Linux下如何查看tomcat是否启动
  7. 2017.10.22 最多的方案 失败总结
  8. 从超融合到全面云化,深信服云计算战略与品牌双升级
  9. 免费股票量化交易软件有哪些?
  10. 界面控件DotNetBar for WinForms使用教程:highlight组件使用教程
  11. blink usb无线网卡驱动 linux,lblink无线网卡驱动下载官方版_blink无线网卡驱动_blink无线网卡驱动_东坡下载...
  12. 【C语言】打印二叉树树形(制表符实现,清晰+高拓展)(2022-10-22 更新—偏移量说明)
  13. 手机中使用到的SENSOR相关原理
  14. 节能与环保杂志节能与环保杂志社节能与环保编辑部2023年第2期目录
  15. python中求最小公约数,python求最大公约数和最小公倍数的简单方法
  16. 对于position定位的认识
  17. exercise2 利雪
  18. go源码阅读——malloc.go
  19. Python - 统计某一列不同项的重复次数 并新增一列赋值
  20. 外贸CRM系统管理客户

热门文章

  1. GIT 详细命令介绍
  2. GoF设计模式学习笔记 第一回 Mediator
  3. python图形用户界面编程
  4. 2-SAT(随意写点)
  5. 诺基亚智能手机的sis和jar格式游戏文件安装方法图解
  6. 网络流媒体--SDP会话描述协议(RFC-4566)
  7. Linux的远程终端连不上,Linux系统远程连接终端连接不上怎么办
  8. AI入门: 关于人工智能的深度思考
  9. Sqlserver 修改字段长度
  10. 王怀南+邵亦波+王建硕=?