当前位置:首页 > 行业资讯 >  > 正文
无题的技术
来源:阿朱说  时间:2023-03-07 06:10:14
字号:

(1)


【资料图】

一、IBM和SAP

1964年,IBM发布了最震撼的S/360大型主机,使用了大规模集成电路板、使用了现代磁盘技术(过去是磁芯技术),而且研发的System/360操作系统具有可通用性(过去是一个应用软件需要和一台计算机硬件的特定操作系统绑定),而且System/360还首创了虚拟机技术,最多支持16个哑终端用户分时操作(因为当时一台大型主机需要200万-300万美金太贵了,必须分时操作而不能独占操作才划算)。

1969年,IBM受美国反垄断影响,宣布硬件、软件、服务,三者独立定价、分开签订合同。

1971年,IBM德国公司的三位副总裁看到这是软件可以独立销售的机会,所以离职创业了SAP(在1969年以前,由于技术局限性,软件只能和具体硬件绑定)。

我写这段的意思是:在1970年以前:计算机硬件技术、操作系统技术、编程语言技术、应用软件技术,都已经趋于成熟。只不过还一直停留在昂贵的政府、军方、大型工商企业中,而没有在广大人民群众中普及。

二、苹果公司

Apple I是世界上第一台个人电脑,产生于1975年。没有输出设备,需要连接电视机作为显示器。

1977年,Apple II发布,有了显示器,而且还能显示彩色。当时一台Apple II的价格是1298美元。

尤其1979年,世界第一款PC机上的表格计算软件VisiCalc与Apple II绑定销售,更是让苹果电脑风靡全球。

三、微软公司

1977年,微软创立。以卖PC电脑上可以运行的Basic 解释器为生意。

Basic这门语言其实在1964年已经在达特茅斯学院产生,是为了教学生学习编程而发明的。顺便说一句,人工智能就是诞生在1954年的达特茅斯夏季研讨会上。再顺便说一句:Basic编程语言是约翰凯梅尼发明的,他是约翰麦卡锡的老师。而麦卡锡就是1954年达特茅斯人工智能研讨会的发起人。麦卡锡后来还发明了人工智能专用语言LISP。

话再说回Basic,它是一门解释性语言,也就是说,不能编译成计算机可识别的二进制机器码(我忘了啥时候它才做到可编译成可执行文件了),只能由解释器来一行行载入一行行解释成二进制代码来供计算机执行。

所以你看这个解释器,是不是有点像后来Sun公司搞的Java语言-字节码-JVM虚拟机-二进制?

(2)

一、Sun公司

Sun这帮人不是做大型主机的,也不是做小型机的,也不是做个人电脑的。他们是学习DEC小型机、Unix操作系统长大的,他们从加州伯克利大学毕业后就创立了Sun公司,所以他们定义了一个新的市场:工作站。工作站比个人电脑要性能高、价格高,但是又比小型机便宜的多。

Bill Joy就是Sun公司创始人之一,也是Sun公司的首席科学家,他在伯克利大学上学时就已经开发了著名的BSD Unix版本。Unix系统上的TCP/IP协议代码库就是他写的。他还在基础上研发了NFS(网络文件系统),他还在此技术上写了RPC(远程过程调用中间件)。就是Sun公司第一个喊出:网络就是计算机。这开创了分布式计算,也草灰千里影响到了现在的云原生计算。

其实在80年代,三大分布式计算基础中间件都已经产生了:

RPC远程过程调用中间件:这是Sun公司首创的

消息中间件:如果你不想实时同步调用远方的API,你可以传递数据消息来异步搞事。这是IBM首创的

事务中间件:你如何在一个分布式计算的多个应用协作中保证在同一个事务?这就是事务中间件的作用。这是AT&T 贝尔实验室发明的。大家想想当时在全国长途通话中如何进行计费就明白了贝尔实验为啥要发明这个东西。

二、Novell

事务中间件Tuxedo后来AT&T卖给了Novell,这是一家在80年代甚至90年代前期都非常火的一家公司,就是它发明了PC局域网上的网络操作系统、网络文件系统、网络目录服务。2003年,它收购了著名的Linux发行版公司SUSE(另一家是被IBM收购的Red Hat)。

再顺便说一声,AT&T曾经把最正宗的Unix源代码卖给了Novell公司,后来Novell衰落后,Unix源代码又被Novell卖给了SCO公司。现在Unix源代码还被SCO公司持有着。

