色即是空,空即是色,TDD,Software Design

有幸成为Craig Larman大师的host,在大师来访的这三个星期安排大师的行程,聆听大师的教诲。Craig Larman是全球敏捷方法与软件分析设计领域颇有名气的大师。大师言行非常严谨,讲究研究与调查,从不空谈所谓“opinion”。这里几天打算随笔罗列些大师的名言,作为记录。其中自然会隐去一些和公司产品相关的内容,以免不必要的麻烦。

这天和一些在用TDD(Test-Driven Development)方法进行开发的工程师做讨论,说到了软件设计的问题。我们是否应该在开始实现,或者说开始写代码之前做Design?
Craig Larman引用禅宗至理(Zen Buddhism)来比喻软件设计:
“Before enlightenment, mountains are mountains and rivers are rivers. During enlightenment, mountains are no longer mountains and rivers are on longer rivers. After enlightenment, mountains are still mountains and rivers are still rivers.” (高深吧-_-!)
回去查了一下,“enlightenment”即佛家所讲的“悟”,孙悟空的悟。汗一个先。我想那意思就是说:我们刚接触Software Design时,感觉它也就是那么点事情,很自然。可当我们悟出一些软件的道理后,忽然发现Design已经不是Design了,变得非常复杂让我们无能为力,所谓“色即是空”。这时我们不是过份Design就是没了Design。等我们大彻大悟之时,发现,Design其实还是那么点事情,即所谓“空即是色”。这似乎与前几天在电视上见到的刚刚去逝的禅宗大师圣严法师的“本来面目”有异曲同工之妙:
过份的设计,或者叫BDUF(Big Design Up-Front),往往是有害而无宜的。BDUF一方面否定了软件设计是演化而来的,容易产生僵死的框架;另一方面为现在用不到的功能花精力,违反了lean的原则。例如冗长的软件设计文档、长达三个月的软件设计而不写一行代码,等等。都是我们在领悟软件工程的过程中附会到Design上去的东西。
而完全依靠测试驱动的开发方式,或者用户需求驱动的开发方式也不会自然而然的产生好的软件设计。如大师所言:“TDD can also generate really bad design”。因此,依据设计原则进行合理的Design Up Front也是必须的。
所以我想大师是要我们在纷乱的敏捷方法、软件理念之余还原软件设计的本来面目。例如在开始实现一段功能前开个简短的Design workshop,画画图,写一个快速原型或者伪代码等等。
另外,也有人讲“Before enlightenment chop wood and carry water. After enlightenment, chop wood and carry water.”:-)

This entry was posted in Reading notes. Bookmark the permalink.

12 Responses to 色即是空,空即是色,TDD,Software Design

  1. zheng says:

    这帮大师整得越来越像老和尚了,说那话都不着边儿了,回头软件工程让他们整成玄学了

  2. 大马 says:

    大貓我跟你說過的,這不已經開始了嗎?把老外請回來講我們那過去的故事。很多人都在走極端,不是設計過度就是不要設計,不懂得中庸之道。事先設計還是必要的,但是要恰到好處。至少要做到那個什么you never know tomorrow。。。(好像要死了似的)然后TDD,一段時間后嗅到了些臭味,然后重構設計。有TDD的自動測試在,重構設計并不痛苦。這樣的話就不用擔心事先設計不夠完善了。這樣反復下去,就是迭代了。這幾個敏捷實踐湊一塊,就是個敏捷過程。所以不要為敏捷而敏捷,敏捷是為了實用。每個項目都有自己的一套過程,獨一無二。這叫無為。糾正大貓一下,禪是哲學佛是宗教,不是一回事,所以大師們沒有剃光頭念經吃齋。同樣,道家和道教也不是一回事。西方這教那教互相斗了上千年,政教分離才幾百年。而中國從來就沒有政教合體過,也沒有各教群毆過,而且早就實現哲學與宗教的分離,甚至儒,釋,道也成為一家了。這方面還是中國先進,小日本學到的那點兒皮毛都能虎得西方人一愣一愣的。

  3. zheng says:

    我觉着整一堆英文缩写和设计模式就跟剃光头吃斋差不多。这些设计理论看看也就算了,关键还得人聪明,现在系统越来越大,对外部依赖也多得惊人,你设计得再好不能要求依赖也跟你一样好。我的结论是,软件系统是不可维护的,大不了从头再来。

  4. Terry says:

    大猫有大猫的道理。大师也说:“There\’s no compensation for incompetence and inexperience.”但是TDD提高代码的可维护性和降低系统bug率是有统计依据的,有空我可以列举一些不同产品线上的应用实例。禅宗哲学在中国感觉并不兴旺,尤其是普通人如我并没有什么体会,只是停留在搞笑和故弄玄虚的层次上。更谈不上从中得到什么启示了。所以始终停留在before enlightenment和during enlightenment的水平上,就像普通的中国人对待大多数事物的水平一样。大猫有这样的惊人之语,很可能已经after enlightenment了。

  5. zheng says:

    哈哈,哪儿啊,我糊涂得比你们谁都厉害。老棍儿写本书吧,写通俗点让我这样的也能看懂。

  6. 大马 says:

    大貓有一點說的對,現在流行的敏捷方法,如xp,是給聰明人用的。不過,笨人們也是可以敏捷的,其實本來就是敏捷的,后來被一群聰明人說太沒章法要工業化,被騙進坑里后現在又被聰明人說不敏捷。我的結論,這個世界永遠是聰明人領導笨人,可笨人做的才是對的。系統越來越大不可維護,可從頭再來的成本更高。唯一的解決方案是從一開始就讓它不那么大。老子(不是我)說,小國寡民,雞犬之聲相聞,老死不相往來。做系統也應該這樣(這句是我說的)。老棍兒,趕明兒你問問Larman大师對老子的這段是怎么認識的?

  7. Terry says:

    写书?嘿嘿,一方面水平不行,另一方面表达能力太差。记得很多年前读到《人月神话》里对“外科手术团队”的描述,其中有个大牛人“He needs great talent, ten years experience, and considerable systems and application knowledge, whether in applied mathematics, business data handling, or whatever.”当时着实兴奋,在旁边注上“我希望成为这个人”。现在十几年的经验了,也没觉得怎么样,反倒是越走越远了。大马的这句话怎么翻译啊?原话我也看不太懂,有机会试着问问。

  8. 羿人 says:

    大师的课,听了一节,感觉不错啊。反正我白纸一张说到设计,实在是没多少机会练手,所以看也白看,学也白学了回忆一下做过的东西,感觉设计其实也就是搞清楚2件事情哪些需求不会变,抽象出来哪些需求经常变,让系统在这方面能变得容易一些其他的不怎么重要了。要我说,再烂的东西,只要需求稳定,都能等到稳定的那一天。可惜前提不成立

  9. zheng says:

    系统越简单,就越能应付复杂的需求。所以要分核心和外围,在核心和外围之间就是API。维持核心和API的不变性,外围改烂了就刮掉重写。所谓设计不过廖廖。

  10. 大马 says:

    找到一個中英對照的。也不知道大師讀沒讀過道德經。http://jorielle-tao.blogspot.com/2004/08/80.html“系统越简单,就越能应付复杂的需求。”,貓的悟性就是比人好。

  11. zheng says:

    整得越来越像写诗了,规矩自然得懂,还得有语感和灵感,只可意会,不可言传

  12. Terry says:

    今天聊了几句,没有很充分,下次再去确认一下。

Leave a comment