阅读更多
这是一篇比较老的文章,但是文中的这些问题在现在仍然普遍存在。代码质量的高低与商业产品的优劣是否有直接的影响?开发者Frank Sommers在文中给出了他的看法。文章内容如下。

在大多数商业项目中,代码质量并不被看重,因为大部分情况下,代码不是整个项目的最终产品,客户最终使用的是二进制文件,而不是源代码。相比代码质量,开发流程、进度和技能更能决定产品最终的质量。

在现实生活中,我几乎从来没有遇到一个对他所工作的代码完全满意的商业软件开发者。相反,我甚至认识到,开发者对其所工作的代码的满意度与代码给老板所创造的价值成反比关系。

我的一个朋友在世界上最大、最赚钱的数据库公司的核心服务器组件部门工作,他时常感叹庞大的代码库中那些丑陋的命名约定,对于开发者来说,很难在这些代码的基础上开始工作。但是,不可否认,就是这些丑陋的代码库为该公司创造了高达数十亿美元的收入。

不幸的是,开发者一边感叹着代码质量,一边还不得不继续做这项奇怪的、与众不同的工作。说这项工作与众不同,是因为用户不能从最终产品中直接看到你的付出。如果你是一个音乐家,你可以根据自己的喜好来塑造每一个音符和乐句,并直接呈现给听众。如果你是一个木匠,你的产出是实际的椅子或橱柜。

但是作为一名开发者,除了你工作的开发环境和开发团队外,你几乎没有留下什么东西。客户看到的是二进制文件,而不是你的源码。除非你的产品是开源的,或者包含源码文件,否则,除了开发团队的人外,几乎没人看到或者关心这些代码,而你每天在这些代码上花费了大量宝贵的时间。

大多数编译器也不关心代码的质量,比如,变量如何命名、方法是否简洁、对象模型是否清晰、甚至不管你使用了什么算法,编译器对这些都没有兴趣,无论代码是优雅还是丑陋,都能创建出效果相同的二进制文件。比如,当你阅读这篇文章时,你根本不会考虑当前页面源代码的质量。

当然,作为开发者,我们必须关心代码质量,因为我们每天要花费大部分的时间来与这些代码打交道。而且,作为一个合格的开发者,我们应该努力打造和维护一个高质量的代码库。

我们花费大量时间来打造更高质量的代码,我们通常会说现在所做的工作将会在一段时间后带来更多的商业利益,以此来体验我们所做的努力。但是,代码质量很少直接导致任何可衡量的商业投资回报。比如我那位在数据库公司工作的朋友的例子,他认为这些代码丑陋不堪、难以阅读,但是依然能够很好地创造利益。该公司专注的是产品的整体质量,而不是代码的质量。

总体产品的质量,不是通过改善单一活动的质量就能提升的。开发者测试、敏捷开发方法、QA(质量保证)、CI(持续集成),这些所有的流程保证了最终高质量的产出。代码质量只是其中的一小部分。商业软件公司往往会更专注于产生高质量产品的过程,因为这比起强调代码质量来说,能获得更好的回报。

通常来说,产品经理很清楚以上这些内容。但是对于开发者来说,必须日复一日地工作在他们认为“丑陋”的代码基础上。这意味着,开发者注定一直无法对他们所工作的代码的质量感到满意。

原文:The Code Quality Myth
11
6
评论 共 41 条 请登录后发表评论
21 楼 joaquinaimar 2012-09-28 14:28
代码质量低了,可维护性就差了。
20 楼 zui4yi1 2012-09-28 13:52
说了那么多,我倒觉得,当一个公司不想花钱的时候,总可以找出几个看起来很有“道理”的理由。
总之,如果开发的只是一些小系统,那当然你的代码质量可以忽略了;但大的系统,从战略的角度上看,花钱是值得的。
19 楼 lpp333 2012-09-28 12:30
https://dynamic.12306.cn/otsweb/js/common/school_suggest1.js?version=4.1 第69行这是哪个学校,这么牛X的出现在铁道部的网站上?
18 楼 唔系好人 2012-09-28 11:47
michael_hy 写道
grandboy 写道
相比代码质量,整体质量更重要,现实生活中的有很大项目是工期紧导致不得不暂时抓大放小,而有些所谓的“小”在一定时期之后已经不可能得到根本性的纠正了。更有一些项目,维护难度大并不是问题,是由于甲方还会出维护成本来维护项目,如果质量超好,反而这些软件开发商挣不到这部分钱了,尤其是那些关系特别强大的企业,关系错综复杂,各方利益纠葛,软件质量只是非常小的一部分因素决定是否继续合作。

