编程架构演化史:远古时代,从打孔卡(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一个月的云服务器,估计在当时是难以想象的,这里不难看出第一个技术演化的驱动力:经济成本。
笨重且巨大的计算机,显然也满足不了各类场景的需求,到如今手机、平板、笔记本等各种大小设备的出现满足办公、娱乐等各类场景,可以发现另一个驱动力:多样场景。
航天天文、金融业务都有复杂计算的需要,分钟级别的打孔数据读取显然不足以支撑;现在各类高性能计算机的存在,其实也可以归纳第三个演化驱动力:复杂程度。
这里说的是驱动力哲学角度来说就是矛盾点,矛盾推动事物的发展真是让人着迷的理论。
本篇作为编程架构演化史开篇说的是打孔编程时代,但推动技术演化背后的驱动力/矛盾点其实已然出现;且看它在水面之下推动着演化变革。一批又一批伟大的公司将走向历史的舞台,同时一批又一批的公司将被历史淹没,既是无情的抉择也是演化历史的必然。
敬请关注公众/头条号(求一键三连)。时势造英雄且看续说编程架构演化史的江湖之路。
编程架构演化史:远古时代,从打孔卡(Punched Card)开始的更多相关文章
- x86-1-32位x86 处理器编程架构
x86(32位)-1-32位x86 处理器编程架构 Intel 32 位处理器架构简称IA-32(Intel Architecture,32-bit) x86是指intel的86系列的CPU统称,比如 ...
- ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构
★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...
- 使用WCF实现SOA面向服务编程—— 架构设计
原文地址:http://www.cnblogs.com/leslies2/archive/2011/03/29/1997889.html SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就 ...
- Python编程-架构、Socket
一.客户端/服务器架构 1.C/S架构 Client/Server架构,即服务器/客户端架构. 客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理.数据共享.数据及系统维护和 ...
- CRUD全栈式编程架构之界面层的设计
Layout的设计 模板模式 mvc的模板特别类似设计模式中模板方法模式,结合Layout中RenderSection和RenderBody方法可以将部分html展现逻辑延迟到具体的视图页面去实现里面 ...
- 并行编程架构(指令流水、进程、线程、多核,Pipe and Filter)
最近在进行DSP软件优化时,查阅文献,看到了几种并行机制,下面予以总结: 关键词一:指令流水 关键词二:多进程 关键词三:多线程 关键词四:多核(多处理器.超线程结构.多核结构.多核超线程架构) 在体 ...
- Hibernate(八)__级联操作、struts+hibernate+接口编程架构
级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个d ...
- SOA面向服务化编程架构(dubbo)
dubbo 是阿里系的技术.并非淘宝系的技术啦,淘宝系的分布式服务治理框架式HSF啦 ,只闻其声,不能见其物.而dubbo是阿里开源的一个SOA服务治理解决方案,dubbo本身 集成了监控中心,注 ...
- 介绍MVC编程架构模式
MVC(Model/View/Controller)模式是国外用得比较多的一种框架模式,最早是在Smaltalk中出现.MVC包括三类对象. Model——是应用对象 View——是它在屏幕上的表示 ...
随机推荐
- 题解【洛谷 P1466 [USACO2.2]集合 Subset Sums】
题目传送门 设 \(sum=1+2+3+4+\dots+n=\dfrac{n(n+1)}{2}\). 如果 \(2\nmid sum\),则显然没有方案. 如果 \(2\mid sum\),则这两个集 ...
- Java开发学习(二十一)----Spring事务简介与事务角色解析
一.Spring事务简介 1.1 相关概念介绍 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 数据层有事务我们可以理解 ...
- JDBC与ODBC的区别
JDBC简介JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,它是Java十三个规范之一.可以为多种关系数据库提供统一访 ...
- 6.18 NOI 模拟
发现 \(Typro\) 没保存的草稿也是可以找回的,\(tql\) \(T1\ bs\) 考虑选的必然是开头的连续一段,那么直接二分\(+\)判定即可 由于数据范围是\(5\times 10^7\) ...
- java-正则、object中的两个方法的使用
正则: "."和"\" "."点儿,在正则表达式中表示任意一个字符. "\"在正则表达式中是转意字符,当我们需要描述一个 ...
- Word 文字错乱,接收方显示的字体与原版不一直
原版文档使用字体的不是电脑上自带的常规字体,比如,黑软雅黑.黑体.宋体等字体.当把文档发送给其他人查阅时,字体发生了错乱,也就是字体与原版字体不一致. 需要打开"选项"设置,把非常 ...
- 未关中断情况下的hardlock
最近遇到一例crash,3.10内核,hardlock,查看对应的堆栈,中断是使能的. 查看对应的hrtimer_interrupts和hrtimer_interrupt_save的值,发现确实相等. ...
- 第二十二篇:有关插槽solt的使用
1.什么是插槽? 插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示, 父组件可以在这个占位符中填充任何模板代码,如 HTML.组件等,填充的内 ...
- 微服务系列之网关(二) konga配置操作
1.konga核心对象 Kong 的四大核心对象:upstream,target,service,route.下面分别说: (1)upstream,字面意思上游,实际项目理解是对某一个服务的一个或者多 ...
- 超详细的格式化输出(format的基本玩法)
一.format的基本玩法 一.什么是format format是字符串内嵌(字符串内嵌:字符串中再嵌套字符串,加入双引号或单引号)的一个方法,用于格式化字符串.以大括号{}来标明被替换的字符串 fo ...