こんにちは、 @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 は書き込み限界があるらしい。
    • それ以上は知らない。

まとめ

  • 知らないことがたくさんある
  • 時間を見つけて勉強したい
  • 僕が知らないことすら知らないものがあれば教えてほしい