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. codeforces 148E Aragorn's Story 背包DP

    Aragorn's Story Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/probl ...

  2. PAT甲级1016. Phone Bills

    PAT甲级1016. Phone Bills 题意: 长途电话公司按以下规定向客户收取费用: 长途电话费用每分钟一定数量,具体取决于通话时间.当客户开始连接长途电话时,将记录时间,并且客户挂断电话时也 ...

  3. git fetch, git pull 以及 FETCH_HEAD

    git push. 这个很简单, 其实和后面的差不多, 这里就不讲了. 唯一需要注意的地方是: git push origin :branch2, 表示将一个内容为空的同名分支推送到远程的分支.(说白 ...

  4. (转)资源监控工具Spotlight监测LINUX

    个人1.安装spotlight,Spotlight on Unix2.配置spotlight,注意spotlight默认不能使用root用户进行连接,需要用户自己创建一个具有root权限的用户.(1) ...

  5. PHP自动加载下——PSR4

    1.先来介绍一下PSR规范 PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR规范,其中自动加载涉及其中两个规范,一个是PSR0,一个是PSR4, PSR0 ...

  6. PSCollectionView瀑布流实现

    [-] 一基本原理 二具体实现 相关数据结构 视图更新方式 relayoutViews方法 removeAndAddCellsIfNecessary方法 select方法 重用数据块视图机制 三使用方 ...

  7. STM32F401

    The STM32F401 line is the entry level to the STM32 F4 series. It is designed for medical, industrial ...

  8. set bin 集合

    set: create table rr(zz char(4));create table test5 (rr set('美丽','态度好','温柔','善良'));insert into test5 ...

  9. JQuery与JavaScript onload的区别

    1.window.onload 不能有多个,后面的功能会覆盖前面.而jQuery(document).ready()可以存在多个. 2.window.onload 在页面所有元素(包括图片,引用文件) ...

  10. 7)Linux程序设计入门--网络编程

    )Linux程序设计入门--网络编程 Linux系统的一个主要特点是他的网络功能非常强大.随着网络的日益普及,基于网络的 应用也将越来越多. 在这个网络时代,掌握了Linux的网络编程技术,将令每一个 ...