再顺便说一声,SCO公司在1980年和微软一起合作移植过PC电脑上的Unix系统,可惜失败。失败后,盖茨才匆忙买了一份操作系统,这就是后来大名鼎鼎的MS-DOS。

Novell曾经是微软的死敌。因为Sun公司的市场一直比PC电脑高,而Novell公司聚焦的就是PC电脑技术市场,而且还能联网。微软过去还都是单机操作系统。所以盖茨当时一直想进军网络版服务器操作系统,这才有了以后Windows NT的故事。Windows NT在1993年发布,1996年又发布了最震撼的NT 4.0,这个版本涵盖了IIS中间件、MSTS事务中间件、MSMQ中间件,一下子把Novell打败了。

三、CORBA

1990年,IBM联合DEC、HP、Sun、Oracle、Novell、AT&T等一众公司,发布了CORBA技术标准,用于大型主机、小型机、工作站、个人电脑,不同硬件、不同操作系统、不同联网协议,但是能统一调用远程API,这就是CORBA。

咱们现在看到的:IDL、命名与发现服务、生命周期管理、企业服务总线、事务服务、消息服务,在1990年的CORBA中早已经产生了。

(3)

一、DLL和DDE

微软在1985年创造Windows 1.0的时候就已经发明了动态链接库DLL技术,以及动态数据交换DDE技术。

DLL技术可以让应用动态载入,动态调用API。没办法啊,当时的PC电脑CPU性能和内存容量太差,尤其写了Windows操作系统自己本身就占用很多,给应用留下的更少,所以被迫只能做动态载入动态调用,而不能全部在应用编译时就集成在一起,那应用软件就太大了。动态链接库的技术在70年代的Unix操作系统上早就实现了,这微软现在才在PC电脑上实现。

不过DLL还有一个意外作用,那就是可以让多个应用共同调用同一个函数库。多个应用都可以动态载入这个Dll动态链接库。

而动态数据交换DDE技术,既可以做到让多个应用共享同一块内存,也可以做到多个应用之间通过这块共享内存达到数据交换。

大家想一想,这是不是和远程过程调用中间件、远程数据消息传输队列中间件异曲同工啊?只不过微软搞的是本地多个应用之间的调用和数据传输而已。

二、OLE

机会来了。1990年,Word 1.0在Windows3.0上发布。在1987年,Excel 1.0已经在Windows2.0上发布了。所以Word1.0想借助Excel的一些功能,而不想自己重新开发在Word中如何画表格的功能。

所以大Office研发团队就想到了DLL和DDE技术,在此技术上发明了OLE技术:对象链接与嵌入。

有人想了,你费这劲干嘛,有DLL和DDE技术啊,你Word应用直接载入Excel画表格的DLL就行了呗,干嘛还发明OLE。

嗯,没办法,因为Excel团队也在奋力开发新版本中,这个画表格的Dll一直稳定不下来,所以Word研发团队没法绑死Excel团队的程序,只能发明一个中间东西,这样既可以集成又可以解耦。这就是OLE技术发明的初衷。

所以,用户需要在Word中画表格,就由Word呼叫一个OLE的后台服务,OLE后台服务把dll功能动态载入进来,画完表格,由这个后台软件再把这个功能这段内存释放了。

由于OLE1.0搞的时候是Word团队自己发明的,所以其实还存在瑕疵,也就是你在画表格的时候你其实在另外一个窗口中,而不是很自然在Word应用程序的窗口中。后来是Word团队显摆,邀请盖茨来参观这个技术,盖茨看到后大呼过瘾,赶快推动Office团队整合。因为微软当时在表格软件市场面临着VisiCalc和Lotus1-2-3的竞争,在文档软件市场面临着WordStar和WordPerfact的竞争。盖茨一直想如何增强微软的竞争力,看到这个盖茨才想到:集成套件。所以OLE2.0,就是完美把Word和Excel平滑集成。

三、COM

时间已经到了1993年。在盖茨的兴奋推动下,这事得好好做做了。所以一帮微软高级技术专家坐下来要制定一个正式的技术标准,为了让不同应用使用同一套技术标准搞相互调用,而不是使用DLL共享库和DDE共享内存这种Low技术。

于是,微软COM技术标准组成立。COM:Component Object Model,组件对象模型。

