友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
敏捷无敌-第9部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
外部接口文档、详细设计文档、测试策略、测试计划等,从敏捷的角度来讲,我们应该做一些简化。”
“嗯,是有必要精简,但应该精简到什么程度呢?”阿朱问道。
“我觉得……”大民稍微顿了一下,似乎是故意为了强调:“够用就可以了!就是说不应该太多,但也不能没有。我们需要找出来对我们真正有用的文档,真正值得花精力的文档,然后做增量设计。”
“话虽如此!问题是咱们在大的流程上还必须按照公司的产品生命周期走,这中间会涉及很多的里程碑,而每个里程碑都要求有完备的文档,才能通过检查,进入下一阶段。”阿朱接着说。
“那我们先来看一下公司的PLC(Product Life Cycle)好了。”阿捷边说边在白板上画出公司的产品生命周期。
“虽然整个周期很长,但咱们必须通过的CheckPoint只有DEV和SHIP。咱们Team目前自己实施敏捷开发,也就是在DEV到SHIP之间。其实,这也正是敏捷软件开发跟CMMI/ISO 000等流程相互补充的最有效方式。其间的SQ虽然很重要,但不是必需的,公司强制得并不严。所以咱们只要在DEV和SHIP这两个CheckPoint上提供完备的文档就可以了。”
“DEV 在我们开发的启动之初,可以周旋的余地不多,这个念头就不用想了,该准备的文档还要准备好。不过,这个CheckPoint更多的是针对Marketing、Product Planner等除R&D以外部门的,对于我们R&D来讲,只需要给出一个项目计划文档和一个软件总体架构文档即可,所以问题不大。而SHIP是在后期,可操作的余地比较大。”
“这样的话,那我们是完全可以按照尽量简化、增量设计的思路来做的!在每一个Sprint,我们都只做简单设计,产生对于当前Sprint所必需的文档,而没必要一次性给出大而全的设计方案,写出非常完备的文档来。这样也不现实,因为最终还是要不断地修改的。完全可以通过后继的Sprint,不断完善,不断重构,直至产品发布前,给出最终版本。当然,每次的设计都应该是可以扩充的,而不是走入死胡同,以后没法重构。大家觉得如何?”。 最好的txt下载网
第11章 你开车,我导航(3)
“应该是可以做到的。关键还是度的问题。设计要适度,文档要适度,不能成为我们工作的累赘,又要做到出现争议的时候有据可查。我觉得有些文档还是一开始就要有的。”大民回应道。
“可哪些文档是必须要有的呢?”小宝还是很关心具体的东西。
“在我看来,至少有两份文档是必需的:需求文档和概要设计。需求文档的目的是告诉大家,我们开发的软件要做成什么样子、要实现哪些功能,这份文档应该是经常更新的,记录开发过程中最新达成的结论。而且这个还必须跟Product Backlog对应起来。概要设计是确保大家在XP的过程中不会脱离轨道,不会天马行空。”
“嗯,那我们就先按照这个思路实行一段时间。可以通过每次的Sprint回顾会议进行调整。那我们再来看看TDD编程?”阿捷把头转向大民。
“好!从它的英文Test…Driven Development即可以看出是测试驱动的。也就是说是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。这一点跟我们大多数人日常的实践是不同的。我们虽然也有UT,并且数量也很多,但这些UT用例基本都是在编写完功能代码之后,才编写的。”
“我觉得区别不大啊!最终都是为了验证功能的正确性。”小宝说道。
“不一样!事后的单元测试较TDD会失去大半的意义。我们先来看看通用的测试驱动开发基本过程。”大民边说边把每一步列在白板上。
(1)明确当前要完成的功能。可以记录成一个 TODO 列表。
(2)快速完成针对一个功能的测试用例编写。
(3)测试代码编译通过,但测试用例通不过。
(4)编写对应的功能代码。
(5)测试通过。
(6)对代码进行重构,并保证测试通过。
(7)循环完成所有功能的开发。
大民转过头来,指着刚刚写完的7条说,“乍一看,似乎也没什么。但深奥之处就在于第一步的明确上。如何明确?通常由业务分析人员、测试人员、开发人员进行一次讨论,就要完成的功能的验收条件达成一致并形成记录,然后测试人员设计并编写验收测试用例,开发人员编写单元测试和并实现功能代码。这样,测试人员早期介入,从而可以避免开发人员与测试人员理解不一致,开始产生争执并阻塞等待业务分析人员或者行政主管的仲裁。”
“嗯,测试就是应该越早介入越好!是吧,阿紫?”阿朱征求阿紫的支持,阿紫很快点头回应。
“对于开发人员来讲,可以强迫他从测试的角度来考虑设计,考虑代码,这样才能写出适合于测试的代码。”大民接着讲。
“从另外的一个角度上说,坚持测试优先的实践,可以让开发人员从一个外部接口和客户端的角度来考虑问题,这样可以保证软件系统各个模块之间能够较好地连接在一起,而开发人员的思考方式,也会逐步地从单纯的考虑实现,转移到对软件结构的思考上来。这才是测试优先的真正思路。”
“另外,大家看第(6)步,这里提到了重构。重构是XP里面非常重要的一个实践,只有不断地重构,才能改善代码质量、提高代码复用,它跟TDD/简单增量设计是相辅相成的,谁都离不开谁。那究竟什么时候该重构,什么情况下应该重构呢?”大民把问题提给大家,静候大家的答案。
“有新功能的时候重构。”txt电子书分享平台
第11章 你开车,我导航(4)
“需要复用代码的时候重构。”
“该重构时重构。”
“写不下去的时候重构。”
“下一次迭代时重构。”
大家七嘴八舌地回答。
大民看到大家差不多说完了,清了清喉咙:“这些想法基本都对。在TDD中,除去编写测试用例和实现测试用例之外的所有工作都是重构,所以,没有重构,任何设计都不能实现。至于什么时候重构嘛,还要分开看,我的经验是:实现测试用例时重构代码,完成某个特性时重构设计,产品的重构完成后还要记得重构一下测试用例。”
“我刚毕业时,加入的是一家铁路局里的信息部门。我很清楚地记得,;带我的大哥给我的第一句忠告就是‘如果一段代码还能工作,没有出现问题,就不要动它’因为我们做的是铁路调度实时运维系统,不能出一点差错。”小宝喝了口水,接着说,“我觉得非常有道理,一直也是奉行这个金科玉律的。你觉得呢,大民?”
大民没有马上回答,沉思了一下:“或许在你们的那个环境、那种条件下,这样做是最稳妥的。我想,你们之前肯定因为修改过代码,而导致重大错误,从而一朝被蛇咬,十年怕井绳,对代码产生了恐惧感,最终无法掌控代码。我是这样认为的,如果一个系统一直没有新的需求,使用的情形一直不变,它本身可以一直不变,这样做是可以的。但对于95%的产品而言,是需要不断变化的。如果一些冗余代码、拙劣的代码,存在糟糕的结构和投机性设计,虽然能够正常运行,但这样的软件完全是‘金玉其外,败絮其中’,常常会带来更大的潜在的问题。对于一个负责任的程序员来讲,是不能容忍的。一定要重构,重新优化,夺回对代码的控制权,千万不能滋生得过且过的情绪!”
阿捷带头鼓起掌来,大家纷纷响应。大民不好意思地咧着嘴笑了。
等大家静下来,大民接着说:“重构不可避免地会带来一些问题,我们需要建立一个很好的机制来保证重构的正确性。其中很重要的一个实践就是单元测试,是TDD。虽然一些简单的重构可以在没有单元测试的情形下进行,重构工具与编译器自身可以提供一定的安全保障,不至于引入一些简单的人为错误,但如果只采用传统方式对代码进行测试,例如使用调试器或执行功能测试,这种测试方法不仅效率低下,而且是乏味的、不值得信赖的。重构时,代码比以前对修改更为敏感与脆弱。若要避免不必要的问题,则应添加单元测试放到项目中。这样可以确保每一小步的重构,都能够及时发现错误。”
“这么看,似乎通过TDD就可以发现很多Bug了啊!因为开发人员跟我们测试人员是按照同样的功能验收条件设计测试用例的。我说的没错吧?大民?”阿紫问道。
“还不能这样说!真正按照TDD的方式进行的软件开发可以非常有效地预防Bug,但不可能通过TDD再找到Bug。因为TDD里有一个很重要的概念是‘完工时完工’。意思是说,当开发人员写完功能代码,通过测试时,工作也就做完了。你想啊,当开发人员的代码完成的时候,即使所有的测试用例都亮了绿灯,这时隐藏在代码中的Bug一个都不会露出马脚来。即使之前没通过测试,那也不叫Bug,因为工作还没做完。”
“嗯,我明白了!所以还需要我们测试人员同步设计功能测试用例,进行功能验收测试才行。那个阶段,发现的问题才能真正称为Bug。”
第11章 你开车,我导航(5)
大民点了点头,以示认同。
“我有一个问题,我该为一个功能特性编写测试用例还是为一个类编写测试用例?”小宝问道,“因为从我们的代码中,我看到UT 测试用例都是类和方法。”
“这个问题很好!我以前也有过类似的困惑。因为关于TDD 的文章都说应该为一个功能特性编写相应的TestCase。后来看了别人的一个Blog,才明白是怎么回事。他们在开始开发一个新特性时,先针对特性编写测试用例,如果发现这个特性无法用测试用例表达,那么将这个特性细分,直至可以为手上的特性写出测试用例为止。然后不断地重构代码,不断地重构测试用例,不断地依据TDD的思想往下做,最后当产品伴随测试用例集一起发布的时候,他们发现经过重构以后的测试用例,就已经是和产品中的类/方法一一对应啦!”
“哦,是这样。”小宝看上去还是半信半疑。
“我感觉从功能特性开始是最安全最稳妥的方式,这样不会导致任何设计上重大的失误,也符合简单增量设计、不断重构的XP原则。”大民加上一句,以进一步澄清小宝的迷惑。
“那么TDD到底该做到什么程度,就算结束了呢?重构总是无止境的。是通过所有的UT测试用例吗?”小宝问道。
“很简单!Clean Code That Works。”大民抛出来一句英文,看来真的想把大家绕晕才甘心。
“那到底啥意思啊?你还是说中文吧,听不懂你说的Chnglish。”阿紫打趣道。
“这句话是TDD的目标,Work是指代码奏效,也就是必须通过所有的UT测试用例,而Clean是指代码很整洁。前者是把事情做对,后者是把事情做好。”
“关于TDD还有什么疑问吗?”阿捷用目光扫了一遍,见没人响应,接着说,“那我们再来讨论一下结对编程吧。上次我们做Scrum发布计划的时候,曾经提到我们缺少一个人,看看能不能从部门内部临时借调一个人过来,帮帮我们。现在告诉大家的好消息就是,Charles已经正式批准章浩将从下个月加入我们团队,进行TD的研发!”阿捷非常兴奋。
大民还没等阿捷说完,就插了一句 :“太好了!章浩跟我是前后脚加入Agile的,开发经验很丰富,又熟悉Agile OSS的整个开发环境。嘿嘿,小宝,他来了你再有问题就可以直接向他请教了。章浩人很Nice的。”
“是啊!自从Charles那回听过咱们的站立会议之后,对Scrum很有好感。再加上咱们前几个Sprint确实做得还行,所以这次Charles听完我和李沙关于TD项目开发任务的汇报后,咱们不是在Resource一栏写着缺少开发人手吗?他看了之后就问我想要谁。我的第一个念头就是章浩!”
“呵呵,当时说出来还怕Charles不答应,因为章浩毕竟是周小小Team的Technical Leader。Charles当时可没答应我,只是跟我讲他会去和周小小谈谈!谁知道今天早上Charles就告诉我章浩可以下周暂时借调到咱们Team,做完咱们规划的3个Sprint之后,再看情况是否需要回周小小的Team。”阿捷笑着和大家讲述着事情的经过。阿捷并没有和其他人讲其实他在和Charles讲完借调章浩后,曾经独自找章浩谈过近3个小时。
“哈哈,我说昨天中午在食堂跟章浩一起吃完饭往台球室走,中途遇见周小小,周小小连看都不看我跟章浩一眼,原来是因为这个啊。呵呵,太好了,下周章浩过来刚好可以赶上咱们的下一个 Sprint!”大民兴奋地讲着。
第11章 你开车,我导航(6)
“嗯,是啊。虽然章浩非常有经验,可能他也需要对咱们正在用敏捷方式做的TD项目熟悉一段时间。咱们最好想个办法,让章浩迅速融合到咱们的开发进程中。大民,你还记得上次你提到的结对编程吗?如果项目组有新人加入,或者由于某种原因进行换岗,你提到可以通过结对的方式来提高整个团队的开发效率。今天再给我们大家讲讲吧。”阿捷看着大民。
大民高兴地说:“好啊,阿捷!我老早就想说这个了,只不过咱们组一直都没有进过新人。说到结对,通常咱们大家都会立即想到编程结对,其实在XP中,这个概念可以是更广泛一些的,还可以是设计结对、评审结对、单元测试结对!”
“设计结对是在对某个模块开始编码之前,两人共同完成该模块的设计,这种设计通常不会花费很长时间,不会产生设计文档,更多的是讨论交流,主要考虑是否符合总体架构,是否足够灵活,易于重构等。”
“单元测试结对通常是说一个人编写测试代码,另外一个人编写代码来满足测试。这样,任何一个人对设计理解有误,代码都不会通过单元测试,从而可以避免由同一个人编写单元测试代码和程序代码带来的黑洞,往往可以发现更多的问题或缺陷。”
“听起来是把一个人的TDD; 变成了两个人的TDD!”阿捷总结。
“对!这样效果会很不错!复审结对是在编码活动完成、通过单元测试后进行的。一般采用一个人讲代码组织和编程思路,一个人倾听、提问的形式。这种复审模式更多地强调了相互交流,这会比一个人单独评审,然后总结评审意见发给原作者的模式效率要高得多,文档、邮件也减少了。当然有人说,这么做就会没有文档化的评审记录。可谁会关心这个呢?良好的代码应该说明了一切。”
小宝一直听得很仔细,插了一句:“其实,如果两人编程结对了,编程的过程其实也就是复审的过程,完全可以省略评审。”
“对!”大民非常赞同小宝的观点,“设计结对、评审结对、单元测试结对这三种方式是对结对编程实践的有效补充,操作简单,受益却很大。而对真正意义上的编程结对,我其实并不怎么看好!”
“啊?为什么?”大家都对大民抛出的这个结论很震惊!
“编程结对,在任一时刻都只是一个程序员在编程,效率到底有多高呢?1+1》1是肯定了,但是否1+1》2呢?”大民留了一点时间给大家思考。
“现在还没有肯定的答案!国外也有很多关于编程结对的研究,基本都是建立在结对的两人组和一个人之间的对比,结论基本上是编程结对不能始终保证开发质量和效率始终高于单人编程。如果是结对的两人组和两个单人开发组进行对比,结果更是未必。所以,我目前也不认为结对一定能始终提高效率。”
“但是,我觉得,他应该能够在某一个阶段,或者说项目进行的某一个阶段内提高效率提高质量。”小宝满怀疑问地说。
“这也是对的!所以我前面也提到了‘始终’这个词!这是因为只有两个经验相等的人结对才有可能真正提高编码效率。而现实中,经常是一个有经验的人坐在旁边,另一个经验不太丰富的人进行编程,还会有一个老手轮询多个新手进行开发的方式,在国内公司尤其普遍。因为大多数耗费时间的编程部分是靠输入来完成的,这样就更难做到1+1》2。”
第11章 你开车,我导航(7)
“通常支持结对编程的人认为,当两个人合作三个月以后,效率才有可能超过两个人单独编程的效率!这里有一个时间前提——三个月以后。三个月这个时间未必是真实确凿的时间分界线,它只是一个模糊的、大概的时间范畴,如果两个人配合得好,也许只需要两个多月,如果配合不好,也许需要四五个月或者更长的时间,不确定性很大。”
“许多时候,如果仅仅只是想减少defects的数量,我认为还是设计结对、评审结对、单元测试结对这三种方式更为有效一些。此外,结对编程始终是两个人的合作行为,其效果会受到多种因素影响。譬如,两个人的性格、个人关系、沟通能力、技术是否互补等都会影响最终的结果。究竟1+1大于2还是小于2真的是一个很难说的事情。只能靠团队自己不断地组合,找出合适的配对个人。”
大家纷纷点头,觉得大民说得很有道理!
“那我们就不实践编程结对了?”阿捷问道。
“其实不仅仅编程结对,其他结对实践,也要视人、视项目、视环境而定。至少两个极端情形下; 结对毫无益处:1。需要静心思考的问题。这时完全可以分头行动,等各自有了理解或解决方案再来讨论。言语在思考的过程中也会帮忙,但有时候,言语只会打扰思路。 2。琐碎毫无技术含量的工作,不得不手工完成的。这种工作考验的只是耐心,不妨分头行动,效率肯定比结对要高。”
“在有些时候还是可以采用的,也是有好处的,特别是对于新加入一个团队的成员而言,可以让他迅速成长,融入团队!因为结对编程的内涵是一种技术、经验、知识的共享。通过共同商讨、解决问题,来提高沟通、交流,来降低误解和疏远。但即使是这样的结对,一天中最好也不要超过4小时。”
“嗯,看来我们至少很有必要让你跟章浩来一次结对编程!一次Agile老员工的强强联手!哈哈,你跟章浩两个进入Agile的时间加一起都超过10年了吧?呵呵,正邪双修啊。”阿捷很少有这么高兴的时候来取笑大民。
“少来这一套,你这家伙,呵呵,小心下回我修理你。”
在一片欢笑声中,大家结束了本次关于XP的讨论。同时也到了下班时间,大家纷纷道别,走出办公室。阿捷并没有马上走,而是独自走回座位,写下了今天的敏捷日记,毕竟今天的讨论太精彩了。
又到了月底的周五下午,是全部门的Monthly Update会议时间。这个会议是Charles在电信事业部组建完成后,一手发起并组织的,在每个月的最后一个周五下午举行。整个部门的员工,都对这个Monthly Update会议颇有好感。每到了这个时候,大家都会像去参加嘉年华一样,热情高涨。因为在这个会议上,不仅仅可以分享到其他Project Team正在做什么项目、最新进展如何,还可以了解到部门最新的财务状况、订单状况,特别是所有人都很关心的China Business。Charles每次都会有一次Update。不管消息好坏,Charles都会毫无保留地分享给大家,都能让大家真正地感觉到自己是公司的一员、部门的一员,因为每一个人都很注重这种被珍视的感觉。通过这个Monthly Update,来自Charles的官方消息每次都会击败所谓的小道消息,从而有效地杜绝了流言的散布。
在今天的会议上,Charles跟以前一样,按部就班地为全部门Update了一遍最新消息,其中Agile OSS可能攻打*TD大单的消息,更是让所有人兴奋了半天。Charles待大家平静下来后,正式宣布章浩将暂时从周小小那里转到阿捷所在的TD团队,帮助攻克TD-SCDMA项目。在介绍完两位新加盟的员工后,Charles最后非常郑重地强调了一下“正确使用公司Internet”的问题。因为最近一段时间以来,公司对外的Internet线路变得奇慢无比,直接影响了整个研发部门的正常运行。IT部门对上个月的Internet使用情况做了一次监测分析后,得出的结论非常令人震惊。60%的Internet流量跟公司业务毫不相干,除了有人下载MP3、电影以外,竟然还有人访问黄色网站,其中有8个人的总共月流量是17GB,居然占到了全部1000多人总流量的15%左右!Charles再三强调,请大家不要拿自己的前途开玩笑,不要违反公司的SBC(标准商业行为准则,Standard Business Conduct)。因为公司以后一旦发现,将严惩不贷。会后,大家纷纷猜测究竟是哪8个人这么强,敢用公司的网络做这种事情。
会后,周小小叫住章浩,让他直接到自己的座位,做一下项目交接。章浩还是比较诧异的,没想到周小小这次这么主动,不过想到自己毕竟是周小小组的Technical Leader,平时负责的事情很多,这一走对他肯定影响很大,也就觉得顺理成章了。当周小小将电脑从锁定状态切换回来,正准备打开一个Excel,突然从屏幕的右下角,蹦出来电驴的图标,紧接着是一个信息窗口,“xxx小电影下载完成!”。
周小小迅速地关掉这个信息窗口,装作若无其事地说:“我现在突然想起来还有点事,我下周一再找你吧!”
突然蹦出来的电驴图标将章浩惊得目瞪口呆,愣是半天没反应过来。看到章浩没有反应,周小小转过头来:“章浩!我下周一再找你,你先回去吧!”
“哦!好的!”章浩这才反应过来,转身朝自己的座位走去。一边走一边想,真郁闷,这种事情怎么让自己看到了,估计以后自己该有麻烦了!更多请访问('EXC')书包 网 。 想看书来
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!