编程架构演化史 | 远古时代,从打孔卡(Punched Card)开始

回想读书时记录到书本里的打孔纸带编程,到初学编程接触到的C语言高级编程,再到C++、Java面向对象语言产生;从面向过程系统设计 到面向对象系统设计;从三层结构到MVC、MVP、MVVM;从主机到虚拟机再到如今的容器,云原生时代;DDD、六边形架构、简洁架构、清晰架构、C4等等,这一系列的名词构建了系统架构设计的发展史。

历史有时候是很有趣的东西,它能让一些看似难以回答的问题变成有解。举个例子,比如一些公司/团队编码规范中有一条,一行代码不应该超过80个字符以便于代码可读性。如果用一个童心来发问为什么是80个字符?相信一些人会嗤之以鼻,80只是一个概数换成90/100也是可以的不用纠结。这说法当然没错,但如果在 20 世纪 60 年代一行唯一能写的只有80个字符,在那时这一限制是物理的没有办法写81个字符,IBM 打孔卡设立的标准。虽然打孔卡早已被淘汰,有趣的是80这个数字还在,当然已经是新的含义了。

历史有时候是在一次次重演,了解历史演化过程才能感知演化趋势。比如函数式编程起源可以追溯到 20 世纪 30 年代 Lambda 运算的发明,而2013年9月 Java 1.8的发布的新特性之一是支持Lambda 表达式。可曾想到70-80年后的21世纪,函数式编程竟越来越火了起来,当然其内在的意义以有了不小的变化。

历史记录着有些技术的消亡,也记录着新技术的出现,但背后力量让人值得深思着迷。可想到在80-90年代使用IBM大型机是主流技术的代表,而如今去IOE、分布式、云计算是时代主流技术的代表;又或者在20世纪90年代你可想到拥有巨大用户基础的IE到今天已经被淘汰,Chrome浏览器成了主流产品;还有机的各种颜色的几MB软盘,到现在几TB的云存储等等。

想尝试着从编程架构历史的演化角度,去理解、解读一些概念;并且写成系列的文章。牛顿说:“站在巨人的肩上。”,也许看看巨人如何长成巨人也是件很有趣的事情;不求能写得多深刻,只求让读文字的人有点趣味,有稍许所思。

远古时代,打孔卡(Punched Card)

写编程架构演化,不可避免地要提到一个公司IBM,虽然2021年初IBM中国研究院全面关闭,但不可否认历史上它是一个伟大的公司。

上图的设备是,Herman Hollerith(1860-1929)为美国人口普查局发明和制造的制表系统。这些机器首次用于汇编1890年人口普查。Hollerith的专利后来被计算制表记录公司(Computing Tabulating Recording Co.)(1924年更名为IBM)获得,也成了IBM穿孔卡片系统的基础。

1928年,IBM推出了规格为190x84mm的打孔卡存储80列x12行数据,相当于120字节。这也是前文中提到80这个数字最开始的意义与样子。现在已经很难想象如果当时是如何调试程序的Bug,以及对于程序可读性的理解。不过,计算机基于二进制进行运算表现得非常硬核,打孔即代表的是1,不打卡代表的是0。

到了1964年,IBM推出了当时最先进的System/360,它的外设 IBM 2540 可以每分钟读取1000张打孔卡;每台能卖到200w-300w美元(特别注意1964年的美元);想想如今喜欢比拼计算机性能或许就是就是从那个时候开始。1969年的美国国家标准定义了打孔器的128个字符,并将其命名为Hollerith打孔卡代码(通常简称为Hollerith卡代码),以纪念Hollerith。 打孔机从人口普查开始,慢慢向更多的行业铺开;比如航空航天、金融机构、学校科研等等,这些行业的发展也越来越离不开程序设备,与此同时需要面对的是其昂贵、笨重、低性能的情况。

打孔卡编程时代的弊端也显而易见,越来越多行业需要越来越多的计算机,但其价格昂贵。现在21世纪几百RMB一个月的云服务器,估计在当时是难以想象的,这里不难看出第一个技术演化的驱动力:经济成本。

笨重且巨大的计算机,显然也满足不了各类场景的需求,到如今手机、平板、笔记本等各种大小设备的出现满足办公、娱乐等各类场景,可以发现另一个驱动力:多样场景。

航天天文、金融业务都有复杂计算的需要,分钟级别的打孔数据读取显然不足以支撑;现在各类高性能计算机的存在,其实也可以归纳第三个演化驱动力:复杂程度。

这里说的是驱动力哲学角度来说就是矛盾点,矛盾推动事物的发展真是让人着迷的理论。

本篇作为编程架构演化史开篇说的是打孔编程时代,但推动技术演化背后的驱动力/矛盾点其实已然出现;且看它在水面之下推动着演化变革。一批又一批伟大的公司将走向历史的舞台,同时一批又一批的公司将被历史淹没,既是无情的抉择也是演化历史的必然。

敬请关注公众/头条号(求一键三连)。时势造英雄且看续说编程架构演化史的江湖之路。

posted @ 2022-10-12 10:07  Java研究者  阅读(1070)  评论(2编辑  收藏  举报