昨天看到一老兄的文章,深有感触,所以转载来给大家分享一下
转载自:http://www.cnblogs.com/mainz/archive/2008/07/06/1237046.html
什么是设计不足(under-engineering)?设计出来的系统复用性差,扩展性不强,不能灵活的应对变化,简言之,设计没到位。设计不足,多半是因为经验有限,设计能力有限。
什么是过度设计(over-engineering)?设计出来的系统比恰到好处要复杂臃肿的多,过度的封装、一堆继承、接口和无用的方法,超复杂的xml配置文件,简言之,客户需求是要一把杀鸡的刀,你给设计了一把牛刀(杀鸡用牛刀)。过度设计,多半是因为有设计的癖好,喜欢炫耀或玩弄无谓的技巧,或是喜欢把简单的问题搞复杂化。
如此说来,没有人能说自己的设计就是恰到好处的。适合的就是最好的,但什么是适合的?这个度很难把握。
客户只是告诉你他“需要一把杀鸡的刀”,至于将来有没有需求变化,有没有可能要这把刀能杀牛,客户也不知道。所以当然这个设计的度就很难把握了。
有人主张设计必须前瞻与用户需求,不能以需求为导向。因为客户从来不会告诉你他未来的需求,连他也不知道。例如,消费者从来不会告诉RIM公司,我需要一款能收企业邮件的BlackBerry手机。
但也有人持相反观点,认为设计必须以需求为导向,软件以人为本,以用为本。
其实从一定意思上说,过度设计和设计不足都是“设计错误”的一种形式。
设计不足,则意味着系统复用性扩展性和灵活性差,系统僵化,不能应对将来的需求变化,或者将来修改和维护的代价和成本会很高,这当然是设计错误;
过度设计,则意味着为了实现这个设计要付出的额外代价,例如成本上升,缺陷可能性加大,提升维护成本,甚至降低系统性能。而可维护性和系统的高性能都是系统的隐性需求,这些需求没实现好,当然也是设计错误。
从另外一个角度看来,能够进行过度设计的,多半设计能力高于设计不足的;过度的设计改回来的成本也比设计不足的改过去的成本低的多。
Martin Fowler说敏捷开发不是轻视设计重实践和重构,而是演进式的设计(Evolutionary Design,区别与计划性的设计 Planned Design)。每一次的重构和迭代都映射和更新到最新的设计中来,从而最大限度的满足客户的功能性需求和非功能性需求。从最初的Prototyping、初始需求分析与建模,然后进行演进式的架构设计和实践,这也许是适合于大多数中小型项目的最佳实践。
因为变化是无穷无尽的,需求是变幻莫测的,我们每天都跟在需求后面跑,跑的很累。而客户还要求我们随需应变,抱怨我们不够敏捷,要求我们以欢喜的心态来拥抱变化,因为变化就是IT的机会嘛! 但我们能找到“银弹”来封装所有未知的需求变化吗?我们能超前于客户的需求,能变被动为主动吗?我们能设计出一个系统超前于未来客户的需求吗?
没有一个完美的能随需应变的系统,所谓“设计之美”也是盛名之下其实难副。我们实际的目标只是最大限度的封装变化,最大限度的预测某些未来可能的变化,提供某些系统扩展和变化的可能性,从而减低未来变化的成本,为客户创造价值。
也许,最简单的才是最好的。大巧若拙,大道至简,有时候越简单的反而越难实现,而且越接近真理。也许这个只能靠个人体会和悟性了,才能最终体会到简单的精妙设计之美。熟背各种设计模式、学个一招半式的人,就像一个天天背着一把剑的剑客一样,唯恐旁人不知道其剑术高强;而真正的高手是手中无剑,却照样可以打赢别人,因为万物都可被他用来施以剑法。这才是真正的高境界。
我们缺乏的是真正有创意的创造性的设计,比如我们为什么没有设计出中国人自己的framework和platform?因为我们经验、技术和设计能力不足,大家都沉迷于玩一些小技巧,战术技巧,不是战略技巧;玩到30岁然后都去做PM做培训做销售去了。而在那些需要简约设计的地方,我们却自诩为高手而加上很多华丽的设计来维护虚幻的可扩展性和灵活性。
中国的架构师,缺乏的不仅仅是经验、技术、创意、设计能力,也许最缺乏的是思想,是心境。
分享到:
相关推荐
同时,应根据实际需求设定洁净度级别,避免因过度设计导致的资源浪费。 其次,生物安全实验室的设计也需要务实考虑。要求人流、物流、洁物、污物完全分开在实践中可能难以实现且不必要。安全措施应以实际需求为主,...
设计师应该掌握多种工具,但不应过度依赖某一软件。Adobe系列软件在国内设计行业占据主导地位,但如果失去这些工具,真正优秀的设计者依然能凭借创新思维和扎实的基本功创造出优秀作品。 总的来说,设计是一个综合...
《C++范型编程与设计模式应用》是一本旨在帮助开发者从初级阶段过渡到高级阶段的书籍,专注于C++中的泛型编程和设计模式。这本书深入探讨了如何利用C++的泛型特性来编写可复用、高效且灵活的代码,并结合设计模式,...
数据库字段设计是数据库架构设计的关键环节,涉及到数据的存储效率、查询性能以及数据一致性等多个方面。以下是一些关于数据库字段设计的重要心得: 1. 数据类型选择:数据类型的选取应根据实际存储需求进行,例如...
在新课程标准的实施过程中,我们应当注重激发学生的数学学习兴趣,同时也要深入挖掘数学知识与学生生活经验之间的联系,避免过度的形式化教学。课堂活动的设计,应当注重其有效性,促进学生思维能力的发展,鼓励学生...
此外,课件设计不合理,如文字过小、切换速度过快,也可能影响教学效果。 4. 忽视基础知识的扎实掌握 过分追求多媒体教学的新颖性,可能导致对学生基础知识的训练不足。语文教学需要扎实的阅读和写作基础,多媒体...
设计模式作为软件开发中的重要工具,旨在提升代码的复用性和可维护性,但过度依赖特定模式可能导致思维固化。实际上,设计模式的本质是抽象出可复用的设计原则,而非固定不变的套路。本文将深入探讨超越设计模式本身...
首先,情境设计应当注重数学化而非过度追求新奇。《数学课程标准》强调情境应紧密联系生活,激发学生兴趣。但在实践中,有些教师过于追求情境的新颖和趣味性,可能导致情境过于形式化,弱化了数学本质的呈现。例如,...
Less is More强调的是一种避免过度设计的态度,其核心是简约而不简单。在网页设计中,Less is More的原则意味着设计师需要剔除那些对用户体验没有实际帮助的元素,突出重要信息,提供清晰的导航和直观的交互方式,以...
通过设计招标,可以激发设计者的创新热情,避免因过度保守而导致的设计冗余和成本增加。而标准设计不仅能够缩短设计周期,降低设计成本,还有助于合理利用资源,保证设计的标准化和规范化。 当项目进入施工阶段,...
然而,过度使用触发器可能会导致性能问题,因此需谨慎使用。 最后,我们谈谈事务。事务是数据库操作的基本单元,确保一组操作要么全部成功,要么全部失败,从而维护数据的一致性。SQL Server支持事务管理,包括...
其次,我们来谈谈面向对象编程的两大核心设计方法:继承和组合。继承是OOP中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以实现代码重用,提高开发效率,并有助于实现多态性。在...
不过,过度规范化可能导致查询性能下降,因此在实际应用中,有时也会采用反范式设计,以牺牲数据一致性换取查询效率。 此外,数据表的拆分也是优化策略的一部分,分为垂直拆分(按列拆分)和水平拆分(按行拆分)。...
本视频教程将深入探讨MySQL的原理分析与架构设计,帮助你掌握如何优化数据库索引、进行分库分表以及SQL查询优化等核心技能。 首先,我们来谈谈数据库索引优化。索引是提高数据库查询效率的关键,它类似于书的目录,...
然而,当前数学试卷编制中存在诸多问题,如与教材配套不足、难度跨度大、知识覆盖面偏颇以及题目重复性高等,这些问题不仅影响了教师的教学策略,也消耗了学生的学习热情。因此,提高数学试卷编制的有效度显得尤为...
6. 物理存储与环境设计 规划文件组分布,利用多硬盘分散I/O操作,优化操作系统环境和网络配置,以适应高并发和大数据量需求。 7. 系统架构设计 针对OLTP系统,选择合适的系统架构,如C/S或三层C/S,将部分业务逻辑...
《PSD网页模板与网站效果切片:理解与应用》 在互联网设计领域,PSD(Photoshop Document)模板和网站效果切片是至关重要的工具和技术。本篇将深入探讨"BL-232_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端...
这些游戏通常设计为室内进行,活动强度适中,如"猫妈妈睡觉"等,既能保持孩子的兴趣,又能降低因过度活跃引发的安全风险。通过游戏,孩子们能够在安静的环境中逐渐平复激动的心情,为回家做好准备。 离园活动的形式...