谈谈软件工程设计的艺术
如果生活的方式与你背道而驰,
如果正确的行为被你视而不见,
毁灭就会降临,难得保全。
马基雅维利, 约1514年
作为最重要的事情之一,如果不是唯一最重要的,一个系统的核心性质是它必须在
其生命周期内保持一种 稳定的 结构。
艾瓦耳。雅可布森
以上的两段话,一是引自一位文艺复兴时期的实用主义政治学家,另一是引自一位
当代设计大师。这两段话很好的反映了软件设计工程所面临的困境,两个相反方向
的作用力,就象阴阳相生相克:一方面,软件设计需要尽一切可能减少开发时间,
使软件尽快面市,同时也对市场的和客户需求的变化作出 迅速的反应;而另一方面,
我们又必须花费足够的时间以保证软件的设计有一个好的架构,这样我们可以降低
软件的维护费用,而且软件可以有较长的生命期。
软件设计过分强调任何一个方面都会造成软件工程投资的极大浪费甚至失败。过分
强调软件开发的速度,而忽视软件架构的设计是那些对软件开发工程缺乏经验者最
容易犯的错误。糟糕的软件架构设计会导致所谓的1.0版现象,即软件只能开发到第
一版。后续开发往往因为修改原有代码过於困难而夭折。因为设计者缺乏长远的目
光和足够的项目开发经验而导致过於急躁的作出架构上的决策,因而导致软件结构
的支离破碎是很可悲的,往往很多好的软件设计创意就这样胎死腹中。
另一个极端同样会导致灾难,因为如果过於强调软件结构的优雅和可扩展性,导致
过多的开发时间放在软件架构设计上,结果使 软件的开发时间过长,等到软件推向
市场的时候,虽然设计上是完美的,但是竞争对手却早已占据了市场。软件设计的
完美主义者容易犯这样的错误。这种人通常是设计方面的
行家里手,而且对软件结构的完美有着不懈的追求。但是正是过於追求完美才是工
程开发方面的大忌。不是每一个软件的设计都有时间和精力(同时也是财力)做到象
STL那样的完美设计。
通常一个好的软件设计会努力在这两个互斥的极端之间达到一种平衡。就象儒家讲
的中庸。这两个极端之间的张力是随着软件开发的领域,环境,条件,时间,客户
的要求,竞争对手现有的水平,等等变化而变化的。就象水形之常变。但是若能领
会其中的道,能够把握其中的艺术,就能够象庖丁解牛一样“以无厚而入有间”,
游刃而有余了。但是关键在於经验的积累和对平衡的领悟。经验可以很大一部分从
前人那里得来,但是对道的把握却是另一度的思维空间了。 所以说软件工程既是科
学又是艺术。但是值得注意的是,这绝对不应当成为忽视软件工程规范的借口,就
象杨振宁可以谈论科学研究的艺术并不表示柯云路之流的所谓“生命科学”就不是
纯粹的胡扯。
设计一个容易维护并且有很强生命力的软件不是一件很容易的事;设计一个能够很
快实现的软件也不是小菜一碟。平衡这两者来给出一个可行的,健壮的设计,使软
件能够在市场上获得成功并生存下去是一件需要奇迹般力量的事业, 然而我们却必
须在普通的工作中用我们的创造力去完成这个奇迹。