-----------------------------------
作者/Marting Fowler/着
译者/赵光正/译
前言
我教授软件设计课程多年来,经常对学员建议要常看书,但不是看使用手册这类的操作性 How-to 书籍,工具书若是因为工作需要,摆着几本当作参考无妨;或者,若能学会如何交一位好朋友—Google 那更好。从它那里,可以找到太多 How-to 性质的答案。而到最后你就会知道,学会快速操作使用,原来就是要懂得如何下对搜寻的关键词,如此而已。How-to 是越来越容易从网络上找到答案,相对来说,软件开发人员,就可以把更多的时间与心思摆在软件设计的思维上。而着重软件设计的书籍,还真的是只有国外几位顶 尖软件大师的著作可以学习。只是软件人员一般会对原文书籍有恐惧感,以及,经常会有一种读书的坏习惯—想要把它看懂。嗯,想要看懂是坏习惯,没错! 所以看书才会觉得有压力,才会想要从第一页看到最后一页,然后大多数都只看到前三章就看不下去了。
阅读软件设计书籍就是要不求甚解,没必要想要得到所谓 “唯一的答案”。就是如同看漫画、金庸小说般,那是一种享受,是对某一主题来作思考与体悟。当然,你起码就要能分辨,你所选阅的软件书籍是否原作者有自己 的 “想法”,那很重要! 没有自己想法的书籍,实在相当多,难怪乎有许多读者 “看不懂” 坊间所谓的 “对象导向系统开发” 的书籍,我觉得是蛮正常的。当你能 “感受到” 作者想要透过书中的文字,来表达他的想法,甚而,还逐渐能猜得出作者内心中的 “假设点”,那么,你就能知道,这是一本可以值得学习的好书!
「UML 精华(UML Distilled)」,是软件设计丛书中,最能表达出作者自我又带着创意性的想法。只是以闲话家常的方式,以口语白话的文字表达,只有薄薄的一本书,却 能精彩活化描述出 UML (Unified Modeling Language, 统一塑模语言) 十三张设计图的精髓。我觉得 Kobryn (UML 规格制订主席) 在推荐序文内说得最好:「自古以来,天纵英才的架构师与最具智慧的设计师都了解何谓 “简约之道 (the law of parsimony)”。」 他甚而还引用了佛家禅宗的心法来解释简约之道:「禅宗的心是初学者的心」。而软件与佛家的智能是一样的,是不受时空限制的,其要旨均在于如何将繁杂的表象 萃取其本质 (essence),让形体 (form)可以很协调地与功能融合在一起。
Martin Fowler,正是软件界具有真正智能的软件大家! 所谓的 “简约之道”,真正在本书中发挥得淋漓尽致。他就是能用迷人、口语化的写作风格,来写出「UML 中最有用的一小部分」,而这一部份,正是可以帮你完成百分之八十工作的百分之二十的精髓 (8/2 法则)。 Fowler 是我在软件业界最为景仰的大师,想想看,有谁能从架构、分析设计至实作的垂直层次写出这么多的经典书籍呢? 包括了 “Analysis Pattern”、”Refactoring (重构,国内由侯捷大师翻译)”、”Patterns of Enterprise Application Architecture” 等。 对于 Martin Fowler,真的也只能想到 “天纵英才” 这样的字眼,来表达出我个人对他的尊敬与崇仰。
先了解本书的架构大纲
从一本书中的目录,大概可以知道作者所要表达的核心思维会摆在哪里。前两章论及了软件开发方法论 (methodology),这里理所当然会介绍 UML 的简介,以及现今主流的开发流程;然后从后续的章节,就是以每一个章节来介绍 UML 十三张图;而关于类别图,Fowler 则是用了两个章节来作说明。而且蛮特别的是,第三章就开始介绍类别图了,这可是与一般软件设计书籍最大的不同之处—先从需求分析着手。至于需求面的设计 图,包括了使用案例图与活动图,则是摆在中间的章节,从第九章起才开始介绍。从这样的编排来看,你就可以知道 Fowler 最为重视的会是软件的结构分析,而这也是本书最精彩之处,包括类别图与循序图的介绍与其想法的论述。
软件开发方法论 — UML 与 开发流程
所谓的方法论包括了两大要素:沟通的机制与开发流程。 UML 正是利用图形标准化的模式语言,来作为团队开发之间沟通的最佳机制。Fowler 在对 UML 的简介里,说明了 UML 的发展历程—由三巨头的统一方法论而成形的;历史的典故了解一下就可以了,不过,Fowler 很幽默,还提及了在 95 年的 OOPSLA 大会上,Rumbaugh 的高声一曲来作为庆祝 0.8 版草案的问世。嗯,大家都希望那会是最后一次听到他的歌声。
Fowler 也提了对 UML 的用法,有分为草稿式与蓝图式。前者是将 UML 图形作为沟通的机制,不讲究精确的语法;后者则是要求精确性高的设计,而以此可以让程序设计师依样画葫芦写程序。嘿,我也与 Fowler 的想法是一致的,比较偏向草稿式的作法。道理很简单:1. 你不能假设你的设计会是正确无误的;2. 绝大部分的软件人员,连 “画出来” 都不太有勇气了,更何况要求僵化的工程模式? 那可会吓跑一堆软件人员,而违背图形模式开发的的本质—沟通。
虽然是介绍 UML 语法,不过 Fowler 还是特别开出一个章节来介绍开发流程。在该章节中,首先就比较了所谓反复式(iterative)与瀑布式(waterfall)的开发风格。现今主流的 开发流程都一致认同反复的开发方式,但却很难做得到,因为会衍生不确定性的恐惧感,与项目管理的议题。Fowler 用了一个很有趣的字眼,「伪反复式开发方式 (原文是用 pseudo,我觉得真的很客气,不是用 fake)」:虽然大家都宣称正在采用反复式开发方式,不过实际上却仍是瀑布式的开发方式。哈,这与我经常在课堂上常提,导入如 RUP 软件制程的开发公司,大部分是 “蓝皮绿骨”,因为他们根本就作不到使用反复的开发方式;因为,他们会重视制度与管理,却经常忽略了人本—而这正是反复式导入成功与否的关键所在。
章节后面则简述了关于 “敏捷式(Agile)”、”极致软件制程(XP, eXtreme Programming)”、”RUP (Rational Unified Process)” 的比较。我觉得 Fowler 在这部分道出了开发流程的本质:流程仅是框架,只是一种建议、一种范本,可千万不要傻傻的以为导入某一开发流程就可以解决软件的根本复杂问题。我最喜欢其 内的一个字汇:裁适 (tailor)—要懂得裁减开发流程以符合项目的需要。
软件系统的根本—结构的分析与设计
UML 最重要的一张设计图就是类别图 (Class Diagram),作为软件大家,Fowler 是最为重视软件的结构分析与设计,而这也是软件根本所在—非从表象的需求来看待系统的开发,而是直指核心,找出软件的本质。
两个章节中,基本概念是介绍了类别图的基本语法,而在高等概念则是说明了类别之间的关系,与一些比较少见,如关连类别、模板类别等的说明。要看这两个章 节,最好能有对所谓对象导向观念有基础功夫,如什么是对象、类别 (老实说,即使对老手而言,可能还不一定清楚对象与类别的区分)。高等概念其实不容易看懂,更何况,这还只是介绍语法而已,并没有教你如何抓本质性的类 别,那会是很需要抽象高层次的悟性,是与 IT 技术没有多大关连的。
真要谈到程序设计人员会关心的,反而不是类别图,而会是表达对象互动的循序 (Sequence)图了。Fowler 提到了所谓集中式与分布式的控制设计方式,这里他写的真是精彩,相当有趣! 你会发现到,Fowler 没有说集中式控制方式的不好之处 (事实上,这是最容易的开发方式,但严格说来,它根本不是对象导向),他用了另外的说法:就是强烈要求写集中控管的软件人员采用分布式的设计风格,也不说 明为什么,但总有一天,他们会恍然大悟,这时候,他们的脑袋将彷佛重生。这真是最高段的损人不带任何脏字:重生之前到底这些软件人员的脑袋是长什么样子?
系统的外观—需求分析
第九章以后 Fowler 才提到了需求的分析,使用案例模型 (Use Case Model) 与活动 (Activity)图。使用案例模型包括了案例图与叙述,Fowler 在此并没有着墨甚多,只是针对基本的语法作说明。事实上,在案例叙述这一部份,他其实是参考了 Cockburn “Writing effective use case (中文译名:使用案例写作实务)” 一书。然后他还特别提了:对于使用案例,请把自己的精力放在说明文字,而不是在图上,使用案例叙述才是全部价值之所在。喔,正是由于这段叙述,我并不那么 为然,还特别开了研讨会来说明使用案例图的价值与妙用。其实呢,要先厘清假设点:需求叙述对需求分析人员是最重要的,那没错;但是,使用案例图则是软件架 构师的利器—用来界定系统开发范围,区分内与外,决定那些要作、那些不作。
其它的设计图
Fowler 很有意思,他不觉得重要的设计图,即使是一个章节,大概就是一页的文字说明,再加上一张范例图就结束了,也不啰唆。例如部署(deployment)图、 互动概观 (interaction overview)图、时序(timing)图 (让我想起电子实习的示波器,真是噩梦)等。我是把这些设计图称之为 “鸡肋” — 食之无味、弃之可惜。
倒是还有两张蛮有价值的设计图:状态(state)图与复合结构(composite structure)图。 第三版改版最多的部分就是在状态图的说明,它会与嵌入式系统设计或者复杂的画面状态设计有相当的价值贡献;而复合结构图则是 UML 2.0 规格最有价值的一张新视图,它同时结合了类别与组件(component)图的优点—表达整体系统对外的接口,以及系统内部的结构组成元素。
结语
这本书目前出到了第三版,我则是每一版都买,而且你会发现到,Fowler 在每一版的制订,并不是新增补充而已,而是会把他当下对 UML 的心得与体悟,给整个重新写到修订的版本内,但仍还是可以维持那么 “薄薄的一本”。三不五时,我仍会拿出来翻阅,还不时会发出会心的微笑;而且你会发现到,新手看了本书,收获甚多,而老手再重新看时,却又仍有不同的深刻 体会,这本书就是如此的精彩!
译者赵光正先生,他翻译过许多相当棒的软件设计好书,甚而在下一期我准备介绍的书评—「UML 与样式彻底研究」,也是由他所翻译的。而这两本,正是我极力推荐每位软件从业人员都应该要必备的好书! 也因为有如此高质量的翻译本(帮光正君挂保证,他翻译的每一本书都很棒),使得初学人员不致因原文的学习障碍而打退堂鼓 (当然,就长期而言,软件人员还是要学会与习惯于阅读原文书籍)。