报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

敏捷咨询工具箱(二)──OO 训练营

  • 2010-12-31
  • 本文字数:2911 字

    阅读完需:约 10 分钟

犯错误是最好的学习方式

──莎伦·德雷珀

背景

我们为客户提供咨询,刚开始做了很多敏捷的实践,包括:持续集成、测试驱动、用户故事需求分析、迭代开发等等之后,发现如果再想深入下去,就会面临一些“硬骨头”:遗留系统和开发设计能力的问题。在一些客户那里,他们产品有 10 多年了,但是很少有人新加程序文件,写代码习惯于复制粘贴,都是在已有的类和函数上修修补补。团队缺少追求好代码的品质和能力,到处是大函数,上帝类(超大类,任何功能变化都要修改此类),重复代码,混乱逻辑,开发和维护成本太高。作为一个顾问,如何才能从根本解决这样的开发设计能力问题呢?

在 ThoughtWorks,如果招聘了一个没有经验的开发人员,会把他们送到印度的 TWU(ThoughtWorks University) 培养 2-6 个月,OO 训练营是开发人员的主要课程之一。它专门用来训练开发人员如何使用面向对象,如何进行测试驱动开发。通过这样的训练之后,开发人员可以很快的掌握面向对象开发和简单设计能力,养成追求好代码的品质。所以,我们也为客户的团队引入了 TWU 的 OO 训练营活动。

活动方式

clip_image002

OO 训练营的培训方式和我们传统的“填鸭式”教育完全相反。它采用的是苏格拉底式教学法,顾问不会给你任何标准答案,而是通过问题的引导,让学员自己一步一步找到最佳的解决方案。我的 OO 训练营的组织方式一般是:

一、顾问提出需求

顾问在训练营活动会扮演着客户的角色。活动一开始的时候,会以客户的身份提出一个需求,让大家去完成。例如:要求建模一个长方形。

二、简单设计

以分组讨论方式做一个简单设计,一般从如下三个方面进行设计。

  1. 类名是什么?
  2. 类的职责是什么?对于复杂需求,可能会要求画一个简洁的 UML 对象关系图。
  3. 类的测试用例会有哪些,并且找到第一个测试用例

讨论结束之后,每组介绍一下各自的讨论结果。通过分组讨论和顾问的引导,对建模一个长方形需求一般会得到如下的设计结果:

  1. 类名是: Rectangle
  2. 类的职责是计算周长和面积
  3. 计算周长的测试用例:
  • a. 正常场景。如果长是 2,宽是 3,那么周长是 10
  • b. 异常场景,宽为 0 的情况。如果长是 2,宽是 0,那么应该抛出异常
  • c. 异常场景,宽为负数的情况。如果长是 2,宽是 -3,那么应该抛出异常

这些测试用例完全是由学员自己设计出来的,没有标准答案。作为顾问只是引导大家,让每组的测试用例更具体和全面。假设没有一组学员没有考虑到异常情况的测试用例,这时也也不用指出来,等后面代码展示的时候,再指出这个问题,因为犯错是最好的学习方式。

三、测试驱动(TDD)开发

学员根据设计和讨论的结果,用测试驱动的方式进行结对编码开发。要求先写单元测试,写完一个单元测试之后,运行测试失败,然后再去写业务代码。如果没有失败的测试,不允许写一行业务代码。这样严格的要求,让大家养成测试驱动开发的好习惯。

两个人一组使用结对方式进行开发,要求使用乒乓式的结对方法。假设是 A 和 B 进行结对开发,A 先写一个测试用例,编译通过但是测试失败。然后把键盘和鼠标交给 B,B 写业务代码,让测试通过,然后为 A 再写一个失败的测试。通过这种乒乓的方式,一个人写测试用例,一个人实现业务代码,并且不停的变换角色。这样两个人可以很好的进行配合,互相给对方出“难题”,一个人在写实现的时候,另一个人会思考下一个测试用例会是什么。

有的时候,我们会对团队提出一些更高的要求。比如编程过程中不允许使用鼠标,一切都是快捷键操作,这样能提高开发的效率。编程过程中不允许使用复制和粘贴功能,如果是相同的功能或者代码,第一应该考虑到的是如何进行功能重用,而不是复制一遍,这样可以杜绝这样错误的编程习惯。

四、代码展示和顾问点评

写完代码之后,每个人开始展示自己的代码。这时,顾问就开始从代码里面寻找代码怀味道 (Bad smell),告诉大家什么样的是好代码,什么样的是坏代码。坏代码会有哪些危害,让后让大家重构。

例如:在实现长方形周长的时候,有人实现了 getLength 了 getWidth 方法,把长方形的长和宽的数据暴露出来了。那么这就是一个代码坏味道(Bad smell),顾问会指出这个问题,告诉大家面向对象最重要的一个特征是封装,不应该把数据直接暴露出来。因为数据暴露出来之后,一方面造成数据的依赖和耦合,另一方面其它代码在调用长方形这个对象的时候,也许会拿到长和宽的数据自己进行运算,这样就破坏了封装,对象之间耦合增大,并且容易产生重复的代码。然后提问大家,正确的做法应该是什么?

