Lispの優位性:Viawebの初期からの教訓

2001年4月にBBN Labsで行われた講演で、Paul GrahamはShopifyの前身であるViawebの技術的基盤について詳しく説明しました。当時、業界はCやC++が主流でしたが、GrahamはLispを選択しました。この決定は単なる個人の好みではなく、優れた開発速度とアーキテクチャの柔軟性を通じて、小規模なチームが大規模な競合他社を追い越すことを可能にする戦略的な技術的選択でした。

サーバーの自由

Lispを使用する主な動機の一つは、デスクトップからウェブベースのアプリケーションへの移行でした。デスクトップ時代、開発者は主にオペレーティングシステムの言語に縛られていました。しかし、サーバーサイドのソフトウェアでは、開発者が環境を制御できます。

Grahamは、この自由が競争上の必要不可欠な要素であると主張しています。反復のスピードがすべてである市場において、単に標準だからという理由で業界標準(C++など)に固執することは、負債になり得ます。より表現力豊かで強力な言語を使用する小規模なスタートアップは、より速く、より少ないバグで機能をリリースすることで、大企業に「ランチを食い尽くす(市場を奪う)」ことができます。

漸進的な開発の力

Lispは、ソフトウェア作成の特定の哲学、すなわち漸進的な開発(incremental development)を可能にします。包括的な設計ドキュメントに数週間を費やしてそれを実装するのではなく、Lispプログラマーは、ほとんど何も行わないプログラムから始めて、各ステップでコードを実行可能な状態に保ちながら、徐々に機能を追加していくことがよくあります。

Grahamは、Viawebエディタの成長を典型的な例として挙げています。それは、一度の完全な書き直しなしに、120行のサンプルプログラムから25,000行のシステムへと成長しました。このアプローチは、ソフトウェアが箱に入った製品として出荷されるのではなく、継続的に更新されるというウェブの「ローリングリリース」の性質と完璧に一致しています。

高速なデバッグとインタラクティブなトップレベル

インタラクティブなトップレベル(REPL)は、バグ解決において大きな利点をもたらしました。ユーザーのデータが会社のサーバー上に存在していたため、Grahamはコードをインタプリタにロードしてユーザーのアカウントにログインすることで、リアルタイムでバグを再現することができました。

これにより、驚異的に速いターンアラウンドが可能になりました。ユーザーがカスタマーサポートと電話で話している間に、バグを修正してデプロイすることができたのです。Grahamが述べているように、これはしばしば少し「ずる賢い」魅力とともに扱われました。サポート担当者がユーザーに単にページを更新するように伝えると、バグは消えていました。

アーキテクチャの勝利:マクロとRtml

Lispのマクロシステムは、ViawebがRtmlというドメイン固有言語(DSL)を構築することを可能にしました。この組み込み言語は、いくつかの重要な目的を果たしました:

  1. HTML生成: HTMLは再帰的であり、接頭辞表記を使用するため、Lispマクロに自然にマッピングされ、複雑なページ生成を管理可能なものにしました。
  2. 「アップグレードパス」: Rtmlは、高度なユーザーが独自のテンプレートを記述することを可能にしました。ほとんどのユーザーはデフォルトを使用しましたが、Rtmlはパワーユーザーのための「脱出口」として機能し、開発者に対してどの機能が標準テンプレートに追加されるべきかという信号を送る役割も果たしました。
  3. 層状の抽象化: ページ生成ロジック(Rtml)を低レベルのシステムコードから分離することで、チームはコアエンジンの安定性を損なうことなく、UIに高レベルな変更を加えることができました。

キーワードパラメータの教訓

Grahamは、彼らの努力を大幅に節約した特定の技術的詳細を強調しています。それは、キーワードパラメータの多用です。Rtmlオペレーターにキーワードパラメータを取るように設計することで、彼、らは既存のテンプレートを壊さずにオペレーターに新しい機能を追加することができました。これは、より硬直的な言語では稀な、前方互換性を提供しました。

クロージャによる状態のシミュレーション

HTTPのステートレス性は、初期のウェブ開発における最も困難な問題の一つでした。Viawebは、この問題をレキシカルクロージャを使用してサブルーチン的な挙動を動作させることで解決しました。

「次にどのCGIスクリプトを呼び出すべきか」と考えるのではなく、ソフトウェアは「次にどのコードの断片を実行すべきか」と考えました。クロージャをグローバルなハッシュテーブルに保存し、それらをURL内のユニークなIDと関連付けることで、システムはリクエストを跨いでコンテキストを維持することができました。

これにより、高度なUIフローが可能になりました。例えば、カラーピッカーが以前に使用していたオブジェクトエディタの正確な状態にユーザーを「戻す」といった機能です。これにより、アプリケーションは、当時の静的なフォームベースの競合他社よりもはるかに高度に感じられました。

現代的な視点

元の講演は2001年に遡りますが、Lisp-driven developmentの原則は依然として重要です。現代の開発者は、Lispのインタラクティブな性質と、強力なDSLを構築する能力に価値を見続けています。コミュニティの議論で指摘されているように、HTMXやDatastarのようなツールは、今日、Lispと自然な親和性を見出しており、動的でインタラクティブな・言語と柔軟なフロントエンドの組み合わせが、依然として非常に効率的な開発サイクルを生み出すことができると証明しています。

ある貢献者が述べているように、 LispやSchemeのような言語のアーキテクチャ的パワーを活用すれば、適切なツールを持つ少数のプログラマーは、投入されるリソースに関それにわらず、大規模なチームを凌駕することがしばしばあります。

Sources