应该怎么做呢,COM技术标准组想到了1990年早就制定好了的CORBA,而CORBA的全称是:Common ObjectRequest Broker Architecture,公共对象请求代理体系结构。

很多人分不清组件和对象,组件其实就是组合的对象,比对象的颗粒度更大,组件是由对象组成的,对象是由函数组成的。

所以,COM不仅具有CORBA的那些东西,还比CORBA多了组件技术。对象只有私有函数、公有函数、保护函数,而组件有了函数、属性、事件三个特性。

COM模仿CORBA有了IDL、接口。而面向对象没有,只有虚类和虚拟函数。

COM利用上了微软的注册表,搞了CORBA的命名与发现服务。

COM组件的创建、引用技术、释放这些组件生命周期管理事项,也由Windows后台服务程序来统一管理,不需要具体应用软件(如Word或Excel)来负责。

四、DCOM

到了1995年,震撼的Windows95发布了,可以借助点对点技术很容易进行网络邻居发现、自动联网,这比Novell那些复杂的网络管理强太多了。

所以借着Windows95易联网的东风,COM技术也从本地多个应用之间互相调用,延展到了可以局域网内多个应用之间互相调用。这就是DCOM技术:分布式组件对象模型。

DCOM组件之间如果要远程互相调用,那么就需要使用企业服务总线。但是微软一直没有把企业服务总线这个技术单独提出来独立成中间件软件,直到2008年借助Vista-WindowsServer2008的发布,才单独提出来WCF。2008年,我记得当时正火SOA、企业服务总线ESB。

五、COM+

1998年,微软借助发布Windows98的机会,再次升级DCOM为COM+。

因为1996年微软发布了震撼的NT 4.0,这个版本内置了微软事务中间件、微软消息队列中间件,所以COM+具备了事务服务、消息服务。这就是Sun J2EE技术后来才出现的CMT(容器管理事务)、JMS(Java Message Service)服务。

六、.Net

虽说Sun公司发明J2EE时候偷学了不少微软,但是微软也没少偷学Sun。

Sun公司的字节码-JVM虚拟机技术是一个很好的技术。Sun公司发明JVM技术最初衷是为了屏蔽日本繁多的智能电器差异。而虚拟机这个技术却让微软想到了其他用途。因为微软当时被人最诟病的就是系统不稳定、系统性能慢、系统容易惹病毒。其实这和微软没有半毛钱关系,都是上层应用随便瞎写、用户瞎安装导致的。但是由于用户都是吃瓜群众,人家才不管你这套,反正看到的事就是你微软操作系统蓝屏死机了。大家想想后来苹果用应用商店、谷歌用安卓JAVA JVM才限制了烂人烂应用。所以微软就模仿Sun搞了.Net字节码-虚拟机。

当然,微软在搞.Net虚拟机的时候,有一名微软老将也心有蠢动,他就是Windows的项目主管马里茨,他也是后来大名鼎鼎的虚拟机软件公司VMWare的CEO。

后来在他的主导下,VMWare还并购了Spring、Cloud Foundry,我一会会给大家讲为什么。其实和这些历史都关联着。

咱们再返回头说.Net。DCOM在1995年发明的时候用的是微软自己搞的远程调用协议,但是在2000年,在火热的互联网上,大家流行的是WebService(WSDL、SOAP、XML、HTTP)。所以.Net平台在2002年发布的时候,.Net组件支持流行的WebService。

而且.Net虚拟机除了解决了微软头疼的上层烂应用搞事的问题,而且还解决了上层烂人写烂COM组件的问题。大家都知道,COM组件的创建、引用计数、销毁都是由COM容器借助IDL接口申请、DLL动态载入绑定、工厂设计模式动态创建来负责的,但就是有烂人瞎用COM组件技术,导致COM组件是销毁了,但是COM组件在运行当中创建的内存却没有很好的一起释放。这就容易带来内存溢出操作系统蓝屏或病毒、内存慢性能低,所以.Net虚拟机还解决了幽魂内存的回收。(这怎么让我想起2003年上映的《黑客帝国2》一开头的那个法国人、火车站、无主代码?嘿嘿嘿)

(4)

J2EE技术体系其实分为:

前端-服务层:Servlet-JSP

业务逻辑层:EJB(Session Bean、Entity Bean、Message Bean)

持久化-数据访问层:JDBC-JDO

