摘自:https://kb.cnblogs.com/page/654057/

作者: 贺卓凡  来源: ImportSource  发布时间: 2020-01-23 19:52  阅读: 2324 次  推荐: 20   原文链接   [收藏]

  大约在60年前,美国军方的软件开发开始遵循一个原则,叫KISS原则。他们希望武器系统中所用的每个指令都是极其简单和傻瓜式的。这个原则后来在编程领域中被广泛采用,如今好多著名的开源框架都是遵循这一原则来开发,并最终取得了巨大的成功。

  在上一文中《Apache的架构师们遵循的30条设计原则》,第一个原则便是KISS原则,几年前简单的了解过这个原则,前几日又翻出来,仔细查看后,倍感震惊,这篇原文可以说道破了编程的天机。以下原文的翻译:

  KISS表示的是什么?

  KISS 是Keep It Stupid Simple 或 Keep It Simple,Stupid的缩写。

  KISS的含义

  该原则在我的多年的软件工程生涯中取得关键、巨大的成功。当今的软件工程师和开发者们有个共同的问题,那就是他们总是慢慢地使得问题复杂化。正确的做法应该是当开发者遇到一个问题后,把问题拆分成一个个能够明白的小块,然后进入编码阶段。但我会说,10个开发者中有8个或9个都没有把问题分解成足够小或可以理解的足够小的部分。这就导致了即使是一个非常简单的问题最后也变成了非常复杂的实现,另外一个副作用就是意大利面代码,在BASIC里只是一个goto语句的事情,在Java中却需要500到1000行代码,每个方法都有几百行代码。

  你需要先想好问题的解决步骤一共分为几步,然后再进入编码。而不是拿到需求后,就开始一边写代码一边去满足需求。这样做的好处就是你的代码会变的足够容易理解和足够清晰。

  我们能从KISS中获取到什么好处?

  1. 你可以更好地解决更多问题。

  2. 你将可以通过很少的几行代码去解决复杂的问题。

  3. 你将可以产出高质量的代码。

  4. 你将可以构建更大更易维护的系统。

  5. 当新的需求来了后,你的代码将会更加的灵活,易于扩展、易于修改和重构。

  6. 你将完成比你想象得更多的事情。

  7. 你将能够工作在一个大型开发团队和大型项目中,因为所有的代码都是stupid simple。

  我如何把KISS原则用到我的工作中?

  这里有几个简单的步骤可供执行,但有一定挑战。就像说起来的那么简单,keep it simple,主要是需要耐心,更多的靠你自己。

  • 要谦虚,不要认为自己是个天才,这是你第一个误解。只有谦虚了,你才能真正达到超级天才的水平,即使不行,who cares!你的代码那么stupid simple,所以你不需要是个天才!

  • 将你的任务分解为4-12小时的子任务。

  • 把你的问题拆分成多个小问题。每个问题用一个或者很少的几个类来解决掉。

  • 保持你的方法足够小,每个方法永远不要超过30-40行代码。每个方法都应该只处理一个小小的问题,不要搞太多uses case进去。如果你的方法中有多个分支,尝试把他们拆分成多个小的方法。这样不仅容易阅读和维护,找bug也更快。慢慢的你将学会爱。

  • 让你的类也小点,原则和上面的方法是一样的。

  • 先解决问题,然后开始编码。不要一边编码,一边解决问题。这样做也没什么错,但你有能力提前把事情切分成多个小的块,然后开始编码可能是比较好的。但也请你不要害怕一遍遍重构你的代码。另外行数还不是为了衡量质量的标准,只是有个基本的尺子而已。

  • 不要害怕干掉代码。重构和重做是两个非常重要的方面。如果你遵循上面的建议,重写代码的数量将会最小化,如果你不遵循,那么代码很可能会被重写。

  • 其他的任何场景,都请你尝试尽可能的简单,simple,这也是最难的一步,但一旦你拥有了它,你再回头看,就会说,之前的事情就是一坨屎。

  有没有一些KISS原则的例子

  太多了,以后我会把一些不错的案例po到这里。但现在我想先给你一些我的观点和想法:

  世界上的很多伟大的算法几乎总是有很少的数行代码。当我们去看这些的时候,会发现很容易理解。这些算法发明者,他们把问题拆分,直到容易理解的程度,然后去实现它。

