过度设计
Overengineering, or over-engineering, is the act of designing a product or providing a solution to a problem that is complicated in a way that provides no value or could have been designed to be simpler. As a design philosophy, it is a violation of the practice of value engineering and the minimalist ethos of “less is more” or “worse is better”, as well as the related KISS principle.
过度设计是指设计产品或为复杂问题提供解决方案的行为,这种方式没有价值,或者本可以设计得更简单。作为一种设计理念,它违反了价值工程的实践和“少即是多”或“差即是好”的极简主义精神,以及相关的 KISS 原则。
——来自维基百科
从上面的定义看,过度设计有两种情况:
1)产品的设计或实施超过了实际的需求。“实际”的需求就是指能够使用。
在设计家用空调时,如果设计的最在室外温度绝对零度时可以使用,那么就超过了实际需求。能够使用的要求仅在-30℃
能够正常使用就可以了。
在设计一款桌球游戏时,在对球的运动和碰撞建模时,使用牛顿经典力学是必要的。但如果使用相对论,可能更加的精确,但这里就超过了实际需求了。
在设计人员管理系统时,将员工工号设计成支持200亿人,这种在理论上是可行的,但在实际上却是不可能的,因此也就超过了实际需求。
2)完成的最终产品过于复杂。让简单的事情变得复杂。
在设计企业内部系统时,按照12306、taobao等网站的规模做设计,那就会让很多看起来很直接的事情变得弯弯绕了起来,设计的过于复杂了。
在从数据库取值时,select * from table
,然后从结果集中取出两个字段而丢弃其它信息。
产生的后果
不论是产品的设计超过了实际需求,还是实现的方式过于复杂,都会带来代价。
超过了实际需求,那么这部分工作内容即使完成了,也是没有真实用处的,但为完成这部分工作付出的劳动力和成本却是实实在在的,甚至为了这部分工作耽误了其它实际需求的工作而造成的产品交付延期,影响企业声誉等,那就影响更大了。
设计的越复杂,那么就越可能出错。异步调用比同步调用复杂,通过第三方中转比直接通信的成本高、效率低、更易出错。同时,它也不便于扩展,比如中转的第三方是否能够同步扩展呢?
正确的设计
刚刚够用、保持扩展是期望达到的理想状态。把复杂的问题正确的抽象成简单问题,是一件正确而困难的事情。
注:这里的简单是指解决方案简洁有效,不是指问题简单
抽象模型越简单,理解起来就更容易,团队沟通效率也就更高,更容易达成共识。在出现错误的时候,也能够快速的定位问题和解决问题。
同样,模型抽象的越简单,由于没有那么多不必要但关联着的功能和依赖,那么也就越容易扩展。
在设计中,需要保持对变化与不变的敏感度,正确的划分两者,将不变作为基础,对变化保持扩展。比如按照20倍容量设计、3倍容量实施、1.5倍容量部署
就是一种保持了扩展和够用的实践。
在软件开发过程中,可以采用诸如增量变更、敏捷开发等方式,慢慢的构建出“刚好够用”的“简单”产品。
同时,在设计时,也需要对一些推理谬误做一定的预防,比如“追求完美解决方案谬误”1,就是需要预防的。