答案应该会是长方形不应该把长和宽的数据暴露出来,所有长方形相关的运算和逻辑都应该在长方形这个领域对象里面进行。这也正是面向对象设计的一个重要原则:Tell don’t ask 的体现。通过这样的引导的方式,带领大家一步一步找到正确的面向对象设计方法和原则,同时纠正那些错误的编码和设计习惯。

每次活动就是类似这样的流程。顾问提出需求,然后是讨论和设计,结对开发,最后展示代码和点评。一轮结束之后,顾问又给大家一些新的需求,进行第二轮,如此一直的循环下去。

经验和教训

我多次为客户的团队组织过类似的训练营活动。最长的一次坚持了 3 个月,每周 2 次,每次两个小时,完成了 OO 训练营的所有课程。坚持参加完这个活动之后,开发人员和技术 Leader 的都能真正的全面掌握面向对象设计方法和原则,并且把这些用到自己的项目中。下面是我的一些经验和教训:

  • 活动时间安排。如果每次活动 2 个小时,一般是安排在下班左右,一小时工作时间和一小时个人时间。因为大部分团队都有交付的任务和压力,完全占用工作时间不现实。
  • 家庭作业。由于我培训的一些团队技术基础不是很好,大部分开发人员无法在 2 个小时内完成编码任务。所以我会把没有完成的任务留作家庭作业,让大家在活动之后完成,这样在 OO 训练营的时候主要是进行设计讨论和代码的展示点评。这样也有一个好处,每个人都会有时间进行独立思考,对代码进行重构产生一个更好的设计。
  • 活动整个过程是以引导为主,让大家自己进行编码、重构和讨论,自己解决问题,寻找设计的最佳解决方案。顾问只是担任一个类似主持人的角色。

参考资料

如果你也想在自己的团队或者公司引入这样的活动,下面一些资料可供参考:

关于作者

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

2010-12-31 06:242815

评论

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

模块八

blazar

「架构实战营」

Linux驱动开发-内核共享工作队列

DS小龙哥

4月月更

亚马逊云科技 2022 年 3 月新服务新功能强势来袭

亚马逊云科技 (Amazon Web Services)

服务 亚马逊

企业如何才能发挥出知识管理真正的价值

小炮

知识管理 企业知识管理

模块八作业

Geek_ec866b

架构训练营

文件包含漏洞带来的危害

喀拉峻

网络安全 漏洞

设计消息队列存储消息数据的MySQL表格

张逃逃

软件工程学习之道

乌龟哥哥

4月月更

面试突击40:线程休眠的方法有几种?

王磊

Java java面试

5 月亚马逊云科技培训与认证课程,精彩不容错过!

亚马逊云科技 (Amazon Web Services)

架构师 培训 认证

从玄学走向科学:在字节跳动广告投放这么干

字节跳动数据平台

大数据 字节跳动 广告系统 ab测试

一个系统工程师的14条建议

一席

高可用 稳定性 SRE 混沌工程 故障排查

「架构实战营」模块八 消息队列存储设计

hxb

「架构实战营」

java培训Mybatis动态Sql处理解析

@零度

sql mybatis JAVA开发

设计消息队列存储消息数据的 MySQL 表格

风中奇缘

#架构实战营 「架构实战营」

云原生训练营 -Week08-2

jjn0703

spring-cloud-kubernetes背后的三个关键知识点

程序员欣宸

java 4月月更

谈谈客户体验管理有效实施

龙国富

客户体验 CEM CXM 客户体验管理

EasyRecovery2022全功能数据恢复介绍

茶色酒

EasyRecovery15

加速OpenHarmony生态繁荣,华为使能OpenHarmony发行版厂商

科技汇

重学架构之消息队列存储消息数据的 MySQL 表格

陈华英

架构实战营 「架构实战营」

设计消息队列存储消息数据的 MySQL 表格

浪飞

CityClub游览随笔记录

耳东@Erdong

InfoQ InfoQ写作社区2周年 City Club

建信金科在中国建设银行物联网平台项目的实践

EMQ映云科技

物联网 IoT 金融 银行 emq

入驻快讯|欢迎小红书技术团队正式入驻 InfoQ 写作社区!

InfoQ写作社区官方

入驻快讯

OpenHarmony 3.1 Beta样例:使用分布式菜单创建点餐神器

OpenHarmony开发者

OpenHarmony OpenHarmony应用开发 点餐

消息队列存储消息数据的MySQL 表格设计

tom

模块8作业

Leo

架构实战营

@DateTimeFormat 注解 和 @JsonFormat 注解

乌龟哥哥

4月月更

4月28日,一场为IT工程师们准备的盛宴

观测云

云原生 可观测性 IT 直播 产品发布会

攻克编译器技术

刘旭东

编程语言 编译器原理 4月月更

敏捷咨询工具箱(二)──OO训练营_研发效能_钱安川_InfoQ精选文章