编程架构演化史:远古时代,从打孔卡(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——是它在屏幕上的表示 ...
随机推荐
- YII XSS(跨站脚本攻击)
\Yii::$app->response->headers->add('X-XSS-Protection','0');//表示关闭YII的跨站脚本过滤//http://www.fro ...
- 鸟枪换炮,利用python3对球员做大数据降维(因子分析得分),为C罗找到合格僚机
鸟枪换炮,利用python3对球员做大数据降维(因子分析得分),为C罗找到合格僚机 原文转载自「刘悦的技术博客」https://v3u.cn/a_id_176 众所周知,尤文图斯需要一座欧冠奖杯,C罗 ...
- Linux系列之链接
前言 在类Unix系统中,一个文件有可能被多个名字引用.我们使用链接来实现这一点,链接共有两种类型:硬链接和软链接,本文分别来介绍它们. 硬链接 硬链接也允许指向文件,但与符号链接的方式不同.它们是U ...
- Luogu3855 [TJOI2008]Binary Land (BFS)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- [CF1539F] Strange Array (线段树)
题面 有一个长度为 n \tt n n 的序列 a \tt a a ,对于每一个位置 i ∈ [ 1 , n ] \tt i\in[1,n] i∈[1,n]: 选择一个区间 [ l , r ] \tt ...
- 第六十一篇:Vue的绑定事件和修饰符
好家伙,补基础加实践 1.绑定事件 我们使用v-on(简写为@)来绑定事件 写个例子, 按钮绑定数字加一(太tm经典了) 在<button>元素中使用@点击事件绑定方法"的&qu ...
- KingbaseES 中实现mysql的from_days和to_days
mysql中两个函数的说明: TO_DAYS(date)给出一个日期date,返回一个天数. FROM_DAYS(N)给出一个天数N,返回一个DATE值. 两个函数比较计算的日期都是 0000-01- ...
- KingbaseES 的行列转换
目录 背景 行转列 数据准备 分组聚合函数+CASE 根据压缩数据的格式,横向展开数据列选取不同方式 crosstab函数 PIVOT 操作符 PIVOT 操作符的限制 工具 ksql 的元命令 \c ...
- KingbaseFlySync 版本升级
关键字: KingbaseFlySync.Linux.x86_64.mips64el.aarch64.Java 拓扑图: 客户现场源端和目标端写在一个flysync.ini中,所以不单独把目标端拿出来 ...
- Go语言学习的坑爹历程
鄙人暑期实习,需要用Go语言进行编程 在go语言中,结构体的定义只支持变量的声明,成员函数是采用"接口方法"来实现的 留一个成员定义的模板在此 package main impor ...