书接上回,有关代码质量保证体系里勾兑的那些个卿卿我我,还有单元测试、持续集成、代码评审与重构需要与你道来。

单元测试

StackOverflow上一个有16.7k分的人问了个有关单元测试的问题“How deep are your unit tests?”,意思就是说“单元测试需要做多细?”,或者换句话说“单元测试的这个单元的粒度是怎样的?”

针对这个问题,下面的回答获得了压倒性的票数,被评为最佳回答。

I get paid for code that works, not for tests, so my philosophy is to test as little as possible to reach a given level of confidence (I suspect this level of confidence is high compared to industry standards, but that could just be hubris). If I don't typically make a kind of mistake (like setting the wrong variables in a constructor), I don't test for it. I do tend to make sense of test errors, so I'm extra careful when I have logic with complicated conditionals. When coding on a team, I modify my strategy to carefully test code that we, collectively, tend to get wrong.

老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,少到你对你的代码质量达到了某种自信(我觉得这种的自信标准应该要高于业内的标准,当然,这种自信也可能是种自大)。如果我的编码生涯中不会犯这种典型的错误(如:在构造函数中设了个错误的值),那我就不会测试它。我倾向于去对那些有意义的错误做测试,所以,我对一些比较复杂的条件逻辑会异常小心。当在一个团队中,我会非常小心地测试那些会让团队容易出错的代码。

翻译来自酷壳网的文章,这不重要,重要的是这个回答来自于KentBeck(敏捷开发XP与测试驱动开发TDD的奠基者)。下面是有人针对Kent这个回答的调侃。

The world does not think that Kent Beck would say this! There are legions of developers dutifully pursuing 100% coverage because they think it is what Kent Beck would do! I have told many that you said, in your XP book, that you don't always adhere to Test First religiously. But I'm surprised too.

只是要地球人都不会觉得KentBeck会这么说啊!我们有大堆程序员在忠实地追求着100%的代码测试覆盖率,因为这些程序员觉得KentBeck也会这么干!我告诉过很多人,你在你的XP的书里说过,你并不总是支持“宗教信仰式的TestFirst”,但是今天Kent这么说,我还是很惊讶!

持续集成

根据《重构-改善代码既有的设计》作者Martin Fowler大师在《持续集成》一书中的定义,“持续集成是一种软件开发实践。在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以多次。每次集成会经过自动构建(包括自动测试)的检验,以尽快发现集成错误。许多团队发现这种方法可以显著减少集成引起的问题,并可以加快团队合作软件开发的速度。”

通俗地说,持续集成(CI)需要对每一次代码提交走一次从代码集成到打包发布的完成流程,以判断提交的代码会对这整个流程带来什么影响。而这个过程中所使用的手法严重依赖于团队成员的多少、目标平台和配置的不同等因素。比如,只有一个人单干,同时只面向一个平台,那么每次有一个commit时,手工跑一下测试基本就知道结果,也就完全不需要其他更为复杂的工具与手段。

但是对于Linux、OpenStack等大型的项目来说,显然没有这么简单,涉及一个使用版本控制软件来维护的代码仓库,自动的构建过程,包括自动编译、测试、部署等,以及一个持续集成服务器。

代码评审与重构

首先,我们先来了解一个程序调试大法——“橡皮鸭程序调试法”,它来自http://www.rubberduckdebugging.com/,酷壳网(http://coolshell.cn/ )上也有篇文章用中文进行了阐释,这里没办法解释得更好。

这个方法实施起来相当方便和简易,几乎不需要借助任何的软件和硬件的支持,可以随时随地地实验,你甚至可以把你的程序打印出来,在纸面上进行调试。

那么,为什么这个方法叫做橡皮鸭呢?一是因为橡皮鸭子貌似是西方人在泡澡时最喜欢玩的一个小玩具,所以,这个东西应该家家户户都必备的。二是这个方法由西方人发明,所以,就被取名为“橡皮鸭”了。下面是整个调试方法的流程:

  • 找一个橡皮鸭子。你可以去借,去偷,去抢,去买,自己制作……反正你要搞到一个橡皮鸭子。

  • 把这个橡皮鸭子放在你跟前。标准做法是放在你的桌子上,电脑显示器边,或是键盘边,反正是你的跟前,面朝你。

  • 然后,打开你的源代码。不管是电脑里的还是打印出来的。

  • 对着那只橡皮鸭子,把你写下的所有代码,一行一行地,精心地,向这只橡皮鸭子解释清楚。记住,这是解释,你需要解释出你的想法、思路、观点。不然,那只能算是表述,而不是解释。

  • 当你在向这只始终保持沉默的橡皮鸭子解释的过程中,你会发现你的想法、观点、或思路和实际的代码相偏离了,于是你也就找到了代码中的Bug。

  • 找到了BUG,一定要记得感谢一下那个橡皮鸭子。

这个方法是否让你感觉太“愚蠢”,太“弱智”了?不过,这个方法的确有效。因为,这就是“Code Review”的雏形!它的核心思想可以概括为:一旦一个问题被充分地描述了他的细节,那么解决方法也是显而易见的。

相信各位都有过这样的经历,当你死活都找不到问题的原因的时候,当你寻求他人的帮助时,对别人解释整个你的想法和意图或是问题背景的时候,你自己都没有解释完,就已经找到问题的原因了。这就是这个方法的意义所在。

所以,“橡皮鸭”只是一个形式,其主要目的是要你把自己写的代码做“自查”,也就是自己解释给自己听。当然,为了不让你像个“精神分裂”的程序员,引入“橡皮鸭”是很有必要的(虽然这样还是有点精神病,但比起精神分裂来说算是好的了)。所以,真实的本质是Code Review。

