我想说这么一个故事。在 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 II 、 TRS-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 核心的类Unix 操作系统,外加来自 BSD 的源代码
- Display PostScript 显示系统和窗口引擎
- Objective-C 语言及其运行时
- 面向对象(OO)应用层,内含多个“工具套装(kits)”
- 针对 OO 层的开发工具(如 Interface Builder)
- 第一个动态 HTML 服务器( WebObjects )
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 的高度。
Steve Jobs 留下的全部遗产还要很长时间才能计算清楚。起初员工们都带着贬义来谈论他的“现实扭曲力场”,指的是他那种凭借说服力和个人魅力令人信奉歪理的特殊技能。但到了某个时刻,Steve Jobs 脑中的世界观突然不再是扭曲的,反而成了一种自我实现的预言。Apple 公司的新产品一个接一个地破土而出,一个接一个地改变着我们的行为。Steve Jobs 的“力场”变成了真实的世界,而我们都生活在其中。
不少人对 Steve 有着负面的看法,但不管怎样,他是过去 35 年间一直不屈不挠地给无数工程师提出新挑战的一个人,这样的人屈指可数。他激励着工程师们去实践那些冒险的创新念头,取得超越想象的成功。如果没有 Steve,今天的个人计算机和电话会变成什么样子?
我们将会记住你。
Think Different。
查看英文原文: A Tribute to Steve Jobs’ Contribution to Software Engineering
评论