对Agile Simple Design的理解


一直以来,对Agile 的Simple Design还是有很多困惑的,仔细阅读了Agile的书籍,结合自己的体会,总结一下了。

 

什么是Simple Design呢?

 

Simple Design是指XP团队根据目前的需求,采用最简单的设计来实现软件。在Robert C. Martin的Agile Software Development一书中,总结了三条:

 

1. Consider the Simplest Thing That Could Possibly Work 根据当前的需求,只选择最简单的技术来实现软件,简单的反面是一些重量级的技术,比如数据库,EJB,RMI,多线程等。

 

2. You Aren't Going to Need it 很多时候,我们总是在想,未来不是很可能会有这样或者那样的需求吗?我们难道不应该为未来做好准备吗?(这点也是我感到非常难以平衡的一点),但是Agile的Simple Design强调的是,除非有非常强有力的证据证明,未来我们肯定要实现这样的需求,否则Simple Design是不引入复杂的框架和技术架构的。 

 

3. Once and Only Once 这个是指对于重复的代码,Agile的团队都是只允许犯一次错误的,一旦我们发现重复的代码,就尝试用一些共用的函数或者抽象为类去实现他们。

 

在Version One的网站上,Simple Design里面更强调的上面的第二点。敏捷软件开发强调的是通过迭代式的设计,不断的重构,来逐步提升系统的功能和质量,小步快跑,越跑越快,而不是考虑太多复杂的“未来”需求导致不必要的工作量以及所带来的系统复杂性。

 

看起来好像很简单,但是结合这些年的经验,还是有很多困惑和问题的。

 

问题1:简单设计是不是就是不要设计或者说采用工作量最小的设计呢?

 

回答:首先肯定不是不要设计了,Agile强调的是对于当前的需求,必须提供High Quality的Design,但是不要为了追求一些看起来未来需要,但是实际上确是当前不需要的需求做一些over design。

 

对于"工作量最小的设计"设计就是Simple Design,这个我想也是不正确的,很多代码里面,加个if else或者做copy & paste,看起来就是最简单的方式了,但是其实这些违反了Good Design的很多原则,其实不是一个好的设计。所以这个也是不完全正确的。

 

问题2:我总是觉得未来可能有或者肯定有XXX需求,但是现在如果我的设计不考虑好,以后改动起来,工作量就很大了,现在Simple Design,到时候还是要老老实实的去改

 

回答:这个确实是最难回答的问题的了。我想,如果未来这个需求,这个回答是非常非常肯定的,那么设计时肯定是要考虑对这个需求的支持和扩展的,也许功能不需要实现,但是设计上是需要考虑如何支持和扩展的。但是如果回答是Maybe,那么现在就不做考虑,确实很多所有Maybe的需求,真正用的可能性往往不大。

 

另外,如果参照Good Design的设计原则,好的设计往往就是Flexible的,如果参照OO的Design Principle,包括Single Responsbility Principle, Open-Closed Principle, Liskov Subsctitution Principle, Dependency-Inversion Principle, Interface Segregation Principle(在Robert C. Martin的Agile Software Development书中提出的),我想即便是基于当前的设计对未来进行扩展,应该大部分情况也是比较容易进行扩展和实现的。

 

最后我想起了很久以前,我的“师父”,他去挽救一个频临死亡的系统的时候,首先做的事情是简化系统的代码,他将这个快崩溃的系统的代码删除了2/3,才慢慢让系统稳定了下来,多余的代码,其实很多时候就是系统设计的复杂性带来,Simple Design but high quality design for current requirement,这个应该是Agile所真正强调的吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值