那么,对于Linux、OpenStack等大型项目来说,为了保证代码评审的有效进行,首先需要做的是为我们寻找合适的道具“橡皮鸭”,然后提供一个将这些道具和我们有效联结起来的平台。

对于这里另一个重要的步骤——代码的重构,简单的说,就是在代码写好之后改进它的设计,存在于我们测试、小修改、测试、小修改……这条不归路中。复杂来说的话,推荐大家可以去看看Martin Fowler有关重构的神作《重构-改善代码既有的设计》。

呆呆的天空

如我的脑袋

总是游荡啊,游荡啊

还好,岁月静好,一切从容。那么接下来应该会有两篇来分别看看Linux和OpenStack为了保证自己的代码质量又做了什么。

相关阅读

代码质量保证体系(上)

喜欢的话,欢迎扫码关(打)注(赏) ^-^

代码质量保证体系(下)相关推荐

  1. 云原生体系下的技海浮沉与理论探索

    作者 | 王银利(芸峥) 1 . 概述 攻技者,短之:理论者,长之:践行者,胜之.可以这么说,一座城市的良心就体现在下水道上,不论这座城市有多少高楼大厦,建设得有多么宏伟,只要是下雨天,雨水就变成了城 ...

  2. 现有的静态代码扫描体系弱爆了?看看阿里的吧!

    摘要:本文由淘宝技术部高级无线开发工程师详细剖析了手机淘宝的现状及挑战.针对手淘问题发现被动.感知模糊和缺乏经验积累等众多问题,阿里精心研发推出了定制化的移动静态代码扫描体系!那么该自行研发的扫描体系 ...

  3. 【网络安全】CIS 2021网络安全创新大会《代码安全体系建设》实录

    一.背景 汤青松 ,北京趣加科技有限公司 安全工程师,实体书<PHP WEB安全开发实战>作者,擅长企业安全建设,SDL安全建设. PHPCon 2020 第八届 PHP 开发者大会分享& ...

  4. S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作。

    这篇文档算上期末复习这段时间其实拖了有好久了,因为从一开始接触linux的i2c驱动体系我就各种凌乱,因为起初脑海中既没有整体框架也不熟悉相关体系下的结构,所以四处乱看,经常性的在看内核代码时看着看着 ...

  5. Python编程语言学习:两行代码输出根目录下所有子文件夹的绝对路径、相对路径

    Python编程语言学习:两行代码输出根目录下所有子文件夹的绝对路径.相对路径 目录 两行代码输出根目录下所有子文件夹的绝对路径.相对路径 两行代码输出根目录下所有子文件夹的绝对路径.相对路径 #Py ...

  6. C++继承体系下的对象构造

    继承体系下的对象构造 继承下的对象构造 虚拟继承 初始化"虚基类子对象" vptr的设置 总结 继承下的对象构造 class Point{public:Point(float x ...

  7. 逻辑回归模型_联邦学习体系下——逻辑回归模型

    联邦学习的体系我们在前期介绍过,这里我们简单回顾一下纵向联邦学习的定义:在两个数据集的用户重叠较多而用户特征重叠较少的情况下,将数据集按照纵向 (即特征维度)切分,并取出双方用户相同而用户特征不完全相 ...

  8. matlab 带有下标的赋值维度不匹配_远见另类资产管理体系下的核心系统搭建

    另类资产管理体系下的信息化建设,或许是小众领域中的更小众话题,但仍值得讨论.很多基金公司.投资公司或资产管理公司都搭建了各种大大小小的应用系统,如OA系统.财务系统.CRM系统等,但对于上系统的价值, ...

  9. 理解SQL Server中的权限体系(下)----安全对象和权限

    在开始阅读本文之前,请确保你已经阅读过上一篇文章,文章地址: 理解SQL Server中的权限体系(上)----主体 简介 在上一篇文章中,我对主体的概念做了全面的阐述.本篇文章接着讲述主体所作用的安 ...

最新文章

  1. react中js文件中写html,javascript – 使用静态HTML与React
  2. 军用软件概算计价规范_超强干货分享:547建筑工程计量与计价,帮你轻松掌握计量与计价...
  3. Strongly connected HDU - 4635(tarjan+强连通分量)
  4. Qt之QProcess(一)运行cmd命令
  5. 【转】HashSet的用法
  6. 自动行政审批流程组件的审批流程节点定义【民间称为工作流组件、官方称为审批流程组件】...
  7. CSS 背景 background属性
  8. 联通实时计算平台演进与实践
  9. 【转】正则表达式括号的作用
  10. 关于BS7799-3
  11. storm和vgj vgj_风暴很忙:VGJ.Storm新阵容亮相DAC预选赛
  12. CRT和LCD显示器的区别
  13. win10关闭自动更新
  14. 使用beeline不能truncate table表
  15. 【吊打面试官】计算机基础知识
  16. 浅谈 CRTP:奇异递归模板模式
  17. 【技术栈】【SSM】SMM的常用注解
  18. java毕业生设计贝儿米幼儿教育管理系统计算机源码+系统+mysql+调试部署+lw
  19. tensorflow报AttributeError: __enter__错误解决
  20. SQLyog下载、安装

热门文章

  1. simplify-js 降低曲线拟合使用的点数
  2. 带你了解地址分配DHCP,IP地址管理方式及分配原则
  3. JavaScript原型是什么
  4. 计算机网络里什么叫专线,专线和宽带的区别有哪些_专线网络和家庭宽带的具体区别介绍...
  5. html地图添加marker,谷歌地图 API 开发之添加标记
  6. 查询批量文件中关键数据方法--uedit32工具
  7. 解析人工智能与人类智慧的求同存异
  8. c语言去掉文件中重复单词,awk脚本 使用awk去掉重复的单词
  9. 【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)
  10. unity中的四元数,欧拉角,方向向量之间的相互转换方法。