プログラマに数学は必要か
プログラミングが属するコンピュータ・サイエンスという学問は理系学部で勉強する分野だ。そして理系と言えば数学。以前は「数学ができないから自分はプログラミングは無理」と諦める人も多かったと思う。実際のところどうなのだろうか。僕が今まで出会った多くのエンジニアの傾向を踏まえてあくまで自分の体験からくる持論として書こうと思う。
今回のまとめ
・IT業界はエリート組と一般組に分かれる
・数学的思考力は数学とは別物
・一般組にとって数学そのものは不要だが数学的思考力は超重要
エリート組と一般組
まず最初に、GoogleとかMicrosoftなど技術に特化した大手企業で製品開発に関わるエンジニアとなると状況は全く違うし、この文章を読んでいるターゲットともずれる。そちらの人は当然数学もできて当たり前だ。
恐らくIT業界という競技は、高校・大学時代からそこを目指して切磋琢磨してきたエリート組と、自分がエンジニアになるなんてあまり考えてなかった一般組の参加者に大きく分断されている。一般組は理系大学に行っていたとしても別の専門領域だったり、プログラミングの授業は触る程度という人も多い。さらに文系も多いし、大学や専門学校には行っていないという人も普通にいる。そしてそういう一般組のほうが人数的には圧倒的に多い。僕自身も一般組の参加者だった。
つまり、安心してほしい。IT業界で活躍しているエンジニアは専門教育を受けてきた人や、数学が得意な人ばかりではない。もちろんプログラミングのセンスや幅広い仕事力があるから活躍できるわけだが、数学に限って言えば中学生で習った連立方程式が解けないというレベルの人も僕は見てきた。そういう人の中にとても優秀なエンジニアも何人もいた。
数学と数学的思考力
ただし、安心ばかりしてもいられない。これがほぼ今回の結論になるのだが、数学はできなくても数学的思考力はめちゃくちゃ重要だ。論理的思考力、ロジカルシンキングとも言われるものだ。
数学というのは一定の数式の扱い方や、問題を解くための前提知識などが多くあり、そこを勉強した人・覚えている人にしか理解できない。そのような知識がプログラミングに必要かというと、大半の場合そこは必要ない。ただし目の前の事象を数学的に捉えて考え、結論に導く力は超重要、というかプログラミングってほぼその作業の連続なのだ。
わかりやすい例として問題を出そう。
ある事件が発生しA, B, Cの3人が疑われた。
Aは「犯人はBだ」と発言した。
B,Cもある発言をした。
その後、以下が判明した。
・犯人はA, B, Cのうち誰か1人
・犯人だけが本当のことを言った
犯人は誰か?
不慣れな人は「BとCの発言がわからないのにどうやって考える?」と戸惑うだろう。現実世界では容疑者の発言は全て聞けるのが当たり前なので、あまり事件や容疑者という現実の想像に引っ張られすぎるとこういう問題はできない。あくまで論理クイズ用に設定された条件、として書いていることだけに忠実に従って考えていくと、答えはCだとわかる。
この問題を解くのに重要なのは、物事を仮定して考える力だ。もしもXならばY、YならZという仮定を想像してその世界線で考える。そこに矛盾が表れ設定が破綻するようならば最初のXが間違っている、ということで徐々に答えを絞り込んでいく。これは背理法という考え方で数学でも頻繁に応用される。
この問題のように、プログラマが扱う題材は数式こそ出てこないが様々な条件を整理し、仮定し、抽象化・具体化し、結論を導く力が求められる。これが数学的思考力だ。プログラミングの現場で数学が必要になるケースは多くない(あるところもある)が、数学的思考力はずっとずっと永遠に必要だ。
数学は本当に必要ないのか?必要な現場は?
でもAIとかやるには必要なんでしょ?と思うかもしれないが、あえてNOと答えよう。もちろんディープラーニングのモデルを自分で構築するとか、低いレイヤーのことをやろうと思うと必要になる。ゲームキャラクターの当たり判定を自分で書かなければいけないシチュエーションでもそうだろう。
しかし、我々一般組がたどり着く仕事で上記のようなものはほとんど出てこない。AIであれば既存のライブラリを利用して取り出せる結果を使うだけ、ゲームもUnityなどを使って当たり判定などはフレームワーク任せ。そういう部分は超絶数学得意なエリートエンジニア達がすでに作って提供してくれているのだ。
結論
今回の記事があなたにとって救いになるのか、はたまたその逆かわからないが、結論は以下となる。
・プログラミングに数学は(ほとんどの場合)不要
・プログラミングに数学的思考力は超重要で不可欠
数学的思考力も訓練である程度は鍛えられるが、その方法についてはまた別の記事で触れてみたいと思う。