是啊,质量都好了,都没有bug了,那还怎么以维护升级的名义收费呢。

根本就不可能没有bug存在!
17 楼 czpae86 2012-09-28 11:10
去看看12306.cn就明白
16 楼 k11hao 2012-09-28 10:26
就怕维护别人的代码
15 楼 michael_hy 2012-09-28 10:08
grandboy 写道
相比代码质量,整体质量更重要,现实生活中的有很大项目是工期紧导致不得不暂时抓大放小,而有些所谓的“小”在一定时期之后已经不可能得到根本性的纠正了。更有一些项目,维护难度大并不是问题,是由于甲方还会出维护成本来维护项目,如果质量超好,反而这些软件开发商挣不到这部分钱了,尤其是那些关系特别强大的企业,关系错综复杂,各方利益纠葛,软件质量只是非常小的一部分因素决定是否继续合作。

是啊,质量都好了,都没有bug了,那还怎么以维护升级的名义收费呢。
14 楼 sunway00 2012-09-28 09:43
有句话,叫出来混迟早要还的。

不好的代码质量其实最终都会反映到后面,但是就像文章说的,客户看到的是编译后的东西,不关心源代码,那么相对的,最终的问题公司也不会从源代码质量这个角度去追查和考虑,即时后来为了解决这个问题多花了几倍的成本。
13 楼 grandboy 2012-09-28 09:10
相比代码质量,整体质量更重要,现实生活中的有很大项目是工期紧导致不得不暂时抓大放小,而有些所谓的“小”在一定时期之后已经不可能得到根本性的纠正了。更有一些项目,维护难度大并不是问题,是由于甲方还会出维护成本来维护项目,如果质量超好,反而这些软件开发商挣不到这部分钱了,尤其是那些关系特别强大的企业,关系错综复杂,各方利益纠葛,软件质量只是非常小的一部分因素决定是否继续合作。
12 楼 gwinthis 2012-09-28 08:54
几乎大部分企业,都不会关心维护成本。即使维护成本很高昂,也觉得是无法避免的。
11 楼 runfriends 2012-09-27 23:53
维护丑陋的代码就是一场噩梦
10 楼 PetriNet 2012-09-27 23:03
乃们人类始终是很原始的
9 楼 jayuton 2012-09-27 22:31
对于一个产品来说,如果这个产品需要一直维护,代码质量太差,其接手和维护成本就会提高
8 楼 niva 2012-09-27 18:15
这就好比,一场球赛,高层领导和观众只关心进不进球,不关心是否控制场面;孰不知,没有好的中场球员,有再好的前锋也没用。高层领导和观众可以不知道这一点,但是作为球员或者教练的你,如果不知道这一点,就只有输球了。
7 楼 damoqiongqiu 2012-09-27 18:13
damoqiongqiu 写道
12306严重印证了楼主的观点

