设计匠艺 | 小即是美之一

博尔赫斯说:“写散文体的短文——寓言、神话、短故事——给了我某种神秘的满足。想起这些篇章,就仿佛想到硬币:实在、结实、闪光的小物体,更多的东西的样品。”显然,小物体之美,让博尔赫斯着迷。

同样,在软件设计领域里,小的设计同样让我着迷。这里所谓的“小”,并非绝对的小,而是强调一种恰如其分的设计哲学。在开发过程中,每一次迭代的目标不宜设立过大,需小步前行,避免过度设计。在设计开发时,整个系统最好由松散耦合的细小模块组成。这些细小模块由于功能相对独立而单一,因而更易于理解。

在设计系统架构时,我们要注意克制做大做全的贪婪野心,尽力保证系统的小规模。Unix的缔造者之一Dennis Ritchie就曾遭受过将系统做大做全的滑铁卢。他在贝尔实验室的第一个任务,是参与大项目Multics,即开发一个前所未有的、可以多人使用的、同时运行多个程序的操作系统。该项目由贝尔实验室、麻省理工学院和通用电气公司三方联合研制,但是由于设计过于复杂,迟迟拿不出成果,1969年贝尔实验室宣布退出。

痛定思痛,Dennis Ritchie和同事Ken Thompson之后在设计Unix时,就吸取了Multics设计复杂而导致失败的教训,提出了"保持简单和直接"(Keep it simple stupid)的原则,即所谓KISS原则。

遵循KISS原则,整个Unix系统由许多小程序组成,每个小程序只能完成一个功能,任何复杂的操作都必须分解成一些基本步骤,由这些小程序逐一完成,再组合起来得到最终结果。表面上看,运行一连串小程序很低效。但是事实证明,由于小程序之间可以像积木一样自由组合,所以非常灵活,能够轻易完成大量意想不到的任务。而且,计算机硬件的升级速度非常快,所以性能也不是一个问题。另一方面,当把大程序分解成单一目的的小程序,开发变得容易,Unix在短短几个月内就问世。

我们千万不要轻视小的力量。

专注的小可以保证独立进化,从“自治”思想看,它需要实现一定程度的自给自足,并保证对外交互的接口足够稳定。这符合老子的“大国小民”的思想。在框架设计上,为保证框架的小,常常会运用内核模式,识别出整个框架的核心功能,作为整个框架的基础。其余功能皆可视为框架的外围功能,根据关注的域对其进行切分。这些外围功能互相之间应尽量减少耦合,使其能够独立进化。Spring框架的设计正是遵循了这样的设计理念。除了Spring IoC是整个框架必备的组件之外,Spring MVC、Spring Batch Job、Spring Data等之间没有依赖关系,可以根据项目自身情况酌情裁剪。

那么,如何才能保证设计的系统足够小?首先,在设计思想上要确立“小即是美”的美学观,要清晰地辨别且能够欣赏小的灵活之美,完整之美与轻盈之美。只有在思想上认同它,你才能顺势而为;只有从心理上感受到这种美丽,你才能响应它的召唤。

灵活之美,在于它能快速地响应变化,这种变化可能是局部的,也可以是整个设计方向的改变。例如,在多数企业系统和互联网系统中,都需要分离Online和Offline任务,以指定不同的架构决策。又例如,我们可以设计独立的、具有最小功能子集的Batch Job来承担后台任务。这些Batch Job可以作为一个单独的应用程序执行在单独的进程中。一旦需求要求我们对设计做出改变,我们也能将修改控制在足够小的范围中,从而保证对整个系统不会带来巨大的影响。

若遵循EDA(Event Driven Architecture)模式,我们可以根据业务领域的不同,设计出功能最小完整的自治组件。组件之间的通信通过事件来传播,利用发布者/订阅者的方式解除组件之间的耦合;又或者利用消息传递来处理业务逻辑,例如在AKKA中,我们可以设计出灵活而小的Actor对象。而微服务(Micro Service)架构则从服务级别展现了设计的灵活之美。

