程序员都有一颗工程师的心,所以当他们到一片新的场地想做的第一件事就是,将旧的一切推倒重来。是的,他们决不会满足于简单的增量劳动。
或许这种微妙的心理定位可以解释:为什么程序员进入新项目组后宁愿丢掉旧代码重新写,也不愿意修修补补。他们认为旧代码简直一团糟。
但是,事实上真是这样吗?你之所以认为旧代码一团糟,其实是由编程的一个基本定律决定的,那就是:写代码容易,读代码难。
为什么你觉得旧代码异常混乱?因为读代码更难。
这大概就是代码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 !
在大型商业项目中,推倒重来是非常危险的行为。当然,如果你是在做实验,想到新算法可以随时重写。
- 浏览: 1048999 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1441)
- 软件思想&演讲 (9)
- 行业常识 (250)
- 时时疑问 (5)
- java/guava/python/php/ruby/R/scala/groovy (213)
- struct/spring/springmvc (37)
- mybatis/hibernate/JPA (10)
- mysql/oracle/sqlserver/db2/mongdb/redis/neo4j/GreenPlum/Teradata/hsqldb/Derby/sakila (268)
- js/jquery/jqueryUi/jqueryEaseyUI/extjs/angulrJs/react/es6/grunt/zepto/raphael (81)
- ZMQ/RabbitMQ/ActiveMQ/JMS/kafka (17)
- lucene/solr/nuth/elasticsearch/MG4J (167)
- html/css/ionic/nodejs/bootstrap (19)
- Linux/shell/centos (56)
- cvs/svn/git/sourceTree/gradle/ant/maven/mantis/docker/Kubernetes (26)
- sonatype nexus (1)
- tomcat/jetty/netty/jboss (9)
- 工具 (17)
- ETL/SPASS/MATLAB/RapidMiner/weka/kettle/DataX/Kylin (11)
- hadoop/spark/Hbase/Hive/pig/Zookeeper/HAWQ/cloudera/Impala/Oozie (190)
- ios/swift/android (9)
- 机器学习&算法&大数据 (18)
- Mesos是Apache下的开源分布式资源管理框架 (1)
- echarts/d3/highCharts/tableau (1)
- 行业技能图谱 (1)
- 大数据可视化 (2)
- tornado/ansible/twisted (2)
- Nagios/Cacti/Zabbix (0)
- eclipse/intellijIDEA/webstorm (5)
- cvs/svn/git/sourceTree/gradle/jira/bitbucket (4)
- jsp/jsf/flex/ZKoss (0)
- 测试技术 (2)
- splunk/flunm (2)
- 高并发/大数据量 (1)
- freemarker/vector/thymeleaf (1)
- docker/Kubernetes (2)
- dubbo/ESB/dubboX/wso2 (2)
最新评论
发表评论
-
2018071904积累
2018-07-19 10:04 446https://www.imooc.com/article ... -
201806182117
2018-06-18 21:19 460https://blog.csdn.net/mosheng ... -
2018020508积累
2018-05-08 19:14 396https://blog.csdn.net/babyupup/ ... -
2018020404积累
2018-04-06 12:06 01.https://www.cnblogs.com/wxgb ... -
2018020328积累
2018-04-06 11:52 3771.https://blog.csdn.net/quinc ... -
2018020322积累
2018-03-22 10:59 0http://mysql.taobao.org/month ... -
2018020315积累
2018-03-15 23:24 0js中 a=b||0; 在这里||代 ... -
2018020308积累
2018-03-08 15:55 01.http://blog.csdn.net/liu943 ... -
2018020304积累
2018-03-04 18:37 428http://blog.csdn.net/lengcong ... -
20180228积累
2018-03-03 21:28 476https://jackywu.github.io/art ... -
20180225积累
2018-02-25 20:42 396生存发展的法则哈,管理层不想被偏门技术人员挟持,可技术人员 ... -
20180223积累
2018-02-24 09:35 379google浏览器点击链接 ... -
20180222积累2
2018-02-22 22:48 443http://www.aboutyun.com/threa ... -
异构数据源海量数据交换工具-Taobao DataX 下载和使用
2018-02-22 09:36 616DataX介绍 DataX是一个在异构的数据库/文件系统之 ... -
积累20180203
2018-02-03 13:18 331TRUNCATE TABLE 在功能上与不带 WHERE ... -
工作的常识
2018-02-01 11:19 467SN码是Serial Number的缩写,有时也叫Serial ... -
软件开发工作总结
2018-01-31 18:59 3211、分享第一条经验: ... -
war包不自动解压
2018-03-22 10:41 835war包放到了tomcat7下的webapps中不解压 , ... -
maven项目的不同
2018-01-07 15:41 01.maven的web项目和Java项目的创建 2.ecl ... -
电脑休眠和睡眠的区别
2018-01-07 08:55 598电脑休眠和睡眠的情况是不分台式和笔记本的! 休眠;就是把应用环 ...
相关推荐
《Delphi 6程序员代码编写标准指南》是指导Delphi 6开发者遵循规范,提高代码质量和可维护性的关键文档。以下是对其中主要知识点的详细解释: 1. **通用源代码格式规则** - **缩格**:代码应保持一致的缩进,通常...
在IT行业中,程序员的工作往往涉及各种工具的...无论是进行数据验证、编码转换,还是优化代码结构,这些工具都能为程序员提供极大的便利。在日常开发过程中,掌握并合理利用这些工具,将对程序员的事业产生积极的影响。
### 知识点总结 #### 一、基本要求 **1.1 清晰简洁的程序结构** ...以上内容综合了代码编写的基本要求、可读性要求、结构化要求、正确性与容错性要求及可重用性要求等多个方面,旨在指导程序员写出高质量的代码。
通过学习和应用设计模式,可以避免诸如命名不规范、类设计不合理、代码结构混乱等问题,从而编写出易于理解和维护的代码。这不仅能使你在团队中脱颖而出,也是个人职业发展的重要基石。 再者,设计模式能够提升处理...
在混乱C代码大赛的作品中,宏常被用来创建复杂的代码结构,甚至模拟面向对象的特性。 5. **位操作** 位操作是C语言的底层特性,通过操作二进制位可以实现高效的数据处理和计算。获奖作品可能会利用位操作进行数据...
6. **无限递归**和**自定义循环结构**:参赛者可能会创建看似无解的递归函数或者非传统循环结构,以增加代码的迷惑性。 7. **不常用库函数**:使用C标准库中不常被提及的函数,创造出独特的效果。 8. **条件编译**...
《Delphi程序员助手 V2.4 最终版》是一款专为Delphi开发人员设计的高效代码管理和检索工具,旨在优化编程工作流程,提高代码复用率,减轻在大量代码库中寻找特定代码片段的困扰。这款软件的核心功能包括代码资料的...
参赛者可能会编写出复杂的宏定义,这些宏在编译时被展开,形成看似随机的代码结构。理解和追踪宏的展开过程,对于解析这类混乱代码至关重要。 四、类型转换的陷阱 在混乱代码中,类型转换往往被滥用,用于制造混淆...
例如,一个常见的混乱代码策略是使用复杂的递归或嵌套循环,这可能会导致阅读难度极大,但通过仔细研究,我们可以学习到如何更有效地组织代码结构,或者理解何时递归或循环可能会导致问题。另一个可能的技巧是通过宏...
通过研究这些混乱的C代码,不仅可以提升我们的代码阅读和调试能力,还能让我们对C语言的底层原理有更深入的理解。尽管这些代码可能看起来难以理解,但它们体现了C语言的精髓和无限可能性。对于想要提升C语言编程技能...
在"重构:改善既有代码的设计(中英文)"这个文件中,我们可以期待找到关于重构的详细指导和案例分析,包括中英文两种语言版本,这将为开发者提供丰富的参考资料。内容可能涵盖如何识别需要重构的代码、何时进行重构...
Java中并没有传统意义上的`goto`语句,因为它被认为是不安全且容易导致代码混乱的。但是,Java提供了一种类似的功能,即标记化的`break`和`continue`语句,它们可以用来跳转到特定标签的语句,虽然这不是真正的`goto...
【什么是好的程序员】 在IT行业中,成为一个优秀的程序员并不仅仅意味着掌握大量的技术细节或底层编程,也并非编程速度越快就越好。一个优秀的程序员应当具备一系列的素质和修养,这包括但不限于以下几个方面: 1. ...
在IT行业中,对程序员的绩效考核是至关重要的一个环节,它不仅评估了员工的工作效果,也为公司的项目管理和团队协作提供了依据。在这个名为“程序员绩效考核 (2).docx”的文档中,我们可以看到一种针对JAVA工程师的...
- 谨慎使用goto语句:goto语句虽然有时候可以简化代码,但过度使用会导致代码逻辑混乱,难以维护。 - 宏和静态变量的使用:合理使用宏定义和静态变量,以提高代码效率和复用性。 - 编译器警告和调试版本:不要忽略...
10. **代码查看器**:特别强调的“代码查看器”功能,使得程序员可以快速预览代码结构,快速跳转到指定位置,提升代码浏览效率。 总的来说,Edplus超级文本编辑器以其全面的功能、强大的性能和高度的可定制性,成为...
总的来说,程序员入门技巧涵盖了从问题理解到代码实现的全过程,强调了良好的编程习惯、结构化的设计和有效的代码管理。通过掌握这些技巧,程序员可以逐步提高编程技能,向更专业化的领域迈进。不断学习和实践,才能...
例如,通过自定义高亮颜色,可以突出关键的语法元素,使得代码结构更清晰;调整行号的显示,便于追踪代码行数;而合适的字符间距则可以让代码排列得更加整齐,减少阅读时的混乱感。 在压缩包文件中,"MAC系统字体...