闲话

公司从去年开始搞敏捷,如火如荼,开始并没什么感觉,但随之逐渐深入,感觉确实有很多不同,敏捷中还是有很多的可取之处,尽管并不完美,但至少已经逐步被大家和我自己接受。

今天要闲聊的话题是:敏捷中的架构设计。

什么是架构设计?

软件领域中未见一个标准的定义。靠自己理解。

困惑:敏捷后设计到哪里去了?

从前瀑布式开发时,有方案设计、详细设计等,可以说设计几乎在每个开发环节中都能体现,但敏捷中,有关设计的开发活动好像突然都消失了。敏捷中的开发节奏就是不停的迭代,似乎没有专门的设计环节,敏捷后,设计到都到哪里去了?

敏捷中还需要架构设计吗?

答案是肯定的。估计大家都清楚,敏捷中肯定是需要设计的,但与敏捷对应的设计应该叫“演进式设计”,与之相对的就是瀑布式开发中使用的“计划式设计”。

计划式设计 VS. 演进式设计

演进式设计,同样需要遵循架构设计的准则,与计划式设计的区别在于:设计的目标。 满足现有需求 VS. 满足未来可能的需求 尽快实现 VS. 计划周密性,架构完整性

简单设计

XP中崇尚“简单设计”,反对“过度设计”,简单说就是设计仅能满足当前需求即可,不为当前不需要的功能设计。设计完全靠“演进”。

XP的目标是快速写代码,相信重构能解决所有的架构问题?

其它设计思路

软件大师Martin Fowler并不完全同意。

完全演进,可能会走进死胡同,过于理想化。

不能完全抛弃计划式设计,Martin Fowler认为28开,需要权衡。

一种做法是项目初期进行计划式设计,确保架构能最大程度上处理风险。后期局部采用演进式设计,应对变化。

最小计划设计,中庸之道。

初始需求分析,架构建模,在Sprint0中。

个人理解

三种方式各有优劣,根据实际情况选择。

演进式设计,需要一系列的敏捷实践来配合实施,比如CI、TDD、重构等,如果开发团队并不擅长、甚至不熟悉,那么也是很难实施的。

个人更倾向于Martin Fowler的观点。

设计是分层次的

宏观架构:分层、分布、功能隔离…

微观架构:设计模式…

纳米架构:封装、clean code、SOLID原则、TDD…

需要初始设计

宏观架构设计、初始设计、架构建模,基本都描述了相同的思路。在开发迭代之前进行初始设计。

初始设计(broad starting point architecture),比如大致的分层、与数据库的交互方式,与web server的交互方式等。

初始设计并不是一成不变的,需要有勇气去修正它

TDD、重构能演进出架构,同意,但大多数情况,应该还停留在低层架构(微观架构)层面,高层架构估计很难,对开发人员和架构师的要求都太高。

TDD也不是完全不用设计的,也是需要事先思考测试列表的。

话题

做初始设计时,考虑了一个模块或功能,但到开发后期发现该模块实际并不需要,要做的肯定是把它去掉。肯定会造成一定的浪费,如果按XP的思想,在没有真正使用到这个模块时,是不会考虑加入该模块的,那么就不存在这样的问题,的确是这样。但并不能因此就否定掉做初始设计,因为,如Martin Fowler所说,很多时候,在程序中加入一个模块会比去掉这个模块花的代价更大。也就是说,如果从最初就没有考虑到这个模块的存在的话,当需要加入它时,可能改动涉及的工作量会比最初考虑该模块,在不需要时去除该模块的工作量更大。当然前提是,代码质量足够好,足够模块化,足够低耦合。

当然这是一个开放式问题,并没有标准答案,不同的人会有不同的选择,我个人还是比较支持Martin Fowler的想法。