プログラミングは理系科目なのか

最近は「文系エンジニアが◯◯」などの記事がよく注目を集めます。
これは逆説的に、「エンジニアは理系だ」と思われているからではないかと思います。

私自身は理系ですが、プログラミングを始めたのは小学生の頃です。
x、yなどの変数を習ってないので、当然理系どころか、文系社会人の数学力すらない頃にプログラミングを始めました。

その後、情報系に進み、ザ・ITエンジニアな経歴を歩んできたので、どちらの立場もわかる存在ともいます。
そんな立場として、プログラミングにおける文系と理系の差を考えてみたいと思います。

理系と文系の区別

そもそも理系と文系の違いって何でしょう。
文系は著者の気持ちを考えてろと揶揄されるように、文系に感性的、理系に論理的なイメージを持つ人が多くいるように感じます。
しかし哲学は論理的に積み上げられていますし、経済学は数式的ですし、論理性の有無は文理関係なく個人の問題に思います。

ただそれだと話が進まないため、一般的なイメージとして理系は「数学得意な人」なのではないかと推測し、そこから展開していきたいと思います。

情報系で学ぶ内容

情報系で学ぶ内容は基本情報技術者や応用情報技術者の内容に近しいものです。
書店で本を見てもらえればわかると思いますが、正直ほぼ暗記科目です。
数式はほとんど必要ないですし、あっても文系の高校数学の範疇内でなんとかなります。

そして情報系で学ぶ内容は、割と実務で役に立たないことが多いです。
例えば「プログラミング言語の歴史」を知っていても、知っていなくても、実務に影響は出て来づらいものです。
CD-ROMの仕組みを知っていなくても、CD-ROMは使えます。
「結局、仕事で役にたってるの?」だけで言えば、役に立ってないものがほとんどです。

そもそも私以外にもいくらでも小学生プログラマーがいるということが、前提知識がなくてもできる証明になっていると思います。
ゼロからプログラミングの勉強をするだけで、プログラミングはできるようになるわけです。

数式はいつ必要になるのか

では数式はいつ必要になるのでしょうか。
実務においては、統計や機械学習、物理エンジンなどで数学的知識を使うことがあります。

ただこうした技術はライブラリ化されており、パラメータを渡すだけで数式を知らなくても動かせてしまうことが多くあります。
たとえば物理学を知らなくても、Unityでオブジェクトを配置するだけで世界を作り上げることができます。

「数式になっていること」は「プログラミングできるもの」なので、その時点で「誰かがすでに書いてるもの」である可能性が高いです。
炊飯器の仕組みを知らなくても米を炊けるように、数式を知らなくても大抵のことは実現できてしまうのです。

プログラミングは文系科目に近い

プログラミングは仕様書の翻訳である

そもそもプログラミングに一番近い学問は何かと言えば、文系科目ではないかとも思います。
日本語で書かれた仕様書をプログラミング言語で記述することは、日本語の文章を英語で記述するようなものです。
単語を覚え、対応する言葉で当てはめ、相手(コンピュータ)の理解できる文章で記述し直す作業です。

プログラミングは現実を抽象化する作業である

またプログラミング自体は現実を言語で記述する作業とも言えます。
設計の世界では、何をどう抽象化していくかが核となる作業です。
その現実の事象を捉えるにあたりどこで補助線の引くかは哲学がまさに行ってきたことです。

ゲームAIエンジニアの三宅陽一郎さんも、AIと哲学の関係性に関する本を出版されています。
実際に哲学を専攻していたエンジニアも周りにいますが、卓越した設計技術を持っています。
こう捉えると、むしろ哲学を学ぶ文系出身の方が有利ともいえるかもしれません。

つまりはプログラミングはあくまで目的を記述するための手段であり、目的が数学的でなければそこに数式は必要ありません。

数学的知識は本当に必要ないのか

ここまでの話をまとめると、数学的知識や情報系の知識は必要ないということになってしまいます。
そのためか「エンジニアは誰でもなれる」「3ヶ月でエンジニアになれる」「未経験でも問題ない」と敷居の低さがアピールされることも多いです。
実のところどうなんでしょうか?

道具を使える能力を競っている

日本のWebエンジニアに対する批判として、「いかに道具を使いこなせるかを競っている」というのを見たことがあります。
つまり、すでに誰かが数式化し、それがライブラリ化されたものを、いかに使いこなせるかで、優秀か否かを競っているということになります。
たしかに使い方を学ぶだけであれば、どう動いているかは知らなくても問題ありません。

道具を作るためには基礎学力が必要

一方で自らが道具を作り上げていくためには、どう動いているかを知る必要があります。
つまり、数学を含めた、あらゆる学術的基盤が必要になります。
したがってこのレベル感の作業を求められるときに、初めて理系の学術的基盤が役に立つわけです。

今の日本の状況

ただ現実的にGoogleなどの優秀な人が作り上げたものを使うだけの方が、下手に自分で作るより効果的なことが多いのも事実です。
残念ながら今の日本は途上国的立場であり、自分たちで1から作り上げるより、優秀な人の作ったものを使うことが正解であるケースがほとんどなのです。

また技術的優位性よりも、アイディア先行でサービスが作られることが多くあります。
そうなると「どのように実装するか」より「いかに低コストで仕様書通りに作るか」が優先され、学術的基盤より道具の使い方が重視されることになります。

評価者が価値観を醸成する

こうなると「どれだけ道具を知ってるか」「道具の使い方を知ってるか」が優秀なエンジニアの基準となります。
人は自分が知らないものを評価することは難しく、また人は自分の経歴を正当化しやすいものです。
より道具を知ってる人が評価されれば、そうした人が評価者となり、さらにその価値観が深まっていきます。

特に日本は「誰でもITエンジニアになれる」という方向性に進んでいるため、数学的知識や、情報系の知識の薄いエンジニアが増えていくのではないでしょうか。
今後そうした人が評価者となることで、数学的・情報系の知識基盤は評価基準から外れていき、社会全体もそれを求めなくなるものと推測します。

おわりに

ともあれ文系・理系の線引きはナンセンスであり、文系・理系問わずその範囲内で自己を制限している人は限界が来やすいものと考えています。
特に「すぐに役に立つものだけを勉強する」のでは、知らないことを知ることはできません。
私はそういった線引き抜きに知識の幅を広げることが、今後の不確実性の高い社会をいきていく鍵になると考えています。


@dorarep
小学生の頃からフリーゲーム作ってました。今はフリーランスでフルスタックエンジニアしてます。