当前位置: 首页 > news >正文

为什么程序员千万不要重写代码?


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


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


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


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


这大概就是代码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!


在大型商业项目中,推倒重来是非常危险的行为。当然,如果你是在做实验,想到新算法可以随时重写。如果你刚接手一个新项目,面对看上去异常混乱的旧代码,请冷静下来,忍住推倒重写的冲动,想想上面这些经验之谈。


— 【 THE END 】—



精彩回顾  点蓝字即可  

 编写可读代码的艺术

 最霸气的程序员辞职理由,阅后即焚!

 程序员面试神回复,最后一个“过分”了!

♡ 老码农冒死揭开行业黑幕:如何编写无法维护的代码

♡ 程序员相亲约在肯德基被拉黑 网友却说:活该!

 IT人才供不应求,快看看你值多少钱!

 程序员,如果一小时后永久断网,你会干嘛?

 第一个就跪了!程序员专属表情包汇总之开发篇

♡ 女生节的一个分号,引发程序员的疯狂热议



相关文章:

  • 你所见过最恶心的代码片段是怎样的?
  • 一场皆大欢喜的程序员跳槽事件
  • 外国程序员发帖求助:快四十岁了,不知道以后该怎么办
  • 我们计划招收300名学员,免费攻读人工智能专业
  • 漫画趣解——云计算的起源
  • 漫画解析12星座程序员的症状
  • 超高逼格程序员行为规范!
  • 程序员,除了写好代码,你更应该学会这些!
  • 外国程序员求助:快 40 了,不知道以后该怎么办
  • 程序员不要去这样的公司
  • 操作系统——进程、线程与协程概念的一个简单解释
  • 趣图:完成一个 task 要多长时间?
  • 程序员吃的是青春饭?本质上取决于......
  • 趣图:当程序员开始解决问题之后……
  • 趣图:给这样程序员的打 call 和点zan
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • co模块的前端实现
  • es6(二):字符串的扩展
  • Fastjson的基本使用方法大全
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • LintCode 31. partitionArray 数组划分
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SSH 免密登录
  • Terraform入门 - 1. 安装Terraform
  • Vue.js 移动端适配之 vw 解决方案
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 多线程事务回滚
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 理清楚Vue的结构
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • hi-nginx-1.3.4编译安装
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (10)STL算法之搜索(二) 二分查找
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)php新闻发布平台 毕业设计 141646
  • (四)c52学习之旅-流水LED灯
  • (一)Linux+Windows下安装ffmpeg
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .form文件_一篇文章学会文件上传
  • .net wcf memory gates checking failed
  • .Net各种迷惑命名解释
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @TableLogic注解说明,以及对增删改查的影响
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [1127]图形打印 sdutOJ
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [Android 数据通信] android cmwap接入点