8.1.5 重视分析工作流
分析,就是从核心域的视角构思系统的内部机理。
在现在的很多软件组织中,分析工作流的技能被严重忽视。很多开发人员上手就直接编码,原因并不是软件开发项目的核心域逻辑简单到了不需要分析,或者他的大脑发达到了在大脑里就可以完成分析的地步,而是开发人员缺乏分析的技能,只好草草跳过这一步。
此外,为了遮掩自己的无能,开发人员还会使用各种遮羞布——引入各种核心域逻辑之外的因素把水搅浑。
图8-8 向核心域逻辑中引入其他因素
遮羞布一:时间
以“时间紧”、“敏捷”为借口,掩盖自己没有能力剖析复杂逻辑的事实——我是有能力剖析的,但时间太紧张了,等以后有时间吧!
遮羞布二:空间
借助“口头交流”、“白板”等容量小的介质,掩盖自己没有能力剖析复杂逻辑的事实——我是有能力剖析的,但白板空间太小了,只好简单画个“草图”了!
遮羞布三:功能需求之外的其他需求或设计因素
在思考核心域逻辑时,频频提出“这样会不会速度慢”(质量需求)、“我们想把它分成N个微服务,让不同团队用各自技术栈开发”(设计约束,也有可能是臆想的设计)等和核心域逻辑无关的因素,掩盖自己没有能力剖析复杂逻辑的事实——我是有能力剖析的,但还要考虑到这个因素、那个因素,所以精力就不够了。
遮羞布四:重构
以“后面再重构”为借口,结合其他遮羞布,掩盖自己没有能力剖析复杂逻辑的事实——我先随便写写,后面再重构,哎呀,没想到啊,时间来不及了(遮羞布一)。
关于重构,此处多说两句。
上世纪80年代末,Bill Opdyke(http://laputan.org/pub/papers/opdyke-thesis.pdf)和Bill Griswold(https://cseweb.ucsd.edu/~wgg/Abstracts/gristhesis.pdf)等人归纳了一些调整代码结构的手法,称为“重构”,后经Martin Fowler等人推广而广为流传。
“重构”的知识可以看作是建模知识的一个子集。如果开发人员真的熟练掌握重构的手法,很多情况下他已经有能力直接建模系统的核心域逻辑得到更合理的结构,根本不需要先走很多弯路再回正路。
要是开发人员以“重构”为理由拒绝思考,很可能他的所谓“重构”也是空话。
摸着石头过河是难免的,但应该在不得不摸的时候才摸,不应该假装看不见已有的路和桥,无论大小事都主动追求摸着石头过河。
当然,也有的人不是假装看不见路,而是真的看不见路——就是个睁眼瞎。不过,大脑不用思考,凭感觉摸着石头过河不停刷工作量,也是一种躺平的幸福。
用考试类比
学渣参加考试时,会这样遮掩自己的无能:
遮羞布一(时间):抱怨时间紧张或者故意提前交卷——如果再给我一些时间,我肯定做得出来。
遮羞布二(空间):故意带不好写的笔或抱怨草稿纸质量差、答题的地方太小——不是我不想好好答,可惜这个纸笔不给力。
遮羞布三(其他因素):抱怨和学科知识无关的其他因素,例如要求用仿宋体答题——不是我不会,写仿宋体耗费了我很多精力。
遮羞布四(重构):我先随便答,一会回来再检查。(结合遮羞布一)哎呀,来不及检查了。(结合遮羞布二)哎呀,答卷上地方不够了。
8.1.6 分析方法学的简单历史回顾
1958年,John W. Young Jr.和Henry K. Kent发表“Abstract formulation of data processing problems”,第一次提出在独立于实现的抽象级别上定义系统的规范。
图8-9 摘自 “An abstract formulation of data processing problems”(Young JW, Kent HK,1958)
1959年,CODASYL(数据系统语言会议)成立。1962年,CODASYL提出了一个和Young/Kent类似的模型,称为“信息代数”(Information Algebra)。
1970-1980年代是结构化分析方法的时代,主要贡献者有Börje Langefors、Chris Gane、Trish Sarson、Tom DeMarco、Pin-Shan Chen、E. F. Codd等人。结构化分析的主要建模方法是数据流图和实体-关系图,这两者的结合,让软件开发人员有能力剖析大型系统。
图8-10 摘自 Structured analysis and system specification(DeMarco T,1979)
图8-11 摘自 The Entity–Relationship model: Towards a unified view of data(Chen PPS,1976)
1982年,Nastec公司开发出了DesignAid,这是第一款CASE(计算机辅助软件工程)工具。随后,其他CASE工具陆续出现。据PC Magazine的1990年1月30刊统计,当时已经有超过100家公司提供了将近200款CASE工具。
图8-12 摘自PC Magazine 1990年1月30日刊(红框圈住的内容说明了工具的数量)
1980年代后期,面向对象的思想开始用于分析和设计。然后,UML统一了表示法。这部分历史已经在本书第1章“UML简史”部分讲述,此处不再赘述。
图8-13 摘自 Object Oriented Analysis, 2nd Edition(Coad P, Yourdon E, 1990)
图8-14 摘自 Object lifecycles. Modeling the world in states(Shlaer S, Mellor SJ, 1992)