回想读书时记录到书本里的打孔纸带编程,到初学编程接触到的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一个月的云服务器,估计在当时是难以想象的,这里不难看出第一个技术演化的驱动力:经济成本。

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

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

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

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

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

编程架构演化史:远古时代,从打孔卡(Punched Card)开始的更多相关文章

  1. x86-1-32位x86 处理器编程架构

    x86(32位)-1-32位x86 处理器编程架构 Intel 32 位处理器架构简称IA-32(Intel Architecture,32-bit) x86是指intel的86系列的CPU统称,比如 ...

  2. ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构

    ★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...

  3. 使用WCF实现SOA面向服务编程—— 架构设计

    原文地址:http://www.cnblogs.com/leslies2/archive/2011/03/29/1997889.html SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就 ...

  4. Python编程-架构、Socket

    一.客户端/服务器架构 1.C/S架构 Client/Server架构,即服务器/客户端架构. 客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理.数据共享.数据及系统维护和 ...

  5. CRUD全栈式编程架构之界面层的设计

    Layout的设计 模板模式 mvc的模板特别类似设计模式中模板方法模式,结合Layout中RenderSection和RenderBody方法可以将部分html展现逻辑延迟到具体的视图页面去实现里面 ...

  6. 并行编程架构(指令流水、进程、线程、多核,Pipe and Filter)

    最近在进行DSP软件优化时,查阅文献,看到了几种并行机制,下面予以总结: 关键词一:指令流水 关键词二:多进程 关键词三:多线程 关键词四:多核(多处理器.超线程结构.多核结构.多核超线程架构) 在体 ...

  7. Hibernate(八)__级联操作、struts+hibernate+接口编程架构

    级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个d ...

  8. SOA面向服务化编程架构(dubbo)

      dubbo 是阿里系的技术.并非淘宝系的技术啦,淘宝系的分布式服务治理框架式HSF啦 ,只闻其声,不能见其物.而dubbo是阿里开源的一个SOA服务治理解决方案,dubbo本身 集成了监控中心,注 ...

  9. 介绍MVC编程架构模式

    MVC(Model/View/Controller)模式是国外用得比较多的一种框架模式,最早是在Smaltalk中出现.MVC包括三类对象. Model——是应用对象 View——是它在屏幕上的表示 ...

随机推荐

  1. 20220727-Java中多态总结

    目录 方法的多态 对象的多态 多态的注意事项和细节 向下转型 Java动态绑定机制 多态polymorphism:方法或者对象具有多种形态 方法的多态 方法的重载可以体现多态 代码示例 // 通过方法 ...

  2. 60行从零开始自己动手写FutureTask是什么体验?

    前言 在并发编程当中我们最常见的需求就是启动一个线程执行一个函数去完成我们的需求,而在这种需求当中,我们常常需要函数有返回值.比如我们需要同一个非常大的数组当中数据的和,让每一个线程求某一个区间内部的 ...

  3. 海豚调度5月Meetup:6个月重构大数据平台,帮你避开调度升级改造/集群迁移踩过的坑

    当今许多企业都有着技术架构的DataOps程度不够.二次开发成本高.迁移成本高.集群部署混乱等情况,团队在技术选型之后发现并不适合自己的需求,但是迁移成本和难度又比较大,甚至前团队还留下了不少坑,企业 ...

  4. BZOJ1977/LuoguP4180【模板】严格次小生成树[BJWC2010] (次小生成树)

    这道题本身思维难度不大,但综合性强,细节多 在其上浪一个早上,你的 最小生成树 树链剖分 线段树 DEBUG能力... 都大幅提升 细节与思路都在代码里面了. 欢迎hack. #include< ...

  5. 基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints

    大家好,我是等天黑. FastEndpoints 是一个基于 .NET 6 开发的开源 webapi 框架,它可以很好地替代 .NET Minimal APIs 和 MVC ,专门为开发效率而生,带来 ...

  6. C#基础_手动书写XML

    XML文档内容: 1.文档声明2.元素=标签 文档总至少要有一个根元素3.属性4.注释   <!--注释内容-->5.CDATA区.特殊字符 <![CDATA[不想解析的内容]]&g ...

  7. 踩坑 Windows 服务来宿主 .NET 程序

    本文所指的 .NET 程序为 .NET6 的程序.因为 .NET 的版本更新很快,所以方式.方法也有变化,所以网上搜到的方法有些也过时了.以下是最近我实践下来的一点心得(坑). 上一篇说到 不安装运行 ...

  8. std::atomic和std::mutex区别

    ​ ​std::atomic介绍​ ​模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>.​在多线程调用下,利用std::atomic可实 ...

  9. FreeSql 导入数据的各种场景总结 [C#.NET ORM]

    前言 导入数据这种脏活.累活,相信大家多多少少都有经历,常见的场景有: 同服务器从A表导数据到B表 批量导入新数据 批量新增或更新数据 跨服务器从A表导数据到B表 每种场景有自己的特点,我们一般会根据 ...

  10. Elasticsearch高级检索之使用单个字母数字进行分词N-gram tokenizer(不区分大小写)【实战篇】

    一.前言 小编最近在做到一个检索相关的需求,要求按照一个字段的每个字母或者数字进行检索,如果是不设置分词规则的话,英文是按照单词来进行分词的. 小编以7.6.0版本做的功能哈,大家可以根据自己的版本去 ...