缅怀 Steve Jobs 对软件行业的贡献

  • Jean-Jacques Dubray
  • 郭晓刚

2011 年 10 月 9 日

话题:架构

我想说这么一个故事。在 Steve 回 Apple 之前,我和他在 NeXT 有一次会面。当时去的还有我们公司的首席科学家。开完会出来,我们两个人在那里复盘刚才的辩论,想找出 Steve 的漏洞——他肯定不能对嘛。结果没成功。我俩站在停车场说话,让他从办公室瞧见了,又跑过来接着和我们辩。那时候说的是跟 Objective-C 编程语言有关的一个技术问题。我也不知道他为什么对这问题那么上心。我从来没见过这种热情劲头。(Eric Schmidt

很多人会因为 Steve Jobs 和他的团队推出、推广的杰出产品而记住他:Apple II、Macintosh、激光打印机、NeXT 工作站、数字动画电影、iMac、iPod、iPhone、iPad。在过去的 35 年间,很多人的生活因为 Steve 的贡献而变得更美好。

从 1985 年到 1997 年,Steve 在他离开 Apple 的 12 年里,参与推广了不少软件技术和编程范式,后来成为当前计算行业、编程语言和软件工程实践的基础要素。可以说,软件成为今天这个样子,也有他的一份功劳,虽然很少有人注意到这一点。我们 InfoQ 的众人,希望在此回顾他那些比较不为人知,但同样影响深远的贡献,以此作为我们最后的致敬。

就在 Mac 刚出来的时候,人们还普遍认为编写带有图形用户界面和多任务功能的软件(多任务在 1987 年面市),比起在Apple IITRS-80或者IBM PC 5150 的 BASIC 解释器上面编程,要困难得多。到八十年代中期,Borland已经开始普及Turbo Pascal等带有强大类库和灵便编辑器的语言。虽然我们不能确切地肯定 Steve Jobs 离开 Apple 之前是否已经着手 Mac OS System 5,但最终 Mac OS System 5 的核心特性完全落入他的构想:多任务和HyperCard。后者是一种革命性的软件建造新方法,采取了“面向对象”和“模型驱动”的开发范式:

HyperCard 里面的编程语言叫做 HyperTalk,它是面向对象的。对象置身于消息传播的路径所构成的一个层级结构之中,响应由用户或者系统本身产生的各种消息。

HyperCard 的基本概念是一“叠”虚拟的“卡片”。卡片上记载着数据,就像真的索引卡片簿一样。它的布局引擎概念上近似于现在快速开发(RAD)环境中所谓的“窗体”[……] 它有一个特殊的“Home”叠(后来网站首页的雏形)用来启动各种应用,有一个代码仓库存放各种共享脚本,还有一个配置各种首选项的设施。

HyperCard 不仅仅是一个数据库系统。每张卡片可以有自己的独特布局,好比你在真的索引卡片上面也可以填写规定以外的信息。希望在同一叠的所有卡片上都显示的元素,可以放进一个特殊的背景层里面;也可以把背景相同的卡片归为一组,共享背景层。背景的内容除了图片(背景最开始的用途就是“背景图片”)、对象,还可以包含字段、按钮、(静态)文本、(可编辑的)文本框等等常见的GUI元素。然后每张卡片可以在它的文本字段、图片字段里面容纳各种数据,就像数据库一样。

到了 1985 年 Steve 创立NeXT之后,这些概念才算真正羽翼丰满。被昵称为“the cube”的第一款 NeXT 工作站于 1989 年推出市场。Tim Berners-Lee 对此有这样的评价

NeXT 是一台非凡的机器。NeXT 一下子引入了许多(甚至太多)新事物——可替换的光存储、Objective-C、针对音响和电影的 DSP、Mach 核心、PC 上的 unix、Display Postscript 显示系统、InterfaceBuilder 等等。确实它的价格一直很贵,光盘也被证明不可靠。可到最后,拯救 Apple 的还是 Steve 和 NeXTSTEP。这说明认准了好东西就应该坚持,谁知道哪天它就成了主流呢。

他还说道:

在 NeXT 上面编写 WorldWideWeb 客户端异常简单。系统本身就带了Text Object模块,这是一个可编辑、多字体的编辑器。我只需要子类化出来一个超文本对象,然后加上互联网相关代码就行了。设计软件菜单什么的完全不费吹灰之力,也就是在 InterfaceBuilder 里面拖放几下子。应用程序的代码框架是自动生成的。这就是平台的作用:在平台上面做出来的东西,没了它不是完全做不了,但那可就辛苦多了。

InfoQ 的编辑 Alex Blewitt 在上世纪九十年代初有过一台 NeXTStation,他是这么说的

NeXTSTEP的操作系统功能已经十分完善,它能播放视频、录制声音、内嵌对象。相比之下,NeXTSTEP 首发的时候,Windows 的第 3 版还没出来。NeXT 的硬件虽然不怎么实惠,但都是高标准的。标配以太网、24 位色的显示器、16 位声卡、内置麦克风和音箱(别忘了当时 SoundBlaster 还没变成通用 API,才是一种刚刚发布的产品而已)。它是价超所值没错——可偏偏第一版的 HTTP 就是在 NeXT 机器上面写的。

Steve 挑选当时能找到的最好的软硬件,打造了一台划时代的万能机器,几乎领先时代十年之多。这台机器的操作系统NeXTSTEP是当时一些革命性组件的结合体:

Mach 核心原先是在卡耐基·梅隆大学,为了支持分布式计算和并行计算而发展起来的一个先进的操作系统。虽然 Mach 保持与 Unix 兼容,但它的目标之一是绕开 Unix“一切都是文件”的概念,因为这个概念被日渐证明不符合实际。从作为 Mach 前身的 Accent 项目开始,进程间通信(IPC)就极受重视,最终 Mach 针对性地提出了我们现在非常熟悉的一套新概念

  • 任务”是“线程”运行所需若干系统资源组成的一个对象。
  • 线程”是单一的执行单元,存在于任务的上下文之中,并且共享任务的资源。
  • 端口”是用于任务之间通信的受保护的消息队列;任务拥有各自端口的发送和接收权限
  • 消息”是带类型的数据对象的集合,它们只能被发送到端口,而不能指定发送到具体的任务或线程。
它和 UNIX 有一个重要的区别,UNIX 下的工具处理文件,而 Mach 下的工具处理“任务”。Mach 把更大部分的操作系统代码移出内核,放入用户空间,结果形成一个大大缩小了的内核,术语“微内核”随之兴起。Mach 的进程——或者叫“任务”——有别于传统的操作系统,可以由很多的线程组成。虽然对于现在系统来说非常普通,但 Mach 是第一个这样定义任务和线程的系统。

还有一样根本区别:

端口概念和对 IPC 的运用,可能是 Mach 与传统内核最根本的区别所在。UNIX 下的内核调用由所谓的syscall或者trap操作构成。程序通过在内存中的规定位置放置数据,然后引发一个fault——fault 是一种错误。系统一开始启动的时候就设置好内核作为所有 fault 的“负责人”,所以当程序引发 fault 的时候,内核就会接管过来,首先检查传递给它的信息,然后执行指令。[……] 利用 IPC 来传递消息有利于线程和并发。因为任务由多个线程组成,使用 IPC 机制的代码又被放在线程内部,所以 Mach 可在消息处理前后冻结和解冻线程。这种设计有利于把系统分布到多个处理器之上,既可以像大多数 Mach 消息那样直接通过共享内存来传递,也可以在必要的时候增加一点代码把消息复制到别的处理器上。传统内核不好实现这样的分布式构造,因为系统要保证不同处理器上的不同程序不会写入同一块内存。Mach 实现起来却很容易而且概念清晰,因为它把“访问消息所在那块内存”的过程,变成了“端口”这个系统基本元素。

Display PostScript(DPS)是一套屏幕显示系统,由 Adobe 和 NeXT 在 1987 年合作开发,同时它也是 Adobe 的一个正式产品。顾名思义,DPS 利用PostScript(PS)图像处理模型和语言来生成屏幕上的图形,不过因应用户交互的需要做了一定的改动。如今在 Apple 的 OS X 操作系统里面,中央窗口服务器只把窗口图形缓存为 PDF,已经不再执行 PostScript 代码。而在当时,PostScript 提供的高级图形语言给开发者带来极大的好处,很容易就能创建出高质量、带交互能力的文本和图形显示,显示结果还能原样生成 PostScript 文档并最终打印出来。对于当时正为打印应用程序生成的 WYSIWYG 文档而困扰的人们来说,这是革命性的创造。

iPhone 让Objective-C和 NeXTSTEP 类库(带 NS 前缀的那些)焕发了第二春。在 1989 年的时候,这可是远远超前于时代的一个软件开发环境,直到两年之后才开始遇到像样的竞争对手PowerBuilder。Objective-C 是 Brad Cox 和 Tom Love 在上世纪八十年代初期发明的一种反射式、面向对象的编程语言,相当于在 C 语言上面增加了 Smalltalk 风格的消息机制。NeXT 开发的 AppKit 和 Foundation Kit 类库内含丰富功能,比如非常完善的容器类。Interface Builder这个模型驱动、基于 MVC 的图形用户界面设计器则堪称 NeXT 开发环境的基石。

Interface Builder 最早于 1988 年作为 NeXTSTEP 0.8 的一部分出现。它的创造者是Jean-Marie Hullot,一开始是用 Lisp 开发的。Interface Builder 属于头一批允许通过鼠标来排布按钮菜单窗口等界面对象的商品化应用程序。Tim Berners-Lee开发WorldWideWeb网络浏览器算是 Interface Builder 早期一个著名的使用例子。

Apple Computer公司 1996 年收购 NeXT 之后,在其新操作系统Mac OS X中采用了 OpenStep 环境。其中除了 Objective-C,还包括 NeXT 的 Objective-C 开发工具Project Builder(后来经过扩展,成为现今的Xcode)和界面设计工具Interface Builder。即便是Cocoa API这个当前最重要、开发最活跃的 Objective-C 环境,仍然大部分建基于 OpenStep 的界面对象。

WebObjects同样是相当领先时代的创新。这个史上第一的动态 HTML 应用服务器由 Bruce Ong、Nico Popp、Charles d’Harcourt 和 François Jouaux四个人用 Objective-C 开发而成。它在数据库访问方面非常依赖 Enterprise Object Framework。作为对比,同样做应用服务器的 Kiva 公司 1995 年创立,1997 年被 Netscape 收购;一家名为 Weblogic 的初创小企业在 1997 年末向市场上推出 Tengah 服务器

有一些现在常见的浏览器特性和快捷键组合可以追溯到 NeXTSTEP 的惯例。HTML 1.0 和 2.0 的基本布局选项源自 NeXT 的 Text 类的特性。Doom游戏的关卡设计器 WAD 是在 NeXT 机器上面开发的。先进的电子表格软件Lotus Improv是在 NeXT 机器上开发的。有个叫 Altsys Virtuoso 的软件也是在 NeXT 机器上开发的,它的第 2 版被移植到 Mac OS 和 Windows,成了Macromedia FreeHand第 4 版。MCI 电信公司的“朋友家庭计划”用 NeXTSTEP 开发后台的支撑软件。甚至连控制半导体层积这样的工作,也可以找到 NeXTSTEP 的身影,比如Riber 公司的 Accessible 软件(第 2.5 节)和休斯实验室的EpiCenter 软件

到 NeXTSTEP 开发告一段落的时候,它成功地运行在 Motorola 68000 系列、Intel x86、Sun SPARC 和 HP PA-RISC 等不同体系的处理器上;以它为基础的OS X操作系统也在 2001 年正式发布。

InfoQ 采访了Jack Greenfield,他曾任 Rose 的总架构师,现任 Microsoft 的 Principal Architect ,于 1989 到 1994 年间就职于 NeXT,领导Enterprise Object Framework的开发工作。Enterprise Object Framework 是最早的的对象 - 关系映射工具之一。

当 InfoQ 让我简短总结一下当年在 NeXT 的经历,当作对 Steve 的追思,我就知道这是一件吃力不讨好的事情。怎么可能几句话就向不曾躬逢其会的人解释清楚那个地方、那个时候的神奇之处?但在这样的时刻面对这样的请求,哪怕再费劲我也要试试。于是我想了一下,大概像我这样的工程师大概都希望知道给 Steve 干活是怎么样子吧。

每个人都知道他有极深刻的洞察力,但这么说还不能表达其万一。当 Steve 走进房间的时候,一切都会变得不一样。我记得有一次,我们在谈持久化对象存储的事情,说来说去都是对象的序列化和访问机制。然后 Steve 过来呆了几分钟,领着我们遨游天外,想象用那些工具可以创造出什么样的世界。到他嘴里,说的就成了图片、视频、声音怎么联系到一起,怎么搜索,怎么合成文档,怎么跟朋友共享。当他离开房间的时候,我们就好像看完一场电影刚亮灯的时候,你要左右看一会儿,才想起自己在哪里,刚才做了些什么。最后我们的成果是近似于 JSON 的东西,超前二十年就已经扎根在 OpenStep 里头,到现在它的衍生产物还在左右着 iOS 上的用户体验,Steve 当时描绘的一切都已经成为现实。

毫无疑问,他的远见极具启迪力量,但这么说还不足以形容和他共事的感觉。NeXT 的每一个人都天资聪颖,拿出优秀的成果是理所当然的事情。一般的领导看了会流口水,流眼泪或者两者一起流的的成果,Steve 却可能不为所动。在 Steve 身边,你只能做出前无古人,乃至后无来者的产品。其中的关键是他并不会直接这么告诉你,但只要没达到他认为有可能达到的高度,就会被认为一文不值。他有办法撩动工程师渴望卓越成果的雄心,然后他会一直激励你,暗示你现在努力得还不够,但他对你有信心。当你把东西拿给他看的时候,他说出来的几个字,或者根本不用说,就让你知道自己还能做得更好,也必须做得更好。当他喜欢你拿出来的东西,你会有站立在众山之巅的感觉,不仅因为他喜欢,还因为你知道自己是实现了自我突破才能站上那个高度。

Steve 是独一无二的人物。我再没遇过任何环境能跟他在 NeXT 创造的氛围相比拟。那里不只是公司,有点像实验室,有点像游乐场,有点像兄弟会社,有点像战场,有点像大学图书馆,有点像现代艺术馆,有点像探险基地。我后来在很多地方工作过,不少地方也能激发我的热情和精力,但没有一个地方能达到 NeXT 的高度。

Wired 如此总结:

Steve Jobs 留下的全部遗产还要很长时间才能计算清楚。起初员工们都带着贬义来谈论他的“现实扭曲力场”,指的是他那种凭借说服力和个人魅力令人信奉歪理的特殊技能。但到了某个时刻,Steve Jobs 脑中的世界观突然不再是扭曲的,反而成了一种自我实现的预言。Apple 公司的新产品一个接一个地破土而出,一个接一个地改变着我们的行为。Steve Jobs 的“力场”变成了真实的世界,而我们都生活在其中。

不少人对 Steve 有着负面的看法,但不管怎样,他是过去 35 年间一直不屈不挠地给无数工程师提出新挑战的一个人,这样的人屈指可数。他激励着工程师们去实践那些冒险的创新念头,取得超越想象的成功。如果没有 Steve,今天的个人计算机和电话会变成什么样子?

我们将会记住你。

Think Different。

查看英文原文:A Tribute to Steve Jobs' Contribution to Software Engineering

架构