轻盈之美,体现在它的功能并不臃肿,对外部的依赖较少,既容易在系统中快速引入,又不会使原有系统变得笨重,还能很方便地部署或者启动。专注的功能常能体现这种轻盈,例如Gradle专注于构建,Guice专注于依赖注入。

展现了轻盈之美的组件往往具有良好的可测试性。我们可以利用六边形架构将系统分隔为内、外两个边界,凡是系统对外的通信,皆通过端口(Port)和适配器(Adapter)完成,这样就能较好地解除对外部环境的依赖,提高系统的可测试性。而清晰的边界划分也是设计小组件的一种有效手段。

若对于框架或平台而言,则需要尽力降低框架或平台的侵入性。当年Rod Jonson之所以提出J2EE Without EJB,正是因为EJB的侵入性带来了诸多病症。

完整之美,在于它是自足的。完整并不意味着大而全,而在于它足够精简,没有冗余。当然,它同时应该是没有残缺的。残缺,意味着它无法在没有外部支持的情况下,完成自己应该完成的工作。这种美感符合“麻雀虽小,五脏俱全”的标准。Standalone的微服务,正好体现了这种自容器的完整之美。

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2014-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯技术工程官方号的专栏

服务器失效那些事

服务器出现故障是大家都非常关心的,而服务器由CPU,内存,磁盘,主板,电源等多种部件组成,一定会有一定的失效率。本文介绍服务器失效的特性及一些部件的失效标准,探...

3365
来自专栏张善友的专栏

.NET 3.5-4.0 并行计算的支持

在以往的计算机发展历史中,硬件技术的发展,特别是CPU频率的不断提高,总是给软件带来更强的性能提升。从386到586,从赛扬到奔腾,每次CPU频率的提升,都带来...

1798
来自专栏PPV课数据科学社区

【学习】Think SAS(一)

为什么你应该学Sas?本文不想卷入SAS与R,或者与SPSS、S-Plus、Matlab等统计软件孰优孰劣的争论中去,我是说,作为一个有志于投身工...

3034
来自专栏喔家ArchiSelf

IoT中的高音质音频设计

音频是许多物联网应用不可或缺的组成部分, 包括消费品(如扬声器、耳机、可穿戴设备),医疗设备(如助听器),自动化工业控制应用、娱乐系统和汽车的信息娱乐设备等。

674
来自专栏镁客网

Broad研究所公布两大研究成果,共同提高CRISPR编辑的精准度 | 黑科技

1190
来自专栏华章科技

天天在做大数据,你的时间都花在哪了

随着数据变多了,量变导致质变,数据足够大后其内部的隐含的规律会越来越精确和完整。机器学习则是将数据内存存在的这种隐含关联给挖掘出来的一项技术。

742
来自专栏人工智能快报

人工智能帮助科学家开展个性化医疗研究

据外媒报道,人工智能帮助科学家分析单氨基酸变异对人体的影响,推动个性化医疗研究。 计算生物学家发现了蛋白质变异引起的令人惊讶的强烈影响。每个人都有唯一的DNA“...

3135
来自专栏老九学堂

【拓展】大数据时代,你清楚什么是网络吗?

一、网络的概念 如果说计算机的发明是一个奇迹,那么网络的发明就是计算机发展中的一个奇迹。什么是网络?网络是连接在一起共享数据和资源的一组计算机。我们把分布在不同...

3445
来自专栏工科狗和生物喵

【计算机本科补全计划】NFV/SDN初识(为了避免保研复试被电话面试)

正文之前 所有的通信应用无非就是两部分组成:计算和网络。 这两者关系密不可分,但两者关系严重缺乏对称性,网络一直拖累着计算。就好像是发快递,你打个包(计算)只需...

3476
来自专栏SDNLAB

毫米波:5G部署跳不过的一道坎

5G被业界视为革命性的无线技术,但作为下一代标准基础之一的高频谱要求运营商采用与以前截然不同的方式来构建网络并对之前的蜂窝网络进行升级。 ? 20世纪80年代的...

3609

扫描关注云+社区