"过度设计"说的根本不是设计问题
YF 2021-2-6 14:04
我们领导昨天教育我们说,不要过度设计,先做最重要的功能!最近学了潘老师的书,题也做了一些,感觉好像说的是功能不是设计,老师怎么看?
UMLChina潘加宇
你的感觉很正确!
很多人说"过度设计(overdesign)"的时候,说的根本不是设计问题,而是“需求蔓延(requirements creep)”。
比如,搜索引擎搜“过度设计”,第一页出来的这个文章:

(本图仅为示意,不代表同意/不同意观点。)
按照《软件方法》的软件开发工作流:

A-业务建模——定位需要改进的目标组织(人群或机构)以及该组织接下来最需要改进的问题。
B-需求——描述为了改进组织的问题,所引入的信息系统必须具有的表现。
C-分析——提炼为了满足功能需求,所引入的信息系统需要封装的核心域机制。
D-设计——考虑质量需求和设计约束,将核心域机制映射到选定非核心域上实现。
很多平时所说的“过度设计”,说的是B-需求,说的是花精力去做很多【用】不上功能,而不是说C和D,即系统内部怎么构造的,分解成哪些类,还是没有类全是过程,它们之间怎么互相调用的,分了多少层……
类似于“架构”、“设计模式”,“过度设计(overdesign)”一词应该也是来源于建筑。在计算机行业最早是谁使用我就不知道了,但最有名的应该是1975年 Fred Brooks的《人月神话》里“自律—第二系统效应”一节提到的overdesign:


Brooks说的就是工作流B-系统的需求——“使用”,不是说该系统内部如何构造。
即使是看起来真的是说“内部”的设计的,其实有可能还是需求问题,比如,网络上摘的一篇名为《软件开发-什么是过度设计》的文章里举的例子:

以上文章以为所说问题是“设计”,其实问题是,考虑了不存在的需求,跟设计过度不过度没什么关系。更何况,如果“支持美元充值、港币充值”这个需求确实存在,图中这个“设计”把各种变化频率不同的概念搅在一个表里,连“设计”都没有,跟“过度设计”还差十万八千里呢。
至于真正的“过度设计”——系统的需求是正确的,但系统内部构造精妙到过分了,呵呵,似乎我见都没见过。
见到的基本上都是伪装成“过度设计”的“没有设计”。架构师没有掌握类图、状态机图等基本的建模手段,领域逻辑都没有能力理清楚,就知道用自己懂的一点粗浅知识来凑工作量,参见《废话迷》。
更糟糕的是,“过度设计”还成为拒绝思考的遮羞布——我害怕自己“过度设计”,所以干脆就不学习设计了,这样就避免了陷入“过度设计”的陷阱。

