标签 Programmer 下的文章

读《How Google Tests Software》

一直对Google这个牛X公司的内部开发过程很是感兴趣,毕竟像Google Search EngineGoogle云计算平台这些伟大产品都是在这个开发过程下缔造出来的。但也许是Google保密工作做的很好,或许人家不是刻意保密,只是 因为工作太忙或人员太低调,没空派人出来宣讲罢了。外界对Google内部的开发流程知之甚少;知道一些,诸如20%项目,也只是皮毛。

终于有一天,Google的三位工程师冒了出来,为我们带来的了一本名为《How Google Tests Software》的小书。我断断续续用了不到一周时间粗略地浏览了一遍这本书,算是对神秘的Google内部开发过程有了初步的了解了。其中有一些思路 还真是值得我后续深入思考,这里仅列出一些让我心有所触的"点",与大家共享。

书是从Test角度展开的,但Google的Test与我们所熟知的Test还有不同,包括这个过程的角色设置与职责等。下面是从书中摘录的一些语句(有些地方是我总结后的)和观点,再加上我的一些体会。

1、在Google,Software Testing被称作"Engineering Productivity(工程效率)",既负责开发和测试工具的开发、发布工程,还负责从单元测试(unit level)到探索性测试(exploratory testing)的全过程。
     
      — 在国内,多数公司的Testers只负责测试过程,而且多从功能测试开始,Unit test是开发人员的责任。大部分公司的开发与测试工具都是开发人员设计和实现的,但也有少部分先进的公司有专职的测试工具开发岗。总体来 说,Google内部的"测试人员"角色是与众不同的。

2、"Quality is a development issue, not a testing issue"、
     "At Google, this is exactly our goal: to merge development and testing so that you cannot do one without the other. Build a little and then test it. Build some more and test some more. "  、
     "The reason Google can get by with so few dedicated testers is because developers own quality.If a product breaks in the field, the first point of escalation is the developer who created the problem, not the tester who didn't catch it."
     "Testing must be an unavoidable aspect of development, and the marriage of development and testing is where quality is achieved."

     — 可以看出Google信奉:"Developer是质量的owner,是第一责任人;质量应该由开发人员把关;测试是开发过程必不可少的一方面;将开发与 测试融合在一起以获取更高的质量;开发一些,测试一些(迭代的思想)"。而国内多数组织依旧信奉着测试是软件质量的最后保证这一信条,将开发和测试隔离的 很开。
 
3、Google内部开发测试过程的三个角色:software engineer (SWE) 、software engineer in test (SET)和 test engineer (TE),Google SWEs are feature developers. Google SETs are test developers. Google TEs are user developers.

    — 在Google,似乎没有纯粹的传统意义上的Testers,按照书中所讲,SWE肯定是开发工程师,负责实现产品功能(feature),而SET,其 实也是开发工程师,用于编写产品的测试Feature,关于测试Feature这个概念很独特,Google认为,产品应该有两种Feature属性,一 种是function feature,一种则是产品的test feature,而SWE和SET则分别focus这两点。SWE和SET共享同一代码库,是开发过程中的Partner。与SWE关注功能 feature不同,SET更加关注产品的可测试性、如何通过测试提升产品质量以及提升测试覆盖率以及产品性能。他们为产品的feature编写测试代 码,从单元测试到后续的各种测试,编写各种工具,并尽量的将测试自动化,提升测试效率。

       而TE这个角色则有些类似传统的Testers,但在Google也有不同。在Google,TE更多是从user角度去探索产品,有的TE会编写大量脚 本代码,模拟user使用产品的各种场景;按照书中的说法:"TEs are product experts, quality advisers, and analyzers of risk"。

4、One of the key ways Google achieves good results with fewer testers than many companies is that we rarely attempt to ship a large set of features at once.

    — 显然Google也倾向于增量的迭代开发,这种模式符合Google内部的role设置,同时,这种role设置也更好地促进了增量迭代开发的顺利高效开展。

5、Build the core of a product and release it the moment it is useful to as large a crowd as feasible, and then get their feedback and iterate. This is what we did with Gmail, a product that kept its beta tag for four years.

     Google often builds the minimum useful product as an initial version and then quickly iterates successive versions allowing for internal and user feedback and careful consideration of quality with every small step. Products proceed through canary, development, testing, beta, and release channels before making it to users.

   — 这似乎就是Google著名的"Beta"模式,目前很多互联网企业(特别是startup)均效仿之。

6、Instead of distinguishing between code, integration, and system testing, Google uses the language of small, medium, and large tests, emphasizing scope over form.

    Small tests cover a single unit of code in a completely faked environment. Medium tests cover multiple and interacting units of code in a faked or real environment. Large tests cover any number of units of code in the actual production environment with real and not faked resources.

    The general rule of thumb is to start with a rule of 70/20/10: 70 percent of tests should be small, 20 percent medium,
