增量迭代开发(敏捷实践之一,它意味着每次迭代的产出只是本次迭代范围内的需求)真的不利于产生好的设计吗?Scrum 真的提倡“忽视架构问题”吗?如果没有敏捷技术实践的话,架构设计能有效的演化吗?测试先行式的开发真会产生优雅的设计吗?在红绿条提示下的重构循环只在局部小范围内有效吗?
来自Net Objectives 的 Alan Shalloway 就利用 Scrum 构建应用的经验向 ScrumDevelopment yahoo group 的成员提出一些问题,问题之一就是“他们是否找到代码质量是依靠什么来保证的?”
当我在课程中或在那些讨论“向已建系统中追加新特性”的会议中提出这个问题时,每个人都认为这属于集成成本。我想,这是因为大多数人不会编写那些融入了很多设计模式的具有良好的扩展性、足够灵活并且易维护的代码。这些人中,大部分也没有使用过 Scrum。
Shalloway 随后详细解释了他的观点:
……正如 Scrum 所告诉我们的,他们(指在 Scrum 团队中的开发者)根据客户价值一次只开发系统的一小部分,如果团队中有高级架构师的话,就会组织得更好。很多开发者有一种很好的意识,即他们会回头看一下是否应该做一些改动,使架构更合理。但更多的人并不知道,假如代码是通过拷贝、粘贴并修改(甚至改得面目全非)得来的,那么这会带来很多冗余。此时,Template Method 可能是一个比较好的解决方案。 也许我悲观了一些,但我的感觉是,假如你没有注意熵的话,就意味着它们会达到你不期望的地步。在你的案例中,你正在使用 Scrum 来改善很多团队忽视的东西。所以,我的问题是:
- 大家忽视它了吗?
- 如果真是这样,它会引来问题吗?
到目前为止,这些反应都表明很多使用 Scrum 的团队有这个问题,甚至那些坚持写测试和进行重构的团队也有同样的问题。那些没有使用多少有些变化的敏捷技术实践的团队,可能会有更大的麻烦。(请记住:Scrum 与开发技术没有必然的联系,你可以使用传统方法开发软件,也可以用 XP,或者其它技术实践,只要你在 Scrum 的框架之内使用就可以了)
接下来,让我们讨论一下现实中, Red-Green-Refactor loop 是如何发挥作用的?一个团队在写测试和重构方面深有心得,就会有一个好的设计吗? Paul Jones 的 blog 中有一篇关于 TDD 如何创建了混沌代码(Ravioli Code),宣称用 TDD 开发出来的代码是低耦合的代码:
我想,很多 TDD 和测试先行的理想主义者和宣传者写出了的确经过充分测试的代码,但还是很难理解。
Jones 并不想撼动 TDD,因为与其测试目的相比,TDD 实际上更关注于设计。但这还是会带来一个有趣的事情。在使用这些实践的敏捷社区中,好在哪里呢?随着社区的成长,这些实践带来的麻烦比其带来的好处还多吗?与传统开发技术相比,这些工具被不正确的使用是否更危险?
最后,让我们假设:我们正在恰当地使用 Scrum 和 TDD。毕竟,象 Ron Jeffries 在《 We Tried Baseball and It Didn’t Work 》一文中所呈现的,我们不能因为自己没有正确地使用它而将不好的结果强加给它。TDD 会产生好的设计吗?对于使用 Red-Green-Refactor loop 的做法,重构可以说是一种局部优化技术。我们优化局部的设计。本质上,这等同于 steepest descent algorithm ,也就意味着重构几乎总是会带来次优设计,就象使用 TDD 来做“数独游戏”一样。
现在是我们用批判的眼光来重新审视我们的这些实践的时候了吗?
查看英文原文: Are Agile Development Practices Detrimental to Architecture and Design?
评论