今回の記事では、プログラミングに数学的知識は必要かについて書いていこうと思います。
・この記事は筆者の独断と偏見に基づいて書かれています。
はじめに
そもそも、今回なぜこの様な内容を書く事になったかと言うと、ボランティアで地域のプログラミング教室(〇〇市主催の中高生向け)があり、社会貢献の一環(会社からのプッシュ)として参加したのがきっかけでした。
そこの会場で実際に教えた内容としては、今流行りのゲームプログラミング的な物を作ってハッピーになろうみないな感じだったのですが、その中で「やっぱり数学の知識って必要なんですか?」という質問があったのです。
その時の回答としては、「あればヒーロー的な凄いプログラマになれるけど、無くてもそこまでは困らないかな」と、子供相手に適当な事を言ったものだと反省をしておる所です。
まあ、そういった事もありますし、実際筆者もそこまで数学的知識を使用してプログラムを書いているわけではないので、これを機に少し深堀してみようと思ったのがキッカケになります。
システム構築での数学利用について
一言にシステム構築と言ってもその幅は広いです。昔と異なり既にシステムというのは社会基盤の一種となっているので、基幹系から工場含めた生産、その前工程にあたる設計や解析業務、売りや買いに繋がる生産や調達システム、一般的な事務的作業、これらを運用するためのハードウェア関係などなど…多岐に渡ります。
では、これらのシステムに対して開発運用を行っていくとしたら、どの程度の数学的知識が必要となるだろうか?
当然の事ながら四則演算や集合(And|Or)は使うとしても、「関数は写像だ!!」という認識で関数を作成しているプログラマは多くないだろうし、先入れ後出し法で配列を扱うにしても、昔の様にスタック処理がどうこうすることは無く、クラスのモジュールを使用して解決してしまうだろう。
一方、解析やハードウェア開発においてはどうだろうか、流石にこの辺りになってくると数学的知識が必要になってくるような気もするが、最近の現場開発ですと、実はベンダーからAPIが用意されており、概念的知識(実行したらどうなるか)を知る必要はあるけれど、現場において線形解析の公式を使ってどうこうするシーンというのは、なかなか出会う事は少ないです。
では、最近流行りのAIやゲーム開発ではどうだろう。
これに関しては後述で記載することになるが、一定程度の数学的知識が必要だ。
ただ、現在のプログラミング環境において、この必要な数学的知識がどの程度かと言うと、議論の余地はある。
公式まで覚えていないとAIやゲームが開発できないかと言われるとそうではない。世の中にあるモジュールを組み合わせるだけで出来る物も当然ある。
しかしながら、数学のどの様な考えが利用でき、どういった影響を与えるかに関しての知識は知っておくべきであろう。
作るプログラマと使うプログラマ
まず現在のプログラミングにおいて、我々は既に用意されているモジュールを使用して構築していく事が多く、数学的事象・公式をモジュール化して提供している側と、それらを利用して組み立てる側に分かれているのではないだろうか、という点が考えられます。
これを説明するのには、テトリスというゲームが分かり易いのですが、このゲームを作っていくときに問題となるのが、右回転と左回転です。
正直、左右の移動に関しては[ブロック座標+1 or -1]みたいな感じで、そんなに苦労をする事はないのですが、右回転と左回転は別物で、これを真面目に実装しようとすると、三角関数と行列を使用した行列変換を知らないと回転が出来ないんです。
しかし、納期に追われた我々はそんなことは考えず「テトリス.js」みたいなモジュールを何処かからか入手し、回転する概念を飛び越して、モジュールに座標位置を渡し、返ってきた値をイベントに反映させるだけで終わってしまいます。
他にも弾道計算や3Dモデルの主人公の動きなども同様でしょう。すでに用意されている物を、マウスで選択し必要な値を入力するだけです。
最近のプログラミング業界の話題で例えるならば、「機械学習はPython」と言っている人も、Pythonに充実している機械学習ライブラリを利用(決定木も[scikit-learn]クラスを用いてデータ配列を渡している)しているだけで、Pythonを使用して最初から、それを実装することは無いのではないでしょうか。極論Java側に機械学習のモジュールが充実し、使いやすくなればそちらに流れていく可能性もあります。
もちろん、決定木がどういう物かは知っておく必要がありますが、数学的な公式や仕組みというよりは、「この様な結果を求めるための機械学習のアイテムは[決定木]、それに必要なデータはこうまとめておく」という概念的なものが重要視されているのではないかと思います。
これは統計を例に挙げると分かりやすいのではないでしょうか。標準偏差を求めるにはコマンド一つで出来ますが、公式を忘れたとしても標準偏差が一体何なのかを知らずに利用することは無いでしょう。
最後に(まとめ)
この様に、数学的知識を使用して、新しいモジュールを作成し世の中へ提供する側のプログラマがいれば、それらを利用して顧客に提供を行う側も存在しています。
前者には数学的知識が求められますが、後者には公式や数学的知識までは必要ないにしても、どの様な結果を求めて、どの様にそれらを利用するかという数学の断片的知識は必要になってきます。
また、プログラミングでコードを記述する場面でも、数学の基礎的知識は必要だと考えます。
それはなぜかと言うと、例えば似たようなコードをまとめようとする動きは、他ならぬ因数分解と同じ動きになるからです。因数分解がどういう物かを忘れていても、知らず知らずのうちに、それら概念を利用していることは間違いないでしょう。であるならば、それら利用している物を深く知ることはプラスになるに違いないと考えます。
また、If文や比較にしても、論理式を知っていれば、より洗練されたコードを書く事が出来るようになるし、論理的思考を身に着けておくことで、順序良くコードを記述していく事に繋がっていくと思います。
この様に直接的に数学的知識や公式を使用しなくても、概念的なものを理解する事は、コードをより良くする上でプログラミングに必要なアイテムとなってくると考えます。
おわり