プログラミングにおけるIQの壁
「高校までは数学嫌いだったけど、大学の数学やって数学の面白さが分かってきた!」
これらは、算数 → 数学 → 大学の高度な数学へと段階を経ていく際にぶつかるIQの壁です。
算数は具体的な計算をしますが、数学は式を組んで証明することが中心になります。
それはつまり、抽象度の階段を上がるということなんです。
その階段を上がる力がIQ(知能指数)です。
算数はできたけど、数学は苦手という人は数学に必要なIQが足りなかったということです。
プログラミングにもこれと似たIQの壁が存在します。どんなものなのかくわしく紹介します。
Contents
アプリケーションをプログラミングする
アプリケーションは具体的であり、アプリケーションに必要な機能を実装していけばいいので、ライブラリ・フレームワークをプログラミングするのに比べれば抽象度は高くありません。
とはいえ、人間が考えたアプリケーションの仕様をコンピュータが理解できるプログラミング言語に変換しなければなりません。
それはアプリケーションの仕様という抽象概念を具体的なコードに落とし込む作業です。それには高度なIQを必要とします。
プログラミングは何をするにも高いIQを使うということです。
ライブラリ・フレームワークをプログラミングする
ライブラリ・フレームワークをプログラミングするにはアプリケーションの全体を俯瞰して眺めることが必要です。すると、共通部分が見えてきます。
「このロジックと、ここのコードはメソッドに切り出すことで、同じ仕組みを使って実装できるな」といった具合にです。
つまり、ライブラリ・フレームワークを開発するにはアプリケーションを開発するよりもさらに高いIQを必要とするということです。
プログラミング言語をプログラミングする
プログラミング言語を実装するには、その言語が必要な機能の実装方法を知っていて、それをどのような構文で表現すればいいかを考える能力が必要です。
プログラミング言語が持つべき機能の本質を見抜き、それを構文表現に落とし込むための高度なIQが必要となります。
ミドルウェアをプログラミングする
代表的なミドルウェアであるRDB(リレーショナルデータベース)には数学の関係代数が使われています。
ECサイトのレコメンドエンジンではベイズ統計という統計学が使われています。
数学理論をソフトウェアとして実装するのには、数学とソフトウェア空間を行き来して、思考を組み立てられる高度なIQを必要とします。
OSをプログラミングする
OSをプログラミングするにはハードウェアが持つ全機能をソフトウェアからアクセスする方法を知っていて、ソフトウェアがハードウェアをどのように制御するのが良いかを考える能力が必要です。
また、OSの機能をアプリケーションから利用させるAPIを実装する際には、どのようなインターフェースを用意すれば最も(性能的 & 安全性的 & 自由度的に)良いかを考えなければなりません。
ハードウェア全体をどのように抽象化してOSとして表現するかを考えられる高いIQが必要となります。
抽象度の壁がIQの壁 → その壁を破る方法は?
アプリケーションが作れてもフレームワークを作ることができない人がいます。それは、フレームワークはアプリケーションよりも抽象度が高く、その抽象度を理解するIQがないためです。
ですが、IQよりも大切なことは、作りたい気持ちです。
「作りたい!」
と思った瞬間、それを作るための技術を学ぶ意欲が生まれます。
そして、試行錯誤しながらプログラミングに没頭してるうちに自然とIQも上がっている、そういうものなんだと思います!