こんにちは、@p1assです。
最近、Twitter 上で、「コンピュータサイエンスについて学びたい」みたいな話をよく見るのですが、僕もその1人です。
コンピュータサイエンスの学科に所属してないので、「独学で学ばないといけない」という気持ちはあるのですが、 「じゃあ一体何を学べばいいんだ?」 となってしまったので、自分なりに知らないことを挙げていきます。
挙げたものが本当にコンピュータサイエンスなのかどうかの確証はないです。
僕がコンピュータサイエンスに関して知らないこと
以下、箇条書きです。過去に書いたものなので、いくつかは既に学んでいます。
データベース
- ACID 特性
- 名前は知ってるし、概念は分かる。
- 実際にどうやって ACID 特性の実現しているのかは知らない。
- 分散データベース
- Master Slave 構成などは知っている。
- 実際にどうやって整合性を担保しているのかは知らない。
OS
- プロセス
- よく名前は聞くし、タスクマネージャーで kill してる。
- 「プロセスとは何か?」の問いに答えられない。
- 並列処理のために必要なことは分かる。
- スレッド
- CPU のスペックに書かれている「4 コア 8 スレッド」と OS 上のスレッドが違う概念らしい。
- 何が違うのかは分からない。
- Linux カーネル
- 存在は知っている。
- システムコールで呼び出せることは知っているが、実際にどんな種類があって、どんな仕組みかは知らない。
データ構造とアルゴリズム
- データ構造
- Queue や Stack、Hash Map くらいは知っている。
- 赤黒木の詳細は知らない。
- アルゴリズム
- ダイクストラは分かる。
- 分枝限定法は名前だけ、実装は厳しい。
セキュリティ
- 暗号
- 共通鍵暗号、公開鍵暗号の特徴は知っている。
- 具体的なアルゴリズムは知らない。
- HTTPS
- 共通鍵暗号と公開鍵暗号を両方使っているのは知っている。
- SSL 証明書の認証レベルの違いは知らない。
- 攻撃手法
- SQL インジェクションと XSS は知っている。
- 逆にそれ以外は知らない。
ネットワーク
- TCP
- 3 Way ハンドシェイクは知っている。
- 実際にどんなパケットが送られているのかは知らない。
- L2 以下
- スイッチが何をしてくれているのは知らない。
- 物理層でどのような電気信号がやり取りされているのか知らない。
プログラミング言語
- プログラミング言語のパラダイムは理解しているつもり。
- オートマトンは名前しか知らない。
- 数学的にどのように型安全を保たれているのか知らない。
ハードウェア
- CPU
- 半導体がいっぱい載っていることは知っている。
- CMOS についてもある程度理解している。
- 「MIPS とは?」と聞かれると答えられない。
- キャッシュ
- いろんなところでキャッシュを使って、高速化を図っていることは知っている。
- どの部分で、どのような方法でキャッシュが実装されているか知らない。
- 二次記憶
- HDD は何かが回っているっぽい。
- SSD は書き込み限界があるらしい。
- それ以上は知らない。
まとめ
- 知らないことがたくさんある
- 時間を見つけて勉強したい
- 僕が知らないことすら知らないものがあれば教えてほしい