`
阿尔萨斯
  • 浏览: 4138257 次
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

“没文档,不要紧咱会看代码,怎么说这是咱老本行,这还搞不定以后还混啥?”相信看代码之前有不少人这样想过,但我相信十分钟之后多数人会收回之前说的。“这是啥玩意?kao5000多行的函数。这是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 RuntimeSTL为主要工具,使用类和模版,不跨平台毋宁死。

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

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

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

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

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

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

分享到:
评论

相关推荐

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    当然,如果愿意,你可以创建自己的DTD,它可能和你的文档配合的更加完美。建立自己的DTD也是很简单的一件事,一般只需要定义4-5个元素就可以了。 调用DTD文件的方法有两种: 1.直接包含在XML文档内的DTD 你只要在...

    只刷题能做程序员吗-Test-Driven-Django-Tutorial:(过时)使用TDDdjango的教程的源代码和文本

    只刷题能做程序员吗更新 - 本教程已过时,不再更新 本教程可追溯到 2012 年,最初是为 Django 1.3 编写的。 它现在完全过时了,我不维护它。 如果您正在寻找(我认为是)对 TDD 和 Django 的更好介绍,请查看 我的书...

    java版地图源码-super-csv:一个快速的、程序员友好的、免费的JavaCSV库

    java版地图源码超级csv 亲爱的 super-csv 社区,我们正在寻找帮助...正在积极维护,如果您遇到困难,开发人员已准备好并愿意提供帮助:) 请查看文档以获取示例和入门帮助。 也可以看看我关于编程和代码质量的个人博客

    PHP基础教程 是一个比较有价值的PHP新手教程!

    由于PHP代码能够无障碍的添加进你的站点,在你设计和维护站点的同时,你可以很轻松的加入PHP使得你的站点更加具有动态特性。 - 数据库连接 PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是现在绝佳的...

    PHP教程 初级教程

    由于PHP代码能够无障碍的添加进你的站点,在你设计和维护站点的同时,你可以很轻松的加入PHP使得你的站点更加具有动态特性。 - 数据库连接 PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是现在绝佳的组合...

    C语言接口与实现 c语言

    愿意查找,能满足他们要求的程序库,这或许是因为写特定应用程序代码要比查找设计好的API容易。 这里我所提到的是一种基于接口与其实现的设计方法,并且通过对24个接口及其实现的描述详细地演示了这种方法,这些...

    轻量级J2EE企业应用实战00003

    如今看到学生们的苦楚,想起更多J2EE 学习者正备受煎熬,笔者愿意 将多年的经验与大家一起分享,这些经验包含笔者多年废寝忘食后的恍然醒悟,也包含 笔者跌落后艰难爬出的陷阱。希望这些经验能缩短读者朋友们的学习...

    轻量级J2EE企业应用实战00002

    如今看到学生们的苦楚,想起更多J2EE 学习者正备受煎熬,笔者愿意 将多年的经验与大家一起分享,这些经验包含笔者多年废寝忘食后的恍然醒悟,也包含 笔者跌落后艰难爬出的陷阱。希望这些经验能缩短读者朋友们的学习...

    二十三种设计模式【PDF版】

    你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和单位做买卖。文章中还对 Jive再进行了剖析。 设计模式之 Decorator(装饰器) Decorator 是个油漆工,给你的东东的外表刷上美丽的颜色. ...

    TortoiseSVN-1.6.4.16808-cn(SVN客户端1.6.4中文版)

    版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许是同时工作在同一个文件!- 你就会明白为...

    TortoiseSVN-1.8.1 win64位

    版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许是同时工作在同一个文件!- 你就会明白为...

    TortoiseSVN-1.7.10.23359-x64-svn-1.7.7

    版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许是同时工作在同一个文件!- 你就会明白为...

    TortoiseSVN 1.5.2.13595(SVN客户端)

    版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许是同时工作在同一个文件!- 你就会明白为...

    TortoiseSVN1.6.17-32位

    TortoiseSVN软件简介 版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许是同时工作在同一个...

    TortoiseSVN

    版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许是同时工作在同一个文件!- 你就会明白为...

    TortoiseSVN 1.5.2.13595版(Windows下的SVN客户端)

     因为 TortoiseSVN 是一个 Subversion 客户端,我们也很愿意为你展示一些 Subversion 本身的特性:  目录版本控制  CVS 只能追踪单个文件的历史,但是 Subversion 实现了一个“虚拟”文件系统,可以追踪整个目录...

    [php]正则表达式的五个成功习惯

    正则表达式难于书写、难于阅读、难于维护,经常错误...如果你愿意采用本文所探讨的五个习惯,你将可以让你设计的正则表达式经受的住反复试验。 本文将使用Perl、PHP和Python语言作为代码示例,但是本文的建议几乎适

    DotNet带进度条下载更新升级组件(V1.1)

    <br>Win Form软件在发布以后的更新和维护,是程序员门最头疼的问题。DotNet 2.0提供了ClickOnce可以很好的实现功能。但是绝大部分程序员还是愿意在自己开发的程序内部提供升级功能。升级的原理实现虽然不难,...

    TCPIP协议详解卷2:实现

    无论是编写网络应用的程序员,负责利用TCP/TP维护计算机系统和网络的系统管理员,还是任何有兴趣理解大块非凡代码的普通读者;本书都是一本优秀的教科书。 作者简介: W.Richard Stevens(1951-1999),国际知名的...

    l-echo:http的备份导出

    L-回声 ... 我想你将不得不等待一个好的 PSP 模拟器,或者另一个愿意编写另一个 echochrome 克隆的程序员(我很高兴向任何想要接受挑战的人教授这些概念)。 2009 年 7 月 30 日更新,我突然想到

Global site tag (gtag.js) - Google Analytics