AICon全球人工智能与机器学习技术大会8折特惠,购票立减¥960! 了解详情
写点什么

敏捷咨询工具箱(三)──结对辅导

2011 年 1 月 11 日

My mind to your mind. My thoughts to your thoughts…

– Mr. Spock

什么是结对辅导

clip_image002

在前面的两篇敏捷咨询工具箱中,我分享了如何做读书写代码活动 OO 训练营。认真的做好这两项活动之后,团队的开发设计能力会提升一个台阶。对于有经验和有能力的团队,他们可以直接把这些技术和思想直接应用到项目中。但有一些团队还需要进一步的跟进。那我们如何进一步的跟进,保证大家能把这些技术应用到项目中呢?

这对一个敏捷咨询顾问是一个很大的挑战。在很多人眼里,顾问就是那些能说会道,把事情说得天花乱坠,但都是只会纸上谈兵,站着说话不腰疼,为团队带来麻烦,却不解决实际问题的人。我承认,顾问的好名声就是曾经被这样的人给败坏了。那顾问如何才能深入团队,解决他们的真正问题呢?答案是把顾问放到一个具体的项目团队里面,为团队成员提供结对辅导。那什么是结对辅导呢?

结对辅导来源于极限编程的一个开发实践──结对编程:

“结对编程,就是两个开发人员用一台电脑一起编程。一个人操作键盘和鼠标,充当驾驶员的角色。另一个人在旁边观察和思考,提出建设性的意见,充当着领航员的角色。同时,两个人会频繁的进行角色互换。”

我们把这项实践运用到咨询中,我会去一个项目团队,和大家一起工作,用结对的方式对团队中不同角色的人进行辅导。我会和开发人员一起结对,指导他们如何做开发和设计 ; 我会和业务分析师一起结对,指导他们如何做写用户故事,如何做需求分析 ; 我会和项目的经理一起结对,指导他们如何管理项目和团队,如何系统思考,如何主持各种会议等等。下面分享我是如何对开发人员进行结对辅导,指导他们在真实项目中进行 TDD 开发和设计。

如何辅导一名主开发人员做 TDD 开发和设计

我在一个客户那里,结对辅导了一个主开发人员。我们一起用了三周时间,完成了一个完整的用管理功能模块,这个功能大致分为 6 个左右的用户故事。我们是在 C 语言的开发环境下,使用 TDD 的编程方式。下面将分享我是如何做的结对辅导。

梳理需求

在结对开发开始之前,我和她花了一天的时间,从下面几个方面对需求进行了梳理:

  • 以前是否有用户管理功能,它的业务流程是什么样的?
  • 为什么要做一个新的用户管理功能?
  • 新的用户管理流程会是什么样的?
  • 每个需求的内容是什么?它的功能范围是什么?背后的价值是什么?
  • 有哪些验收用例,这些用例是否全面和具体?
  • 测试人员如何验收?这些需求是否可以端到端的进行完整测试?

通过这样的提问和交流,我们完整的把这些需求梳理了一遍。同时也把遇到的一些不合理用户故事做了重新划分。

纠正错误的编程习惯

第二天,我们开始结对编程。刚开始结对的时候,发现她已经从别的地方拷贝了一堆代码,修改了一些,可以编译通过。她想在这碓代码的基础上开发,这也是典型的复制 & 粘贴式的开发方法。我们花了很长时间讨论了这个问题。复制和粘贴是邪恶重复代码产生的根源之一,这显然是错误的编程方法和习惯。可是她却习以为常,并不觉得有什么错,按照她的话说:有现成的代码,拷贝过来修改一下有什么错。激烈的讨论之后,最终以双方的妥协和各自让步达成了一致:

  • 这些代码是有价值的,它只是用来做 Spike,验证一些功能是否可以实现
  • 但是 Spike 之后这些代码需要扔掉的,作为妥协,她愿意把这些代码全部注释起来(舍不得这些破烂)
  • 用 TDD 的方式写代码,先写测试后写代码,没有测试失败就不要写代码,重构代码除外

真正的 TDD 开发

我要求她使用 TDD 开发即测试驱动开发。先写一个测试,运行测试失败,然后再写业务代码。可是,她上来就反对:“费那事干吗,一次把所有的测试都写完了再写实现代码,这样岂不是更快?”。我先是无语,然后便开始说服她,告诉她这叫小步前进,就是把复杂问题分解开,从最简单问题的开始,一步一步的前进,这样开发才有节奏,每一小步都会有反馈(测试失败,实现业务代码,测试通过),整个开发过程可控可驾驭。我苦口婆心说了半天,她还是坚持自己的意见。于是我问她:“你为什么要一次写完所有的测试?”。她的回答让我恍然过来:“因为我想到了很多测试场景,如果没有写下来,我担心自己后面会忘掉”

啊哈!我终于搞明白了她的顾虑。这个好办,我们拿了一张卡片,然后把想到的测试场景全部写到卡片上。实现完一个小功能,就在上面做个标记。这样在做 TDD 开发的时候,就可以专注写一个测试,有了一个失败测试之后,让测试通过是压倒一切的任务。这样的开发过程很专注,思维不容易发散,任何时候想到了其它相关的问题,就及时的纪录在卡片上,等后面再实现。