and 10 percent large.

   — Google内部的测试不是按照代码单元测试、集成测试以及系统测试这些典型的阶段划分的,而是用"small、medium、large、 enormous"这些词汇来描述测试的各个环节,这些词汇也是Google内部的"共同语言"。如何界定这些测试的scope呢?Google内部有一 套共享的测试执行系统,它通过test size来界定不同的test类型。比如:对small tests的要求是每方法(method)的测试执行时间不能超过100ms,如果1分钟仍然执行不完,则将被kill掉。

7、Keeping it simple and uniform is a specific goal of the Google platform: a common Linux distribution for engineering workstations and production deployment machines; a centrally managed set of common, core libraries; a common source,
build, and test infrastructure; a single compiler for each core programming language; language independent, common build specification; and a culture that respects and rewards the maintenance of these shared resources.

   — 在Google内部一切都是"整齐划一"的,大大降低了各种人员在熟悉、学习和使用过程中的工作量。可以看出,Google为了提升内部开发效率,真是无 所不用其极啊。另外Google内部这套完整的强大的基础设施工具、库、语言以及流程支撑想必也让大家垂涎三尺吧。

8、There is no set rule at Google for when SETs engage in a project, as there are no set rules for establishing when projects become “real.” A common scenario for new project creation is that some informal 20 percent effort takes a life of its own as an actual Google-branded product. Gmail and Chrome OS are both projects that started out as ideas that were not formally sanctioned by Google but overtime grew into shipping products with teams of developers and testers working on them.

No project gets testing resources as some right of its existence. The onus is on the development teams to solicit help from testers and convince them that their project is exciting and full of potential.

  — 这两段话既描述了SETs进入项目的时机,同时也从侧面反映出了Google内部产品的初期形成机制。在这种机制下,一些著名产品诸如Gmail、 Chrome等诞生了。个人很是认同这种自底向上的产品"产生机制",有利于员工创造力的充分展现。其实退一步来说,我们不一定非要公司明确规定设置 20%个人时间,只是我们在平时工作中主动去发现、去分析、思考和总结,我们一样可以"创造"出一些用于改善我们工作和生活的工具或产品,这些"成果"在 我们的日常工作中使用,逐渐被大家所接受,甚至于发展演化成熟,形成一个可盈利的产品或是贡献给开源社区,不是一样很好么。感觉国内的很多互联网公司里面 的一些同行正在做这些事情。

9、This is the convention at Google: Make the common case fast.

  — 这显然已经上升到了哲学的层次,不仅对开发测试过程的效率改进有着指导意义,对软件自身的调优也是一样富有价值。甚至于对我们的日常生活也是有帮助的。

10、Designs that seek to automate everything end-to-end all in one master test suite are generally a mistake. The larger an automation effort is, the harder it is to maintain and the more brittle it becomes as the system evolves. It’s the smaller, more special purpose automation that creates useful infrastructure and that attracts the most SWEs to write tests.

        Overinvesting in end-to-end automation often ties you to a product’s specific design.

  –  这又是Google内部对自动化测试的一种中肯的实用的理解。我们要自动化,但要掌握方法,不要大而全,要小且精,吸引SWE自己去写测试代码。过分追求全闭环的自动化测试会将你与一个产品的细节间建立依赖。

11、Google centers its development process around code reviews. There is far more fanfare about reviewing code than there is about writing it.
      
       These pre-submit rules cover simple things such as adherence to the Google coding style guide and more involved things such as ensuring that every existing test associated with the CL has been executed (the rule is that all tests must pass).

  — Google打造了一个以代码评审为中心的开发过程,建立了一套完整的日常开发流程以及评审流程。并通过一套完整的工具平台在代码提交评审前对代码进行各种自动化检查,让评审过程更加focus关键业务逻辑,而不是语法之类的细节。

12、Test Runtime Requirements
   – Each test must be independent from other tests so that tests can be executed in any order.
   – Tests must not have any persistent side effects. They must leave their environment exactly in the state when it started.

  — 这里点明测试执行的原则:测试case间无依赖,可任意顺序执行;测试执行应遵循"童子军"纪律:测试执行结束后,将环境恢复到测试起始状态。

13、带认证的测试(Test Certified)

  — Google内部建立了类似竞赛似的规则,对每个项目的测试水平进行认证,分为几个级别:从TC level1到TC level5。对于每个级别都有明确的指标,甚至是明确的达标数字,比如总测试覆盖率,各种类型(比如small)测试的覆盖率等。在每个项目的首页都会 看到该项目的认证级别。这种规则将促使项目SWE和SET不断地改善测试,来提升测试认证水平,间接地提升了产品的质量。

暴雨·冰雹·涉水·夜路·堵车·行车记