分布式逻辑层:JNDI-RMI、消息、事务

一、Applet、Servlet

我过去专门写过一篇文章,世界上伟大的技术都是瞎猫碰见死耗子走狗屎运才成功的。Sun公司的Java技术也是这样。

Java本来是给日本1985年日美贸易战之后的日本搞的雄心勃勃的第五代计算机:人工智能和智能硬件战略而准备的。但是1991年日本房市股市大跌、日本进入失去的二十年,日本第五代计算机体系战略失败,所以Java技术当时无用了。Java的发明人高斯林也正愁着找工作,如果再找不到工作就要被开除了。

可巧互联网热在美国爆炸了。当时的网页都是静态网页,连Javascript语言都没有,只有HTML和CSS,吸引不了广大人民群众。所以网景公司想找一种很小的可以在Modem电话线窄带拨号的互联网上传输-酷炫展示的技术。快要失业的高斯林大喊一声:我能。

其实Java当时不能,但是Java原本就是给日本智能家电使用的,小是肯定的。所以Java团队快速做出了Applet技术,供网页前端酷炫展示。从此Java抓住了互联网风。

这一下子不得了。当时互联网已经很热了,大家都想利用互联网搞点事。当时,想编写互联网服务器端的应用,只有CGI技术(1993年出现)。Java团队配合Applet前端网页酷炫动态展示技术,结合CGI技术,又发明了后端的Servlet技术。

二、JSP

其实JSP是1997年发明的,但是在1996年微软已经发明了ASP。但是,PHP早在1995年就产生了。也就是说,ASP是偷学PHP,JSP是偷学ASP。

后来2000年出现了Struts,JSP才偷学改进成JSF(2004年发布)。

而在2004年,Web2.0兴起,大家流行的是纯前端:

结构:HTML+CSS

行为:Javascript

数据:AJAX进行前端和服务器端数据传输

所以,ASP和JSP这种前后端代码混合的编程方法被唾弃。

三、EJB

EJB 1.0是在1998年出现的。其实在1998年,微软已经从COM(1993)-DCOM(1995)-COM+(1998)进化到了最高级。说穿了,Sun公司都是偷学微软的。微软才是组件技术的鼻祖。另外再顺便说一声,AJAX技术也是微软在1998年就发明了,可惜在2004年被谷歌发扬光大了。

但是也不能说Sun公司抄微软,毕竟微软搞COM/DCOM/COM+,还是借鉴CORBA的,而CORBA其实还是来源于Sun公司的。真是历史螺旋上升。

微软当时发明COM,是为了Word和Excel重用公用功能,这是函数编程-面向对象编程-DLL和DDE技术都想解决的,可惜一直没有解决好的。现在EJB也想解决这个问题。

可惜,Sun这帮人太想竞争过微软了,一方面把EJB设计的更加解耦化,一方面又和Sun公司最擅长的分布式计算(分布式RPC、分布式消息、分布式事务)紧密集成。这就有问题了。

EJB设计的更加解耦,这就让当年被迫流行设计模式-架构,我当年也是学了一堆设计期UML图-架构期设计模式。这把开发要求能力大大提升了一个门槛。

EJB和分布式计算更加集成,让EJB非常笨重。所以Sun公司后来痛定思痛,又开始把分布式计算的东西剥离出EJB,让中间件来承担。如CMP(容器管理持久化)、CMT(容器管理事务)。

所以,敏捷联盟的发起人-Spring框架的作者之一-著名的Java技术专家Robert Matin就说:Without EJB。

所以,从2004年Web2.0热潮起来的时候,大家都唾弃J2EE(Servlet+JSP+EJB+JDO)+中间件,而是使用Struts+Spring+Hibernate这套Framework。

(5)

明年就到2024年了,距离2004年Spring流行,已经快20年了。这20年来,人们流行了SOA(面向服务架构)、流行了Micro Service(微服务),后来云原生又关注整个研发流水线:编译-自动化测试-打包-发布-部署-日志-监控-跟踪...。

一、SOA

SOA这个词是被IBM炒起来的。但是IBM炒的SOA的内涵却被人们丢弃,你说这世界可笑不可笑。

IBM的SOA内涵包含:

SCA:面向服务的组件

SDO:面向服务的数据对象

BEPL:业务流程执行语言

