孔明:结对编程,可保木牛流马交付无忧 |【守望者】第五期《工程实践九大坑》正式发布

本文内容节选自「守望者」第五期《工程实践九大坑》第三章《孔明:结对编程,可保木牛流马交付无忧》何为“结对编程”? “结对编程” 的集中实施方式。
本文内容节选自「守望者」第五期《工程实践九大坑》第三章《孔明:结对编程,可保木牛流马交付无忧》

李岩老师作卷首定场诗一首

《工程实践之九大神坑》

分支管理没规范,集成发布真混乱。

度量指标瞎乱选,虚假繁荣吹上天。

结对编程来牵线,基情四射笑开颜。

测试全靠人肉点,加班加点累瞎眼。

覆盖不全无人管,出了问题挨个怨。

自动测试年年喊,一到落地就犯难。

蛮力集成就是干,部署挂了都滚蛋。

安全问题讨人厌,频繁被黑真是惨。

技术债务天天欠,不思偿还就是懒。


第三章《孔明:结对编程,可保木牛流马交付无忧》

建兴六年(228年)春,蜀汉丞相诸葛亮兵出祁山,开启了克复中原的战争序幕,但因街亭一战失利,蜀汉丧失了闪击曹魏的唯一一次机会,此后,诸葛亮被迫陷入与曹魏的拉锯战中。建兴十二年春二月,孔明入朝拜后主刘禅请求再出祁山,并于昭烈之庙涕泣拜告曰:“臣亮五出祁山,未得寸土,负罪非轻!今臣复统全师,再出祁山,誓竭力尽心,剿灭汉贼,恢复中原,鞠躬尽瘁,死而后已!”祭毕,拜辞后主,星夜至汉中,聚集诸将,商议六出祁山。
临行前,诸葛亮总结了前几次北伐失利的教训,他觉得准备工作不足是最大的问题。而所有准备工作之中,尤其以粮食的准备最为重要。而老奸巨猾的司马懿,也深知这一点,所以每次对阵都是闭门不出,将战争拖入相持阶段,使得蜀军每每受困于粮草不济,最终不战而退。为了克服蜀汉人力畜力不足、道路崎岖的现实困难,诸葛亮将希望寄于运输工具的改造上。于是,他以第四次北伐中使用过的木牛为基础,做了进一步升级,迭代出了流马。木牛用来在蜀中的山道上运粮,流马则用于在煲水、斜水上运粮。
孔明回到帐中,唤裨将杜睿、胡忠二人,附耳授以密计。令唤集随军匠作一千余人,入葫芦谷中,制造木牛流马应用;又令马岱领五百兵守住谷口,并嘱咐道:“匠作人等,不许放出;外人不许放入。捉司马懿之计,只在此举。切不可走漏消息。”马岱受命而去。
杜睿等二人在谷中监督匠作,依法制造,但期间问题不断,主要有以下3点:
第一、随军匠作能力水平参差不齐,新手居多,交付质量参差不齐。
第二、部分核心构件重度依赖几个核心骨干,一旦有异动后果难料。
第三、匠作间鲜有沟通,自顾自干,协作不顺,而且频繁有人摸鱼。
无计可施的杜睿只能上书诸葛亮,求破解之法。诸葛亮接到奏报,沉思片刻,而后提笔写下一行大字——结对编程,可保木牛流马交付无忧。并命人星夜送往葫芦谷。杜睿看后茅塞顿开,但一旁以胡忠为首的众将士们却不知其意。
胡忠问道:何为“结对编程”?
杜睿答曰:结对编程(Pair Programming)是一种敏捷软件开发的方法,也是极限编程(XP)的核心实践之一,简单理解就是两个程序员并排坐在一台电脑前,面对同一台显示器,他们一起进行需求分析、设计、编码、编写测试用例、执行单元测试和集成测试,甚至一起写文档。
胡忠追问:可否将“结对编程”的具体做法细细告之于吾等?
杜睿笑曰:莫急,莫急,且听我一一道来。
胡忠介绍到,结对编程其实有一种标准玩法和一种变体:
第一种、标准玩法——驾驶员领航员模式
按照极限编程定义,参与结对编程的结对角色通常分为两个角色,分别是“驾驶员”和“领航员”,两者的作用如下:
  • 驾驶员控制鼠标和键盘的使用,聚焦于当前正在写的代码,专注于细节,即负责编码工作。
  • 领航员坐在驾驶员一旁观察和思考,即负责检查错误、提出改进的意见,考虑解决方案。
