KISS My YAGNI,KISS (Keep It Simple, Stupid)和 YAGNI (You Ain’t Gonna Need It)软件开发原则
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)软件开发原则的更多相关文章
- Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折 1.1.1. 软件的本质:抽象 1 1.2. 软件开发的过程就是不断 ...
- 《OOAD与UML那点儿事》目录索引
关键字:OOAD.UML.设计模式 各位园友,大家好,我是Bobby,在学习OOAD和开发的项目的过程中有一些感悟和想法,整理和编写了一些学习资料 [内容简介]掌握某种开发语言,让你实现了由零到一的脱 ...
- Unity文档阅读 第一章 入门
Before you learn about dependency injection and Unity, you need to understand why you should use the ...
- KISS
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 ...
- 60年前美国军方的这个编程原则,造就了多少伟大的框架--KISS原则
摘自:https://kb.cnblogs.com/page/654057/ 作者: 贺卓凡 来源: ImportSource 发布时间: 2020-01-23 19:52 阅读: 2324 次 ...
- kiss框架学习
#parse("$!jc.skinpath/exam/cart.ascx") var CategoryId = "$!this.loadCategory_combo(). ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- 设计模式的征途—2.简单工厂(Simple Factory)模式
工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...
- 设计模式--简单工厂(Simple Factory)
工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...
随机推荐
- Linux知识(2)----中文输入法安装
Ubantu14.04在English的环境下,没有中文输入法,自带的ibus不完整.现在基于ibus框架,有几个比较好用的输入法,如sunpingyin和google pinying,还有五笔的输入 ...
- Mahout学习之Mahout简单介绍、安装、配置、入门程序測试
一.Mahout简单介绍 查了Mahout的中文意思--驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了... 附logo: (就是他,骑在象头上的 ...
- 我弄的一些TASKER配置
http://tieba.baidu.com/p/2184969007 我弄的一些配置,需要的童鞋们找自己想要的吧,有些配置感觉还是很繁琐,请高手不吝赐教才好,图片太多,就发链接了. ◆保持屏幕开启, ...
- STM32F10X FLASH and SRAM size
STM32F10X FLASH Size SRAM Size Device Type --------------------------------------------------------- ...
- 获取easyui calendar 属性
<div id="cc" class="easyui-calendar" style="width:250px;height:250px;&qu ...
- python的threading.Thread线程的start、run、join、setDaemon
Pycharm整体看下Thread类的内容:模拟的是Java的线程模型 表示方法method,上面的锁头表示这个是类内部的方法,从方法名字命名规范可以看出,都是_和__开头的,一个下划线表示是子类可以 ...
- Hadoo生态中pHive HBase 项目的区别
http://jenmhdn.iteye.com/blog/1678789 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于H ...
- 原生对话框【Dialog】AlertDialog和.Builder
使用大全 public class MainActivity extends ListActivity ); pd.setProgress(i);//改变当前进 ...
- 高性能WEB开发:深入理解页面呈现、重绘、回流
在讨论页面重绘.回流之前.需要对页面的呈现流程有些了解,页面是怎么把html结合css等显示到浏览器上的,下面的流程图显示了浏览器对页面的呈现的处理流程.可能不同的浏览器略微会有些不同.但基本上都是类 ...
- [CF 295A]Grag and Array[差分数列]
题意: 有数列a[ ]; 操作op[ ] = { l, r, d }; 询问q[ ] = { x, y }; 操作表示对a的[ l, r ] 区间上每个数增加d; 询问表示执行[ x, y ]之间的o ...