http://www.aqee.net/kiss-my-yagni/我们都知道KISS (Keep It Simple, Stupid)和 YAGNI (You Ain’t Gonna Need It)软件开发原则,然而,过度复杂的软件仍然随处可见。

假设我们需要一个应用服务。没错,缺少分布式事务管理系统是不行的。而且需要一个消息队列——用来实现系统低耦合。哦,我们的业务逻辑看起来有很多的业务规则,那就用规则引擎来管理吧。还需要一个ESB,没错,ESB——没有它如何能让我们分布式的多个模块相互独立不依赖?数据库?当然是Oracle。但 CouchDB 和 Cassandra 也是需要的,因为关系型数据库有时不善于做某些事,我们需要更高的性能。我们还需要一些额外的应用层。还需要一些facades。还有模块化——我们可不希望我们的应用是铁板一块,否则如何能复用我们的组件?你说对了,我们要使用OSGi,这个东西很适合我们。我忘了说Web Services吗?SOA很重要。并且ESB是少不了它的。

即使没有架构师来设计,这些技术也会很自然的出现在架构设计中。每一样都看起来合情合理,无可厚非。

不。YAGNI(你不需要它们)。你开发的业务系统极有可能只有几百人同时在线,有可能只有一些业务逻辑,其余的都是大量的不报表和统计。为了实现一个可用的、而且简单好维护的软件应用,你不需要上面提到的那些技术架构。

我是不是有些自相矛盾?因为之前我还坚持说frameworks are there for your good,能够降低软件的复杂度,但现在却宣称应该远离那些技术和框架。其实并不冲突。

如果后来证明你真的需要一个消息队列模块——那就增加,把同步调用代码替换成发送消息队列的代码。如果后来你的postgresql/mysql数据库不能很好的处理这样大的数据,那就换成Oracle。如果你的用户开始增加到百万级,那就考虑Cassandra。你只需要重写那些DAO类就行了。如果后来发现需要在系统里集成很多第三方的软件,那就研究一下ESB。如果你发现在很多项目间需要将一些代码拷来拷去,那就归纳提炼,做成可复用的组件。

但不是在这种需求出现之前就做这些事情。因为系统会因为它们而变得复杂度陡增,很难迭代,尤其是当团队里并不是每个人都熟悉这些技术的情况下。

这是在倡导在计划中走一步看一步吗?难到我们积累的经验不能让我们事先判断将会需要什么吗?是的,我们可以有预见,但那是在有足够的数据支持下。在项目的前期,我们几乎什么数据都没有。

有两种东西我们知道可能会是需要的。第一,实用工具。那些能简化我们的工作的工具。例如,ORM,它通常(但并不是总数)能简化我们的数据库访问。一个依赖反射注入框架,它能简化代码之间的交互。其次是子系统。某种形式上的消息队列服务系统,NoSQL数据库,ESB,这些都是子系统。它们并不属于我们的系统的原生部分,它们不是工具。它们会增加开发、配置、部署的复杂度。我们自己需要去评估使用它们给系统造成的影响,是否值得一用。

在“凡事自己动手”的错误做法和YAGNI开发原则之间其实有清楚的界限。这都是常识。这是我们的经验发挥作用的地方——判断什么是最好的工作辅助工具,什么只是很酷的“也许会有帮助”的工具。

当有人对我说“让我们使用X来实现Y吧,”我会说:“不,我们要保持简单。我们现有的技术架构能处理它”。这样做的结果就是:更简单的软件。易于维护,易于让新手接手。而且不失功能性。

KISS My YAGNI,KISS (Keep It Simple, Stupid)和 YAGNI (You Ain’t Gonna Need It)软件开发原则的更多相关文章

  1. Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折

    Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折 1.1.1. 软件的本质:抽象  1 1.2. 软件开发的过程就是不断 ...

  2. 《OOAD与UML那点儿事》目录索引

    关键字:OOAD.UML.设计模式 各位园友,大家好,我是Bobby,在学习OOAD和开发的项目的过程中有一些感悟和想法,整理和编写了一些学习资料 [内容简介]掌握某种开发语言,让你实现了由零到一的脱 ...

  3. Unity文档阅读 第一章 入门

    Before you learn about dependency injection and Unity, you need to understand why you should use the ...

  4. KISS

    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 ...

  5. 60年前美国军方的这个编程原则,造就了多少伟大的框架--KISS原则

    摘自:https://kb.cnblogs.com/page/654057/ 作者: 贺卓凡  来源: ImportSource  发布时间: 2020-01-23 19:52  阅读: 2324 次 ...

  6. kiss框架学习

    #parse("$!jc.skinpath/exam/cart.ascx") var CategoryId = "$!this.loadCategory_combo(). ...

  7. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  8. 设计模式的征途—2.简单工厂(Simple Factory)模式

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  9. 设计模式--简单工厂(Simple Factory)

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

随机推荐

  1. (转)Ext.Button点击事件的三种写法

    转自:http://maidini.blog.163.com/blog/static/377627042008111061844345/ ExtJs的写法太灵活了,现在收集了关于Button点击事件的 ...

  2. How to put a relative path for a DLL statically loaded?

    How to put a relative path for a DLL statically loaded? I have a DLL made in Delphi 7/Windows XP tha ...

  3. Android与Unity交互研究

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/46733221 Android与Unity交互研究 unity与android交互的由来 ...

  4. 【docker】【mysql】docker安装mysql,阿里云docker镜像加速器,docker搜索查看远程仓库上的镜像,docker拉取镜像,查看本地所有镜像,查看容器的运行状况,查看容器的详细信息

    在docker上安装mysql有两种方式 1.通过Dockerfile构建 2.直接在docker hub上拉取镜像安装 =================本篇采用方法2=============== ...

  5. 无线AP和无线路由器区别wifi热点

    转自:http://network.51cto.com/art/201310/413327.htm 就像很多用户很容易混淆无线上网卡和无线网卡一样,很多用户也分不清无线AP和无线路由,小峰便是其中的一 ...

  6. 解决kylin报错:java.lang.ArrayIndexOutOfBoundsException: -1

    报错信息: -- ::, INFO [pool--thread-] cli.DictionaryGeneratorCLI: : Building snapshot of ENERGON_DM.DM_D ...

  7. 《jQuery技术内幕:深入解析jQuery架构设计与实现原理》

    <jQuery技术内幕:深入解析jQuery架构设计与实现原理> 基本信息 作者: 高云 出版社:机械工业出版社 ISBN:9787111440826 上架时间:2014-1-10 出版日 ...

  8. (Inside Out) Web地图坐标系——TDT的奇妙

    一个GIS科班出生的研究生.把已还到课本的基础GIS知识,准备又一次学习,并结合这几年下来自身在行业中GIS的应用.总结一些有用的GIS知识点.一备不时之需,二为积累沉淀,三则是年龄越大.记性越差,加 ...

  9. OpenCV中图像融合

         准备2副背景图像,注意图像黑色的部分,是作为mask用的,我们会用灰度图的方式打开它们,这时黑色的部分值为0,则图像融合时候,可以把第二幅图像在黑色的部分显示出来. 代码非常简单,注意就是图 ...

  10. 数学图形(2.23)Cylindric sine wave柱面正弦曲线

    柱面正弦曲线 #http://www.mathcurve.com/courbes3d/couronnetangentoidale/couronnetangentoidale.shtml vertice ...