このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Catyの特徴と機能をイメージできるようなオハナシ

先ほど書いた記事を受けて、Catyに関する情報不足をナントカする試み。

技術的な背景や設計判断に関して述べることはいくらでもあるのですが、それ以前に、「それはなに?」「なにがうれしい?」さえも説明してない/できてないですね。

「それはなに?」「なにがうれしい?」のイメージがある程度は湧くように、次の2つのキャッチフレーズに絞って、どんなことがどのように出来るかを描き出したいと思います。

  1. ミーティングが終わったら出来ている
  2. 作り方を作れる

ミーティングが終わったら出来ている

例えば、新しいWebサービスに関してブレーンストーミングをするとか、顧客と業務システムの概要について打ち合わせをするとか、ひとしきりディスカッションをして、だいたいの合意が取れたとしましょう。「こんな感じかなー」というシステムイメージは、おおざっぱなロバストネス図として描けた、と、そうしましょう。

Catyではロバストネス図類似の視覚化表現をコマンド一発で描けます。(図は「ユースケース図もどき、とか」よりの引用)

この図のもとになるのは、一種の仕様書ですが、その一部を引用すると:(全文は「ユースケース図もどき、とか」にあります。)

resource 予約ページ ("/reserve.html") {
action 取得("/GET")
:: @[in, out] #0 void -> void produces 予約注文画面 ;
};


state 予約注文画面 for 顧客 :: defered links {
+ 予約 --> 予約処理.予約;
};


resource 予約処理 ("/process.cgi") {
action 予約("reserve/POST")
:: @[in] #in LunchOrder -> _ relays [ng, ok],
@[out] #ng _ -> void redirects 予約ページ.取得,
@[out] #ok _ -> LunchOrder produces 確認画面
;
// ...
// ... 省略
// ...
};

構文の詳細はともかくとして、画面やアクション(サーバー側で実行されるプログラム)が記述されているのはわかるでしょう。構文に慣れてしまえば、メモ書きや議事録として、この“仕様”をその場で書くことができます。

この仕様は、単に視覚表現の元データということではなくて、Catyにとって理解可能/実行可能な形式です。つまり、一種のプログラムであり、Webシステム実装の一部なのです。

実行可能な形式なので、その場でWebシステムとして動かすことができます。もちろん、デザインはまったくしてないし、プログラムロジックも一切記述されてないので、仕様に書かれたデータ型やハイパーリンク構造を確認できる程度ですが、最初のプロトタイプとしては使えます。

つまり、ミーティングが終わったら時点には、最初のプロトタイプが動き出します。

作り方を作れる

今までのハナシで、仕様からプロトタイプを作り出す機能をCatyが組み込みで持っていると思った方もいるでしょう。それは違います。そうじゃありません。Catyがもともと持っている機能は、データ型やらスクリプトやらのメタオブジェクトを通常のデータ(JSONデータです)に“落とす”機能です。

この機能を我々はレイフィケーション(reification)と呼んでますが、リフレクション(reflection)とかイントロスペクション(introspection)と呼ぶほうがお馴染みでしょう。設計時/プログラミング時に概念として意味を持つ情報が、実行時にもデータとして存在していて、かつ“概念を表現するデータ”(メタオブジェクト)をプログラムで操作可能なのです。

Webシステムの設計時に意味を持つ、クライアント状態(画面)、リクエスト処理、ハイパーリンクなどが、実行時のメモリ内にも存在します。そして、それらのメタオブジェクトをJSONデータとして取り出せて、JSON処理/文字列処理により好きなように加工できます。この加工それ自体は単なる普通のデータ処理に過ぎませんが、元々がメタオブジェクトだったのでメタプログラミングとなります。

メタプログラミングの応用のひとつとして、仕様に相当するメタオブジェクト群からプロトタイプを生成すること出来るわけです。Catyがもともと「プロトタイプを作る機能」を持っているのではなくて、「『プロトタイプを作る機能』を作る機能」を持っているのです。

Catyプロジェクトの初期の頃から、マゾ・テストというものを目標のひとつにしてきました。これは、「自分をテストするためのテストコードを自分で作り出して、自分自身をテストする」機能です。まだマゾ・テストは出来ません。課題が残っています。でも、メタプログラミングの能力を洗練・増大させれば、マゾ・テストもあながち夢でもなかろう、と思っています。