这三个技术的使用方式是:用SCA定义组件,SCA组件和组件之间通过SDO传输数据,SCA组件和组件之间通过BEPL串联在一起。

可惜,这套内涵从未被流行,人们只是流行了SOA这个词。

IBM也淡化组件了,而是浑水摸鱼采用了面向服务的组件。对象比函数颗粒度大,组件比对象颗粒度大,现在服务比组件的颗粒度大。IBM甚至在做技术推广的时候还故意选择了没有成熟的组件技术实现的PHP语言和C++语言来做Demo演示,来说明没有组件技术照样可以玩转SCA-SOA。也就是说,IBM也在偷偷扔掉由Sun公司主导的EJB组件技术。本来嘛,在1990年由IBM领导的CORBA标准也没有组件技术啊(嘿嘿嘿,其实2001年CORBA组织也模仿EJB搞了一套CORBA组件技术)。

二、Spring

大家应该想起我在最前面讲VMWare时留了一个小尾巴,那就是VMWare并购Spring。嘿嘿嘿,搞JAVA虚拟机的Sun公司搞中间件,搞虚拟机的VMWare国内公司搞干掉中间件的编程框架。这里留一个问题:他们为啥都要干这些事?

我其实对SSH这套框架组合很警惕。更进一步说,我对一切源代码Framework都很警惕。我喜欢Dll这种API,我喜欢操作系统/编程语言/数据库/中间件这种开箱即用的东西,我也可以容忍小代码片段和Lib代码类库,但我对这种我的源代码需要严重依赖的Framework是极其警惕的。

虽然Spring号称是AOP、IoC,不是侵入式的,但是这是Framework啊,不是Lib代码类库、不是小代码片段、不是Dll这种API。尤其Spring后来不断扩展,自己也搞了ORM模块一体化代替了Hibernate,自己也搞了MVC模块一体化代替了Struts,这更是一套重型的Framework。而且这是你的程序代码要严重依赖的一套重型Framework啊。

再回到最初原点、甚至回到中国的程序员界、甚至更回到中国的企业应用软件界,我们可以扪心自问:我们真的需要组件吗?甚至说我们真的需要面向对象吗?有多少中国企业应用软件程序员真的在使用面向对象分析-设计-编程?我个人感觉,很多人在被迫使用面向对象编程语言(因为目前不流行面向过程编程语言了),在用面向对象编程语言开发面向过程的代码。甚至我处处看到,很多程序员连面向过程都做不到,比比皆是的几百行代码甚至上千行代码在一个函数里随着维护越来越长没人敢动。

我在想,对于中国企业应用软件开发人员,下面这套不香吗:

前端层:HTML+CSS、Javascript

前-后数据传输层:AJAX

逻辑层:普通开发语言

数据访问层:SQL

很多人想,这套技术组合这么简陋,能满足复杂的中国企业应用软件吗?

嘿嘿嘿。一点问题都没有。很多技术都是作茧自缚。

三、Spring Cloud

2015年,Docker借2007年谷歌发明的LinuxCGroup思路发明了软件容器。容器本来是为了简化相关依赖的应用如何简单打包-发布-部署的,所以云原生的重点不在微服务,而重点在于研发流水线:编译-自动化测试-打包-发布-部署-日志-监控-跟踪...,就是为了公有云大规模作业用的。

但是却被人们想歪用歪,人们把容器当成了性能更佳的虚拟机,人们把云原生重点使用微服务框架。你说这世界还有道理可言吗?所以,历史真的是由群众创造的。

虽然2015年来的云原生的流行,我个人越来越隐隐不安,尤其是看着CNCF图谱中的技术越来越复杂时,这种心情越来越沉重。我是从90年代CORBA-COM-.NET-J2EE技术一路走过来,我又看到很多过去的东西重新开发一遍重新还魂,如:

注册与发现服务、请求路由、配置中心

负载均衡、限流、降级、熔断器

消息队列

认证授权、安全

...

面向私有部署应用软件,IBM服务器+Oracle数据库+Oracle WebLogic + 一体化套件应用,难道不香吗?

面向公有云应用服务,需要一套软件服务所有客户,所以底层通过统一适配API来调用公有云的PaaS中间件,难道不香吗?让公有云PaaS中间件它们去保证这些复杂的注册发现、请求路由、负载均衡、限流、降级、熔断、认证、安全...,难道不香吗?

标签: 操作系统 应用软件 分布式计算