什么是设计不足?设计出来的系统复用性差,扩展性不强,不能灵活的应对变化,简言之,设计没到位。设计不足,多半是因为经验有限,设计能力有限。

什么是过度设计?设计出来的系统比恰到好处要复杂臃肿的多,过度的封装、一堆继承、接口和无用的方法,超复杂的xml配置文件,简言之,客户需求是要一把杀鸡的刀,你给设计了一把牛刀(杀鸡用牛刀)。过度设计,多半是因为有设计的癖好,喜欢炫耀或玩弄无谓的技巧,或是喜欢把简单的问题搞复杂化。

如此说来,没有人能说自己的设计就是恰到好处的。适合的就是最好的,但什么是适合的?这个度很难把握。

客户只是告诉你他“需要一把杀鸡的刀”,至于将来有没有需求变化,有没有可能要这把刀能杀牛,客户也不知道。所以当然这个设计的度就很难把握了。

有人主张设计必须前瞻与用户需求,不能以需求为导向。因为客户从来不会告诉你他未来的需求,连他也不知道。例如,消费者从来不会告诉RIM公司,我需要一款能收企业邮件的BlackBerry手机。

但也有人持相反观点,认为设计必须以需求为导向,软件以人为本,以用为本。

其实从一定意思上说,过度设计和设计不足都是“设计错误”的一种形式。

设计不足,则意味着系统复用性扩展性和灵活性差,系统僵化,不能应对将来的需求变化,或者将来修改和维护的代价和成本会很高,这当然是设计错误;

过度设计,则意味着为了实现这个设计要付出的额外代价,例如成本上升,缺陷可能性加大,提升维护成本,甚至降低系统性能。而可维护性和系统的高性能都是系统的隐性需求,这些需求没实现好,当然也是设计错误。

从另外一个角度看来,能够进行过度设计的,多半设计能力高于设计不足的;过度的设计改回来的成本也比设计不足的改过去的成本低的多。

Martin Fowler说敏捷开发不是轻视设计重实践和重构,而是演进式的设计(Evolutionary Design,区别与计划性的设计 Planned Design)。每一次的重构和迭代都映射和更新到最新的设计中来,从而最大限度的满足客户的功能性需求和非功能性需求。从最初的Prototyping、初始需求分析与建模,然后进行演进式的架构设计和实践,这也许是适合于大多数中小型项目的最佳实践。

因为变化是无穷无尽的,需求是变幻莫测的,我们每天都跟在需求后面跑,跑的很累。而客户还要求我们随需应变,抱怨我们不够敏捷,要求我们以欢喜的心态来拥抱变化,因为变化就是IT的机会嘛! 但我们能找到“银弹”来封装所有未知的需求变化吗?我们能超前于客户的需求,能变被动为主动吗?我们能设计出一个系统超前于未来客户的需求吗?

没有一个完美的能随需应变的系统,所谓“设计之美”也是盛名之下其实难副。我们实际的目标只是最大限度的封装变化,最大限度的预测某些未来可能的变化,提供某些系统扩展和变化的可能性,从而减低未来变化的成本,为客户创造价值

也许,最简单的才是最好的。大巧若拙,大道至简,有时候越简单的反而越难实现,而且越接近真理。也许这个只能靠个人体会和悟性了,才能最终体会到简单的精妙设计之美。熟背各种设计模式、学个一招半式的人,就像一个天天背着一把剑的剑客一样,唯恐旁人不知道其剑术高强;而真正的高手是手中无剑,却照样可以打赢别人,因为万物都可被他用来施以剑法。这才是真正的高境界。

我们缺乏的是真正有创意的创造性的设计,比如我们为什么没有设计出中国人自己的framework和platform?因为我们经验、技术和设计能力不足,大家都沉迷于玩一些小技巧,战术技巧,不是战略技巧;玩到30岁然后都去做PM做培训做销售去了。而在那些需要简约设计的地方,我们却自诩为高手而加上很多华丽的设计来维护虚幻的可扩展性和灵活性。

中国的架构师,缺乏的不仅仅是经验、技术、创意、设计能力,也许最缺乏的是思想,是心境。

转载于:https://www.cnblogs.com/Mainz/archive/2008/07/06/1237046.html

