由于《驯服烂代码:在编程操练中悟道》一书已经出版,所以本次编程道场是最后一次有关驯服烂代码主题的编程操练。
这次编程操练让我感觉最有意思的是,当大家在最后实现那两个新功能“VIP客户的票号从1001开始,Regular客户的票号从2001开始”时,都把设计考虑得很复杂,比如使用了Factory或Strategy模式,但事后一想,其实只要简单地添加一个带有起始票号参数的TurnNumberSequence类的构造器就能解决问题。
感谢当当网的史海峰帮忙为本次活动提供场地与支持!
* 时间:2014.12.5, 2~6pm
* 地点:北京市朝阳区北三环东路8号静安中心17层当当网
* 参加人数:26人
* 活动主题:操练解耦入单测(Java版)及用Koans学习新语言Scala
* 编程环境:Cyber-dojo, Java, JUnit
* 编程操练题目描述:这个题目是有关自动取号系统的,类似于去银行办事进门时取号的那种取号机。有3个类:TurnTicket类表示从取号机上所取的票,票上印着号码;TurnNumberSequence类用于产生所有票上的号码;而TicketDispenser类则表示取号机,根据从TurnNumberSequence类获得的号码来出票。这个题目要求在有多个TicketDispenser的情况下,两个人分别在两台不同的取号机上,不能取到同样号码的票。操练这个题目首先要为TicketDispenser类编写测试,然后在测试的保护下实现两个新特性:1)VIP客户的票号从1001开始;2)普通(Regular)客户的票号从2001开始。
活动过程
* 伍斌自我介绍
* 参加者有关开发问题的搜集(10个)
* 了解编程操练题目,并阅读代码
* 伍斌使用Cyber-dojo/Java/JUnit做TDD有备编程操练
* 参加者两两结对编程操练
* 用Scala Koans学习Scala介绍
* 伍斌对上述问题的看法
* Well, Less Well, Puzzles
回顾要点
Well
* 对TDD有了初步的了解,也明白了基本过程, +10
* 知道了Scala,和函数式编程思想,Scala与多线程,内容不错,+4
* 讲例子和coding结合挺好,+4
* 解耦实例生动,易于理解, 如何解耦很明确(接口提取和依赖反转), +3
* 结对编程的参与体验环节很好, +3
* 讲解详细, +2
* 推荐了一些好书,+2
* 了解了DDD相关的内容,+2
* 极限编程的练习模式给我留下了深刻的印象,也从中暴露了很多在实际工作中会发生的问题
* 例子生动形象,并且通过自主结对编程的方式,让大家看到平时编程中的不足之处,收益和启发很大
* 良好的开发习惯,边写边测,小步走得远
* 气氛轻松,测试专业知识丰富
* 内容比较丰富,覆盖了开发、测试和设计思想
* 一种新的开发理念,可以更好地站在真实需求角度进行程序的设计和开发,对开发人员有一定的启示和帮助
* 准备充分, 知识面丰富,手动实践能力强
Less Well
* 对Scala的介绍有些简短,对函数式编程的实际应用场景缺乏介绍(Ben: 本来计划要大家结对用Scala Koans进行操练的,无奈投影仪明流较小,看不太清楚,就没有做。下次最好搞一个亮度高的高清大屏幕电视),+6
* 时间稍紧张,没有看到更多TDD例子,+4
* 结对编程练习时大家思路不统一,没有形成一个完整的例子, +2
* 可以加入重构实践环节、具体的代码腐臭的例子和fix环节
* 视角太单一,改进代码质量的手段应该是多样的,测试只是其中一种,+2
* 主题深入不够,表面的内容多,加强深度思维的传递(模式、架构、思想),+2
* 结对编程的效果还可以更好。如在公司内部,可以由前一位驾驶员邀请下一轮的人来提高参与度(Ben: 很好的建议!)
* 在结对编程环节中,如果结对者还是按照以往的开发理念进行开发时,可以适当提醒下,以更好地让其去理解和接受TDD的开发理念
* 提问的问题没有深度,解答部分不是很清晰
* 结对编程环节的点评较少
* 动手实践中没示例源代码回滚
* 没有介绍JMock
* 对于TDD的缺点是否也应说一下,比如,有人认为TDD限制了程序员开发的欲望,形成了枷锁
* 希望在结对编程环节中能够有一定的引导,不至于过于偏离主题
* 结对编程环节,可以减少组合的次数,方便程序员充分思考
* 没有分享主持人自己在开发过程中的经验
Puzzles
* 如何用TDD去驱动?,+2
* 如果对打log(比如用log来记录有关性能的数据)的程序进行测试?
* 如何对中间组合服务做测试?
* UT比较易变该怎么办?
* 第3方组建不好mock怎么办?
* mock了不准怎么办?
* 重构时间不够怎么办?
* 用什么标准去选择有效的测试?
* 多层架构中的测试如何去分配?
* UI和Action层该如何测试?
* 在TDD模式下,写mock而增加的测试代码在上线之前要做出有效的分离吗?(Ben: 最好将测试代码与生产代码用不同的文件目录来分离。可以共同上线。)
* TDD如何实施?在团队中人员角色如何定位?常见问题已经建议?
* 对TDD还是似懂非懂
* TDD开发是否比普通开发耗时?
* TDD在实际项目中的作用?
* 编程的实现对可扩展性的考虑是不是少了?
* 能否介绍一下比较好的TDD流程?
--------------------
操练成就匠艺。全栈开发者的公益编程操练社区:bjdp.org北京设计模式学习组。微信订阅号:bjdp_org,QQ群号:235913915。