请猛击这里:http://hyfw.12306.cn/Dzsw/action/action/FwcszsAction_index?type=--%3E%27%22%3E%3CH1%20style=%22color:red;font-size:100px;%22%3E%3Cimg%20src=%22http://img.9292.net/p9292/2010/12/2010120717023727610.jpg%22/%3E%3C%2FH1%3E
6 楼 damoqiongqiu 2012-09-27 18:12
12306严重印证了楼主的观点
5 楼 魔力猫咪 2012-09-27 18:00
怎么不说这些“丑陋”的代码造成的损失呢?
说编译器不关心代码质量可不对。现代编译器对于那些有潜在BUG的、危险的代码是会给出警告的。我不认为一个整体质量好的系统可以容忍质量不好的代码。
4 楼 java_bigniu 2012-09-27 17:19
公司专注的是产品的整体质量,而不是代码的质量。
开发者测试、敏捷开发方法、QA(质量保证)、CI(持续集成),这些所有的流程保证了最终高质量的产出。代码质量只是其中的一小部分。
3 楼 aninfeel 2012-09-27 16:57
确实如此啊,码农的痛。代码优不优雅根本不重要,最重要的是能方便地实现需求。
2 楼 kanme818 2012-09-27 16:47
虽然写的很功利,但事实就如如此。码字员只是一个产品流程中很小的一部分,当然,小并不代表不重要。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • delphi 中 adoquery 带参数查询的奇怪问题

    str = select * from t1 a + left outer join t2 b on a.id=b.id+ left outer join t3 c on a.id=c.id+ where c.field like :v1 ;adoquery.sql.clear; adoquery.sql.add(str) ;adoquery.parameters.paramv

  • (转载)ADOQuery参数传递

    ADOQuery参数传递 dbgrid1.DataSource := datasource1; datasource1.DataSet := adoquery1; Value := 1221; SQL := 'SELECT * FROM customer WHERE CustNo>:Number'; adoquery1.SQL.Clear; adoquery1.P...

  • Delphi ADOQuery 的一些操作

    Prepared用来确定ADOquery是否要准备好了再查询,如设为true,则系统会先编译后再运行,在多次重复使用某一查询的情况下能有效提升运行速度,但对于只执行一次的查询反面会导致速度下降(编译会消耗时间): adoquery.sql.text:='select * from table1' adoquery.prepared:=true; while condition do adoquery.open; end; ADOQuery.Prepared属性的True/False与ADOQuery.P.

  • Delphi开发学习二:使用ADOQuery控件对SQL数据库表进行操作

    在delphi学习一中,已经使用ADOConnection控件设置属性连接数据库SQL了。 在这里开始使用ADOQuery控件对SQL数据库表进行操作。 首先我们在SQL中创建数据库名为PERSONNELMG_SYS的数据库,然后在这个数据库里创建USER_TABLE表,用来存放用户账户信息。 USER_TABLE表的结构如下图所示: 该表有用户名(USER_NAME) 、用户密码(USE

  • 参数化SQL(Parameters)使用示例

    public partial class Form1 : Form { private string connString = "Data Source=.;DataBase=TestDB;UID=sa;PWD=lwm110"; SqlConnection conn; DataTable dt = new DataTable();...

  • ADOQuery 查询 删除 修改 插入

    //利用combobox组件查询数据库表procedure TForm1.Button1Click(Sender: TObject);beginADOQuery1.Close;ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add('select * from '+trim(ComboBox2.Text));ADOQuery1.Active:=true;end; //查询记录...

  • CreateParameter 方法 Type 属性 (ADO)

    指示 Parameter、Field 或 Property 对象的操作类型或数据类型。 设置和返回值 设置或返回下列 DataTypeEnum 值之一。相应的 OLE DB 类型标识符在下表的说明栏的括号中给出。有关 OLE DB 数据类型的详细信息,请参阅第 10 章和《 OLE DB 参考手册》的附录 A。 常量 说明 adArray 与其他类型一起加入逻

  • CreateParameter参数说明

    CreateParameter参数说明(ASP) cmd.CreateParameter("参数名称",类型,方向,大小) Cmd.CreateParameter Name,Type,Direction,Size,Value 数据类型(Type)的值及其意义如下: 名称值          整数值                        功能 adDBTimeStamp  

  • 如何在Delphi中调用oracle的存储过程返回数据集

    如何在Delphi中调用oracle的存储过程返回数据集 【delphi+oracle报表解决方案(一)】delphi中调用oracle的存储过程(分带返回游标,不返回值两种) 关键字: delphi ,oracle存储过程,游标,返回数据集,报表 注:delphi 6+ oracle 8.1.6 一.创建包与包体 1.附:建表aaclass为下面作测试用 create ta

  • plsql中报错argument out of range_我们是怎么发现C++异常从堆栈追踪中消失的原因的...

    每当我的程序崩溃的时候,我都会用核心转储 (core dump) 文件来找出来崩溃发生的具体位置。(关于怎么产生和使用核心转储可以看我之前的文章。)一直以来我调程序的时候都是很开心的……直到我遇到了这个新的 bug。当我把它的核心转储文件载入到 GDB 之后,我很失望地发现所有的堆栈追踪 (stack trace) 都是关于系统库的,没有一行是关于我的代码的。太长不看:那就看看这个补丁就好了。让我...

Global site tag (gtag.js) - Google Analytics