数学かプログラミングか、どちらかしかできないとしたら。

Pocket

数学とコンピュータⅡ Advent Calendar 2017 21日目の記事です。

 

はじめに

僕は京都大学理学部数学科3年生です。大学に入ってから、iOSアプリの開発やウェブサービスの開発をしています。
最近はDr. Numbersというサービスをリリースしました。美しい数字の特性を誰でも投稿できるサービスです。

このAdvent Calendarの存在を知った時も、僕みたいに、大学では数学をするというよりプログラミングをしていたかもしれないような人間には、いやはや書くことはないと感じたのですが、日程の空き具合を見たところ、本日12月21日が空いていたわけでした。

これが、僕にとっては運命的なものでありました。
1221という対称性、1×11×111という美しさに魅了されたことに起因して、僕は何か記事を書くことを決めたのでした。

僕は大学に入る時に、将来の人生を考えて専攻を決めるというのもいいと思いましたが、僕は自分が好きなこと、自分が今まで続けられたことを基準に選考を決めようと 数学を選んだわけでした。

大学に入ってからは、新規サービスで一発当てたいなという思いもありプログラミングを始めました。

そうこうしているうちに大学も卒業をする年になりつつあり、この先の進路も考える必要が出てきたわけです。

このまま大学に残り数学をするのか、それともプログラミングなどITの世界で生きていくのか、それとも全く関係ない世界に首をつっこむのか、どうしようかと、最近は少しばかり悩んでおります。

 

プログラミングと数学の比較

数学とプログラミングの比較をしようという心持ちではありますが、これは全く異なった二つを比較するというわけではなく、完全に切り離すことができないトピックです。

つまりは、数学でもあるし、プログラミングでもあるような対象が生まれていますし、そもそも数学的思考とプログラミング的思考には共通するものがあると思います。
では、この比較において、先に主な結論を偏見を込めて申し上げます。

数学の方が難しくて、プログラミングの方が簡単である。

これが、僕が感じていることです。
あるいはこういう言い方をした方がいいかもしれません。

プログラミングの難しい部分は数学と分類されている。

数学というのは、ある対象を抽象化した時に生まれる対象の学問であります。もちろん、応用数学のようにある程度具体的な対象に関しても数学という分類はなされ得ますが、一般的な側面でいえば数学の本質は抽象化だと思います。

ここで、思考の難しさとは何で決められるのかと考えてみると、その定義の一つに抽象化というのがある程度大きな要因として含まれると思われるので、では数学の方があらゆる対象よりも難しいという命題は真であるのだ、と言うこともできそうだなと思います。

数学の方が難しくて、プログラミングの方が簡単である。

もう少し掘り下げてみましょう。

まず、数学は膨大な数の定理と証明を理解、証明しながら進めなければいけません。これはすごく体力と時間のかかることです。一ヶ月間数学の勉強を本気でしたとして、ほんの少し、ある対象に関する理解が深まると言った具合です。

それに比べて、プログラミングならば、一ヶ月もの間本気で勉強したとすると、何か一つのサービスが完成したり、結構な実力がつくかと思います。

時間の流れが違いすぎるのです。自分は出来ているのだと言う実感は明らかに数学よりもプログラミングの方が湧きやすいでしょう。
ですから、体感として、プログラミングの方が簡単だなと感じるのは自然なのです。

次に、数学の問題をコンピューターに解かせるのは、どうやるのだろうという疑問があります。

コンピューターにできることは簡単なことであるという観点の元に話すと、例えば、あるサービスのプロトタイプを作成するとサービス自体を完成させてくれる、というシステムはそれなりの難しさもあるでしょうが、実現する未来はある程度近いように感じます。

つまり、僕のような人たちが今行なっているようなプログラミングの作業というのは近い将来コンピューターに代替される上に、汎用性もそれほど高くないということです。

それに比べて、数学の定理の証明や、問題の解決は、コンピューターに解かせる目処は立っていないのではないかと思っております。

僕は基礎数学に詳しくないので、何かコンピューターが証明を行う世界においてブレイクスルーはあるかもしれませんが、それでもプログラミングが数学上の定理を理解し、証明し、問題を解き、問題を発見し、定理を理解するというフローを完全に自動的に行うことはないと思っています。
もちろん部分的には実現するかもしれませんが、人間の思考の本質的な深さというものにコンピューターが到達するのかという問題です。

これに関しては、これが完全に自動的に行われるとした時に、人間の存在意義が問われるという根源的な問題から生じる希望的予想とはなりますが、僕はそのようなことは起こり得ないのではないかと期待しています。

 

数学とプログラミングの共生

数学の方が難しくて、プログラミングの方が簡単とは言ったものの、もっとミクロな視点に立てばこれらは互いに影響しあってこの世界で繁栄しているのだと思います。

具体的にいえば、プログラミングというもの自体を数学の対象にしているものや、数学をプログラミングの対象にしている場合があります。

プログラミングを数学の対象にしているとはどういうことかというと、最近流行りのディープラーニングの研究であったり、型理論の研究などで、これらは数学をプログラミングに適用していると言った方がいいかもしれません。
こちらに関しては僕はあまり詳しくないのでこれ以上は割愛します。

逆に数学をプログラミングの対象にしている場合を考えましょう。
例えば、僕が作ったDr. Numbersは、数学(数字の性質)を対象にして考えたwebサービスなので、この分類に入るでしょう。

もっと、有名で大規模なものを紹介すると、整数列の辞典であるOEISや質問サイトであるstack exchangeなどがあるでしょう。

これらはプログラミングを使ってというよりも、ウェブアプリケーションのフレームワークを使用して作るという開発者視点での話ですので、このサービスを使用するユーザーはプログラミングのことを考える必要は全くありません。

ただ、数学もプログラミングも好きだという人の表現方法として何かのサービスを考える時に、こういうサービスが実際にあるし、もっとサービスを作ることもできるのだという話です。

プログラミングを使って数学の概念に触れてみる類でいうと、Mathematicaなどの数学用の言語で何か計算させるというようなことも可能です。もちろんPythonなど他の言語によっても、コンピューターによる数学の世界を垣間見ることはできるでしょう。

数学とプログラミングは共生可能であり、どちらかに絞らずとも、どちらも続けていけるということを示しています。

 

高貴すぎる数学、実用的すぎるプログラミング

数学の歴史の深さに比べ、プログラミングの歴史というのは、まだまだ浅い。
しかし、数学が一部のスターしか輝いていないとみるなら、プログラミングの世界ではある程度皆輝ける世界なのだと思う。

これは何より、数学が高貴すぎて、すぐには役に立たない学問である一方、プログラミングが、あまりに実用的であるからだ。

先に述べたように、数学はより難しいし、プログラミングの方が、プロダクトができたりして成果が見えやすい。
だから、ある程度限られた人たちしか実際に数学をずっと専門として続けることができないのだと思う。

実際に僕も、高貴すぎる数学をこれ以上続けるのは難しいのではないかと考えるようになりつつあり、実用的すぎるプログラミングの道に体が半分以上入っている状態の気がする。

ただ、僕は数学という学問を学問の中で一番尊敬しているし、どのような道に進んだとしても片手間には数学と触れていたいと感じている。

高貴すぎる数学と実用的すぎるプログラミング、どちらか一つを選択しなければならない時が来たとすると、あなたはどちらを選ぶだろうか。

Pocket