为什么“前Google工程师”会“感觉UML没啥用”?

潘加宇

前几天,有学员发给我截屏,一位“前Google工程师”在自己的网络课上发表了以下言论:

截图

这么多年来,发表类似“感觉UML没用”这样的言论的人,实在是太多了,包括“现Adobe工程师”、“现微软工程师”等等,大公司的名头确实唬住了不少人。

我在《软件方法》中讲述到各个知识点时,也对此类言论有所评述。在此,我专门针对此类言论做一次集中回应。

一、当惯了尾巴,理解不了脑袋所需的技能

软件开发的一个迭代周期中需要思考四个问题,即四个工作流:

A-业务建模——定位需要改进的目标组织(人群或机构)以及该组织接下来最需要改进的问题。

B-需求——描述为了改进组织的问题,所引入的信息系统必须具有的表现。

C-分析——提炼为了满足功能需求,所引入的信息系统需要封装的核心域机制。

D-设计——考虑质量需求和设计约束,将核心域机制映射到选定非核心域上实现。

如图1。

工作流

图1 四个工作流

以上四个工作流的名称使用了传统术语,也有一定的模糊性(特别是业务建模)。更贴切的名称是组织建模、需求建模、核心域建模、实现。如果您觉得业务建模、需求、分析、设计不好,直呼ABCD或改成阿猪、阿狗、阿鸡、阿鸭也无所谓。

针对这些工作流的思考,其实就是建模。任何一个软件项目,这些思考都是逃不掉的,也就是说,我们一直在建模,只不过很多人习惯于无意识地做,运气时好时坏,速度时快时慢,有的人能够有意识地做,让汗水不白流。

思考的结果,可以用口头表达,也可以用文本、其他表示法或自造符号来表达。用UML来表达,目前是一种不坏的做法。如果用UML表达,推荐的用法如图2。可以看到,工作流D可以不需要用UML表达。

工作流

图2 各工作流思考内容和推荐表达

如果“前Google工程师”对工作流A、B、C有认识,也掌握了相关的技能,只不过认为自己掌握的其他表示法(例如ArchiMate或BPMN)比UML表示法要好,那么发表以上言论还有可以理解之处。遗憾的是,综合看作者其他言论,他对工作流A、B、C并没有认识,所以作者说“UML没啥用”实际上说的是“工作流A、B、C没啥用”。

为什么“前Google工程师”会这样认为呢?

一些“大厂工程师”,即使在国外总部上班,他所做的工作很可能属于上面所定义的工作流D,没有承担A、B、C的工作,自然感觉不到建模和UML的作用。

这不是新鲜事。上个世纪,市场经济的大幕在中国刚刚拉开时,一些从乡镇企业发展起来的民企,想借助国外先进企业的经验帮助自身提高企业管理水平,从著名外企挖人来当总经理。结果,受惑于老外那花里胡哨的头衔,挖到的“外企人才”其实在外企里扮演的只是走格子的角色,根本担当不起画格子的责任。

习惯了当尾巴,不了解脑袋所需要的技能,也不愿意学习,尚且可以理解,但拿自己的无知和大公司的名头来误导读者,实在不应该。

那为什么有人乐意这样误导呢?

一名护士,即使在美国梅奥诊所工作,也还是护士,并不具备医生的技能,回到中国就当主治医生是不可能的。如果这名护士不想辛苦学习医生的技能,又想获得最大的好处,应该怎么做呢?一个好的策略就是贬低医生的技能,发布类似于“感觉医生没啥用,最终打针还是得靠护士来打”的言论,把周围的人的知识限制在自己懂的范围之内。

护士虽然没有掌握检查诊断的技能,拍脑袋就开药,但为了掩盖自己的缺陷,开处方的时候特别在意字写得很工整,对患者的态度也出奇地好。有时候,患者还真的被蒙住了。可惜,药不对症就是不对症。

***************************

对工作流A、B、C没有认识,最容易产生的误解就是,认为UML模型只是代码的一个“概要描述”或者“视图”。这样的误解经常会导致思维颠倒,先拍脑袋得到D,然后从D反推A、B、C。例如下面的对话:

张三:这个不应该是系统的用例(如果您不理解什么叫“用例”,就先把它理解为“功能”好了)。

李四:是的!我都写好了,运行一下给你看,这个系统确实提供了这个用例。

是否系统的用例应该以“好卖”来判断。权衡涉众利益之后觉得应该有,系统就有,不该有就没有,而不是我写好了代码,所以就应该有。

张三:这两个类关系不应该是泛化,而是关联。

李四:是泛化,不信我打开代码给你看,或者逆向工程转出类图给你看。

是否泛化关系应该以“符合领域内涵”来判断,而不是先写好代码“人是猪的一种”(肯定编译通过),再用写好的代码来证明“人是猪的一种”。

这种误解不只是某些“Google工程师”会有,很多开发人员眼中的“大神”也会有。Martin Fowler所著的UML畅销书《UML精粹》,认为UML有三种用法:草稿、蓝图和编程语言,也是把UML模型当成了代码的一种“文档”。从Fowler的书籍和文章可以知道,他的研究工作集中在C和D,特别是D,对A和B研究并不多。

***************************

最后说一下态度问题。

既然开课教书育人,应该有一个严谨的态度。“感觉”、“没啥用”之类的用语是不合适的。可以说“我不用UML”,“我认为UML在****情况下用处不大”。

***************************

对任何东西,应该先了解,再评论。

读者可以先尝试做下面的题目,看看自己对建模的了解是什么水平。然后再看看对本文有任何看法。

也可以看看我写的其他文章。

有时间再写一些其他相关内容,例如:

二、为什么计算机科学博士也有可能是软件工程盲?

三、为什么很多流行的基础设施软件在开发时没有用UML之类的建模语言?

四、一些互联网开发人员介绍的关于建模的体会能相信吗?

五、建模门槛高不高?