什么样的代码为好代码?好代码的科学定义

你如何定义好的代码?本文通过咨询65个开发人员同一个问题从而得出了一个伪科学的答案。

首先我们相信写好代码是非常重要的。为什么呢?首先,好代码比差代码更有趣,成本更低。其次,代码好,就意味着你正在构建的产品有可能会更好。第三,也是非常关键的一点,写出好的代码是我们的职责:毕竟,我们的工作就是写代码。

方法

由于此65名开发人员都是我们某个职位的应聘者,所以这意味着这些样品开发人员大多偏向于使用Java或Scala技能,并且通常有着5年及以上的工作经验。

问题统一:“怎样写好代码?你如何定义好代码?”并且在面试时由同一人(面对面或通过电话),历时约1年,从2014年1月至2015年1月,来执行此地调查。

梳理这些问题的答案之后,可以分为31个不同的类,每组至少有2个相似的答案。例如,下面这些答案通通归纳为可读一类:
可读。

  • 人脑可阅读。
  • 能自我解释。
  • 人们能读懂。
  • 很容易理解。
  • 不用5分钟就能了解。
  • 没有文档,你也可以阅读并理解。
  • 可读,新来的开发人员也能够理解。
  • 就如同文本一样可读。
  • 易于阅读,直线化的思维。

结果

这65位开发人员的答案总共统计出288条不同的内容,平均一个人4.43条。

当然,目前最常见的答案是,代码必须可读(78.46%),几乎10分之8的开发人员认为,好的代码应该易于阅读和理解。

然后是可测试的/测试过的(29.23%),这说明好的代码应当是经过自动化测试的(或至少是有可能执行测试的)。25%的受访者认为,良好的代码
还应该是简单的——不过于复杂,当然还应该是可以工作的,意味其能够按照我们的意愿正常执行功能。前五条是,代码应该是可维护的(21.54%)。

奇怪的是,我们发现有两项内容是关于同一主题的:文档和代码注释。有的开发人员认为代码应该自文档化(不需要用文档解释),而有些开发人员则表示应该在代码中着重于注解,说明代码目的。

其他的,如,可扩展的/可重复使用的,恰当的命名规律,代码解耦或者称为小方法的重要性——当然这个“小”在不同开发人员的眼中概念还不一样:“10-15行”到“<50行”莫衷一是。

探讨

面试中的回答给了我们很多有趣的可用于分析的定量数据,而有些数据非常值得一提。下面这些是我们点赞量最多的答案,有的让我们会心一笑,有的有理有据值得深思:

  • 再怎么测试也不会发生崩溃。
  • 不要创建那些并不需要的玩意儿。
  • 任何人都需要写点注释。好不好以后自然会知道。
  • 你看到它,它才有意义。
  • 你需要了解业务目的。
  • 你需要做的不仅仅是写代码。
  • 不需要太过于特立独行。
  • 差的代码也能做很多事情,但就是通通做不好。

开发人员重视代码的可读性和可理解性并不奇怪。但是令人有一点点惊讶的是,其余的回答却差不多至少有50%的差异!

以下这四条就属于让人惊讶的后者:

  • 可维护:因为我们大多数人都有过维护别人代码的经历(或者一段时间以后维护自己的代码),并且很有可能度过了一段非常悲惨的日子。所以,我们期待更多的开发人员能够编写出可维护的代码。可能有的人假设代码可读,那么一定易于维护,所以就忽略了这一条。
  • 可工作:编写代码的目的,就是能够为他人提供价值。编写可工作的代码,是我们的首要任务之一。所以我们很惊讶为什么并不是每一个开发人员的答案中都囊括这一条。
  • 可测试/已测试过的:测试的重要性在这里我就不多说了,相信大家已经听到过不知道几百遍了。
  • 高效:话说,答案中包含“高效”的开发人员比强调“不可过早优化”的开发人员,要多两倍,而众所周知,“过早的优化是万恶之源”,所以,这太让人纳闷了。

最后,我们总结出好代码的定义:

“好的代码是可读的,可理解的,覆盖了自动化测试的,不过于复杂,并且能办好我们需要它做的事情。”

听起来就相当美,right?

作者:小峰

来源:51CTO

时间: 2024-10-26 14:11:34

什么样的代码为好代码?好代码的科学定义的相关文章

如何这段C#代码翻译成VB代码?谢谢!

问题描述 如何这段C#代码翻译成VB代码?谢谢! private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //自动点击弹出确认或弹出提示 IHTMLDocument2 vDocument = (IHTMLDocument2)webBrowser1.Document.DomDocument; vDocument.parentWindow.execScrip

【前端模板之路】二、人肉非智举,让代码帮我们写代码才是王道

