韩卫平--程序员们,你愿意维护别人写的“烂”代码么?

http://blog.csdn.net/akirya/archive/2009/03/11/3982139.aspx

程序员们,你愿意维护别人写的“烂”代码么?相信各位的回答都是不愿意。不幸的是绝大多数的程序员或多或少的都在做这样的事情。自然我也不例外也做过不短的一段时间,现在回想起来那段时间真是后怕。

首先是文档,相信谁都喜欢看看文档就能了解产品是如何实现,各个模块之间的关系如何,甚至都希望文档具体到每个成员都有详细的说明。然而直至现在这种事情我还没有遇到,相信绝大多数读者也没遇见过。这个时候有人会想有一份简单的文档说明也行,然而很多时候这份简单的文档也可能是旧的。要是能碰到一个文档和代码相差不大的,那恭喜你赶快去买彩票。最惨的是没有任何文档。不过据我所知,最惨的人还真不是占少数。这时候有人会说“看代码呗,代码总是最新的吧。”这时候允许我泼点冷水,我遇见代码和产品不同步的,有多个分支版本还有多个发布出去的版本,谁都不知道那个版本的代码对那个发布版。没文档没说明,连个搞C++的人都没有。我还真没见过这方面比我更惨的。

“没文档,不要紧咱会看代码,怎么说这是咱老本行,这还搞不定以后还混啥?”相信看代码之前有不少人这样想过,但我相信十分钟之后多数人会收回之前说的。“这是啥玩意?kao,5000多行的函数。这是C++么?之前写的人脑子是不是有问题了?”脑子里不断的重复这样的话,于是就开始思考这玩意我做的话该怎么做,改怎么设计,这个地方该用啥模式等等。我绝对相信有这种想法的人水平肯定不错。于是程序员们雄心勃勃的向上司反应,这代码如何如何的烂,自己是如何如何有能力设计好,把代码重写的多好多好等等。然而通常这个时候都上司的话都差不多“先把问题解决吧,这个要紧,重写的话等有时间”于是一个伟大的计划夭折了,你只能找啊找,在某个几千行的函数代码中找到要改的地方,前面加点声明,后面加点代码。呼一个Bug就这样修正了。同时烂代码的规模又曾加了一点点。归根结底代码没有丝毫的改善,反而更烂。

说起来烂代码不单是程序员的责任,还有半数的责任在于BOSS。

第一点程序员水平差,这点在C方面不是那么的严重,但在C++方面则非常严重。先说C语言,我知道有不少公司都有入职培训,有详细的编码手册。对常见的问题都有强化培训,甚至连编码风格都有严格的规定,使代码看起来都是一个人写的。再说了C语言不容易掌握的地方比较少。一般来说掌握了指针和内存管理这2个大问题外遇见棘手的问题就大大减小了。另外宏也是一个大的问题,不加限制的话,很容易写出来难以看懂理解的代码。总的来说C语言属于比较容易控制代码质量的语言。再说说C++,这个复杂的语言。不知道各位是看谁的书学的C++。我已经不记得了,但我记得书里面的内容,绝大多数在讲C的东西,用了几页讲了一下类,顺带提了一下virtual,函数模板也是顺带提的形式,没有类模板,没有STL,后面有几页是讲如何读写文件。总的来说是一本讲C的书籍。C++是一种非常复杂、灵活和体现程序员个性化的语言。有篇帖子是说C++的十大流派(见帖子最后)。由此可见C++的灵活性,和个性化。虽说C++号称开发效率比C高,维护也比C容易。但我觉得这仅仅是对于水平达到一定程度的程序员来说,而且代码还得是有一定水平人写出来的。但实际上呢?绝大多数是古典C流,而且代码还继承了C不容易维护的地方,指针、变量声明在函数头部、宏使用的频繁、函数几百行甚至几千行上万行、滥用全局变量。一旦这几点综合到一起极具杀伤力,在这其中成百上千行的函数最具杀伤力。

第二点懒惰。一般来说每个程序员在新写一段代码的时候都会去思考怎么做,不管是C还是C++,都会认真的去写代码,但无奈的是水平是大问题。但总体来说最开始写的代码是最容易维护的。好景不长,需求变更Bug的增多,程序员们疲于在代码之间奔命。就在这个时候代码开始膨胀起来,本来需要拆分的函数偷懒写到一个函数里面。结果一个函数的功能越来越多,参数越来越多,最要命的是里面还有不少标志性的变量。变成名副其实的巨无霸。一旦到了这个时候后悔也基本上来不及了,首先没时间 ,再次功能混杂的太厉害拆分也就是想想的事情,没有人愿意做的,再后来改Bug更要命。本来可维护的代码就这样变成了不可维护的代码。代码中处处充满了巨无霸,对维护人的身心有这巨大的打击。因为懒造成的不可维护,后来的人想维护也难。

BOSS的原因很简单,对于大多数BOSS眼前的利益永远是最重要的。问题变得麻烦的时候不是去想如何彻底的解决,而是光想着凑合着解决。还有一点是不那么愿意多花钱请水平高的人监管代码质量。

再扯一下软件工程,我觉得软件工程是解决了一大的问题。提出了控制代码质量的方法。从大的方面控制了代码的质量,但小的地方就得看程序员的能力了。有时候尽管大的方面设计的很好很出色,但具体的代码质量很差,也会造成代码不可维护。毕竟架构设计不可能设计那么具体,考虑的那么清楚。大多数时候还得考程序员们的功力。

1.经典C++流:类是核心,例程多用C   Runtime的,很少用模版,一般是正统教育的结果。

2.古典C流:基本上当C用,偶尔用用对象,不使用异常,喜欢怀旧。