另外,结对的角色是可以随时互换的。
第二种、变体玩法——乒乓模式
乒乓模式是结对编程和测试驱动开发(TDD)结合的一种变体。具体做法是:
  • 一个程序员先写单元测试,写好单元测试后运行确认不通过。
  • 另一个程序员写具体功能代码,写好后再运行单元测试,确认通过,然后进行可能的代码重构。
  • 写测试的程序员和写功能代码的程序员,角色互换。
以此类推,循环往复。你写单元测试,我来实现具体代码,然后我再写单元测试,你来实现具体代码,就像打乒乓球一样。这样的好处是单元测试和代码实现是不同的人负责,更能避免遗漏,且两个人都同时参与了单元测试和具体实现,也有利于测试驱动开发的实施。
众匠作听后都觉得新奇不已,正在这时,人群中突然冒出一个声音:胡将军,这么做有什么好处啊?话音刚落,大家纷纷附和:对啊,新奇却不知有何用处。
杜睿捋了捋胡须,对众将说到,其利有三,具体如下:
第一、可促进沟通,加速人员成长,以提高团队整体战斗力
通过结对的方式,两个人可以互相分享对业务逻辑及代码实现的理解,促进团队内的沟通。尤其是团队中的新手,可以在这个过程中很好地向其他成员学习,快速融入团队并上手,在短时间内提升个人能力,从而提升团队的整体战斗力。
第二、可共享知识,减少个体依赖,以实现代码集体所有制
采用结对编程的方式,两个人为完成同一个交付目标,相关的知识和经验自然要相互分享,很难藏私。同时也使得每个功能模块都会有至少有两个人了解,使得代码集体所有制成为可能,也减少了某系统或某功能点对个人成员的重度依赖,即使将来有异动(请假、转岗或离职等),整个团队的交付能力也不会受到很大的影响。
第三、可减少摸鱼,加速问题解决,以提高交付质量和效率
由于结对编程是两个人在一起工作,所以每个人都更专注,不容易频繁出现分心和偷懒的情况,加速了价值的流动。同时两个人一起,经验互补,相比一个人,可以前置发现很多潜在问题,大大减少了代码中的缺陷,从而提升交付的质量。
一旁的武将马岱听到后,大笑不止,略带讥讽的问道:说了这么多好处,但原本一个人的工作,现在两个人一起做,这成本不是明显增加了吗?
杜睿听后急忙言到:非也非也!研发成本=开发成本+重构成本+测试成本+改bug成本,结对编程虽然会略微增大最初的编码成本(有研究表明结对编程比单独编程仅仅多消耗15%的时间),但是由于代码质量的提高,可以大大节约重构成本、测试成本和改bug成本,同时兼有加速人员成长,减少对个体的依赖,减少摸鱼,加速问题解决等诸多好处,又何乐而不为呢?
终将听后皆连连称赞,于是都依令开始践行结对编程,果不其然,数天后,军匠团队的整体气氛瞬间提升,大家其乐融融,交付的木牛流马质量也明显提高。数月后,木牛流马皆造完备,宛然如活者一般。上山下岭,各尽其便。众军见之,无不欣喜。孔明令右将军高翔,引一千兵驾着木牛流马,自剑阁直抵祁山大寨,往来搬运粮草,供给蜀兵之用。后人有诗赞曰:剑关险峻驱流马,斜谷崎岖驾木牛。后世若能行此法,输将安得使人愁?
然而天命难违,依靠木牛流马解决了粮草问题的孔明,却在两队阵之际不幸病重,孔明强支病体,令左右扶上小车,出寨遍观各营。自觉秋风吹面,彻骨生寒,乃长叹曰:“再不能临阵讨贼矣!悠悠苍天,曷此其极!是夜,孔明令人扶出,仰观北斗,口中念咒,以保将星不落,而后入塌嘱托后事,答问间渐无声息,众将近前视之,已薨矣。时建兴十二年秋八月二十三日也,寿五十四岁。后人赞曰:
拨乱扶危主,殷勤受托孤。英才过管乐,妙策胜孙吴。
凛凛出师表,堂堂八阵图。如公全盛德,应叹古今无!

 

 

 

 

 

 

 

 

本章作者:李岩

项目管理专家&敏捷教练

下载地址:「守望者」第五期《工程实践九大坑》正式发布

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注