結城浩のはてなブログ

ふと思いついたことをパタパタと書いてます。

(2) パターン・ライティング

軽い昼食の後、ラウンジでミルクティを飲んでいると、ボーイさんがはがきを届けてくれる。家内と子供たちからの絵葉書だ。あちらはあちらで楽しくやっているようだ。
ミルクティのおかわりをしようと周りをきょろきょろ見回すと、キャンプのメンバーらしき一人が私のところにやってきた。手にはアイスコーヒーを持っている。20代のにこやかな男性である。ここでは仮にミラノさんと呼ぶことにする。
ミラノ「こんにちは、結城さん。ミラノといいます。ちょっとおしゃべりしてもいいですか。」
結城「ええ、いいですよ。」
ミラノ「私は普段はJavaでプログラムを書いているプログラマなんですが、結城さんのデザパタ本を読んでからパターンに興味を持つようになったんです。」
増補改訂版Java言語で学ぶデザインパターン入門
結城「そうですか。ありがとうございます。」
ミラノGoF本や、その他のデザインパターンの本なんかを読んでいて思ったんですけれど、パターンってどうやったら書けるんですか?」
結城「と、いいますと?」
ミラノさんはそこで言葉を探すように目をぱちぱちさせた。ラウンジではあちらこちらにグループができ、理数系の楽しげな会話が繰り広げられている。静かなバロック音楽が流れている。
ミラノ「説明がへたですみません。例えばGoFのAdapterパターンってありますよね。それからPreeのいろんなパターンも。それから『パターンハッチング』でブリジデスさんが1つのパターンを練り上げようとしているドキュメンタリーのような文章がありましたよね。私も、日常的に開発をしていて、自分なりのパターンのようなものがあるんですが、それをどういうふうに書いたら、みんなからパターンとして認めてもらえるかと思いまして。…言っていること、わかりますか?」
結城「ええ、わかりますよ。ええと…、まず私はパターンの本を書いていますけれど、特に学問的に研究しているわけではないので、もしかしたら間違っていることを言っているかもしれません。と、お断りしておいて。ミラノさんは自分の経験がいろいろとおありで、それをパターンとしてまとめたい、ということですよね。」
ミラノ「はい、そうです。それでどうやったら有用なパターンであるというお墨付きをもらえるかと思いまして。」
結城「そういう『お墨付き』を与える機関はないと思いますよ。しいて言うなら、PLoP (Pattern Languages of Programming)のようなパターンに関連したシンポジュームやカンファレンスに論文を出して、多くの人から『これは有用である』と認識してもらうことだと思いますけれど。」
ミラノ「はあ…。」
ミラノさんは、アイスコーヒーをゆっくりと飲む。私はボーイさんを呼んで、ミルクティのおかわりをたのむ。
結城「あまりピンと来ませんか。パターンに関してはいろんなところで人々が活動しています。日本に限って言えば、パターンワーキンググループができていますね。定期的にタスク活動を行っていますし、勉強会もやっていますよ。そういうところであなたのパターンを発表する機会を見つけてはどうでしょうね。」
ミラノ「それは知りませんでした。そういう団体があるのですね。」
結城「それから、パターンワーキンググループとは関係ありませんが、私が主催している[DP/ML]というメーリングリストもあります。あなたが自分のWebサイトでパターンを紹介したときなどには、[DP/ML]に流していただければ、たくさんの人の目には触れると思いますよ。そこから先は、あなたの書かれたパターンを他の人がどう思うか、ということになりますね。」
ミラノ「実は、アイディアはいろいろあるんですが、具体的にパターンを『書く』というのはどうすればよいかわからないんですけれど。」
結城「なるほど。PLoPなどではパターンライティングの講座が開かれることもありますね。それで敷居が高いようなら、ネットのあちこちで見つかるパターンを見よう見まねで書いてみるのがよいと思いますよ。パターンを書くにはいろんなフォーマットがありますので、それにしたがって書くのもよいですし『自分の書きたいことをもっとも適切に相手に伝えるにはどうしたらよいだろう』ということを考えて自分なりのフォーマットを作ろうと努力するのも楽しいと思いますよ。」
ミラノ「結城さんは絵本のパターンとかをお書きになっていましたよね。」
結城「ええ。絵本を読むときのパターン・ランゲージのことですよね。あれは、パターン・ランゲージで有名な建築家Alexanderのフォーマットにならって書いたものです。文脈と問題の提示があって、その問題に対する解法がある。そして関連する解法への参照がある。だいたいそういう形ですね。」
ミラノ「パターンとパターン・ランゲージは違うんですか。」
結城「個々のパターンを「単語」とみなしたとき、パターン・ランゲージは「言語」とみなすことができます。つまり、複数のパターンを組み合わせて、より大きくて有機的な解法の連鎖を生み出すことができるもの。それがパターン・ランゲージですね。「絵本を読むときのパターン・ランゲージ」の場合には、子供に絵本を読み聞かせるときに直面する複合的な問題(こまったこと)にどのように対処したらよいかを、私なりに提示したものです。このパターン・ランゲージを読むと、個々の問題を解決するだけではなく、子供に絵本を読み聞かせるというのは、いったいどんなことなのかがほのかに浮かび上がってくるような文章になるように心がけました。」
ミラノ「ふう…。なかなかたいへんそうですね。結城さんはどこでそういうことを学ばれたのですか?」
結城「恥ずかしながら、みようみまねです。パターンのことを勉強しているときに、石井勝さんからAlexanderのA Pattern Languageという本をすすめていただいたんです。結構古臭くて厚い本だったのですが、ぱらぱら見てみてその「形式」はすぐにわかりました。それでみようみまね、というわけです。」
ミラノ「じゃあ、私がパターンを書くときもそのAlexanderの形式にしたがったほうがよいでしょうか。」
結城「それはよくわかりません。まずは、GoF本を持っていらっしゃるなら、その形式でやってみてもよいかもしれませんね。よい方法は、自分でとにかくまず書いてみる。そしたら公開して他の人に見てもらう。そして率直なフィードバックをもらう。それがよいと思いますよ。あまり形式的なところを重視しすぎないで、他の人に自分の考えていることが伝わるだろうか/伝わっただろうか、というところに注意を向けたほうがよいと思います。」
ミラノ「何となくわかってきました。というか、いろいろと書いてみたくなりました。結城さんがお書きになったパターンは他にありますか?」
結城「これはご存知かもしれませんが、技術系メーリングリストで質問するときのパターン・ランゲージというページも、Alexanderの形式風に書いてあります。」
ミラノ「あ、聞いたことがあります。「過去ログを読むように」とか、「検索エンジンを使いなさい」とかですね。」
結城「ええ、そうです。そこら中の技術系メーリングリストで同じようなことが毎日のように繰り返されますよね。パターンというのは、繰り返し起きる問題に対する解法ですから、まさにこういう分野には適切な表現形式なのですよ。それから、Webサイトではありませんが、私のスレッド本の最終章には、マルチスレッドプログラミングのパターン・ランゲージが出てきます。」
Java言語で学ぶデザインパターン入門 マルチスレッド編
ミラノ「わかりました。今度読んでみることにします。なんだか長話になってしまいましたが、ありがとうございました。」
結城「いいえ、こちらこそ。何か面白いパターンが書けたら、ぜひ[DP/ML]で教えてくださいね。」