文档章节

#legoo内核# -- 准则一 :小即是美

边缘行者
 边缘行者
发布于 2014/01/02 23:50
字数 2515
阅读 87
收藏 2
点赞 0
评论 0
      从目前社会的发展可知,随着社会的不断进度,分工也愈来愈精细,这种来自社会发展的规则也同样适用于软件架构设计。SOA其实就是在模拟社会的一种分工精细框架的投影,业务成熟度越高,SOA体现的价值就愈大,反之则价值体现愈小。我写这段开场白的目的其实就是想说明,基于软件架构而言,软件架构的进化过程与社会的工业化进程有着惊人的相似之处,而 #legoo内核# 的定位是模拟 工业化下的流水线作业模型。正如 文章的标题,“小”代表着每一段有效的代码都是独立的流水线上的一个节点,功能单一但绝对高效,并且可以随处复用。
      如果你准备开始编写一个程序,首先要做的就是勾勒一个完整的程序流程图,下一步则是对流程图进行修饰,保证流程图上的每一个节点尽可能的功能单一并且可复用,让节点成为业务数据的加工场与过滤器。作为一个传统的架构师,心中肯定怀着一个编写伟大程序的渴望,但是在真正的投入项目研发时,却要花费数周甚至几个月的时间去从零开始构思一个完整的项目解决技术方案,然这种方案是不可取的,其实在我现实的世界中,只要把一些小巧的解决方案组合起来,几乎可以解决90%以上的问题,好像到现在读者依旧无法体会 基于 小 的思维模式如何进行流水线设计?下面用一个很传统的程序例子来说明。
      任何一个懂电脑的人,都知道文件复制吧,也就是用户把一个文件从一个文件夹复制到另外一个文件夹抑或在同一文件夹复制,貌似如何简单的一步操作,如果我作为操作系统的复制流程设计,那么我要用如下的一种思路来对拷贝的过程进行分解,从而完成最终的拷贝,整个流程按照序号依次进行:
       1、要求用户选中所要复制的文件
       2、检查源文件是否被锁定,如果锁定则提示用户无法完成复制
       3、检查目标文件是否存在(复制的目的文件夹)
       4、如果存在一样的文件,咨询用户是否要进行覆盖抑或取消复制操作
       5、对文件加锁,并且读入文件信息。
       6、如果文件内容为0字节,则提示用,是否继续 或者退出复制
       7、申请内存,随机读取指定大小的文件块
       8、创建目标文件,并且写入文件内容,知道源文件读取完毕
       9、关闭IO流
       10、提示用户复制成功
       如果作为linux的话,可能还会加入当前用户对文件的 读写权限的过程,window下则可以忽略这一过程,一个文件的复制,只有在第7、8步才是真正的执行复制操作,而其他的流程节点则是在为复制进行合法性过滤以及对复制结束的后台动作进行收尾处理,如果你是一名程序员的话,你可能会发现,其他的几个步骤也可以适用于除了文件复制之外的其他任务,例如文件 剪切 操作。
       上面的每一个节点都可以作为一个独立的程序片段去设计,每一个片段的存在并不关心自己到底在做神马动作(复制 or 剪切),他只聚焦于自己本身的功能,例如 第3步:检查一个文件是否存在,他仅仅需要一个文件路径参数即可,也不关心他的下一步要干嘛,这就是  小 的优雅之处。
      整个流程是基于一定的规则组装而来的,类似于SOA下的bpel流程设计,但这是基于程序片段的一种流程组装,“等一下”也许读者会这样子想, 这些复杂的程序如何能按照一定的规则去运作,入参如何控制。。。诸如此类的问题,这一章节不讨论这些,文章主要是向大家阐述明白  小 的这种思维模式与方法论。
      本人也承认,就程序片段而言,完成的功能很简单也很单一,但是把这些简单的功能组装在一起,你就会体现到他的强大之处,整体功能大于局部功能的简单叠加。任何大型任务都可以按照这种思维模式 进行 “小”的设计与分解。这让我想起 本山大叔的一个小品,大意是这样子的:动物园开会,大象没来 。。。。请问,把大象关冰箱需要分几步。。。 看到了吧  程序源自生活,打开冰箱 与关上冰箱 是可复用,把任何东西放进去都需要这两个动作,所以要把这两个动作单独剥离出来设计,化整为零大法啊。。。。。
      从专业的角度来看待这个问题,首先小程序总完成既定的u,不存在二义性,这样子在任何地方复用,升级都可以保持他功能的唯一性,而不是一个函数同时要完成几项不同的业务处理,这种贫血设计是严格不建议使用的,从维护的角度来看待问题:大程序相对复杂一些,也给人们带来了理解的障碍,程序的规模越大,就越发背离了架构师的初衷,代码的行数也会成为维护人员的噩梦,1000行的代码是什么概念,~~~ 写这种代码的程序员 要好好地反思反思了。当然,任何业务也许总会出现一些让人难以理解的业务与程序,不管她的规模大小,这是因为本身他们的执行的功能就很难懂,但是这样的程序必经是少数,本人很推崇 8/2 法则,一个框架能解决80%的问题,那就足够了,剩下的20% 则完全可以特殊化处理。对于一般的初级、中级程序员而言,小的程序是容易看懂的,先对于大程序而言,商家的维护成本可以降低。
     小程序从维护和优化角度讲,都是值得推崇的,这一点我很坚信,如果出现 单点的故障,可以很快找到一个代替的方案去替换他,而无需惊动整个业务流程,抑或优化,抑或替换,唯一影响的就是节点自己。
     从内存使用角度看,小的程序对于内存消耗更加具有优势,因为他们短小,所以运行时占用内存很小,执行完则可完全释放内存。这大大降低了程序持有内存的时间,降低了内存交换与分页的请求,如果对于Java程序而言,内存的回收是影响性能的很大因素,小的程序可以降低JVM对内存回收的计算深度,便于jvm更好地进行内存回收。
     小程序更加容易被复用,小 设计的目的就是为了复用,越大的东西越不容易复用,在现实的世界中,也是这样子的。有小程序组装的业务流程更加能适应多变的业务,因为每个小程序之间的连接是基于某种契约配置的,而不是基于硬编码 铸就的(可能会牺牲一些性能,依旧用8/2法则来回答 哈哈)。
     通过我这几年的不断积累,越来越喜欢把程序往 小 的方面切割,随着项目的不断壮大,感觉自己越游刃有余。乐高积木 就是一个伟大的发明,因为我创造的积木形状越多,后期可服用的也越多,感觉自己 是 活字印刷术 一般了 ~~ 神奇~~~~
   让每个程序片段只完成一个功能,尽量保持入参 与 出参的简洁性。小程序从设计到编写 到维护,都有无比拟的优越习性,对未来业务发展的包容性将更加好,可以应对将来更加复杂的业务,做出较好的应对。

   让每一个程序只做好一件事    这就是  小  的内涵,也是我结尾要说的一句话。 
   
   现在时间  23:47 分,关于 小 既是美的话题 就此打住, 洗漱休息。一个人的家  显的格外的冷清~~~~~~ 

