即使开发人员有很多年的Java经验,其抽象能力也可能非常弱----通常现象就是一个BaseService里面塞数千行代码。
如果你是高级设计师,那么在让初级开发人员编码时,不妨暂时禁止其开发Base服务,等到代码定型后转测前再抽出时间做抽象。
用例图在高阶设计时使用,这里重要的难题给“本体(ontology)”下定义。它取决于市场调研或者战略分析的目标决定,甚至领导拍脑袋决定,比如需要知道它的用户是谁,做了什么,需要什么。
“本体”一般分为两种思考方式
在思考的过程中需要逻辑链的广度遍历与碰撞(比如他人的质疑),它必然是从“发散”到“层化”的过程,最终用例图会转化为MindMap/WBS。
用例图的媒介并不重要,我个人的习惯是跟第一个带我的人学的,他被日企Fanuc的Excel模版给固化了,因此我的习惯也被第一个人给固化了,全部文档均用Excel整理还更快。
这个图主要用于大数据场景(APM/运营/时序/知识管理等)
含义大致如下
这里的设计方法对大数据的项目很有作用,比较类似flink里的算子。
注意事项:
此外还有N2图,它和DFD类似。
它主要可以通过概念设计、逻辑设计和物理设计实现。在真实项目中,可能看了个大概需求,就上来直接设计SQL表了(即物理设计),这时问题来了,抽象与具体哪个更优先?
在软件理论中,要求设计数据库时一般从抽象到具体;而在事实搬砖中不一定要符合教条,比如大数据/AI场景中,聚合多个野生的实体数据源,经过清洗抽象最终整理为维度数据的场景,就是自下而上的。
ER图设计阶段也需要完成索引的设计。
ER图的局限
ER图只能承载“元组运算/域运算”的关系演算,工程上有如下缺点
参考阅读:关系式模型的实质
下面是个人在通用软件的主要交付件介绍,大部分项目并不需要拼天赋,而是体力活,做好分类和枚举就可以。
尤其注意的是,千万不要认为“高阶设计”是指单纯地先抽象接口与类图,再写实现类。高阶
只是指对经验世界的抽象(或者投影),一定需要先经验再理性,先实现后抽象,以防加太高的思考杠杆(比如过度设计)。除非你的设计是“重复劳动”。
参考阅读:某软硬件架构师的一些思考
这种模型核心就是判断你的工作是否是可复制的“泰勒化”,它永远只在高阶的PPT汇报中。小公司用不上,大公司推广落地到小组也阻力重重。而在真实搬砖小组中,主要依靠“语境”方案。
目前业界仍然缺少缺少较好的IT工具。
PERT图本质是一个有向图,可以帮你估算复杂且需要多人共同完成的动作依赖关系,在复杂的部署变更场景中可能使用。这个在LeetCode中是Hard的Graph BFS问题。在半导体设计的STA阶段也需要使用。
比如我在深航的宣传册里,发现航空领域从零开始也是这样
有一天,没有事先通知,港中旅派了一个人,是留英回国,在英国大不列颠航空公司工作的资深工程师,到我办公室,说来了解深航筹建进展,问我这一段干什么?我把这张网络图给他看了。他说明白了,说在英美搞大工程都要这样,叫PERT(Program Evaluation and Review Technique),这样很好。回去向港中旅汇报了,误会消除。
再举例如下,假如我需要从零部署一个“Linux工作站”,那么变更动作分解可以参考如下
注意此图中
再比如我要从零做一个中低规模的项目
此绘图流程要求项目被充分地分解,类似泰勒所谓的“标准化原理“,分析成本是很高的。真实工具中(比如微软AzureDevOps)均不支持这种图的遍历方案,大部分还是人工分解为树状结构。
有的领导习惯让你完成看似简单,实际实施过程中一堆坑的项目,这时就考虑用PERT来分解。
这个分解依赖关系的能力是后天学习的,一定需要掌握。日常生活中使用Excel/PPT绘图即可,有强迫症可以使用PlantUML,但是效率的确不高
这种管理手段在大型项目中可能存在,它本质上也是报表呈现的作用。
但是对于10人左右的小组的日常管理,基本还没见过能真正用起来的,因为估算/倒排能精确到周就不错了,事实上大家还是心安理得的照着人月神话的反例搞。
软件工程通过降低偶然性换取确定性,是泰勒式的教条主义。如果需要更高阶的设计思路,可以参考“数码物(Digital Objects)/技术物”的概念,而非经典“自然物”的概念。
参考书籍