文 / 王越
Interface Builder,是用于苹果公司Mac OS X操作系统的软件开发程序,Xcode套件的一部分,于1988年创立。它的创造者Jean-Marie Hullot自称是“一个热爱旅行、充满激情的摄影师”,本篇分享Hullot热爱技术的那一面——创造Interface Builder的过程。
因势而动
1981年, Jean-Marie Hullot拿到巴黎第十一大学的计算机科学博士资格后,开始了法国国家信息与自动化研究所(INRIA)的研究生活。
20世纪70年代初,正是面向对象程序设计开始走上历史舞台的时期。许多现代计算机技术的诞生地Xerox PARC(施乐帕洛阿尔托研究中心)的Alan Kay、Dan Ingalls、Ted Kaehler 、Adele Goldberg等人,从1969年开始研发一款面向对象的程序语言Smalltalk,并于1980年正式公布。这是一个完整地实现面向对象范型的编程套件,包含了一种面向对象的程序设计语言、一种程序设计库和一个应用开发环境(ADE)。
虽然当时的机器跑得巨慢无比,但Smalltalk先进的思想对其他众多的程序设计语言(Objective-C、Actor、Java和 Ruby)的产生起到了极大的推动作用,对计算机工业界的发展产生了非常深远的影响。我们将会在今后介绍Objective-C时,详细介绍Smalltalk及其对Objective-C的影响,这里先一笔带过。
Smalltalk的发布在业界一石激起千层浪,也给Jean-Marie Hullot幼小的心灵带来了巨大的震撼。他立即明白了面向对象思想所代表的先进生产力,一定会改变今后数十年的程序设计流程,他毫不犹豫地成为面向对象编程模式的早期粉丝。
SOS的助力
那时,Jean-Marie Hullot使用早期的Macintosh计算机进行开发。不过他很快就和其他开发者一样,发现虽然Mac的用户界面做得不错,但开发程序实在是太糟糕了。他说:“当Macintosh被发明出来时,计算机和先前就大不一样了,你至少需要花60%~70%的时间在用户界面部分的代码上。”在Macintosh被发明之前,用户界面是相当简单的,只需要在命令行下面打一串字符,计算机就会回应出一行行的信息。所以在那个时代,开发者完全不需要专注于用户界面。而Mac一经发布,随之而来的众多的窗口和菜单,让整个世界都不一样了。虽然对于使用最终产品的用户而言是简单方便的,但对于码工来说简直是个噩梦。每次他们需要一个窗口或者菜单,都要从零开始构建。
聪明的Hullot开始动脑筋改进Mac编写用户程序难的现状。他开发了一个程序,有点像现在Windows系统中的“画板”。一侧的工具条,是类似菜单这样的大量可重用的对象;而另一侧,则是程序员想构建的用户程序界面。只要把工具条上的工具拖放到程序界面中,那么类似“打开”、“打印”等相关的功能,就可以被添加到用户界面中。事实上,这个程序,是最早的一批能通过鼠标把控件拖入界面设计窗口实现相应功能的商业程序,是用户界面设计软件的先驱。
这个跨时代的发明被称作SOS,用Lisp语言编写【注:What are we going to called this thing中认为此时就是Interface Builder,但据The NeXTonian等多处资料表明,在Steve Jobs见到以前,该程序名为SOS】。当时,ExperTelligence开发了一种叫做ExperLisp的方言,SOS即用此语言写成【注:http://en.wikipedia.org/wiki/Interface_Builder】。
此时Hullot忽然意识到,他设计的东西事实上很强大,其重要性简直可以和Smalltalk这样的发明相比——Smalltalk让开发者尝到了面向对象语言的甜头,而SOS则是直接把对象放到了开发者手边。有了这么拽的东西,Hullot意识到如果他只在研究所窝着,那只能让十几个人享受这一成果,而如果他跳槽,把这个工具公开,那对天下的码工来说可是大福音。
诞生之源
经过不断努力,Hullot找到了一个值得推销自己发明的好地方——剑桥的苹果大学联盟(Apple University Consortium)。这个苹果和大学合作的组织看到Hullot的创作后反响很好,就推荐他去见Jean-Louis Gassee。 Jean-Louis Gassee是个法国人,时任苹果开发研究院主任,见到SOS后也认为这是个好东西,便说服他去美国闯一闯。经过几次的鼓励和推荐,加上美国对Hullot来说又不陌生,于是他就买了机票跳上飞机就奔赴美国。
不过当Jean-Marie Hullot来到美国加州苹果总部时,他却认为这不是一个工作的好地方——苹果已经是一个很庞大的企业,很难再有所创新发展。他最终决定不留在那儿,转而在美国寻找一个能把这个产品卖出去的人。四处推销之后,找到他用来写SOS的Lisp解释器的生产商,就是刚才提到的位于Santa Barbara的软件公司 ExperTelligence。
事实上,当时的ExperTelligence正在寻找合作商卖自已的Lisp,而Hullot也在找合作商卖自已的 SOS,两者一拍即合,随即打电话给 NeXT,共同推销自家的产品。
NeXT在Palo Alto总部的产品市场部人员接待了Jean-Marie Hullot和两位来自ExperTelligence的员工,被SOS的理念镇住,遂打电话请Steve Jobs下来看。Jean-Marie Hullot像复读机一样又把自己的大作秀了一遍。老谋深算的Steve Jobs事实上早就看中了SOS,但他对ExperTelligence的Lisp一点兴趣都没有。所以他装作对这场演示毫无兴致【注:这有很多引用该文的翻译译错,原文说nonplussed,字面意思为惊异,但在美国非正式表述中,此字表毫无兴致】,挥挥手就把这三个人打发走了。
但当他们一行人走到停车场时,Steve Jobs让他手下把Hullot追了回来,当他只身回到NeXT总部时,发现Steve Jobs正恭敬地等着他。
“我想要你计算机上那个程序”【注:http://rixstep.com/2/0/people/】,Steve Jobs说道:“你大概什么时候能开始给我们工作?”
Hullot回答说自己翌日就要离开去度假。
“好吧,我两周后给你打电话,”Steve Jobs说。
“不行,老乔”,Hullot表示:“我不游美国,我可要环游欧洲,你七个礼拜后再打给我吧。”
Steve Jobs虽然一骨子傲气,但他明白一个简单的道理:21世纪最缺的是什么——是人才!即使Jean-Marie Hullot玩起了大牌,这电话自然还是要打的。Hullot刚一度完假回来,Steve Jobs的电话就如期而至。
如此三顾茅庐般的热情,把Jean-Marie Hullot感动得第二天就登上了去美国的飞机。合约签了半年,但实际上他最终在NeXT整整待了十年。在NeXT工作期间,他使用Objective-C和NeXTSTEP框架重写了SOS,命名为Interface Builder。由此,Interface Builder成为NeXT集成开发环境 Project Builder标准套件之一。
进阶与探索
Interface Builder和SOS一样,提供了一个工具箱,包含一系列用户控件对象。工具箱并不是官方定死的,而是可以任意扩展的,比如如果用户想使用类似Safari中的toolbar,而这不是官方提供的,则下载第三方的PSMTabBar即可实现,甚至连Cappuccino这样的网页框架也可以用Interface Builder来完成设计。开发者只要把控件比如菜单和文本框拖入项目文件就能完成用户界面设计,节省了几乎所有和控件放置有关的代码。
开发者拖拽鼠标,将控件可提供的动作(IBAction)和另一个对象的接口(IBOutlet)连在一起, 则建立了一个绑定。这样,一旦动作被激发(比如用户点了按钮),那接口中相应的方法则会被执行。所以,大量对象关联的代码也能被省去。
有了这样的模式后,Interface Builder和Cocoa可以比后来出现的Microsoft Visual Studio或Qt Designer等软件走得更远——只要是对象,Interface Builder就能够操控它们,不需要一定是一个界面的控件。比如,数据库的数据源、队列等,都可以在Interface Builder中连接起来,于是很多原本需要上千行的复杂应用(比如用来显示、修改企业中职工姓名、部门、电话、地址、头像等信息SQL数据库的用户界面程序),数分钟内就可以写完,不用一行代码。不信?让1992年的Steve Jobs亲自做给你看【注:http://www.youtube.com/watch?v=j02b8Fuz73A, 第23分钟~第29分钟】。
NeXT被Apple收购后,苹果把下一代操作系统建立在NeXTSTEP的基础上。Objective-C和Cocoa被作为主要框架,而Interface Builder和Project Builder也因此受到重用。就官方的工具箱而言,支持Objective-C/Cocoa、Carbon的HIToolbox和WebObject。
2008年3月27日,苹果发布首个iPhone SDK,设计Cocoa Touch界面的,也正是Interface Builder。可以说,Interface Builder一直随着公司产品的发展而不断拓新。
Jean-Marie Hullot是在NeXT被收购时进入苹果的。Steve Jobs令他率领在法国的一个小团队,秘密为Mac OS X 10.2开发一个办公软件。以往这样量级的程序,都是由苹果加州总部的大班人马完成。而这次,为了向世人表明他的Interface Builder有多强大,iCal横空出世,展示复杂的界面元素(日历、可拖拽的任务、五花八门的分类)和诸多功能(网络同步、Apple Script脚本控制)可以用相当快速的时间内开发出来【注:http://www.appleinsider.com/articles/07/10/17/road_to_mac_os_x_leopard_ical_3_0.html&page=2】。
最后,在iCal小组打完酱油的Jean-Marie Hullot荣升苹果软件开发部首席技术官。
Project Builder在Mac OS X 10.3时被重命名为现在大家所熟知的 Xcode。Xcode 3以前,Interface Builder使用一种名为nib格式的二进制文件格式。不过由于nib不能用肉眼读,也不方便使用版本管理工具来管理,所以Xcode 3开始新加入一种名为xib的文本文件格式,最后再在项目编译阶段输出为nib格式。和产生静态界面布局代码的工具(如MSVC、QtDesigner、 Delphi等类似的软件)很不同,nib是不被转译成相应Objective-C代码的。用户程序执行时,nib文件被读入,解包,并且唤醒【注:awake,即载入 nib 会自动调用程序中awakeFromNib方法】,所以nib文件是在运行时动态加载的。
长期以来,Xcode环境和Interface Builder是两个独立但相互工作的程序。而2010年释出的Xcode 4预览版中,Xcode和Interface Builder合二为一,成为一个一体化的编程环境。所以现在,开发者甚至可以只用鼠标在用户界面和代码间来回拖拽就能完成,这样一来Interface Builder对用户代码的解释也比先前更正确。比早期分离的程序使用起来确实方便很多。
当然,一个负面的影响是,这样用一体化集成开发环境写程序,往往会发现屏幕空间是不够的,所以像我这样用11寸Air或者13寸Macbook Pro的人,出去打招呼都不好意思说自己是做Mac开发的。
下一个海阔天空
在而后的岁月里,Interface Builder创造了一个又一个应用软件神话,小到官方教程中的汇率计算器,大到苹果所有的家用、专业软件,都由Interface Builder完成。
在风起云涌的1989年,欧洲核子研究组织(CERN)工作的科学家Emilio Pagiola忽悠经费,买来研究所的第一台NeXT计算机——当时NeXT计算机在CERN可是个新鲜事物——那里的科学家们纷纷前来把玩,普通青年发现里面有全本的韦氏词典,并可自动检查用户输入的拼写错误,技术青年发现它跑的是Unix系统,还有一个可读写的光驱,文艺青年更是发现里面居然预装了莎翁全集。不过毕竟像Emilio Pagiola这样忽悠巨款买NeXT机器的青年不多,所以大家围观完了,也就回去该干嘛干嘛了。
但Tim Berners-Lee和别人不一样,他不仅围观了那台计算机,还看到了Jean-Marie Hullot设计的 Interface Builder,研究了Objective-C,发现了面向对象编程范式开发环境的最高成就。这情景让他心中漾起了巨大的波澜,最终化为激情澎湃的投入,汇成了一行行面向对象的代码,一泻千里,奔向未来。
一年后,世界首个 HTTP 服务在CERN的NeXT计算机运行起来,而使用Objective-C和Interface Builder 所编写的超文本语言编辑器兼浏览器同步发行。他给这个主从式架构起了个好听的名字——World Wide Web(万维网)。
作者王越,美国宾夕法尼亚大学计算机系研究生,中国著名TeX开发者,非著名OpenFOAM开发者。