3.MFC流:秉承MFC的风格,主要使用MFC/ATL对象和Win32   API,不喜欢STL,用很多的宏把IDE的语法提示模块折磨到崩溃。

4.Portable流:以C   Runtime和STL为主要工具,使用类和模版,不跨平台毋宁死。

5.Functional流:以模版和STL为主要武器,大量使用函数式语言的设计方法,并号称这才是真正的C++。

6.Win32流:多使用全局函数,偏爱Win32   API,但不排斥C   Runtime,通常喜欢轻量级的程序,所以身材也比较苗条。

7.Java流:全面使用Java的风格,不能容许任何全局成员,但允许使用STL的集合类,写很多叫Factory的类。

8.COM流:喜欢AddRef()和Release(),大量使用接口,隐藏一切可以隐藏的东西,诵经的时候要把上帝替换成COM。

9.戒律流:追求完美的C++程序,计较每一个const和throw(),极力避免不安全的cast,随身一定要带一本ISO   C++手册。

10.混沌流:其程序无常形,无恒道,变幻莫测,吾不知其名。

转载:韩卫平--程序员们,你愿意维护别人写的“烂”代码么相关推荐

  1. 关于程序员30/35岁以后就写不了代码(没前途)的问题。

    2010年,俺已经30了,俗话说得好"三十而立",我是既没成家也没立业.混的还是比较很惨的.只是我对写代码还是很感兴趣的.如今已经30了,长了不敢说,至少还能写两年的代码.就是说我 ...

  2. 淘宝程序员拿几十万工资,写出来的代码到底怎么样?

    来源:淘系技术 我们编写的代码,除了用于机器执行产生我们预期的效果以外,更多的时候是给人读的,这个读代码的可能是后来的维护人员,更多时候是一段时间后的作者本人. 如何能够写出优雅整洁且不让人[哔--] ...

  3. 腾讯程序员最爱 C++,每年写 3 万行代码,70% 的技术 Leader 仍在持续编码

    整理 | 王晓曼 出品 | 程序人生 (ID:coder _life) 3 月 18 日下午,腾讯对外发布 2020 年度<腾讯研发大数据报告>,披露了 2020 年腾讯在研发投入.研发效 ...

  4. 构造函数为什么不能是虚函数 ( 转载自C/C++程序员之家)

    从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过 vtable来调用, ...

  5. 转载: 中国大部分程序员的通病

     中国大部分程序员的通病        出处     http://www.copathway.com/itbookreview/view_paper.asp?paper_id=240 中国的大部分程 ...

  6. 一个程序员的自白:我为什么写博客

    时间: 2011年 人物: 初出茅庐的臭小子, 臭石头一般坚硬的相信我将来一定会成为富二代他爹. 我来到一个大型互联网公司, 同事很nice, 管理很自由, 在这里开始了我的码农生涯. 我很敬重部门老 ...

  7. 专业程序员必知必会技巧:驯服复杂代码

    感悟:虽然不想做一个程序员,但还是自做这些事情!艺术家首先是工匠!多美妙的哲理,可是路途漫长而很多人选择了放弃,我也想放弃了.更重要的是,如果希望是一个艺术家,首先是一个NB的工程师. 原文链接:ht ...

  8. 程序员公众号用什么工具写?

    程序员公众号用什么工具写? 1.编辑工具 2.推荐插件 1.编辑工具 https://editor.mdnice.com/ 用Markdown语法写,写好后可以复制格式到公众号.有很多样式,格式统一, ...

  9. HTML5七夕情人节表白网页(抖音-流动爱心表白)HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 爱心表白网页

    HTML5七夕情人节表白网页❤抖音-流动爱心表白❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 爱心表白网页 这是程序员表白 ...

最新文章

  1. torch.nn.functional.cross_entropy.ignore_index
  2. 独家 | Kaggle 大神Dan Becker与你分享他的数据科学之旅!
  3. tomcat架构Pipeline和valve技术
  4. MFC+OPENCV实现角点检测
  5. iOS之深入解析操作系统的架构
  6. leetcode1504. 统计全 1 子矩形(动态规划)
  7. Linux7改运行级别,Centos7.0修改系统运行级别
  8. Java—File类详解及实践
  9. Linux下,查看USB设备信息
  10. SpringBoot之idea快捷键
  11. 【数据结构笔记】二叉搜索树及其相关算法
  12. 系统架构师 项目经理 哪个更有前景_OLED和QLED电视有什么区别?哪个更好更有前景?...
  13. WebStorm WiFi真机同步无法安装成功及appLoader无法连接
  14. 洛谷P1600 天天爱跑步
  15. 深入解析Tensor索引中的Indexing Multi-dimensional arrays问题
  16. 【拜小白的机器学习】2-机器学习的种类与基本术语概念
  17. 想要彻底掌握placement各种技巧,这个一定可以如你所愿
  18. 解决MySQL Connector NET xxxx无法卸载的问题
  19. sd卡tf卡进入spi模式
  20. Java中hashcode和equals详解

热门文章

  1. 宝鲲财经:揭秘炒汇建仓技巧有哪些
  2. MySQL5.7.30主从复制集群搭建及互为主从集群搭建(附问题处理方案)
  3. FFmpeg入门详解之82:FFmpeg转码器Java版之ava编码
  4. 光与夜之恋服务器维护中,《光与夜之恋》优化及补偿内容公告
  5. 抖音下拉宝解说“极速营救”,女生如何安全自救!
  6. 2021-11-06机械管理开发期刊
  7. 纸质文件从PDF转化为word 教程
  8. python分支结构的关键字_学习python分支结构
  9. Latex引用参考文献,要作者名、章节、页码等详细信息
  10. 新城控股董事长王晓松:逆势增长51%,新城控股挖潜商业板块