テ、 -  ソフトウェアの設計について -

# はじめに
（タイトル変更しました[^1-1]）
[^1-1]:[元々のタイトル【テ、 - 「ハリウッド的転回」と「手の柔軟性」について -】が我ながら意味不明だったため]

今日は2024年のクリスマス。

アドベントカレンダー最終日となります。

「チ。-地球の運動について-」に影響を受け、ソフトウェアの設計やプログラミングにおける「逆転の発想」的な話を記載したいと思います。

当日に1枠空いていることに気づいたため、即席に近い記載ですが、少しでも気づきを与えられるように心がけます。


# 「チ。-地球の運動について-」の簡単な紹介
<blockquote>
「15世紀のヨーロッパを舞台に、禁じられた地動説を命がけで研究する人間たちの生き様と信念を描いた」フィクション作品。
</blockquote>

私は漫画ではなく、アニメで見始め、しかも「サカナクション」や「ヨルシカ」といったアーティストの情報が最初のきっかけで、にわかに近い　です m(_ _)m

そんな新参者でも、引き込まれるストーリー構成、示唆に富んだセリフ、アニメの静かな雰囲気や画面の落ち着いたトーンなどの特徴により、毎週の楽しみとなった。

作者の魚豊氏がこの作品をつくろうと思ったきっかけをネットで調べてみた。

<blockquote>
天動説から地動説へ移行する、知の感覚が大きく変わる瞬間がいいんですよね。哲学と結びついて、「コペルニクス的転回」や「パラダイムシフト」って言葉が生まれるくらいの衝撃を与えました。その瞬間が面白くて、漫画にしようと決意しました。
</blockquote>

私もこういった話は大好き(大好物)です。


# ハリウッドの原則

ソフトウェアの設計やプログラミングにおける「逆転の発想」の一つに「制御の反転」(制御の逆転、Inversion of Control、IoC)というものがある。

細かい説明・歴史は割愛するが、再利用可能な共通化処理の呼び出しが（従来主流だった）「手続き型プログラム」と逆の流れになる。

この共通化の仕組みは「フレームワーク」と呼ばれる。
ちなみに、従来の制御の共通化処理のモジュールは「ライブラリ」と呼ぶ。

「地動説」が当たり前になったように、「制御の反転」もフレームワークを使ったプログラミングが当たり前になった今では、特別な考えではなくなっている。

今から約30年前1990年代、それ以前は「手続き型プログラム」が主流だったため、1995年Javaが発表され、サーバサイド中心にJ2EE(JavaEE)のフレームワークが出始めた頃は、元々のプログラミングの考え（常識）からの転換に苦労した人も多かった、と思う。

私も昔、大学のゼミで人工知能の研究(人工知能冬の時代)において、ミンスキーのフレーム理論などの応用的な実装のためオブジェクト指向のクラスやインスタンス構造などは理解していたつもりだった。
ただ、社会人になってJavaのEJBコンテナやWebコンテナ(Servlet/JSP)の開発に携わった当時、フレームワークをつくる難しさは、「逆向きに考える (逆向きに解く)」という、ところにあると感じていた。

一見難しそうな「制御の反転」を言い換えた言葉として、ロバート C. マーチンの書籍に掲載されていた「ハリウッドの原則」がある。
この表現が個人的に面白く、自分の中に腹落ち出来た。

（以下、Wikipediaより抜粋）
<blockquote>
冗談として時々「ハリウッドの原則」と呼ばれることもある。つまり「君の方から電話してこないで。君が必要な時はこっちから電話するから」ということである（つまりここでの「ハリウッド」は、いわゆる「買い手市場」の代名詞ということである）。冗談ではあるが、「電話する」という英語の動詞 call と、サブルーチン呼出（subroutine call）の call を掛けたダジャレになっている（英語では）。
</blockquote>

イメージしてみてほしい、あなたが演者だとして、何かしらのハリウッド作品についてのプロデューサーとの連絡方法を。
プロデューサーに都度都度（頻繁に）連絡するのが従来のやり方（これがプログラミングの常識だった）。
最初に契約しておいて、あとは必要なタイミングでプロディーサーから連絡がくる（こちらが制御の反転）。

（ちなみに、プロデューサーはヒゲを蓄えた大柄な男、そんなステレオタイプなイメージを私はしてしまった・・・皆さんはどんな方をイメージしましたか？）


# むすんでひらいての法則

「ハリウッドの原則（制御の反転）」を実現するにあたってフレームワークの設計では、いくつかのソフトウェア設計原則に基づく必要がある。

そのひとつに「Open-Closed Principle」（開放/閉鎖原則、OCP）がある。

<blockquote>
ソフトウェア要素（クラス、モジュール、関数など）は、拡張に対しては開いており、修正に対しては閉じているべきである。 
</blockquote>

開放/閉鎖原則という用語が難しかったが、まさーる（石井勝）さんが1997年に「むすんでひらいての法則」と平易な言葉で名付けたのは絶妙な表現だった[^3-1]。
[^3-1]:[オブジェクト倶楽部 むすんでひらいての法則](https://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/nifty-logs/ocp.html "むすんでひらいての法則")

私はこの言葉で、モジュールとモジュールが「手」を取り合うイメージが頭に浮かび、理解できるようになった。


# まとめ

ソフトウェア開発における逆転の発想・視点として、「ハリウッドの原則」と「むすんでひらいての法則」について簡単に記載してみた。

「制御の反転」（Inversion of Control）だったり、「開放/閉鎖原則」(Open-Closed Principle)という表現だと難しく感じてしまうかもしれないが、平易な言葉やイメージをきっかけに理解できることもある。



# さいごに

まさーるさんが福知山線脱線事故で無くなって来年2025年で20年になります[^4-1]。
[^4-1]:[石井勝さん追悼](https://objectclub.jp/community/memorial/)

お会いしたことはないですが、書かれているコトバで、優しい人柄が伝わってきます。
OCPの「むすんでひらいて」の表現は、まさーるさんから頭が硬い私へのプレゼントだった、と勝手ながら考えています。

「チ。-地球の運動について-」で好きなシーンは、ラファウが水溜りで「転ぶ」シーン（２話）　です。
モノの見方が変わる、視点の転換を象徴していました。

ずっと成功ばかりではなく、時には転ぶことで、新しい発想を得ることができる、なんてことを象徴しているのかも。

そういう点では、次に機会があれば、「ウォーターフォール」に対する「アジャイル」なども記載してみたいです。

今年の漢字は「金」でしたが、「アジャイル」を漢字一文字で表すなら「動」(Agileの語源であるラテン語のAgereはActionの語源でもある）　ですかね。
ただ、もう一文字追加できるなら「転」（転ぶ＝失敗する・転がす＝進む）を挙げたいな、と個人的に思います。

長くなりましたが、読んでいただき、ありがとうございました。


# 余談

ロバート秋山　最大のヒット曲「TOKAKUKA（都か区か）」になぞって「TIKATEKA（『チ。』か『テ、』か」というテーマで書いてみようと思ったのですが、残念ながら文章が降ってきませんでした。

■■カタカナのチとテは、形が似ている。
■■ビックリマンチョコのメーカーは？ロッチだよね、いやロッテに決まってる♪
■■星が空を動くのは？テン動説だよね、いやチ動説に決まってる♪

素敵なクリスマスをお過ごしください。