© 著作权归作者所有

共有 人打赏支持
边缘行者
粉丝 73
博文 64
码字总数 117839
作品 0
广州
技术主管
#legoo内核# (1)设计准则

编程N年,积累下来的一些方法论,映射到目前自己维护 Legoo内核,需要自己给自己一个归纳与抽象,在正式介绍设计架构之前,我先从更为抽象的角度来看待他,他的设计坚持了什么原则,这些原则...

边缘行者 ⋅ 2013/12/22 ⋅ 0

#legoo内核# 准则四:使用配置提高杠杆效应

现在的计算机发展可谓是一日千里,特别是我在工作中,总是抢计算机的工作,无法让计算机加倍努力工作,让一切都变的自动化,例如在 程序的持续集成方面,至少我还用认为干预的模式,目前有很...

边缘行者 ⋅ 2014/01/19 ⋅ 2

Linux:内核开发者 Sarah Sharp 宣布退出

曾经公开呼吁Linus Torvalds文明用语的内核开发者Sarah Sharp宣布退出(Closing a door)。SarahSharp说,过去一年多时间她已经逐步终止了手中的各项社区工作,转交了USB3.0主控制器驱动的维...

oschina ⋅ 2015/10/07 ⋅ 63

美图:11 亿用户增长背后的感性与理性

