1 攀岩的启示
- 攀岩第一级:人工岩壁(休闲运动, 学习场地,有保护设施)

- 攀岩第二级:天然岩壁,顶绳攀登(极限运动, 野外场地,已有保护设施)

- 攀岩第三级:天然岩壁,先锋攀登(极限运动,野外场地,攀登过程中自己加入保护设施)

- 攀岩第四级:天然岩壁,徒手攀登(啥运动? 野外场地,无保护设施)

- 无保护徒手攀登之一,来自纪录片<<徒手攀岩>>。
- 无保护徒手攀岩之二,来自电视剧<<北辙南辕>>。
问题:
- 你想玩哪一级?是想玩最酷的, 还是想活着?还是两者都要?
2 攀岩与编程
攀岩与编程有很多共同点。
攀岩:
- 攀岩需要掌握很多技术:转身,引体向上,腾挪,跳跃 ......
- 攀岩需要辅助性装备:攀岩鞋、手套、镁粉 ......
- 攀岩需要保护性装备:主绳,安全带,安全铁索,快挂,岩石塞、岩钉、膨胀钉、挂片 ......
编程:
- 编程也需要掌握很多技术: OO、设计模式、模板
- 编程也需要辅助性装备:编译器、调试器 ......
- 编程也需要保护性装备:What?
类似的问题:
- 你想玩哪一种编程?玩大而复杂的项目,还是想简单地活着?还是两者都要?
- 如果攀岩需要保护性装备,为什么编程可以不关心?
答案:
- 源代码测试框架是编程的保护性装备,测试驱动开发是有保护编程。
3 没有测试驱动开发的编程
开发阶段
- 快点搞。因为开发不结束,测试不能排期,领导着急。使劲加班。
- 写完了,等测试,这时啥也做不了。闲呆着。
- 自己测一测?事倍功半不值得,大概搞一搞算了,反正后面还有集成测试。再说也没有那么多时间。
测试阶段前期
- 免不了出问题。又是一顿狠催,被迫在巨大的压力下分析问题。又是使劲加班。
- 是使用不当,还是功能缺陷?与测试工程师的关系尖锐对立。
测试阶段后期
- 终于好像比较稳定了。还有没有问题呢?好像心里还是没底。
- 有些地方似乎有更好的设计?改动比较大?算了,先就这样吧,别自找麻烦。
维护期
- 看起来稳定了。要尝试新设计吗?搞好了别人看不到,搞出新问题要自己担。还要解释那么多工时花到哪去了。唉。
问题:
- 不知道会出现什么样的问题?问题的数量收敛了吗?
- 在这个过程中掌握了什么设计技巧了吗?
3 有了测试驱动开发呢?有保护编程
3.1 创建安全网
-
源代码测试框架的一般使用方法:
- 构造对象,
- 设置对象属性/调用对象方法,
- 检查对象状态
-
这样写代码最自然的方式,就是基于对象(Object-Based)编程。
-
有了自动化的单元测试,就可以开始评估代码的可靠性。哪些场景是测过的,一定程度上,心里有了底。在相当程度上减少了一开始的问题单数量。
-
一边写代码,一边校验正确性。对开发期进度的估计会越来越精确。
-
遇到了问题,就可以在脑子里过一遍,安全网已经兜住了哪些场景?在下手排查之前就排除了很多可能。
-
问题解决了,就可以将新的测试加到测试用例集中去。
-
测试工程师(或其他人)每发现一个问题,安全网就更完善一点。这样测试工程师成了开发工程师脑力的延伸,两方不再是对立关系了。
这里将源代码测试框架仅仅用作单元测试工具,这也是TDD最基础的使用方式。收益不够大。
3.2 在安全网中快速变更
-
人的认识不断发展、完善,认识的深度和广度都会变化。TDD推动/激励变更,推动/激励更简单、更清晰的设计。
-
TDD推动变更的同时,也提供了快速变更的条件。有了自动化运行的测试用例,快速变更变得容易了,只需要调整部分测试实例就行。
-
测试用例要简单直白。测试用例不够简单,写起来费劲,就说明对象的接口不够友好。
-
一边写代码,一边检验接口。从优先考虑“怎么实现”,转变为优先考虑“怎么设计接口”。
-
所以TDD激励对象的拆分和重组,以便表达清楚,干净利落。软件设计是一门“解释”的科学,表达得清楚、干净,就是设计得好。
-
基于对象(Object-Based)编程,必然会自然过渡到面向对象(Object-Oriented)编程,也必然会应用设计模式。因为世界原本就是这样的。
-
很多问题,在尝试解决时,会发现前人已经解决过了,也总结过了。或者会发现,原来自己思考思考,也能赶上前辈大师了。常常会觉得,至少在当前的问题上,自己在逼近人类认识的极限,在完成一个作品,而不仅仅是完成一个功能集合。
3.3 团队开发中的TDD
- 敏捷开发/迭代式开发,以模块的快速变更为基础,实际上是以个人的TDD为基础。
- TDD首先是个人开发模式,不在敏捷团队中也可以从中受益,在敏捷开发团队中更可以游刃有余。
4 攀岩与编程再比较
项目 | 能力/技术 | 保护性装备 | 保护设施 |
---|---|---|---|
攀岩 | 转身,引体向上,腾挪,跳跃... | 主绳,安全带,安全铁索,快挂,岩石塞、岩钉、膨胀钉、挂片... | 你的岩钉嵌入到哪里? |
编程 | OO、设计模式、模板... | 源代码测试框架 | 你的自动化测试用例集嵌入到哪里? |
- 只是纸上谈兵,锻炼不了技术;没有保护,容易挂掉,也没有机会锻炼技术。所以要在有保护条件下,反复练习。无论是攀岩还是编程。
- 有保护攀岩是安全攀岩,有保护编程是安全编程。
相关链接
测试驱动开发与设计模式 - 为什么使用测试驱动开发
测试驱动开发与设计模式 - 从入门到精通
测试驱动开发与设计模式 - C++书籍及网站
测试驱动开发与设计模式 - 适应并改进软件设计过程
测试驱动开发与设计模式 - 让“理想结构”与“快速变更”并行
测试驱动开发与设计模式 - 提速 — 在纸上做细节设计
测试驱动开发与设计模式 - 开发实例一 DVR-POS库
测试驱动开发与设计模式 - 开发实例二 JSON过滤库
测试驱动开发与设计模式 - 开发实例三 rs_driver库
网友评论