Many great problem solvers were not great coders, but yet they produced great code!

  许多伟大的问题解决者(problem solver)都曾不是伟大的程序员,但他们却产出了伟大的代码!

  KISS只能用于java代码?

  显然不是,它可以用于很多编程语言,并且甚至可用于你生活的其他的领域。当然不能用于你的感情、爱,更重要的是,不能用在你的婚姻上。

  相关阅读:

  Apache的架构师们遵循的30条设计原则

  如何写一个清晰明了的bug

60年前美国军方的这个编程原则,造就了多少伟大的框架--KISS原则的更多相关文章

  1. 优秀程序设计的Kiss原则(keep it simple,stupid)

    优秀程序设计的Kiss原则(keep it simple,stupid) 良好的编程原则与良好的设计工程原则密切相关.本文总结的这些设计原则,帮助开发者更有效率的编写代码,并帮助成为一名优秀的程序员. ...

  2. 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)

    2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...

  3. [转] .NET领域驱动设计—初尝(疑问、模式、原则、工具、过程、框架、实践)

    阅读目录: 1.1.疑问 1.1.1.UML何用 1.1.2.领域建模 1.2.模式 1.3.原则 1.5.过程 1.6.框架 1.7.项目演示 最近在研究DDD颇有收获,所以整理出来跟大家分享,共同 ...

  4. 设计模式原则(3)--Dependency Inversion Principle(DIP)--依赖倒转原则

    1.定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对接口编程,而不是针对实现编程. 2.使用场 ...

  5. 进阶篇:4.1)DFA设计指南:简化产品设计(kiss原则)

    本章目的:理解kiss原则,明确如何简化产品的设计. 1.前言:kiss原则,优化产品的第一原则 如果要作者选出一个优化产品的最好方法,那一定是kiss原则莫属.从产品的整体设计到公差的分析,kiss ...

  6. .NET领域驱动设计—初尝(一:疑问、模式、原则、工具、过程、框架、实践)

     .NET领域驱动设计—初尝(一:疑问.模式.原则.工具.过程.框架.实践) 2013-04-07 17:35:27 标签:.NET DDD 驱动设计 原创作品,允许转载,转载时请务必以超链接形式标明 ...

  7. 第2章 面向对象的设计原则(SOLID):6_开闭原则

    6. 开闭原则(Open Closed Principle,OCP) 6.1 定义 (1)一个类应该对扩展开放,对修改关闭.要求通过扩展来实现变化,而且是在不修改己有的代码情况下进行扩展,也不必改动己 ...

  8. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html   上一讲鸡啄米讲的是VS2010应用 ...

  9. 【Java并发编程】:并发新特性—Executor框架与线程池

    Executor框架简介 在Java5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocur ...

随机推荐

  1. 085-PHP文件引用include(二)

    01.php <?php function foo() { global $color; include '02.php'; echo "A $color $fruit"; ...

  2. Spark调优(一)

    一.对多次使用的RDD进行持久化 如何选择一种最合适的持久化策略? 默认情况下,性能最高的当然是MEMORY_ONLY,但前提是你的内存必须足够足够大, 可以绰绰有余地存放下整个RDD的所有数据.因为 ...

  3. Python MongoDB 插入文档

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  4. Bean Java配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  5. 【LeetCode】二叉树的最大深度

    [问题]给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数.说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7 ...

  6. InstrumentationTextCase 测试

    <instrumentation        android:name="android.test.InstrumentationTestRunner"        an ...

  7. css笔记01

    CSS样式(Cascading Style Sheets) 表格布局缺陷: ​ 嵌套太多,一旦顺序错乱页面达不到预期效果 ​ 表格布局页面不灵活,动一块整个布局全都要变 语法: ​ 在style标签中 ...

  8. jdk8安装

    ==安装jdk1.8== [root@ycj ~]# mkdir -p /usr/local/src/jdk //创建目录 [root@ycj jdk]# cd /usr/local/src/jdk ...

  9. Android群英传神兵利器读书笔记——第二章:版本控制神器——Git

    本人一直是徐医生的真爱粉,由于参加比赛耽误了8天,导致更新得有点慢,大家见谅 2.1 Git的前世今生 Git是什么 Git安装与配置 2.2 创建Git仓库 Git init Git clone 2 ...

  10. 《Thinking in Java》中讲到了final,发现自己有部分地方迷糊

    1.1当给全局的静态字段加上final时,系统是不会给其赋默认值的,若不手动初始化,会编译时错误——Variable 'xxx' might not have been initialized. 1. ...