看似倒退的过程 - 技术的进步不是简单的重复

作者:钓鱼城  于 2021-6-30 05:16 发表于 最热闹的华人社交网络--贝壳村

通用分类:流水日记

早年流行的计算机软件语言是C语言。这是一种流程化的语言(Procedural Programming Language, 或PPL, 请原谅我不能找到更恰当的词来翻译)。这种语言的设计理念强调每一个流程要由多个步骤逐一完成。如果说抽象(Abstraction)是科学研究一切实际问题的初始的一步,那么C语言还是处于抽象过程中最低级的阶段,是最接近于原生系统的计算机语言。因此人称没有C不能应用的领域,不能解决的问题。它的基本建造单元就是那一个个字节(byte)和原始变量(primitive type)。C语言不属于Object Oriented Programming(OOP)。所谓OOP, 把具有特定功能的代码模块化(Object oriented)。然后在建立一个程序或者程序库的时候,只要把这些模块(Objects)拿来合理地拼装搭配在一起,就能很快做成一个完整的程序。这种OOP有利于模块功能的标准化,通用化,并且便于重复使用和替代,也适合大规模生产,拼装和测试, 以及运行的管理和维护。这显著地缩短了软件的生产周期。是走向大型复杂的软件集约化生产最重要的一步。

                                     

                               

                                              Procedural   vs    Object Oriented


其实这种演化过程在近代的工业化进程中,早就不是第一次出现。举个例子。以前人们建房屋,要自己准备泥沙,石子,和石灰。然后自己拌三合土,一小铲一小铲从桶里舀出来,附在用作2X4的竹篾材料上,来建房屋的墙(这是四川和重庆地区农村的建墙方法,北方或者其它地区可能不同)。这就是为什么,以前的房屋建不高 - 主要是承重力不够。这种修建过程也非常缓慢,因为要等前面的灰土干硬后才能继续上灰。这里基本的建筑材料单位是石子和沙子。可以想象,用沙子一点一点来砌一堵墙,一栋楼,会是多么漫长的一个过程。在计算机软件的发展中,用C语言写源代码就是这样的一个建墙过程,它用它自己的“沙”和“石子”来一片片的搭起一个程序。
后来人们发现,可以用粘土做成坯,再烧制成一块块的砖。这意味着基本建材单位模快化大型化了(对比一下砖头和沙泥)。这产生了建筑业的一次分工。可以在专门的工区生产砖这样“大型”的建筑材料,预先大批地制造出来,然后运到建筑工地,再把它们一块一块砌起来就行了。这样做,跟用三合土抹稀泥上墙相比,快速,简单,专门;工作起来,省时省工省力。这掀起了一次建筑工业和建筑设计的革命。与此相似,计算机语言构架的模块化(OOP), 同样经历了这样一个过程。C++和Java等等就是这样使用“砖块”(Object),而不是仅仅使用“泥沙”(byte,primitive type)来建程序的例子。那就是为什么,这些OOP构架变成了现代软件发展的趋势并经久不衰。

                                                    

                                                 Object Oriented Programming 
另一个例子是五十年代末集成电路的发明和应用。上世纪六七十年代的中小学生可能有这样的经历。那时,要想自己装一个无线电(就是有一个或者两个三极管的收音机),你要把一个一个分立的二极管,三极管,电阻,电容焊接起来。你自己要去钻布线的孔,然后插基脚,连铜丝线,沾松香,焊锡,然后焊接。这样做的结果,虚焊的点多,容易脱落,成功的机率小,质量不可靠。用这样的工具和方法要想焊接出大型电路的可能性很小。那时根本没有钱去买集成电路块,也买不到 - 集成电路是军用国防物资。后来半导体厂生产出印刷电路基板,预留了各个元件的位置。这样虽然有一些好处,但仍旧不能把电路小型化。看着元件密密麻麻布满了一版,其实所具有的功能还是太少。随着电路越来越复杂,靠简单重复地增大体积(volume),不可能是未来的发展方向。
一九五八年,德州仪器的工程师杰克。基尔比为了解决晶体管的成本居高不下(一个晶体管当时作价十美元),复杂电路需要的元件越来越多,电路总体积越来越大的问题,他利用其他同事休假,实验室无人打扰的两周时间,透彻地分析了问题的所在,提出了在一块硅晶片上建造一个完整电路的设想, 由此可以把电路模块化,并把体积做到极小。这就是集成电路的雏形。这是现代电子工业的一个飞跃,其意义非同寻常。
再回到建筑材料的模块化趋势上来。尽管砖头比直接用泥沙建房已经好了很多,人们觉得还可以继续在模块大型化这个方向上走下去。近几十年,人们做出了更大更重的水泥预制件,可以达到几十吨上百吨,然后把它们运到建筑工地,桥梁工地,拼装起来,这样几天就可以建一层楼,或者完成一个桥梁的跨栱。要是用水泥和着石子一铲一铲来慢慢修建,如果说不是不可能(桥栱可能真是不可能这样建),那起码也要化几十倍上百倍的时间来做同等的工程量。

            

                                        使用预制件的桥梁拼装