作者 | Fox Lui,美图 Head of International Business 来源 | GrowingIO 2017增长大会 大家好,我是 Fox Lui,现任美图 Head of International Business,致力于让全世界的人都成为美图的用...

张溪梦 Simon ⋅ 2017/12/21 ⋅ 0

Red Hat 成为首家年入突破10亿美元的开源厂商

开源解决方案提供商红帽周三发布了该公司2012财年第四季度及全年财报。受公司业绩超市场预期的推动,红帽股价在周三的盘后交易中大涨8.93%。在截至2012年2月29日的第四财季,红帽营收为2.97亿...

虫虫 ⋅ 2012/03/29 ⋅ 16

Linux 内核引入了“冲突准则”

以出口不逊著称的Linux作者Linus Torvalds在内核4.0-rc3中合并了一个“冲突准则(code of conflict)”文档,限制代码评审过程中的语言暴力现象,Linus评价说,“让我们看看它是否有效果。”...

oschina ⋅ 2015/03/12 ⋅ 12

查看linux系统版本是32位的还是64位的

一、 [root@linuxzgf ~]#getconf LONG_BIT [root@linuxzgf ~]#getconf WORD_BIT (32位的系统中int类型和long类型一般都是4字节,64位的系统中int类型还是4字节的,但是long已变成了8字节inu...

942267027 ⋅ 2014/05/02 ⋅ 0

linux查看系统位数

一、 [root@linuxzgf ~]#getconf LONGBIT [root@linuxzgf ~]#getconf WORDBIT (32位的系统中int类型和long类型一般都是4字节,64位的系统中int类型还是4字节的,但是long已变成了8字节inux系...

BryanYang ⋅ 2013/11/10 ⋅ 0

MSM 芯片组摩托罗拉设备的 Linux 内核--kernel-msm

kernel-msm,Linux 内核,用于使用基于 MSM 芯片组的摩托罗拉设备。 即是,摩托罗拉安卓智能手机的安卓系统内核。由摩托罗拉开源。

匿名 ⋅ 2017/01/18 ⋅ 0

红帽第一季度净利润4040万美元 同比增长7.8%

北京时间6月20日消息,红帽今天发布了2014财年第一季度财报。报告显示,红帽第一季度营 收为3.63亿美元,比去年同期的3.15亿美元增长15%;净利润为4040万美元,比去年同期的3750万美元增长7...

oschina ⋅ 2013/06/21 ⋅ 9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长...

颖辉小居 ⋅ 18分钟前 ⋅ 0

利用有限制通配符提升API灵活性(28)

1、参数化类型是不可变的 List<String> 不是List<Object>的子类,但是二者是有联系的 利用有限制的通配符类型处理类似情况 List<? extends Object>(生产者) Collection<? super E>(消费者......

职业搬砖20年 ⋅ 24分钟前 ⋅ 0

ssm框架 +bootstrap分页

这里有两种方式 方式一:自己写分页 方式二:使用插件PageHelper 1.自己写分页 1.1 效果 1.2 实现过程 1.2.1 创建分页公共类 //---------------------------1.属性-------------------------...

Lucky_Me ⋅ 31分钟前 ⋅ 0

Istio

helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml after $ kubectl create namespace istio-system$ kubectl create -f $HOME/ist......

openthings ⋅ 31分钟前 ⋅ 0

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 36分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 37分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 41分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 54分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 59分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部