Marginalia

パターンが機能するとはどういうことか

Kent Beckは、名著『実装パターン』(Kent Beck 著 長瀬嘉秀・永田渉 監訳 ピアソン・エデュケーション・2008。残念なことに絶版のようだ。)の中で次のように書いている。

価値、原則、パターンという3つの要素で、開発のスタイルはバランスよく表現される。パターンは行動の内容を説明する。価値は動機を提供する。そして原則は、動機を行動に変換するのに役立つ。

どんなパターンにも、そのパターンが生まれるための動機となる価値観がある。価値観に共感できないパターンは使う意味がない。なぜなら、何を問題とするかはまさに価値観によるのであって、価値観が違うならそのパターンで解決しようとする問題意識そのものが共有されないからだ。パターンが機能するひとつの形は、そのパターンの根底にある価値観と問題意識を共有した人にとっての先人の知恵ということになるだろう。

また、パターンはそれがパターンであるということ自体でも機能する。少し経験のあるプログラマーであれば誰でも、他人の書いたプログラムから意図を理解するのに苦労した経験があるだろう。もしかしたら、他人ではなく過去の自分が書いたものでさえも理解できないことがあるかもしれない。プログラムは書かれるものであると同時に読まれるものでもあり、往々にして読まれることのほうが多い。であれば、他人に意図が伝わりやすいプログラムを書き、他人のプログラムから意図をうまく読み取るにはどうすればいいだろうか。そのひとつの答えがパターンである。

パターンに沿って書かれたプログラムは、そのパターンを知っている読み手にとって補助線が引かれているようなものだ。パターンはプログラムの重要で注目すべき部分はどこなのかを教えてくれる。パターンで書かれた部分の意図はそのプログラム固有のものではない。パターンに沿って書かれたプログラムの中でなおパターン化されえない部分こそが、そのプログラムの個別的で本質的な部分であり、時間をかけて読むべき部分である。パターンという補助線によって、プログラムを読むために必要なコストを最小限にできる。当然だが書き手にとっても同じことが言える。パターンに沿って書くことで、プログラムの重要な部分を強調し、思考をその部分に集中することができる。

『プログラマー脳』(Felienne Hermans 著 水野貴明 訳 水野いずみ 監訳 秀和システム・2023)で語られているように、熟練者と初心者との間でプログラムを読む速度に違いが出るのは、熟練者のほうがそのプログラムに慣れているからだ。馴染みのないプログラムは熟練者であっても初心者と同じように時間がかかる。熟練者を熟練者たらしめる能力の一側面は、知っているパターンの豊富さ、そして既知のパターンを目の前のプログラムに当てはめる力だといえるだろう。これこそがプログラマーにとっての経験の大部分ではないだろうか。

広く普及しているパターンにはそれだけの理由がある。そのようなパターンを学ぶことは、プログラミングの基礎的な力を鍛えることにも役に立つ。あるパターンがどのような原則に基づいているのか。パターンを生み出した偉大な先人たちはどのように問題を認識してきたのか。そのような問いから新たな視点を得ることで、プログラミングに対する洞察力が養われるだろう。そうした過程はパターンそのもの以上に大きな価値がある。だから、古くなったといわれるパターンであっても学ぶ価値があり、それがどのような前提条件で有用であったのかと考察することで得られる示唆がある。