随着时间的发展,这个使模块大型化的过程在前几年达到了极端。三D打印,甚至可以用打印机(printer)按设计蓝图把整栋房子打印出来,然后拉到工地上安装好就行了。这样可以随时随地大批量生产, 也方便更改设计。可以预见,未来模块的大型化,会持续发展。这就是进入了所谓的整体化(Monolith)阶段。以下是2019年一则新闻提到的第一所3D打印的商品房,要价30 万美元。

       这栋3D打印的House,一共有1407平方英尺(130平方米)生活空间。
对比之下,近三十年计算机软件的发展,也大致经历了类似的发展过程。从九十年代IT大跃进开始,程序功能模块化得到了强调和应用。人们发现用这些一块一块的“砖头”(Objects)搭建一个大型的应用程序越来越方便,越来越快捷。一个以前看起来复杂无比的东西,现在三下两下就拼装好了。人们尝到了模块化(OOP) 的甜头,因此倾向于建造更大更强的模块,让其具备所有需要的功能。就像可以把所有鸡蛋装在一个篮子里一样,你可以把所有的子程序装进一个大的软件包里,把它捆紧扎好,这样上火车,下飞机,到哪里都只提一个包,很方便是不?这也就进入了整体化程序(monolithic programming)阶段。一个整体化(monolithic) 程序,就是产生单一大型的功能整体。它包括资料存储,数据分析,输入输出,以及所有的操作。
So far so good,形势似乎一片大好。软件构架的发展似乎走在正确的方向上。可是问题开始慢慢产生了。那就是,如果一个程序变得庞大无比,无所不包,其内部各部分之间必然存在着强烈的相互依赖和关联。它的每一部分代码都需要运行良好,否则整个程序就会停止运作。这产生了一个要么大家一起工作,要么一个不工作,全部不工作的结局!要是其中的一部分代码不能正常运行,那就会造成整个程序宕机的后果!这怎么得了!这不就是那种绑架式的爱情的翻版:说爱不爱我?爱,就一切相安无事,风平浪静;不爱?那行,我们谁都别活了,一起跳崖!这种一荣俱荣,一损俱损的工作方式不反映现代英特网的特点,更不符合现代电商24小时不停机的要求!
从这里出发,接下来,软件构架的演化发生了跟传统建筑业发展方向上的分野 - 计算机程序设计的变革在于,模块不仅仅要大型化,模块更需要强调智能化。
确实如此。进入二十一世纪,软件的构架设计出现了一个新的倾向。那就是放弃大型,单一的整体性(monolithic application)程序构架,而重新把大型程序小型化,把大而单一的程序分成一个个更小且相对独立的程序个体(loose coupled)。这就是著名的微型服务块(Micro-services) 构架。初看起来,这跟模块(OOP)大型化的趋势刚好相反。难道, 这是在简单地走回头路吗?
这个问题也曾让我困惑不解,不能判断这是不是正确的发展方向。在仔细观察分析之后,我慢慢认识到这种带有“返祖”, “回归”特征的微型化服务结构(micro-service)的优劣之处。原来此微型模块和原来的小颗粒(泥沙,甚至砖石)是不一样的!而且大相径庭。看官,且听我细细道来。
以前的一块砖就是一块砖,一堆泥沙烧制而成,其内部也没有什么特别的, 没有任何功能设计(空心砖除外)。在这种情况下,当然是把这砖做得越大越好,做成超大型预制件最好。现在,对于一个所谓的微型服务程序块(micro-service), 我们也可把它看着是一块块有不同功能的“砖块”。但这砖块有它自己完善的内部结构,一种功能化的内部结构。每一个micro-service程序块,有它独立的信息(data) 存储,输入输出,数据处理,可以完全不依赖于其它的micro-service程序块而独立存在。但是,这些micro-service“砖”块又能够互相连接,沟通,可以协同起来做同一件事,就好像是一个大型的整体预制件一样; 也可以分开来做不同的事。从某种意义上讲,micro-service是一个模块的智能化构架,就像砖被掏空了,被间谍在里面装了一台发报机。
也可以说,它的发端来自于现代仿生学。举个例子,micro-service程序构架就像蜜蜂的复眼超级结构,蜜蜂原来的一个大眼睛,进化成了现在的成百上千(大约5000)的小复眼构成。一个小复眼都有一套集光系统和感光系统,复眼愈大,小复眼数愈多,视觉就愈发达。原来的一个大眼睛坏了,那个大眼睛就整个都坏了,两个大眼睛坏了,那不就失明了?现在好了,一个小复眼坏了,其它的还好好的,读书看报一点问题没有,看球赛,玩游戏,一点不输给别人。甚至一个小复眼近视了,要配眼镜,也只配一个沙粒那么大的镜片就够了。说到底,就是小复眼坏一个修一个,不浪费材料。当然复眼系统大多数时候,合起来可以作为一个大眼睛用。不用说,用来恨人的时候,5000只小复眼的聚光穿透力不比原来的一支大眼睛弱。哈哈。

                    

         蜜蜂的复眼。它的每一个复眼就像一个micro-service程序块。坏了一个照常读书看报。
