聊我所理解的敏捷(Agile)——外一篇

那些众所周知的敏捷宣言,敏捷方法,敏捷教科书,敏捷大神,我就不提了。只是聊聊,我所理解的敏捷的本质。

敏捷的本质,是承认软件开发的复杂性。而且承认,这种复杂性,达到了这样一种程度:“无法通过足够充分的前期准备,而消除后续的风险。甚至于,前期准备得越是充分,后续的风险越大。”

往往有很多人,将建造大楼与软件开发做简单的类比,以说明前期设计的重要性。但事实上,我们无法想象,一幢大楼,在接近完工的时候,有新需求出来,要求整个设计从从一幢四边形的楼,变成一幢六边形的楼。

但是,在软件开发领域,就是会出现这样的需求,而且,这种需求虽然会被所有的开发人员痛骂,但却“实际上具有其合理性”。

如何理解需求的复杂性、易变性?

软件的出现,还不到100年。建筑的历史,则至少有5~6千年了吧。人类对于建筑的需求,已经足够稳定(相对于软件而言)。另一方面,软件的可能性,又实在是太强大了,至少重力因素软件可以毫不考虑。

软件开发这个领域,还太年轻,大家都没有足够的经验。年轻到了,甚至现在去急于总结经验,都是错误的!

来源于Christopher Alexander《A Pattern Language: Towns, Buildings, Construction》曾经给予Gang of Four以巨大的启发,所以他们写出了著名的《Design Patterns: Elements of Reusable Object-Oriented Software》。

但是,现在看来,设计模式的流毒真的不少…

所谓敏捷方法,不过是一种需求发现与谈判策略

过去的思路,认为需要尽可能发现所有的需求,并且做好设计,然后再开始开发。现在大家已经意识到,一边做,一边确认,一边发现,一边纠正。从总体成本上衡量,反而会更加低。

但是,在实际施行敏捷的过程中,“一边做,一边确认,一边发现,一边纠正”,也同样可能存在巨大的浪费。而且,因为披上了敏捷的外衣,反而变得无可指责了。

本质上,这是一种对于开发方,而非需求方,更加有利的谈判策略。

总结陈词

我们现在还缺少一系列量化的手段,去衡量需求的复杂度,开发的效率以及各种流程方法的优劣。(不要跟我提Function Point Estimation,那种教授坐在书桌边发明的方法~~)

因为缺乏这种量化,所以大师满天飞,却让人无所适从。

外一篇:“设计模式的荼毒”体现在何处?

可以从两个角度来谈这个问题:

1. 建筑里的结构工程师,如何设计结构?

我们都知道,建筑设计中的结构工程师,非常重要,而且,他们必须非常深入的了解数学这门学问。

在结构设计出来之后,他们还需要做一些模拟与演算,以确保他们设计的结构,能够承载整个建筑。

再进一步,一个敢于设计结构的结构工程师,有很长的一个学习阶段,以了解前辈大师的经典结构与数学模型。

可以说,建筑结构学,是一门科学,是一门以数学模型和科学实验为基础的严谨的科学。

2. 中医如何看病

中医,也有一套理论:阴阳呀、五行呀、相生相克呀,等等等等。在这套理论的基础上,也有上千年的经验积累,什么药吃了能治什么病,大概是什么计量。

但是,说到底,这是一门「经验科学」,或者直白一点说:「这不是一门科学」。

声明一下:我不是中医黑,虽然我也不是中医粉,至少中医的确有大师,他们真的治好了很多病人,这个我绝不会否认。

毕竟:疗效的好坏,还是很难伪造的。

3. 软件架构师,如何设计架构?

架构师,看起来很像结构工程师,但是:他们没有科学基础,只有一些「设计模式」和「架构模式」。

那些「模式」的有效性与适用范围,并无严谨的证明,只有一些模模糊糊的「实践案例」。

「听说设计模式是好东西」,就像「听说人参大补元气」一样。真正的中医,尚且不敢给病人乱开人参,但是架构师,他们真敢把所有的「设计模式」都用上。

中医再怎么不靠谱,真是把病人给治死了,医生也会吃不了兜着走。但是,我们什么时候听说过一个项目的失败,是因为架构师不合格呢?

还有个更大的罪魁祸首「需求变动」顶在前面呢。

4. 总结陈词

一种「理论」却没有严谨的理论支撑,一门「手艺」却难以客观的评价手艺高低,随便看两本模式的书,就敢开整。没有流毒,就怪了。