上周六是六一儿童节过后的第一个周末,由于六一是工作日,没能带果果出去玩,因此周六我和LP一起带果果到太原街购物游玩。

 
早就听到天气预报说沈城会有雷阵雨,不过早上的天气还是蛮好的,不是很热,于是乎也没有太在意,只是带了简单的雨具。
 
也许是受到天气预报的影响,商业中心区居然也能很顺利找到停车位,一切安顿好后,就带着果果直奔商场。逛街顺序与往常没啥两样,先购 物,再带果果到商场楼上的儿童娱乐城玩。下午1点半左右玩累了,就在商场里的美食城饱餐了一顿。午饭过后,果果似乎有些累了,也到小家伙 的午睡时间了,于是就把果果抱到商场的"母婴室"睡觉,小家伙果然是困了,路上就已经呼呼开睡了。LP在母婴室看着果果睡觉,我趁机到楼 下的超市买些食品。
 
果果这一睡不要紧,外面的天气骤变,黑压压的乌云滚滚而来,电闪雷鸣,大雨倾盆而下。母婴室的小孩儿较多,一个小孩子醒来哭闹,其他小 孩子也都被吵醒了,因此果果总共也没睡上一个小时就醒了。本打算带果果回家,但此时外面暴雨倾盆,我们只带了一把伞,况且这么大雨行车也 不安全,于是乎我们选择了等待。
 
果果似乎对外面的情况并不知情,小家伙在儿童区玩的很开心。又过去一个小时,我和LP都有些着急了。于是又来到商场门口查看外面天气情 况。一个小时的急降雨,让商场正面的马路成了一片汪洋,几乎看不到什么车辆,只是有几个高档豪车仗着自己性能优越,在水中缓慢跋涉。此情 此景让LP越发着急,不断催促我想办法回家。在LP的不断催促下,我也有些不耐烦了,于是乎拿着伞出去取车,试想着从侧门接LP和果果上 车。事实上这个决定差点铸成大错,事后想起来还有些后怕。
 
我打伞出去时,雨势似乎不大。车停在离商场北面大月300米的露天停车场里,但当我接近停车场时雨势不知怎么地突然变大,目测应该是大 暴雨程度。进到车内,从车窗向外看,视距也就2-3米,而且只能看到前面,两个后视镜以及后玻璃在这么大的雨情下已经基本无法使用了。将 车龟速开出停车场。由于雨太大,根本看不清道路以及路牌标志,马路上的车都是龟速,打着双闪,另外不时能看到车辆刮碰的情况。我是第一次 开车到这个地方,路十分不熟悉,结果两次走错路,那时也顾不上什么交通规则了,看到没车,就调头往回走。这时车窗车顶响起了硬物撞击声, 冰雹!我的心一下凉了。这次我的车看来再劫难逃了,坐在车里那个心疼啊,我提车没到两周呢:(。
 
事实上更惊险的事情还在后面呢!刚将车开到正确的大街上,我立马后悔了,这哪里是大街啊,这就是大海啊。这条街中间有护栏,调头是不可 能的了。后面的车排成了长队,也没法倒车,只能硬着头皮往前龟速行驶。中间看了很多车停在水里不动了,不知道是发动机进水了,还是司机故 意不走了,那场面简直就像是《后天》里的末日景象。我的心都提到嗓子眼了,生怕发动机进水熄火,那车的彻底废了。终于看到前面有一个路 口,右侧的一个小路上积水不深,很多车都右转上岸,我赶紧打方向跟进!终于上岸了!我长出了一口气,路旁恰好有一个空位,立马过去将车停 住!谢天谢地啊,发动机终于算是保住了!但不知冰雹是否给车留下痕迹,由于光线太暗,根本开不清车的外观是否有损伤,只能第二天观察了。
 
这时雨势减小了,我下车又回到了商场。和LP、果果在商场选择继续等待。果果出来时没穿太多衣服,玩了一天,小家伙看起来也很疲倦。此 时外面的雨势虽然已经小了,甚至是停了。但考虑到路上的深深的积水,特别是回家的途中还要经过一座地道桥,我们选择等等再出去。先到美食 城吃点东西,补充一下热量吧,别感冒了。
 
40分钟后,我们离开了商场,回到车内,起车回家。但回家之路又谈何容易!沈阳站铁道桥洞东西方向已经成了停车场,那车龙一眼望不到 边。原本半分钟的路,我们走了能有1个小时。期间又下起了大雨。雨滴打在车上的声音很大,担心果果受惊吓。于是不断和果果聊天。这也是我 第一次夜间行车,之前我连大灯都没开过,现打开车辆手册翻看如何打开大灯。好不容易挤到十字路口,在交警同志的指挥下,终于上了大道。到 家时,已经8点半了,惊魂行车之旅终于结束了。
 
按我LP的话说,经过这次艰难行车,我已经从新手成长为成手了^_^。
如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats