この話をしておきたいと思います。SteveがAppleに戻る前のことですが、私たちはNeXTでミーティングをしました。私はチーフサイエンティストを連れていました。ミーティングを終えて立ち去る前、私たちはSteveが間違っているところについて説明しようとしていました。彼は明らかに間違っていたからです。でも結局はうまくはいきませんでした。ミーティングを終え、私たちは駐車場にいました。すると彼はオフィスから私たちを見つけて、わざわざここまで出てきて、さらに反論してきたのです。それはObjective-Cというプログラミング言語にまつわる技術的問題を超えていました。どうして彼がそんなに大事にしているのか、私にはわかりませんでした。これほどまでの情熱を今まで見たことはありません。(Eric Schmidt)
多くの人がSteve Jobsのことを忘れないだろう。彼と彼のチームは誰よりも先にいくつもの偉大なプロダクトを世にもたらした。Apple II、Macintosh、レーザープリンター、NeXTワークステーション、デジタルアニメーションムービー、iMac、iPod、iPhone、そしてiPad。35年にわたって、Steveは何億人もの人生に影響を与えてきた。
SteveがAppleを去ってからの12年間(1985年から1997年まで)、彼は現代のコンピューティング、プログラミング言語、ソフトウェアエンジニアリングのプラクティスの土台となる数々のソフトウェア技術やパラダイムを世にもたらした。したがって、彼は今やほとんどの人が知らないであろうやり方でソフトウェアを変革したと言ってもよいだろう。そこでInfoQでは、あまり知られてはいないが、私たちの生活、特に開発者やアーキテクトとしての生活に彼が果たした偉大な貢献をふりかえることで、Steveを追悼したい。
Macが登場した頃、GUIやマルチタスキング(1987年に登場)を使ったソフトウェアを書くのは、Apple II、TRS-80、IBM PC 5150のBASICインタープリタを書くよりも難しいことだと認識されていた。80年代中頃というのは、BorlandがTurbo Pascalのような強力なライブラリと洗練されたテキストエディタを備えたプログラミング言語を世に出し、広まりはじめていた頃だ。これは推測にすぎないが、Steve JobsはAppleを去る前に、すでにMac OS System 5に着手していたようだ。そのコアとなるフィーチャーは彼のビジョンに不可欠な要素であった。それはマルチタスキングとHyperCardという「オブジェクト指向」と「モデル駆動」というパラダイムを用いた革新的で新しいソフトウェアの作り方だった。
HyperCardのプログラミング言語はHyperTalkと呼ばれ、オブジェクト指向でした。オブジェクトはメッセージパス階層にあり、ユーザーもしくはシステム自身によって生成されたメッセージに応答します。
HyperCardは仮想的な「カード」の「スタック」というコンセプトに基づいています。カードはデータを保持します。ちょうどローロデックス(回転式名刺ホルダー)のようなものです。そのレイアウトエンジンは、現代のRAD(Rapid Application Development)環境で使われている「フォーム」と概念的によく似たものでした […] 。特別な「ホーム」スタック(Webサイトにあるホームページの前身)がアプリケーションランチャー、共有スクリプトのリポジトリ、設定プリファレンスのために使えました。
HyperCardは単なるデータベースシステムではありません。各カードのレイアウトは独自なものにすることができます。これは名刺に標準でない情報を追記できるのとよく似ています。特別なバックグラウンドレイヤは、そのスタックにあるすべてのカード、もしくは特定のバックグラウンドにグループ化されたすべてのカードに現れる要素を収容します。バックグラウンドには、フィールド、ボタン、(固定)テキスト、(編集可能な)テキストフィールド、その他共通GUI要素など、各カードに利用可能なオブジェクトだけでなく、ピクチャー(もともとの目的は「バックグラウンドピクチャー」)を含めることができました。各カードはデータベースのようで、そのテキストやピクチャーフィールドに別のデータを含むことができました。
彼が1985年にNeXTを始めると、これらのコンセプトは本格化していった。そして最初のNeXTワークステーションである「cube」が1989年に出荷された。Tim Berners-Leeは次のように語っている。
NeXTは本当にすごかった。NeXTはいろいろなものを一度に導入しました(やりすぎにも思えますが)。リムーバブルなオプティカルストレージ、Objective-C、サウンドおよびムービー用DSP、Machカーネル、PC向けUnix、Display Postscript、InterfaceBuilderなど。確かに、これらのせいで値段は高かったですし、オプティカルディスクには信頼性が欠けていました。しかしSteveとNeXTSTEPは、最終的にAppleを救いました。クールであることへのこだわり、そこから学べるものがあるはずです。それらがいつ実際にメインストリームになるのか、あなたには決してわからないのですから。
そして、こう付け加えた。
NeXTでWorldWideWebクライアントをプログラミングするのは驚くほど簡単でした。NeXTにはすでにTextオブジェクトというソフトウェアモジュールがありました。これは編集可能なマルチフォントのエディタでした。私はそれをサブクラス化して、ハイパーテキストオブジェクトを作り、インターネット関連のコードを書いただけです。アプリのメニュー設計も簡単でした。InterfaceBuilderを使ってドラッグ・アンド・ドロップするだけです。アプリのフレームワークは自動的に生成されました。これがプラットフォームです。なくてもモノは作れますが、たくさんの作業が必要になります。
InfoQの編集者であるAlex Blewitt氏は、90年代初めにNeXTStationを所有しており、次のように書いている。
NeXTSTEPはすでに十分機能するオペレーティングシステムでした。ビデオを再生でき、サウンドを記録でき、オブジェクトを組み込めました。これと比較すると、NeXTSTEPが登場した当時、Windowsはまだバージョン3にもなっていませんでした。NeXTのハードウェアは商業的にはヒットしませんでしたが、システムはデフォルトでハイクオリティなものでした。標準Ethernet、24ビットカラー、16ビットサウンド、組込みオーディオマイクおよびスピーカー(SoundBlasterが汎用APIでなく当時製品が立ち上がったばかりの時代) 。確かに値段は高すぎましたが、HTTPの最初のバージョンはこのNeXTで書かれたものなのです。
Steveは当時利用可能な最高のソフトウェアと最高のハードウェアを選んで、10年先を行く、現代的で多目的なマシンを作り上げた。それがNeXTSTEPというオペレーティングシステムであり、(その当時)革新的なコンポーネントの集合体であった。
- MachカーネルとBSD由来のソースコードに基づいたUnixライクなオペレーティングシステム
- Display PostScriptおよびウィンドウエンジン
- Objective-Cプログラミング言語およびランタイム
- 複数の「Kit」からなる、オブジェクト指向のアプリケーションレイヤ
- オブジェクト指向レイヤのための開発ツール (Interface Builder)
- 最初の動的HTMLサーバー (WebObjects)
Machカーネルはもともと分散コンピューティングや並列計算を支援するためにカーネギーメロン大学で開発された、先進的なオペレーティングシステムだった。MachはUnix互換であるにもかかわらず、実用的でないとわかりはじめていた「Everything-as-a-file」というUnixの概念を回避する試みだった。MachはAccentプロジェクトの一部として、プロセス間通信(IPC)に重点を置いており、今では非常になじみのある新しいコンセプトをもたらした。
- 「タスク」はスレッドが実行できるシステムリソースの集合からなるオブジェクトである。
- 「スレッド」は実行の単一ユニットであり、タスクのコンテキストに存在し、タスクのリソースを共有する。
- 「ポート」はタスク間通信のための保護されたメッセージキューであり、タスクは各ポートに送受信することができる。
- 「メッセージ」は型付けされたデータオブジェクトの集合であり、特定のタスクやスレッドではなく、ポートにのみ送られる。
UNIXとの大きな違いは、ユーティリティがファイルを処理するのではなく、任意の「タスク」を処理できることでした。オペレーティングシステムのコードの大部分がカーネルからユーザー空間へと移されて、カーネルは非常に小さくなりました。マイクロカーネルという言葉はここから生まれました。従来のシステムと違って、Machではプロセスもしくは「タスク」は数多くのスレッドによって構成されます。これは現代のシステムでは一般的ですが、このようにタスクとスレッドを定義したシステムはMachがはじめてでした。
ほかにも大きな違いがある。
ポートの存在とIPCの利用は、Machと従来のカーネルとの最も基本的な違いでしょう。UNIXにおけるカーネルの呼び出しは、システムコールやシグナルといったオペレーションによって構成されます。プログラムはライブラリを使って、メモリ上の既知の領域にデータを配置し、エラーの一種であるフォールトを引き起こします。システムが初めて起動されると、カーネルはすべてのフォールトの「ハンドラ」を設定します。これによりプログラムがフォールトを引き起こすと、カーネルがあとを引き継いで、渡された情報を調べてインストラクションを実行するのです。… メッセージパッシングにIPCを利用するのは、スレッドと並行性をサポートするのに効果的でした。タスクは複数のスレッドによって構成され、コードはIPCメカニズムを使ったスレッドにあるため、メッセージが処理されている間、Machはスレッドをフリーズ、アンフリーズすることができました。このおかげで、ほとんどのMachメッセージがそうであるように、直接共有メモリを使ったり、必要に応じてメッセージを別のプロセッサにコピーするコードを加えることで、システムを複数のプロセッサに分散できるようになりました。従来のカーネルでこれを実装するのは困難です。別のプログラムが別のプロセッサから同じメモリに書き込もうとしていないか、システムが確認する必要があるためです。Machではこれが明確に定義されており、実装も簡単でした。それはメモリ、ポートにアクセスするプロセスそのものであり、システムのファーストクラスにされていたのです。
プログラミングモデルのレベルでは、プロセス間通信はPDO (Portable Distributed Objects) によって非常に簡単に書くことができた。これはCORBAが登場するよりずっと前のことだ。
Display PostScript (DPS)は、1987年にAdobeとNeXTが共同開発したオンスクリーンディスプレイシステムであり、Adobeの公式プロダクトだった。その名前からもわかるように、DPSはユーザーインタラクションをサポートするよう変更したPostScript (PS) イメージングモデルおよび言語を用いて、オンスクリーングラフィックスを生成するものだ。現在のMac OS Xの中央ウィンドウサーバーはPostScriptコードを実行する代わりに、ウィンドウグラフィックスをPDFとしてキャッシュしている。DPSは当時、開発者にとって極めて大きな恩恵があった。PostScriptはハイクオリティでインタラクティブなテキストやグラフィックス表示を簡単に作り出すことができ、そのままPostScriptドキュメントにレンダリングして最終的にプリントすることまで可能な、ハイレベルなグラフィカル言語を提供してくれたのだ。アプリが生成したWYSIWYGドキュメントをプリントする必要のある人にとって、これは革命的だった。
iPhoneとともに、Objective-CとNeXTSTEPライブラリ(NSというプレフィックスが付いている)は第二の人生を得ることができた。1989年当時、これは最先端のソフトウェア開発環境だった。PowerBuilderといった本格的な競合が出てくるのは、少なくともその2年後のことだ。Objective-CはC言語にSmalltalkスタイルのメッセージングを追加した、リフレクティブなオブジェクト指向プログラミング言語だ。これはBrad CoxとTom Loveによって80年代前半に開発された。NeXTはAppKitとFoundationKitライブラリを開発し、本格的なコレクションクラスなどを導入した。またNeXT開発環境に不可欠なものとして、Interface Builderがある。これはモデル駆動で、MVCベースのGUIデザイナーだ。
Interface Builderは1988年にNeXTSTEP 0.8の一部として初めて登場した。これはJean-Marie Hullotにより、もともとLispで発明、開発されたものだ。これはボタンやメニュー、ウィンドウといったインターフェイスオブジェクトをマウスを使ってインターフェイスに配置できる最初の商用アプリケーションのひとつだった。Interface Builderを使った初期の有名なソフトが、Tim Berners-LeeによるWorldWideWebウェブブラウザの開発だった。
Apple Computerは1996年にNeXTを買収して、その新しいオペレーティングシステムであるMac OS XにOpenStepを使いました。これにはObjective-CとNeXTのObjective-Cベースの開発ツールであるProject Builder(これは拡張され、今ではXcodeと呼ばれている)、また、そのインターフェイス設計ツールであるInterface Builderが含まれています。現在AppleのCocoa APIの多くはOpenStepインターフェイスオブジェクトをベースとしており、開発にアクティブに使われている最も重要なObjective-C環境となっています。
WebObjectsも当時、かなり革新的だった。これは最初の動的HTMLアプリケーションサーバーであり、もともとBruce Ong、Nico Popp、Charles d’Harcourt、François Jouaux(そう、たった4人でだ)によってObjective-Cで開発されたものだ。これはデータベースアクセスのためにEnterprise Object Frameworkに大きく依存している(下を参照)。一方、1997年にNetscapeが買収したKivaは1995年に創業され、Weblogicという小さなスタートアップのTengahが市場に登場したのは1997年後半のことだ。
最近のブラウザでも見られるいくつかの機能とキーボードショートカットは、NeXTSTEPが持っていた機能に由来するところがある。HTML 1.0と2.0の基本的なレイアウトオプションは、NeXTのTextクラスで利用可能だった機能に由来している。Doomというゲームのレベル (WAD) エディターもNeXTマシンで開発された。このほかにも、Mac OSとWindowsに移植されてMacromedia FreeHand version 4となったAltsys Virtuosoのversion 2、Mathematicaの「Notebook」インターフェイス、先進的なスプレッドシートだったLotus Improvなどがある。MCIのFriends and Family programをコントロールするソフトウェアもNeXTSTEPを使って開発された。NeXTSTEPはRiberのAccessible (section 2.5)とHughes Research Labs EpiCenter softwareを使った高度な半導体の蒸着をコントロールするのにも使われていた。
すべての準備が整うと、NeXTSTEPはMotorola 68000ファミリー、Intel x86、Sun SPARC、HP PA-RISCで動作するようになった。これは2001年にリリースされたMac OS Xの基盤となった。
InfoQでは、Roseの前チーフアーキテクトでMicrosoftの主任アーキテクトであるJack Greenfieldに話を聞いた。彼は1989年から1994年までNeXTで働き、最初のオブジェクトリレーショナルツールのひとつ、Enterprise Object Frameworkの開発をリードした人物だ。
InfoQからNeXTでの経験についてSteveを追悼する短い記事を依頼されたとき、これは骨折り損になるとわかっていました。どうやってその場にいなかった人に、その場所その時間に起こった魔法を、わずかな言葉で伝えられるでしょうか? しかし、たとえ十分表現できなくとも、私は要望に答えることにしました。私はみんなが何を知りたいのか考えました。そして、私のようなエンジニアだったら、Steveのために仕事をすることがどんなものだったのか、聞きたいのではないかと考えました。
ご存知のとおり、彼はとんでもなく偉大なビジョンを持っていましたが、それを十分表現することはできません。Steveが部屋に入ってくると、すべてが一変するのです。ある出来事をよく覚えています。私たちは永続的オブジェクトストアについて話し合っていました。要するに、オブジェクトのシリアライゼーションとアクセスメカニズムについてです。するとSteveが私たちのところに立ち寄り、そうしたツールを使って実現できる夢のような世界へと私たちを連れていきました。それは、画像、テキスト、ビデオ、サウンドをつなげて、検索したり、ドキュメントに変換したり、他人と共有するといった世界でした。彼が部屋を去ると、そこはまるで映画が終わったかのようでした。照明が戻り、あたりを見回し、ようやく自分のいた場所と自分がしていたことを思い出すのです。こうして、もう20年も前のことですが、JSONのようなものが生まれ、OpenStepの心臓部に取り込まれました。それは形を変えて、今日のiOSのユーザーエクスペリエンスを支えています。やっていることはすべて、あのとき彼が話したことなのです。
明らかに、彼のビジョンは私たちにインスピレーションを与えました。しかし、彼のために仕事をするのがどんなものだったのか、これでは十分表現できていません。NeXTにいた人はみな、とんでもない才能があったので、偉大なことをするよう期待されていました。しかし、Steveはものごとに満足することがありませんでした。普通のリーダーを喜ばせたり、泣かせたり、同時に両方をさせることもありました。Steveのまわりでは、後にも先にも例のない違うものを作ること以外、選択肢はありませんでした。しかし、魔法のように思えたのは、彼がそれを教えなかったことでした。彼はただ、自分ができるとわかっていることに対して、どこか足らないように感じたものを評価しなかったのです。すばらしい仕事をしたくてたまらないエンジニアひとりひとりに、彼は訴えかけました。彼は探究すればできることがわかっているようほのめかし、その領域へ到達するようエンジニアを挑発しました。ものを見せると、彼はそのような見方をしました。また、彼は言葉少なに、もっとうまくやれるはずだと教えたり、もっとうまくやらなければならないと言うこともあれば、何も言わないこともありました。彼が気に入ってくれたとき、それはまるで山頂に到達したような瞬間でした。ただ彼が気に入ってくれたからでなく、そこに到達するために自分の殻を破って成長したことを実感できたからです。
Steveは独特でした。そこで彼が築き上げた環境、それに近いものですら、私はこれまで見たことがありません。そこは単なる会社ではありませんでした。研究所であり、遊び場であり、社交クラブであり、戦場であり、大学図書館であり、現代美術館であり、登山のベースキャンプでした。それ以降、私もさまざまなところで働き、その多くは私の情熱とエネルギーを呼び覚ましてくれましたが、NeXTほどのところはありませんでした。
Steve Jobsが残した遺産はずっと整理されないでしょう。従業員が初めてJobsの「現実歪曲フィールド」について語ったとき、それは皮肉としてでした。彼の信念とカリスマによって、間違った真実に署名させる様子を指していたのです。しかし、ある時点から、Steve Jobsの頭の中にある世界の見方は歪曲ではなくなりました。それは自己充足的予言の手段となりました。Appleから次々と製品が生まれ、それぞれが新たな領域を開拓し、私たちのふるまいを変えていったのです。Steve Jobの現実歪曲フィールドは現実となりました。そして私たちはみな、その中に生きているのです。
Steveにネガティブな意見を持つ人も大勢いる。にもかかわらず、彼は35年にわたって数えきれない数のエンジニアたちと革新的で時としてリスクのあるアイデアに絶えずチャンスを与え、エンジニアが可能だと考えたことを超えるようかき立ててきた、一握りの人物だ。もしSteveがそうしなかったら、パーソナルコンピュータやテレフォニーの世界は今のようになっていただろうか?
寂しくなるよ。
Think Different.