インテンショナルソフトウェア
2009年4月20日
数年前、当時の同僚だったマット・フォメルは、私たちがソフトウェアを構築するために使用していたツールに不満を感じ、チャールズ・シモニーに連絡を取り、謎めいたインテンショナルソフトウェアについて詳しく知ろうとしました。彼が見たものは彼を感動させ、私や他のThoughtWorkerたちも巻き込むように説得しました。私たちが見たのは、驚くべき可能性を秘めたツールでしたが、秘密主義とリリースに対する緊急性の欠如に不満を感じていました。その不満は先週終わりました。
先週、私はクリス・セルズのDSL Devconに出かけるところだったのですが、インテンショナルのプロダクトマネージャーであるマグナス・クリスターソンは、彼らの進捗状況を確認するために立ち寄ってみることを提案しました。「近日公開」が数年続いていたので、私は疑念を抱いていましたが、インテンショナルと定期的に連絡を取り合っていた同僚のレベッカ・パーソンズは、今が良い時期だと言いました。
私はベルビューにある彼らのオフィスで、魅力的で刺激的な一日を過ごしました。特に新しいものを見たというわけではありません。これらはすべてしばらく前からあったアイデアや機能でしたが、以前にはなかった現実感と成熟度がありました。実際、インテンショナルは数週間前に製品のバージョン1.0をリリースしていました。通常のやり方であれば、画期的な製品のバージョン1.0のリリースは大々的に宣伝するところです。しかし、インテンショナルだけがそのようなリリースを行い、誰にも知らせようとしません。実際、私がこれを書いている時点でも、彼らのウェブサイトには製品に関する記述はありません。詳細を知りたい場合は、彼らに直接問い合わせる必要があります。
そこにあるもの
これは彼らのツール(インテンショナル・ドメイン・ワークベンチと呼ばれています)についての包括的な議論ではありません。そのようなものをまとめる時間がありませんでした。しかし、私の散在した考えや観察が興味深いものであれば幸いです。インテンショナル・ドメイン・ワークベンチは言語ワークベンチであり、実際、私がその用語を作ったきっかけとなったシステムの一つです。言語ワークベンチとは、人々がドメイン固有言語を設計できるようにするツールです。単に解析するだけでなく、豊富な編集機能を含む包括的な環境を構築します。インテンショナルの場合、これはプロジェクション編集環境です。
彼らが持っている例の一つは、私が本の序章で使用しているステートマシンの例です。ワークベンチでは、スキーマ定義言語でセマンティックモデルのステートマシンのスキーマを定義できます。ステートマシンを操作するために、セマンティックモデルの投影を定義します。インテンショナル・ドメイン・ワークベンチの顕著な特徴の一つは、同じセマンティックモデルの複数の投影をサポートできることです。ステートマシンの例では、私が例を議論する際に使用したDSLのいくつか(XML、カスタム構文、Ruby)で投影を定義しています。これら3つの投影はすべて可逆的です。つまり、それらを通して編集でき、セマンティックモデルや他の投影を更新できます。投影間の切り替えは、メニュー項目を選択するだけです。
彼らはまた、fluent C#、コマンドクエリC、およびステートマシン図の読み取り専用の投影も持っていました。図を編集可能に設定していませんでしたが、ワークベンチは編集可能な図式表現を処理できます。別の例では、ツリー構造のプロパティシート投影と回路図投影の両方で編集可能な電子回路を示しています。
回路図は、ワークベンチのもう1つの非常に強力な機能、つまり、プログラム定義と例の実行を流動的に統合する能力も示しました。電子回路の場合、これは回路のさまざまな要素にプロパティを与えることができ、モデルが回路のさまざまな部分のインピーダンスを計算し、回路を編集する際に表示することを意味します。もちろん、このようなことを行うためのカスタムプログラムを構築できますが、重要なのは、この動作がワークベンチでのDSL定義の一部として簡単に行えるということです。
例の実行とプログラム定義を組み合わせることは、スプレッドシートの特徴の1つであり、スプレッドシートが素人プログラマーの環境として非常に成功した理由かもしれません。また、ジョナサン・エドワーズの興味深くワイルドなアイデアの多くを推進してきた概念でもあります。私の感覚では、言語ワークベンチの興味深いDSLは、特に素人プログラマーが使用することを目的とする場合、この特徴を持つでしょう。
実行と仕様を組み合わせるもう1つの方法は、テストケースを使用することです。彼らは、アクチュアリーが完全な数学表記を使用して数式を入力し、FITのような表でテストケースを表示できるようにする、Capgeminiで構築された年金ワークベンチの例を持っています。これらのテストケースは、数式を編集すると適切な赤/緑の動作でライブになります。
年金ワークベンチは、複数の言語の組み合わせも示しています。画面上で年金ドキュメントを見ると、3つの独立した言語を見ていることになります。散文のワードプロセッシングテキスト、数式の数式表記、およびテストケース表です。これらの言語は独立して開発されますが、ワークベンチのコアデータ構造(インテンショナルツリーと呼ばれます)に統合されます。この統合は実行にも及びます。テストケースにステップインして、数式の途中値を調べることができます。
これらのものを実行するには、セマンティックモデルに動作を含める必要があります。インテンショナルは、これを実行するために、CL1という作業名の独自の汎用言語を開発しました。CL1はC#のスーパーセットのように見えますが、そのような見方はコアセマンティックモデルの投影にすぎません。これはJetBrains MPSがJavaのような汎用言語に投影される「ベース言語」を持っているのと似た特徴であることに興味を持ちました。ますますこれらのツールの多くは、このワークベンチ内の汎用言語を使用してプログラミングされています。
意図された作業方法は、開発者がインテンショナル・ドメイン・ワークベンチを使用してドメイン固有のワークベンチを構築することです。彼らは、言語編集機能なしで実行するためのランタイム(インテンショナル・ドメイン・ランタイム)を提供します。したがって、Capgeminiは、インテンショナル・ドメイン・ワークベンチを使用して、年金ワークベンチを独自の製品として構築しました。インテンショナル・ドメイン・ワークベンチでは、新しいモデルスキーマと投影を定義できますが、年金ワークベンチでは、これらの言語を使用して年金プランを構築できます。
インテンショナルシステムは、主に.NETエコシステムで構成されています。ワークベンチとランタイムの両方がCLRで実行され、それらのコア部分はC#で記述されています。ワークベンチを使用すると、ワークベンチに自動的にロードしてテストしたり、ランタイムで実行したりできる.NETアセンブリを非常に簡単に生成できます。カスタムワークベンチは任意の環境用のコードを生成でき、インテンショナルは別のパートナーと協力して、カスタムワークベンチで動作を指定し、結果として得られたシステムをJava環境に展開できるように、Javaコードを生成する作業も行っています。
実装の興味深い点は、1つの大きな変換ではなく、多数の小さな変換を使用して表現変換を処理することです。例として、セマンティックモデルからC#を生成するコードには、多段階コンパイラと同様にパイプラインに並べられた約12の小さな変換が含まれており、最後のステップはC# ASTからテキストへの変換です。内部設計の多くは、このアプローチを効率的に行うことに重点を置いており、効率の低下を気にすることなく、多くの小さな変換を連鎖させることができます。さらに、コード生成の変換パイプラインは、投影の編集に使用されるものと非常に似ています。
プロジェクション編集を使用するツールで共通の問題は、バージョン管理をどのように処理するかということです。多くの場合、答えは、複数の人が同時に同じストアを編集できるようにすることだけです。これにより、多くの真剣な開発者は震えます。インテンショナル・ドメイン・ワークベンチには、インテンショナルツリーに加えられたすべての変更を記録し、ツリーレベルでコミットとマージを実行できる組み込みのバージョン管理メカニズムがあります。その後、別の投影を行うことで、言語の差分を確認できます。
このバージョン管理アプローチの興味深い点は、競合を伴ってコミットでき、競合が競合としてリポジトリにコミットされることです。テキストファイルとは異なり、テキストが混乱することはありません。実際のデータ構造が存在するため、競合を見つけて修正できます。開発者は、この機能を使用して、解決できない競合をブランチにコミットし、競合領域に詳しい開発者がブランチを更新して修正できるようにします。
編集がテキストではなくインテンショナルツリーで行われるという事実は、他のいくつかのことも変化させます。たとえば、順序付けられていないコレクションにはタグが付けられているため、エディターで要素の順序を変更しても競合は発生しません。また、ドメイン固有の競合検出および解決動作を含めることもできます。
公開
歴史的に、インテンショナルのリリースが不足していることは1つの問題であり、彼らの秘密主義はもう1つの問題です。インテンショナル・ドメイン・ワークベンチについて何か現実的なものを見るには、ニール・フォードがアンフォーギブン契約と呼ぶものが必要でした。インテンショナルはいくつかの公開講演を行っていますが、それらは「私たちを信じてください。本当にクールなテクノロジーを持っています」と言うだけに過ぎませんでした。私たちは確かに彼らが持っていることを知っていましたが、なぜなのかを人々に説明することができませんでした。
そこで、私はDSL DevConで、マグナスとシェーン・クリフォード(彼らの開発マネージャー)が行う講演を非常に期待して待ちました。彼らはついに幕を開けると言っていました。彼らは本当にそうするのか、そして人々はどのように反応するのか?
彼らはいつものように、あまり情報のないPowerPointで心配なほどに始めましたが、その後、ワークベンチの表示に切り替え、ついに幕が開きました。反応を測るには、Twitterを見てみてください。
- @pandemonial すごく感動しました!これは素晴らしい!複数のドメイン、複数の言語、疑問に答えられないものはありません
- @csells C#ファイルで、ライブの電気回路がレンダリングされて動作しているのを見るのは、マジですごい。
- @jolson Intentional Softwareの電子工学デモについて言いたいことは二つ。「マジかよ」。以上、私の脳みそはついに爆発しました。
- @gblock これは派手なデモの話ではなく、我々が知っている世界を完全に変える話だ。
- @twleung よし、数理計算式のIntelliSenseは本当に素晴らしい。
- @lobrien これは100mpgのキャブレターを見るようなものだ:「マジかよ」、誰かがこれを買って金庫に入れるだろう!
その後、数人が、これは今まで見た中で最も重要なデモであり、すべてのデモの母に匹敵するとさえ言った。多くの人にとって、ソフトウェア開発の世界全体が変わってしまったという感覚があった。
(このカンファレンスを企画し、私を講演に招待してくれたChris Sells氏と関係者の皆様に感謝します。彼らは講演のビデオも公開しました。)
それで、これからどうなるのか? このすべてには、デモが明らかにできる以上のものがある。今のところ、私たちはワークベンチを実際に使って、徹底的に試してみたいと思っている。そのテストに合格すれば、商用プロジェクトで使用し、実際にどのように機能するかを確認したい。Intentional Domain Workbenchを使用して設計されたシステムはまだ稼働しておらず、アジャイル開発者なら誰でも知っているように、毎週本番環境にデプロイするまで、本当に何かを理解することはできない。
まもなく、これに類似するもう一つの主要なワークベンチであるJetBrainsのMeta Programming Systemが、バージョン1.0としてオープンソースでリリースされる予定だ。そのため、今年は、これらの言語ワークベンチがようやく日の目を見て、最初の外部パイロットプロジェクトが始まる年になるかもしれない。(MetaEditワークベンチはしばらく前から存在しているが、あまり注目されていないことにも言及しておくべきだろう)。これらのワークベンチが、私たちが知っているプログラミングの姿を変えるかどうかは分からない。結局のところ、私はかつてSmalltalkが私たちの未来になると信じていたのだから。しかし、これらのワークベンチには、それほど大きな変化をもたらす可能性を秘めている。確かに、私たちは今、この旅の次の、より公的な段階にいることに興奮している。