コンピュータサイエンス(CS)って何だろうと思って、調べてある程度どういうジャンルなのか分かってきたので、まとめてみる。
元々、CSに相当するものはコンピュータアーキテクチャだと思ってて、その領域で有名だというコンピュータの構成と設定という俗にパタヘネ本と呼ばれる定番書を買って読んでみたりしていた。ただ、そこからボンヤリと輪郭みたいなものが見えてくると、コンピュータアーキテクチャよりも、より一般的なコンピュータサイエンスというカテゴリーがあることに気づいて、CSをやってみようと試みたら、これもCSに入るし、それもCSって感じで、結局CSって何だろう?と混乱してきたので、真面目に体系的にまず枠組みを知ってから、取り組もうと思い、調べてみた。
- アラン・チューリングが、数学の計算の原子性について研究し「+1と-1の繰り返し」のみが表現できれば全ての計算が表現出来ると示した。それだけがあれば、足し算と引き算、掛け算と割り算が計算でき、これはすなわち全ての計算が出来ることと同じことである。
- 「+1と-1の繰り返し」だけで全ての計算ができることは分かったが、それをどう機械に処理させればいいだろうかという話になる。
- 機械に処理を指示するための命令が、プログラムコードである。
- プログラムコードを処理するための機械がCPU(中央演算装置)であり、プログラムコードを記憶しておくための機械がメモリである。
- 現実の世界の問題をどう計算に落とし込むかと考える必要も出てくる。
- また、問題をどう上手く処理するのか、どう上手く表現するのか考える必要も出てくる。
- そしてプログラムを複数同時に計算させたくなり、それを上手くスケジュールしたり、管理するための役割が必要となってくる。
- プログラムが大きく複雑になってくれば、プログラムをどう書くかという話も必要となってくる。
と書き下してみたが、これがコンピュータサイエンスと呼ばれる領域だと理解した。すなわち、以下の通りのことがコンピュータサイエンスなのかと思った。
- 計算理論
- プログラミング意味論(プログラムの正しさに関する数学的証明を考える分野):Programming Languages and Methodology
- プログラミング言語処理系
- コンピュータアーキテクチャ
- アルゴリズムとデータ構造
- OS
- ソフトウエア工学
これらに以下を加えたものがもう少し広いコンピュータサイエンスになるのかなというのが現時点の理解。
- セキュリティ(暗号理論)
- データベース(リレーショナルモデル)
- ネットワーク
正直、これらの単元を抑えていくと10年とかの時間が必要だと思うので、自分が特化したい部分に集中して関連する分野を並行して抑えていくようにしたい。