写在前面 在前面一篇文章<[前端模板之路]一.重构的兄弟说:我才不想看你的代码!把HTML给我交出来!>中,我们举了一个人肉各种createElement的例子,那繁琐程度绝对是惨绝人寰.人生本就苦短,每天加班又占据了不少时间,这么折腾下去,还让人怎么活.面对这种场景,我们该怎么做. 无需复杂的构建工具,仅几个简单的工具函数,帮我们告别重复意义的劳动:让代码帮我们写代码! 从最简单的例子说起 让代码帮我们写代码,似乎很豪迈的话,但相信部分童鞋听着还是有些丈二和尚摸不着头脑.那我们暂且抛开这句不

求民航售票系统代码用java+jsp代码 SQLserver数据库myeclipse平台

问题描述 求民航售票系统代码用java+jsp代码 SQLserver数据库myeclipse平台 用于课程设计不用太复杂,只用实现基本功能.1.用户登录2.根据时间,出发地,目的地查询机票功能3.订票4.订单查询5.退票.用java+jsp代码 SQLserver数据库myeclipse平台 解决方案 参考:http://download.csdn.net/download/angelyucc/2373156 解决方案二: 这个可以参考,但最好还是自己写吧 解决方案三: http://down

extjs java-请问使用extjs进行文件上传,extjs前台代码和java后台代码应该怎么写

问题描述 请问使用extjs进行文件上传,extjs前台代码和java后台代码应该怎么写 请问使用extjs进行文件上传,extjs前台代码和java后台代码应该怎么写 解决方案 代码复制一下.http://www.cnblogs.com/hannover/archive/2010/12/02/1894820.htmlhttp://blog.itpub.net/29870867/viewspace-1280697/ 解决方案二: extjs的上传是封装好的,你只需要在后台servlet中接收传过

没有对比就没有伤害,优秀的代码VS糟糕的代码

可持续开发不仅在于项目架构设计,还与代码质量密切相关,代码的整洁度和质量成正比.-- Robert C. Martin, "Clean Code" 如果你还没有发现代码质量的区别,如果你从未见过优秀的代码,或者从未见过糟糕的代码,那么本文将以直观地对比,告诉你代码质量究竟会有多大的区别. [ 代码量 ] 我们知道代码量显示着功能的复杂程度,例如Windows XP的代码量超过2000万行,Linux内核有1500万行(2012年).然而代码量和功能数量之间并非线性关系. 优秀的设计中,

java-高分,帮忙下,谁知道把PhP代码转成Java代码

问题描述 高分,帮忙下,谁知道把PhP代码转成Java代码 <?php $prize_arr = array( '0' => array('id'=>1,'prize'=>'平板电脑','v'=>3), '1' => array('id'=>2,'prize'=>'数码相机','v'=>5), '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10), '3' => array('id'=

c++-怎样把一段C++代码(小游戏代码)跟Xtinon pro 联系起来.

问题描述 怎样把一段C++代码(小游戏代码)跟Xtinon pro 联系起来. 怎样把一段C++代码(小游戏代码)跟Xtinon pro 联系起来,想弄一个小游戏,也是一份暑假作业来的...大神们,求救,谢谢! 解决方案 Xtinon pro应该是Xtion PRO吧,一个体感应用. 1.下载部署Xtion PRO SDK:2.游戏代码中调用Xtion PRO API,读取体感设备的输入控制游戏进程. 解决方案二: 用vs2010..配置了openNI和opencv能用么

拔高你的Java代码质量吧:推荐使用枚举定义常量(转)

提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析  常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量.代码如下:    enum Season{ Spring,Summer,Autumn,Winter; }   二.场景  那么枚举常量与我们的经常使用的类常量和静态常量比有什么优势呢?  1.枚举常量更简单  先把Season枚举翻译成接口,代码如下:    interf

代码重构(六):代码重构完整案例

无论做什么事情呢,都要善始善终呢.前边连续发表了5篇关于重构的博客,其中分门别类的介绍了一些重构手法.今天的这篇博客就使用一个完整的示例来总结一下之前的重构规则,也算给之前的关于重构的博客画一个句号.今天的示例借鉴于<重构,改善既有代码的设计>这本书中的第一章的示例,在其基础上做了一些修改.今天博客从头到尾就是一个完整的重构过程.首先会给出需要重构的代码,然后对其进行分析,然后对症下药,使用之前我们分享的重构规则对其进行一步步的重构. 先来聊一下该示例的使用场景(如果你有重构这本书的话,可以参

as3代码创建火效果代码

as3代码创建火效果代码 下面为.swf文件调用方法 private function update(e:event):void { target.filters = [new displacementmapfilter(bmd, new point(), bitmapdatachannel.red,bitmapdatachannel.red, 10, strengh, "clamp")]; offset=offset.add(v); bmd.perlinnoise(size / 2,