定理と呼ばれるものの中にも、「無限の猿定理」とか「ブラックホール脱毛定理」とか変わった名前のものがあります。今回は「ノーフリーランチ定理」というものを取り上げて、プログラミングにもある程度適用できるのではないかということを考えてみました。
本来の定理の内容
今はちょうど機械学習がブームとなっていますが、何かを探索するようなアルゴリズムは、機械学習以前にも多々ありましたし、これからも増えて行くことと思います。ただ、フリーランチ定理は、そのような探索アルゴリズムについて、大きな示唆を与えています。
コスト関数の極値を探索するあらゆるアルゴリズムは、全ての可能なコスト関数に適用した結果を平均すると同じ性能となる
つまり、あらゆる問題に「これ1つで済む」ような、汎用的な手法はない、ということです。
プログラミングの場合
プログラミングの場合も、「プログラミング言語」や「ライブラリ」は星の数ほどありますが、ノーフリーランチ定理と同様の仮定ができるのではないかと考えています。
- 他の選択肢より明らかに不便なもの→選ばれず消滅するか、少なくとも主流にはなれない
- 他の選択肢より明らかに便利なもの→一時的には有利になるけど、遅からず同等の機能が他にも普及していってベースラインが上がる
そういう前提で考えると、プログラミング言語もライブラリも適材適所で、合った場所に使えば便利だけれど、合わない場所で使おうとすれば無駄に負担がかかることもある、と考えています。
- 環境の問題…組み込み系ではCかアセンブラしかない、という環境もありえますし、ブラウザ内でJavaScriptやAltJS以外の言語を使うのはまだまだハードルが高いです。
- 想定範囲の問題…フレームワークなどでは、「フレームワークで想定した範囲内のコード」は本当に快適に書けるものの、その想定の枠外へはみ出そうとすれば、普通にやる以上に手間がかかってしまう、なんて例もあります。
「ハンマーを持つものにはすべてが釘に見える」なんていうことわざもありますが、言語やライブラリなどの環境で行き詰まったときには、無理にその中でなんとかするのではなく、別なものを導入するというのがいい選択肢となるかもしれません。