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

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

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

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

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

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

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

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

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

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

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

原文:The Code Quality Myth
11
6
评论 共 41 条 请登录后发表评论
1 楼 white_crucifix 2012-09-27 16:37
说出了我的心声

发表评论

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

相关推荐

  • 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