能够理解我在这儿的胡言乱语吗?想象一下,如果我们所住房子的墙,不是一块块简单的泥巴做成的砖,而是里面有功能的智能砖,它们可以自动调节温度,控制太阳光线的明暗,呼入室外的新鲜空气,排除室内的废气,等等。它的好处是,不像地下室烧的那个大锅炉,锅炉如果坏了,冬天家里可以把人冻成狗;也不像室外的空调机不工作了,夏天可以热到让人怀疑人生。如果一块智能砖不好用了,也仅仅是这一块砖不工作了,其它的仍旧好好地在干活,因为它们是相互独立的,或者说弱关联的。你坐在房子里,几乎感觉不到有什么东西不工作了。这就是现代的通讯,电商,或者宽带物联网所要想达到的状态。好处多不多?多!
看懂了micro-service程序构架是怎么工作的,了解了为什么要这么设计,那么回过头来看看新近的产品里,有哪些是用了相近的设计理念的呢?别的不说,一个知名的产品就是特斯拉(Tesla)全电车的电池。这是一个由六百多个细胞电池(cell battery)整合成的一个电池联合体,给车提供足够的动力。人们会想,为啥不造一个单一的大电池呢?这当然考虑到了一个容错(fault-tolerance)的问题,那就是如果只有一个大电池,那么一旦它坏了,整个车就趴窝了。相反,如果使用细胞电池组成的电池阵列,那么即使一半的细胞电池不工作了,车仍旧能开,你依旧能够慢慢开回家跟家人一起吃晚餐。这是多么好的一件事情。
认识到这样一个既要保持功能分别,松散独立, 又要聚小成大,集合成阵的矛盾综合体的妙处,有些做服务器(server)的公司,放弃了造更大更强的巨无霸服务器(super computing server)的生产线。 反过来,他们用微型服务器设计,比如说用几百个使用Arm作为系统构架,手机大小的硬件组合成群。如果我没有记错的话,惠普几年前就设计生产了一种这样的工业用服务器。据说能够节能百分之九十。而且这种机器不容易完全坏。其道理不再重复。
跟历史发展一样,技术进步也是波浪式发展,螺旋式上升的。
文中所用图片来自网上,一并致谢。

高兴

感动

同情

搞笑

难过

拍砖

支持
1

鲜花

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

关于本站 | 隐私政策 | 免责条款 | 版权声明 | 联络我们 | 刊登广告 | 转手机版 | APP下载

Copyright © 2001-2013 海外华人中文门户:倍可亲 (http://www.backchina.com) All Rights Reserved.

程序系统基于 Discuz! X3.1 商业版 优化 Discuz! © 2001-2013 Comsenz Inc. 更新:GMT+8, 2021-6-30 23:03

倍可亲服务器位于美国圣何塞、西雅图和达拉斯顶级数据中心,为更好服务全球网友特统一使用京港台时间

返回顶部