プログラミングにおける「モデル」の大切さ、モデル化の難しさを、前回話ました。今回は、モデル化を皆さんにできるようになっていただこうと思います。

もう一度、モデル化とは何か

まずは、おさらいです。

ある事象から、性質、動作、傾向などの特徴を抜き出し、抽象化することを「モデル化する」といいます。そして、事象をモデル化すると「モデル」になります。「ビジネスロジック」と言ったり。単に「ロジック」と言うこともありました。

モデルを考えるときには、物事を俯瞰(ふかん)することが必要となります。上から見下ろす感じです。地図を見たことがある人なら解るでしょうが、地域によって、碁盤目状になっていたり、まばらに民家が存在したりといった、特徴があることが解るでしょう。

このように特徴を掴むことがモデル化するための第一歩となるのですが、好き勝手に特徴を抽出したのでは、役に立つ物は作ることができません。やはり、ある程度トレーニングが必要となります。

モデル化のトレーニングをする上で、プログラミングのオブジェクト指向では、いきなり自動車やポットを持ってくることが多いのですが、最初にやるトレーニングとしては、高度すぎるかと思います。

最初のトレーニングでやると良いのは、パズル感覚でできる分類から初めてみるとよいです。分類をするには、特徴を必ず掴まないとできませんし、モデル化のよいエッセンスが含まれています。

動物園にいってみよう

では、実際に動物園の例で見てみましょう。

僕も先日、動物園にいってきましたが、実に沢山の種類の動物がいます。自然界に、なぜこのように多様性が生まれるのかは実に不思議ですね。

さて、今回は、「動物園で学ぶモデル化」です。動物園で会えるであろう動物をあげてみました。以下の動物をあなたなりに数個に分類してみてください。小学校とかで習うよくある分類でも構いません。
このくらいでよいでしょう。用意するものは、紙とペンです。次の文章を読む前に、是非、手を動かしてやってみてください。

さっそく分類してみた

おそらく皆さんは、以下の様な分類になったのではないでしょうか。
  • 哺乳類: サイ、ニホンザル、白くま、リス、イルカ
  • 鳥類: ペンギン、ふくろう
  • 爬虫類: ワニガメ
  • 魚類: シーラカンス、サメ
このような分類ができた僕らは、学校で非常に優秀な学生だったことでしょう。なぜか、僕ら日本人は、この分類を軽々とできるようにトレーニングされています。しかし、その詳しい理由は不明です。ダーウィンの進化論が大好きな人が多いからでしょうが、この分類が役立つことはクイズ番組意外ではほとんどありません。

その証拠に、大学に入って生物学を勉強すると、上の分類は教科書や講義にほとんど出てきません。よく考えてみてください。生物としての特徴を把握するのに、この分類は不便ではありませんか。

よくあるミスとして、イルカを魚類に入れたくなりそうになります。その感覚のほうがモデル化を勉強する人にとっては正しいのです。彼らの住環境、食生活は、サメなどの魚類とあまり変わりません。

考えれば考えるほど、この分類が機能しないことが解るでしょう。困ったものです。

こういう分類もある

そして、より良く生物の特徴を掴んでいる人の分類は、以下のようになるかもしれません。
  • 水中に住む: シーラカンス、サメ、イルカ
  • 陸上に住む: ニホンザル、白くま、リス
  • 空中に住む: ふくろう
  • 水中、陸上両方に住む: ペンギン、サイ、ワニガメ
このように分類をすることで、より特徴を掴むことができるかもしれません。その他にも、食生活や求愛活動に関する分類もできるかもしれません。

住環境に関して分類してみたわけですが、住環境は、それぞれの生物の持つ「機能」にも、もちろん影響してきます。水中に住むには、「泳ぐ」という機能が必要かもしれませんし、陸上に住むには「歩く」とか「走る」といった前進するための機能が必要になるかもしれません。

このようにして、分類するトレーニングを普段からするようにおすすめしたいです。例えば、電車に乗る人は、時間軸や服装や格好でどのような分類ができるか。一見、全く関係なさそうな2人を同じ分類に入れるにはどのようにしたらよいかなどです。

このように分類しているうちに、自然に特徴や共通点に関して注目するようになっていることでしょう。実は、これが、僕の狙いです。

いきなり目の前のものをモデル化してといっても不可能なのです。全体から考えたら対象物はどのようなものなのかを考えるようにするのです。分類するためには、当然、対象同士の共通点に関して考慮しなくてはいけなくなります。

そのようにしているうちにもう、僕らは、モデル化できるようになってしまっているでしょう。

プログラマがすべきこと

プログラマがやらなければいけないことを簡単にいうと、世の中を便利にすることです。世の中を便利にするということは、将来のことをいっているように思えるかもしれませんが、それでは、今現在の飯代が稼げません。

もちろん、お腹が減っているからといって、ご飯を食べ続けてもいけません。今を生きつつ将来の世界を便利にするのがプログラマとしてのあり方です。

当然問われるべきは、今作っているものは、1年後にも使えるものか、もっというと10年後20年後も使えるかは常に考えるべきなのです。

そこで必要なのが、モデルです。今作っているのは、今必要な機能として、将来も必要とされるためには、最大限の広がりをもってモデルを作成すべきなのです。

将来使うか分からないような変数や関数をダラダラと並べていくのではなく、将来も使いやすいように、きちーっと分類してモデル化しておくことです。

例えば、動物園のチケットを扱うモデル Ticket を考えたとします。子供は200円。大人は500円と仕様が決まっています。僕らは、Ticket を設計する際に、子供なのに500円という値が入らないように保証すべきです。同時に仕様になくても将来的にシニアが入れられるように考えておく必要があります。

将来、キャンペーン・イベントなどをやったときに Ticket はどうなるのかも考えなければいけません。仕様にない場合も、プログラマとして気に掛けなければいけない問題となります。

モデル化はやっぱり難しい

先ほど、分類に関して学んでいただいたのは、分類は1つではないということを学んでいただくためでもあります。複数の分類がありますし、モデル化も1つの方法だけではありません。

哺乳類、鳥類、爬虫類、魚類という分類で、そのままモデル化して安心していると、すぐに、「哺乳類なのに、住環境は水中です」、「鳥類なのに飛べない」などの複雑な要件や仕様が追加・変更がなされていきます。

なにか、きちーっとモデル化が上手く言っているような気がしても、すぐに方向転換が求められることがあります。僕らのモデル化が間違っていたり、根本的に問題解決に繋がりにくいことがよくあるのです。モデル化がやっぱり難しい理由となります。

このような難しい問題には、分類やモデル化に関するトレーニングを積むしかありません。テクニックでは、なんともならない問題となります。

プログラマのよく発する言葉に、「気持ち悪い」「臭い」などの共感覚じみたものがあります。これは、将来も通じるモデルという視点で考えたときに、どう考えてもおかしなコードや設計だということから出る言葉です。なんだと言われても説明不能ですね。

まとめ

さて、プログラマがなぜ稼げるかというところに戻ってきますね。プログラマの仕事は、充実感がありますが、大変難しいものなのです。

モデル化を的確にできるプログラマは、いつの時代も重宝されるでしょう。日々、きちーっと努力していく。モデル化のトレーニングは、プログラマの日々の筋トレのようなものだと捉えてください。