在我的严格要求之下,她开始了 TDD 方法,先写一个测试再写业务代码。我的目标是把她培养出来,所以我们采取了是教练式的结对方法:我提出想法,她操作键盘和鼠标写代码(有时候我会为她写一些测试代码)。结对也是一个引导的过程,有了一个新的测试之后,第一步是要让测试通过,这时不用去追求代码的优雅,只要测试通过就可以了,然后我会提出代码中的坏味道,和她一起讨论,问是否有更好的方法?如何让代码更能表达业务意图?如何在同一个层次上编程等等?引导她一步一步的进行重构。

下面这张图是一步步用 TDD 方式产生的用户登录功能的测试用例:

clip_image002

就这样,用了三周左右的时间,我们一起完成了这个功能模块的开发。三个星期的结对下来,我也有了一些心得体会。

心得体会

  • 在同一个经验丰富的开发人员进行结对辅导的时候,前面会有一个挑战的磨合期。因为他们一般都积累了自己的一套成功的编程方式和习惯,这样导致他们对新的 TDD 开发和简单设计有抵触的情绪。这样就需要顾问一步一步的引导说教,让他们切实体会到新开发方法的好处。
  • 结对辅导需要两个人紧密的协作,刚开始肯定会有一些工作方法和习惯上的冲突。如果对方不认可敏捷的开发方法时,不要一味的说教,一定要先沟通和交流,询问为什么不愿意这样做,了解清楚对方的顾虑和担忧之后,对症下药,提供一些实践解决对方的顾虑。
  • 有时候我们的建议遭到拒绝,往往并不因为是建议本身的问题,而是因为我们还没有建立好信任和领导力。

关于作者

钱安川,ThoughtWorks 公司高级软件咨询师、敏捷过程教练、资深讲师、Team Leader、开发者、 BeiJing Open Party 组织者和主持人。个人博客:敏捷开发训练

2011 年 1 月 11 日 04:381421

评论

发布
暂无评论
发现更多内容

即构实时音视频多中心调度设计

ZEGO即构

Shell脚本命令常用技巧

MySQL从删库到跑路

shell脚本编写

太赞了!滴滴开源了一套分布式ID的生成系统...

Java架构师迁哥

互联网应用系统常见问题与方案

raox

极客大学架构师训练营

这才是你需要的C/C++Linux学习路线!

赖猫

c++ Linux 后台开发 服务器开发

EMAS远程日志 - 移动端问题排查利器

应用研发平台EMAS

阿里云 运维 日志 监控告警 应用

附PPT丨AI和云原生时代的数据库进化之路

dbaplus社群

数据库 云原生

记一次MapReduce的内存溢出

AI乔治

Java mapreduce 架构 内存溢出

大咖直播 | Elasticsearch 应用监控管理平台搭建实战

小小的一朵云

大数据 elasticsearch Elastic Stack 监控管理平台

告别消费主义的双12,是华为云12.12会员节真正的意义

脑极体

搭建网站/APP最全准备攻略

前嗅大数据

小程序 建站 APP发布

Java中多线程安全问题实例分析

叫练

Java 多线程 什么是多线程 多线程与高并发

第十三周学习总结

饭桶

传统巨头抢占区块链场景高地 医疗、汽车、金融成为热门赛道

CECBC区块链专委会

区块链 金融

信任的传递——为什么我们需要第三方授权?

Thoughtworks洞见

证书 身份认证

浅谈JDK并发包下面的分治思想及分治思想在高并发场景的运用

AI乔治

Java 架构 jdk 分布式 多线程与高并发

静态代码分析工具评估指标及方法

maijun

自建本地电话告警系统

周楠

运维 物联网 监控告警

如何在数智化时代少走弯路? 这里有100个案例可以借鉴

京东科技开发者

DevOps 云原生

AWS 助力贝壳VR看房走出国门,升级全球居住服务新体验

亚马逊云科技 (Amazon Web Services)

AWS

Elasticsearch 新机型发布,性能提升30%

小小的一朵云

大数据 elasticsearch Elastic Stack

云原生架构-可观测性之 Prometheus 服务自动发现

云原生实验室

Apache顶级项目ShardingSphere — SQL Parser的设计与实现

京东数科风险算法与技术

数据库 开源 中间件

牵头成立“现代计算联盟”,强大如谷歌也需要组团打怪吗?

脑极体

第13周作业

饭桶

面向全场景模块化设计 京东智联云的服务器部署有多灵活?

京东科技开发者

服务器 云主机

云南区块链电子发票全面推广啦!

CECBC区块链专委会

区块链 纳税人

建信金科大咖访谈:金融衍生品定价与建行实践

金科优源汇

金融科技 金融创新

几种常见的研发管理体系,哪种更适合你?

菜根老谭

敏捷开发 研发管理 CMMI IPD

住建部等六部门:广泛运用区块链等技术,建设智慧物业管理服务平台

CECBC区块链专委会

物业生活

图文回顾丨北京「解构云原生:企业数字化转型新支点」沙龙

RancherLabs

k8s rancher

敏捷咨询工具箱(三)──结对辅导-InfoQ