谈谈设计不足(under-engineering)与过度设计(over-engineering)相关推荐

  1. CTO也糊涂的常用术语:功能模块、业务架构、用户需求、文档、过度设计……[20210217更新]

    潘加宇 [初稿写于2018/5/30,最近更新2021/2/17] 功能模块.业务架构.需求分析.用户需求.系统分析.功能设计.详细设计.文档.业务.技术--很多被随口使用的名词,其实是含糊甚至错误的 ...

  2. 阿里技术专家:谈谈软件开发中的 “过度设计”

    引言 写软件和造楼房一样需要设计,但是和建筑行业严谨客观的设计规范不同,软件设计常常很主观,且容易引发争论. 设计模式被认为是软件设计的"规范",但是在互联网快速发展的过程中,也暴 ...

  3. 软件测试中过度设计的那些事儿

    过犹不及,这是古代<论语>中的一个成语,做得过了就好比没有做够一样.在软件测试行业中同样也会存在过度测试的情况,今天我就班门弄斧一下说说我对过度测试的理解. 很详细的需求文档会导致维护成本 ...

  4. 停止过度设计,开发客户需要的软件

    在与许多不同的团队合作过之后,Greg Young发现大家做项目时经常会大幅度的过度设计.比如一个预计要开发9个月的项目,换个角度思考一下,却可能只需要几个星期就可以提交95%的功能.Young在最近 ...

  5. 西门子智能门锁设计_如何过度设计门锁

    西门子智能门锁设计 by Steven Chan 史蒂文·陈(Steven Chan) 如何过度设计门锁 (How to over-engineer a door lock) My company's ...

  6. 架构的坑系列:重构过程中的过度设计

    架构的坑系列:重构过程中的过度设计 软件架构   2016-06-03 08:47:02 发布 您的评价:       5.0   收藏     2收藏 这个系列是 坑 系列,会说一些在系统设计,系统 ...

  7. 不要盲目满足用户需求,造成过度设计

    摘自:http://www.yixieshi.com/ucd/9921.html 概念 过度设计,从产品方案与设计上来讲,指盲目满足用户需求,极度追求用户体验,最后导致需求未果,产品可用性下降.主要表 ...

  8. JDK源码系列:ThreadLocal弱引用真的是过度设计吗?

    在<码处高效:Java开发手册>这本书上详细描述了ThreadLocal的原理,也有过度设计的说法, 难道弱引用设计真的没必要吗?对此老吕要仔细分析分析,ThreadLocal到底该不该使 ...

  9. 过度设计会扼杀你的产品

    更多内容关注微信公众号:fullstack888 本文不只针对产品经理.创始人.投资者,或者任何其他在任何数字产品或服务方面有足够关系的人都可以利用本文的观点. 我相信这一点,因为我们将讨论创建产品时 ...

最新文章

  1. Binder通信模型 :ServiceManager
  2. java面试题4(基础)
  3. 推荐一位大佬,在腾讯工作十年
  4. 实现html锚点的两种方式
  5. ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理
  6. 西瓜书+实战+吴恩达机器学习(十一)监督学习之集成学习
  7. JavaScript获取当前月的第一天和最后一天日期
  8. linux service和daemon
  9. 解决Adobe Flash Player已不再受支持的问题
  10. vue+element pagination分页的二次封装,带首页末页功能
  11. python 和vba在财务上_Excel函数和VBA技术在财务工作中的应用
  12. python 处理 MovieLens 数据
  13. 矩阵相乘c语言代码用指针实现,矩阵相乘C语言实现
  14. 创建个人网站(一) 如何申请一个网站
  15. DSP28335的eCAP模块
  16. 测试人员用的专业截图软件,8款免费好用的截图软件工具
  17. 机器翻译领域最重要的论文和学术文献目录清单(清华大学NLP组)
  18. 如何找到winRE.wim (Win10无法重置电脑找 不到恢复环境,需要重装介质)
  19. STM32的脉冲宽度调制(PWM)
  20. 李兴华内部JAVA培训视频 (难找啊)

热门文章

  1. cocos 时间函数需要什么引用_2021国家公务员考试时间是什么时候 国考备考时间需要多久...
  2. java程序实验总结_Java Socket 编程实验总结
  3. python的tkinter的用法_Python Tkinter图形工具使用方法及实例解析
  4. .net 导出excel_java导出excel(easypoi)
  5. Python知识点6——函数
  6. kali使用笔记本自带无线网卡_笔记本电脑的无线网卡有必要升级吗?
  7. 一个关于小程序Iot的具体实现(MQTT版)
  8. 通过 “函数对象”看javascript函数
  9. IDNO简单生成方法
  10. memcache和redis对比