1.1
粗放经营的时代已经远去
中国刚改革开放时,出现了许多农民企业家,他们不用讲管理,也不用讲方法,只要胆子大一点,就能获得成功。当时的市场几乎空白,竞争非常少。农民企业家思路很简单:人人都要吃饭,所以开饭馆能够赚钱。现在这样的思路已经行不通了,市场竞争已经足够激烈,十家新开张的饭馆恐怕只有一家能撑下来,所以农民企业家已经很少见(连农民都越来越少了)。软件开发行业也一样,最开始的时候,会编程就了不得,思路也很简单:每个公司都要做财务,所以开发财务软件就能赚钱。现在呢?我们每想到一个“点子”,可能有上千人同时在这样想;我们要做一个东西,可能发现市场上已经有许多类似的产品,你卖高价,他就卖低价,你卖低价,他就干脆免费。机会驱动、粗放经营的时代已经远去,为了在激烈的竞争中获得优势,软件开发组织需要从细节上提升技能。
本书聚焦于两方面的技能:需求和设计。关于需求和设计,开发人员可能每天都在做,但是否理解背后的道理呢?我们来做一些题目:
1.2 利润=需求-设计
利润=收入-成本。不管出售什么,要获得利润,需要两个条件:(1)要卖出好价钱;(2)制造的成本要低。妙就妙在,价格和成本之间没有固定的计算公式,这就是创新的动力之源。放到软件业上,我也炮制了一个公式:
在软件开发中,需求工作致力于解决“产品好卖”的问题,设计工作致力于解决“降低成本”的问题。二者不能相互取代。您能低成本生产某种软件产品,但不一定能保证它好卖。您的某种产品好卖,但如果生产成本太高,或者在市场需要新型号时,无法复用之前的组件,又要投入大量人力物力去重新制造,最终还是赚不了多少钱。
高焕堂在其著作《Use Case入门与实例》(清华大学出版社)第1章的“Use Case的经济意义”中讲到:用例是收益面,对象是成本面。本书发展了他的思想。
如果需求和设计不分,利润就会缩水。从需求直接映射设计,会导致功能分解得到重复代码。如果从设计出发来定义需求,会得到一大堆假的“需求”。
拿自古以来就有的一个系统“人体”来举例。人体对外的功能是会走路,会跑步,会跳跃,会举重,会投掷,会游泳……但是设计人体的内部结构时,不能从需求直接映射到设计,得到“走路子系统”、“跑步子系统”、“跳跃子系统”……。人体的“子系统”是“呼吸子系统”、“消化子系统”、“血液循环子系统”、“神经子系统”、“内分泌子系统”……。
图1-1 人体的需求和设计
人体的“子系统”中很多是不能从需求直接映射出来的,需要设计人员的想象力。水店老板要雇一个送水工(即租用一个人肉系统),他只要求这个工人能跑能扛工资低就行,管他体内构造是心肝脾肺肾还是一块电路板。同样,也不能从设计推导出需求——因为人有心肝脾肺肾,所以人的用例是“心管理”、“肝管理”。送水工能这样找工作吗:“老板,我有心脏管理功能,你请我吧!”
很多时候我们说“本系统分为八大子系统……”,其实说的是“本系统的功能需求分为八大需求包……”需求包是从外部对系统功能所做的简单分包,子系统应根据部件的耦合和内聚切割得到。
我把需求和设计的区别简要列举如图1-2,后面的章节我再慢慢阐述这些观点。
图1-2 需求和设计的区别
1.3 核心工作流
要迈向“低成本制造好卖的产品”的境界,并非喊喊口号就能达到,需要静下心来,学习和实践以下各个核心工作流中的技能:
1. 业务建模——描述组织内部各系统(人肉系统、机械系统、电脑系统……)如何协作,使得组织可以为其他组织提供有价值的服务。新系统只不过是组织为了对外提供更好的服务,对自己的内部重新设计而购买的一个零件。组织引进一个软件系统,和招聘一名新员工没有本质区别。如果能学会通过业务建模去推导新系统的需求,而不是拍脑袋得出需求,假的“需求变更”会大大减少。
2. 需求——聚焦于待开发系统的边界,详细描述系统要卖得出去必须具有的表现——功能和性能。这项技能的意义在于强迫我们从“卖”的角度思考哪些是涉众(Stakeholder)在意的、不能改变的契约,哪些不是,严防“做”污染“卖”。需求工作流的结果——需求规约是“卖”和“做”的衔接点。
3. 分析——提炼系统内需要封装的核心领域机制。可运行的系统需要封装各个领域的知识,其中只有一个领域(核心域)的知识是系统能在市场上生存的理由。对核心域作研究,可以帮助我们获得基于核心域的复用。
4. 设计——将核心域知识和非核心域知识结合,最终实现系统。说“代码就是设计”指的是这里说的“设计”。代码确实是设计,但代码不是分析,不是需求,不是业务建模。
图1-3 核心工作流
只要您思考过、表达过上面这些问题,就是在建模,用文本、UML、其他表示法或自造符号来表达都可以。而且我相信,每一个项目,我们都会思考和表达上面这些问题,只不过可能是无意识地、不严肃地做,现在我们要学习有意识地做,把它做出利润来。当然,使用UML来做是目前一个不坏的选择。
从我的观察所得,以上四项技能,大多数开发团队做得较好的是设计(也就是实现),前面三项都相当差,特别是业务建模和分析,没有得到足够的重视。很多开发团队拍脑袋编造需求,然后直扑代码,却不知“功夫在诗外”。
开发团队如果缺乏软件工程方面的训练,对这些工作流没有概念,就会把编码以外的工作通通称为“设计”或者“文档”。例如问开发人员在做什么,回答“我在做设计”、“我在写文档”,其实他的大脑可能正在思考组织的业务流程(业务建模),或者在思考系统有什么功能性能(需求),或者在思考系统要包含的领域概念之间的关系(分析),但他通通回答成“在做设计”、“在写文档”。后来又有牛人说了:代码就是设计。本来“设计”在他脑子里就是“代码以外的东西”,这么一推导,不就变成了:代码就是一切?
一些书籍、文章、博客大谈“编码的艺术”,很多也属于概念不清,其实文中探讨的根本不是编码的技能,而是分析技能甚至是业务建模技能。编码确实有编码的技能,就像医院里护士给患者输液也是技术活,但如果患者输液后死亡,更应该反思的是护士的输液手法不过关,还是医生的检查诊断技能不过关?
把工件简单分割为代码和文档(或设计),背后还隐含着这样的误解:认为模型(文档)只不过是源代码的另一种比较概要或比较形象的表现形式。其实,不同工作流产生的工件之间的区别不在于形式,而在于内容,也就是思考的边界,见图1-4。如果清楚了解这一点,即使只用C#,也照样可以“建模”。后面我们可以看到,如果不能做到UML模型就是代码,那么设计工作流就不需要UML模型,代码就是设计。
这种误解不止“普通”的开发人员会有,一些著名的UML书籍作者也有。Martin
Fowler所著的UML畅销书《UML精粹》,认为UML有三种用法:草稿、蓝图和编程语言,也是仅从编码的角度来说的。从Fowler写作的其他书籍《重构》、《企业应用架构模式》、《分析模式》等可以知道,他的研究工作集中在分析设计工作流,特别是设计工作流,不了解他在业务建模和需求方面有多少研究。鉴于Fowler在某些社群的心目中如大神一般存在,此处专门提到了他。
图1-4 核心工作流思考边界
一些不了解以上概念的开发团队干脆以“敏捷”为名,放弃了这些技能的修炼。就像一名从护士成长起来的医生,只掌握了打针的技能,却缺少检查、诊断、拟治疗方案等技能,索性说:“唉,反正再高明的大夫,也不能一个疗程把病人治好,干脆我也别花那么多心思了,先随便给病人打一针看看吧,不好再来!“迭代”只是一个底线,确实,再高明的大夫也没有把握一个疗程就治好病人,但是检查、诊断等技能越精湛,所需要的疗程就越少。不能把“迭代”作为偷懒的庇护所。
唱曲的名家,唱到极快之处,吐字依然干净利落;快节奏的现代足球,职业球员的一招一式依然清清楚楚;即时战略游戏高手要在极短时间内完成多次操作,动作依然井然有序。在激烈竞争的年代需要快速应变,掌握技能才能真敏捷。世上无易事,偷懒要不得。
刚入行的开发人员体会不到建模的重要性,是正常的。就像下象棋,初学者面对单车对马双士、单马对单士等已经有共识的局面还需要思考良久,最终还拿不下来甚至输掉。这时中局和布局的书在他看来多半是枯燥无味的,还不如把一本实用残局汇编看熟了,学到一些奇技淫巧,也能在菜市场赢几盘棋。不过,要迈向职业棋手的境界,参加更残酷的竞争,就体会到中局和布局的重要了。
1.4 UML简史
随着市场所要求软件的复杂度不断增大,软件开发的方法学一直在进化。从最开始没有方法,到简单的功能分解法,再到数据流/实体关系法。进入1990年代,面向对象分析设计(OOAD)方法学开始受到青睐,许多方法学家纷纷提出了自己的OOAD方法学,流行度比较高的方法学主要有Booch、Shlaer/Mellor、Wirfs-Brock责任驱动设计、Coad/Yourdon、Rumbaugh
OMT和Jacobson OOSE。不同方法学图形比较如图1-5所示。
这种百花齐放的局面带来了一个问题:各方法学有自己的一套概念、定义和标记符号。例如现在UML中的操作(Operation),在不同方法学中的叫法有:责任(Responsibility)、服务(Service)、方法(Method)、成员函数(Member
Function)……这些细微的差异通常会造成混乱,使开发人员无从选择,也妨碍了面向对象分析设计方法学的推广。
图1-5不同方法学图形比较
1994年,Rational公司的James Rumbaugh和Grady Booch开始合并OMT和Booch方法。随后,Ivar
Jacobson带着他的OOSE方法学加入了Rational公司,一同参与这项工作。他们三个人被称为“三友”(three
amigo)。这项工作造成了很大的冲击,因为在此之前,各种方法学的拥护者觉得没有必要放弃自己已经采用的表示法来接受统一的表示法。
1996年,”三友“开始与James Odell、Peter Coad、David Harel等来自其他公司的方法学家合作,吸纳他们的成果精华。1997年9月,所有建议被合并成一套建议书提交给OMG。1997年11月,OMG全体成员一致通过UML,并接纳为标准。
从2005年起,UML被ISO接纳为标准。相当于UML 1.4.2的ISO标准是ISO/IEC 19501,相当于UML
2.1.2的ISO标准是ISO/IEC 19505。2012年,ISO继续接纳UML 2.4.1为ISO/IEC
19505-1:2012 和ISO/IEC 19505-2:2012,接纳OCL 2.3.1为ISO/IEC
19507:2012。
2011年,中华人民共和国也发布了统一建模语言国家标准GB/T28174。
UML诞生时,Martin Fowler就作了如下预测:
你应该使用UML吗?一个字:是!旧的面向对象符号正在快速地消逝。它们还会残留在UML稳固前出版的书上面,但新的书、文章等等将会全部以UML作为符号。如果你正在使用旧的符号,你就应该在1998年间转换到UML。如果你正要开始使用建模符号,你就该直接学习UML。
─Martin Fowler著,easehawking译,面向对象分析和设计技术,电子杂志《非程序员》第5期,2001。英文原文在网络上已搜索不到。
时间过去十多年了,UML不断发展,在表示法上已经获得了胜利。随便打开一本现在出版的软件开发书,里面如果提到建模,使用的符号基本都是UML,即便在纸上随便画个草图,样子也是UML的样子。各种主流的开发平台也相继添加了UML建模的功能。OMG还和各种行业标准组织如DMTF、HL7等结盟,用UML表达行业标准。
另外,以UML为契机,掀起了一股普及软件工程的热潮,在UML出现后的几年,不但有关建模的新书数量暴增,包括CMM/CMMI、敏捷过程等软件过程改进书籍数量也出现了大幅度增长。制定UML标准的角色(OMG)、根据标准制作建模工具的角色(UML工具厂商)、使用UML工具开发软件的角色(开发人员)这三种角色的剥离,也导致建模工具的数量和种类出现了爆炸性的增长。而之前的数据流等方法从来没有像面向对象分析设计方法一样,出现UML这样的统一表示法,从而带动大量书籍和工具的产生。
最开始一批UML书籍,基本上是方法学家所写。最近几年,以“UML”为题的新书大多为高校教材或普及性教材。这并不是说UML已经不重要,而是没有必要再去强调,焦点不再是“要不要UML”,而是要不要建模、如何建模。
根据UMLChina的统计,UML相关工具最多时达168种,经过市场的洗礼,现在还在更新的还有近百种。有钱买贵的,没钱就买便宜的或者用免费、开源的。从以下网址可以了解UML标准和工具。
OMG UML规范:http://www.omg.org/spec/
ISO UML规范:
http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=52854
中华人民共和国国家标准:http://www.chinagb.org/ChineseStandardShow-197675.html
UML新闻:http://www.umlchina.com/News/News.htm
UML工具大全:http://www.umlchina.com/Tools/Newindex1.htm
电子杂志《非程序员》下载地址:http://www.umlchina.com/xprogrammer/Index1.htm
1.5 各工作流中的UML
UML现在的版本是2.4,包含的图形如图1-6所示,一共14种(泛化树上的叶结点)。
图1-6 UML2.4图形(根据UML2.4规范重新绘制)
可能您看了会说,哇,这么多图,学起来用起来多复杂啊。其实,UML像一个工具箱,里面各种工具都有。您只需要从这个工具箱中选择适合您的项目类型的工具用上就可以,并不需要“完整地”使用UML。不只是UML,对编程语言也一样的。很多人说“我用Java”,其实只是用Java的一小部分,而且很长时间内只用这一小部分就够了。
经常有学员问:潘老师,能不能给一个案例,完完整整地实施了整套UML?这是一种误解,这样的案例不应该有。有一些建模工具自带的案例模型会造成误解,一个模型里把所有的UML图都给用上了,但这是工具厂商出于展示其工具建模能力的目的而提供的,不可当真。
各工作流可以选用的UML元素以及推荐用法如图1-7所示。
图1-7 可选和推荐的UML用法
从“推荐UML元素”一栏中可以看到,常用的UML图形用例图、类图、序列图三种就够了。针对特定类型的项目,可以按需要添加图形,例如,开发复杂组织的运营系统,如果在业务建模时不喜欢用序列图,可以用活动图取代;对于系统中的核心类,可以着重画出状态机图来建模类内部的逻辑,针对质量要求很高的系统,每一个类可能都需要画状态机图,甚至还要画时间图。
另外,设计工作流推荐的做法是不需要画UML图,“代码就是设计”。要注意这里的“设计”的含义,代码是设计,但不是分析,不是需求,不是业务建模。反过来,“设计就是代码”也是成立的,例如用带有设计级调试和强大代码生成能力的Rational
Rhapsody开发实时嵌入系统。
对UML不了解的人经常问我的一个问题是:UML能代替编码吗?其实源代码(也就是人脑需要编辑的介质)的形式一直在变化,从最初的机器语言到汇编语言、过程式高级语言到现在流行的面向对象语言。“模型就是源代码”不是可不可能的问题,而是合不合算的问题。真实世界中,涉众对许多系统的质量要求并不高,电商网站、银行系统出个故障,人们习以为常,能够接受,反正出了故障再恢复呗。这样的系统,充分的建模没有必要性。同时,也没有可能性,因为类太多,工期不允许为每个类画状态机。这类系统,只需要对关键的类充分建模。如果做一个心脏起搏器,对质量要求非常高,通过充分的建模尽可能减少人工编码导致的偶发错误是必要的,而且也是可能的,因为类的个数少。
1.6 基本共识上的沟通
不少开发人员并不喜欢用UML,更喜欢在白板上画个自造的草图,似流程图非流程图,似类图非类图,然后说“来,我给大家讲讲!”。这样的做法有一个巨大的“优点”——怎么画都是对的,关于这个草图的解释权归“我”所有,同事不好批评我,项目要依赖于“我”头脑中的隐式知识——要是“我”不“给大家讲讲”,大家就玩不转了。上面这种现象,在有一定资历、但又不对项目的成败承担首要责任的“高手”身上表现更明显。
但是,这样的做法更像是想通过形式上的丑陋来遮掩内容上的丑陋。动乱年代,数学家在牛棚中用马粪纸做数学推导,不代表就可以因为演算工具简陋而允许自己胡乱使用符号和概念;过去的作家没有电脑,不意味着作家可以随意写错别字和犯语法错误。开发人员故意选择简陋的形式为简陋的内容开脱,就如同作家故意选择不好的纸来掩盖自己文字功力不足的事实,并不是好现象。UML没有强调一定要用多么昂贵的工具来建模,但是,即使您在海边用手指在沙滩上建模,模型依然要概念清晰,而不是以此为理由遮掩脓包。
如图1-8所示,就像数学符号背后隐含着数学的基本共识,五线谱背后隐含着基本乐理一样,UML背后隐含的是对于软件建模的一些基本共识。这些符号幼儿园的小朋友都会画,但背后的共识需要一定的训练和学习才能掌握。掌握之后,团队在基本共识上沟通,效率会高得多,无效的低水平争论会少得多,背后的脓包也会强制露出。开发人员如果习惯于画“草图”,用“模块”、“特性”等词汇含糊不清地表达思想,在严谨建模思维的追问之下,往往会千疮百孔,暴露许多之前没有想到的问题。这是一些“高手”潜意识里不愿意直面UML的深层原因。
图1-8 符号背后的基本共识
面对一个棋局,下一步怎么走?在业余棋手看来到处都是正确答案,在职业棋手眼里,值得讨论的选项只有两三种,因为职业棋手针对一些基本的技能形成了共识,大大减少了思考中的浪费。
有些伪敏捷开发团队,抛弃了所有“文档”(前文已说过,如果使用“文档”这个词,说明概念不清楚),更喜欢口头交流,你一嘴我一嘴,场面看起来热热闹闹,其实沟通的效果不好,更谈不上思考的深度和知识的沉淀。对比一下菜市场下象棋的热闹和职业棋手比赛时的沉静就知道了。“敏捷”的理由也不成立,菜市场的民工判断局势的速度快还是职业棋手判断局势的速度快?江湖棋手不看棋书不打谱,摆个路边摊够用了,如果参加职业比赛,非被打得落花流水不可。
有的开发人员的“十年工作经验”实际上是“一年工作经验用了十年”,一直在热热闹闹的民工层次徘徊,没有积累和成长。
1.7 沟通仅限于开发团队内部
但是,这里要注意一点:这种沟通仅限于开发团队内部,UML模型不是用来和涉众沟通的!
经常有人问:客户看不懂UML怎么办?这个问题本身就有问题,提问者潜意识里可能认为“客户”是一个人,其实“客户”是一大堆“涉众”,他们所在领域不同,学历职位有高有低,年龄有大有小,健康有好有坏,关注的利益更是各自不同,怎么能寄望用一个模型和所有的涉众沟通?
拿五线谱类比,五线谱是音乐专业人士交流的工具,作曲要懂、编曲要懂、乐手要懂、指挥要懂、歌手要懂(注意:是懂五线谱,不是人人都要用五线谱作曲)。但哼着“什么样的节奏是最呀最摇摆”的打工仔不需要懂五线谱。UML只是在“软件开发人员”圈子里面的统一表示法,强迫开发人员思考,改善开发人员的交流,表达软件开发的模型。
那么,和涉众交流的介质是什么呢?不是模型本身,而是模型的各种视图。面对大领导,我们可以给他放幻灯片交流愿景;中层干部喜欢看文档,我们可以按照他喜欢的格式给他炮制文档;一线操作工只关心他那一小块工作,我们可以制作界面原型和他交流;有时候甚至有的涉众根本不喜欢看任何东西,我们还可以通过“谈话”这种视图和他交流。涉众连谈话都不乐意,我们也可以通过观察来获取素材。
需求调研的技能有许多种,不仅仅是浅薄的“画个界面草图给用户看”,“问用户想要什么功能”。许多伟大的创新正是有心人在涉众不作声的情况下,观察涉众的行为得到的。另外,和涉众交流的内容应该聚焦于需求的素材——涉众利益(涉众希望什么担心什么),而不是需求。软件的需求规约相当于电影剧本。电影剧本并不是由观众直接提供的,而是由编剧根据不同观众的口味编出来的。同样,软件需求不是由涉众直接提供的,而是由需求工程师综合不同涉众的利益编造出来的。涉众没有资格、也没有责任提供需求。
和涉众交流的形式应该采用视图,而不是模型
和涉众交流的内容应该聚焦涉众利益,而不是需求。
不管涉众向我们索取什么材料,都把它看作视图,不管涉众向我们提供什么信息,都把它看作素材(涉众利益)。视图和模型的分离、交流和建模的分离,带来了灵活多变的交流方式和严谨稳定的开发内核。
图1-9 交流和开发分离
如果不了解这个区分,直接拿UML模型去和涉众交流需求,很容易导致“四不像”。不少开发团队十年如一日没有进步和积累,“交流影响开发”是原因之一。为了迁就不同涉众的知识水平,开发团队只好损害模型的严谨性,即使是这样,涉众也不一定接受,交流效果还是不好,而且还会因为涉众的交流形式多变而影响开发团队核心工作流的稳定——双方都受害。客户的领导说,我不习惯看UML模型,就知道以前看的是××标准格式的文档,我只在这个格式的文档上签字,难道我们就不用UML建模了?下一个项目的客户领导喜欢另一种格式怎么办?下下个项目根本不需要签字怎么办?互联网网站没有“客户领导”签字确认需求怎么办?建模的目的是帮开发团队思考,它可以指引开发团队发现到底需要向涉众了解什么,但不是直接拿着模型和涉众交流。
开发人员有意无意把建模的目的理解成和涉众交流,有时背后的思想还是“懒”字,因为这样想,就有了推卸责任的机会:不是我不想建模,就算我建模了,客户不想看啊。
拿患者和医生类比,您想想下面的情况合理吗?患者说“我腿疼,得了腿癌,我要做放疗”,医生就给他做放疗?患者想看核磁共振成像,医生就给他做;患者不想看甚至昏迷不醒,医生就干脆不做?显然不是这样,医生应该按照成熟的治疗套路,该做什么检查就做什么检查,该如何治疗就如何治疗。
1.8 方法和过程
本书讲的是方法(技能),不强调具体某一种过程。拿足球打比方,本书讨论的是射门、运球、传接、抢截、定位球、配合的技能,不讨论战术,更不讨论更衣室团结、俱乐部运营和俱乐部文化。
团队实施过程改进容易流于形式,根源往往就在于技能的不足。如果把改进的焦点先放在技能上,开发人员技能提升了,适用什么样的过程自然就浮出水面,没有必要去生搬硬套某过程。或者说,技能增强了,更能适应不同的过程。UML建模没有绑定到特定过程,不过当前主流的软件过程都是强调增量和迭代开发,所以应该把前面所讲的业务建模、需求、分析、设计看作是一个迭代周期里的工作流,做一点业务建模,做一点需求,做一点分析,做一点设计……不可误解成“做完了所有的业务建模才能做需求”……。
很多时候方法和过程经常被混淆,现在经常说“敏捷方法”,其实“敏捷”是一个过程家族。之所以造成这个误解,也许和Martin
Fowler把他介绍敏捷过程家族的文章起名为“新方法学(The New Methodology)”有关。另一个常见的误解来自Robert
C. Martin的书《敏捷软件开发-原则、方法与实践》,书中主要讲的是面向对象设计的一些方法(原理、原则和模式),这些方法并非Robert
C. Martin首先提出,而且和敏捷过程没有必然关系,但是,经常会有开发人员误解面向对象设计的这些思想是敏捷人士提出来的。更有一些敏捷人士在没有学习和掌握软件工程知识的情况下,先高喊“砸烂一切”吸引热血青年,然后发现砸烂一切是不行的,又偷偷拾起过去被自己砸烂的东西,加上自己的“敏捷”包装,有意无意地给不了解历史的新入行开发人员造成“这是敏捷发明的,那是敏捷发明的,所以把敏捷挂在嘴边的人最懂”的印象。此类现象,非独软件领域,各个领域、国内国外都屡见不鲜。
我刚开始为开发团队提供服务时,有一次和一个开发团队的经理交流,经理说“我们用的是面向过程方法”。我一开始信以为真,认为如果能做到用面向过程方法,从组织级、系统级到模块级层层分解也不错的。后来发现,经理所说的“面向过程方法”其实是随意的功能分解,也就是没有方法。
类似的场景还有:开发团队负责人说“我们现在采用的是敏捷过程”,稍为深入了解,多半会发现其实他所说的“敏捷过程”就是没有过程。
没有方法不等于面向过程方法,没有过程不等于敏捷过程。面向过程是成熟的方法学,真正的敏捷过程应该是很严肃的过程。不要让“面向过程”、“敏捷”成为偷懒的庇护所。
还有一个常听到的偷懒庇护所是“软件开发是艺术”。软件开发是不是艺术,我不知道,不过我的观点是,就算软件开发到了极高境界真的是艺术,恐怕也不是我等目前有资格谈的。下棋到很高境界,也有各种流派风格,但那是在通晓了基本棋理的基础上演变出来的,连基本棋理都没有掌握的初学者,把自己的胡思乱下也当成“流派”就不合适了。
师父纠正少林弟子武功招数的细节,弟子懒得去了解为什么按师父教的会好一点,反而说“不要纠结于细节,天下的武功又不仅仅只有少林这一派”,以为这样一说,自己就可以摇身一变成为武当派高手了。其实,少林派武功学精了,如果对武当派武艺感兴趣,转起来容易很多。如果某人学少林派武功时面对细节总是以“不纠结”为由拒绝进一步思考,很难相信他学习武当派武功时会好到哪里去。
高考时要拿到高考状元,很多时候要靠运气,顶尖的学生的知识掌握和学习方法不相上下。但不可以此作为偷懒的借口,绝大多数学生并不处于这个级别,他们要做的是将排名从1000名提升到200名,这样就有好学校可读。这个级别的爬升,还是要靠勤奋和方法。
本书到现在为止,已经说了很多回“偷懒”,就是强调世上无易事,好的方法应该能强迫您思考,强迫您付出心血和汗水来获得竞争优势,反之就是忽悠,就像现在一些甜得发腻的伪敏捷宣传。
1.9 案例介绍
本书的案例讲述UMLChina自己的故事。我在序言说到,UMLChina秉持“内外有别”的原则。在外面看来,UMLChina的网站其貌不扬,十几年如一日,UMLChina组织的信息化其实藏在背后。
UMLChina一开始把领域放在软件工程,后来发现,这个领域已经太大了,没有能力在这么大的范围内做到最好,于是缩小范围,专注于和UML相关的建模技能。例如,2002-2004年间我们和出版社合作翻译了《人月神话》、《人件》等软件工程书籍,后来这方面的书籍就不做了。
我为UMLChina所做的定位是:做世界上最小和最好的建模咨询公司。咨询工作适合做精,不适合做大。UMLChina没有招揽或培养满屋子的“年轻资深咨询师”,通过扩大规模来提高收入,有的机构这样做了,也获得了更多的收益,但那不是我们的路。
一旦从深度上定位,就会发现要做的事情非常多,2005年,我决定着手开发UMLChina的业务系统。经过这些年持续改进和升级(也仍将继续改进和升级),虽然现在离我希望的“武装到牙齿”的境界还有很大的距离,但这个和UMLChina业务结合在一起的系统确实能够让UMLChina不必请更多的人就可以保持运作。因为很多业务逻辑已经封装在系统中,所以也比较容易分权给助理。
后面给出的素材绝大部分是真实的,如果有一些地方做了模糊处理,那是出于商业上的考虑。UMLChina在商业方面的事宜有公司负责运作,本书隐去公司真实名字,仍把这个公司叫做UMLChina。
1.10 模型的组织
建模的过程中,我们在不同的工作流使用了一些UML元素,如何来组织它们?从前面的图1-7可以知道,工作流和所用的UML元素不是一一对应的。模型可以按照UML元素的种类组织,也可以按照工作流来组织。
本书推荐的模型组织方式是按工作流组织,如图1-10。本书提供了一个初始Enterprise
Architect模型,该模型已经按照图1-10的组织方式建好了包,并且添加了一些业务建模和分析的构造型(Stereotype)。我建议读者直接从本书提供的初始模型开始做,按部就班填空即可。初始模型的下载地址是http://www.umlchina.com/training/myproject.rar。初始模型使用EA9.2编辑保存,不过使用其他EA版本打开编辑应该没有问题。您在熟练掌握本书的建模技能以后,如果体会出对您的项目更合理的组织方式,可以抛弃本书所推荐的方式。如果您平时使用的工具不是Enterprise
Architect(以下简称EA),而是MagicDraw、StarUML、VP-UML等,也可以自行按照图1-10的方式组织模型。UML工具(包括EA)一般都会预置一些模板,建议先无视它们。
图1-10按工作流组织模型(推荐做法)
另外一种常见的模型组织方式是按视图来组织,如图1-11。以前Rational
Rose缺省的组织方式就是这样,最开始我也是这么做的,但是后来发现开发人员容易出问题的地方不是用什么图,而是目前在做什么。开发人员的思维经常跳来跳去,无意识地改变研究范围,思考的边界一会在系统之间,一会在待开发系统的边界,一会跳到系统里面类的关系,一会又细到某个操作内部的代码。所以,不推荐按视图组织模型。
图1-11按视图组织模型(不推荐)
1.11 工具操作
在开始项目实作的讲解之前,我们先建立新的UMLChina模型,并对Enterprise Architect做一些设置。
【步骤1】启动Enterprise Architect,点击Start
Page上的Copy a Base Project,在弹出对话框Model Project栏中选中模板项目,New
Project栏中定义新建项目的位置和名称,确认选中Reset New Project GUIDs复选框,单击Create
Project按钮。
图1-12 从模板项目创建新项目
*与在资源管理器里复制项目文件相比,以上做法可以重置所有标识值,保证模型唯一。
【步骤2】点击菜单Tools|Options,在Options对话框中选择Appearance页签,点击Configure
Default Element Fonts按钮,在弹出的Configure Default Fonts对话框中设置您适合的缺省字体。本书的选择是大小为14的微软雅黑。
图1-13 设置模型的缺省字体
【步骤3】在Options对话框中选择Standard Colors页签,将Paper设置成您喜欢的画布背景颜色。本书的选择是纯白色(255,255,255)。
图1-14 设置画布的背景颜色 |