コンピュータについて知っていること・知らないこと
Created at 2021-03-09
Updated at 2021-03-09
情報系学部での生活が折り返しを迎えようとしています.ここで自分がコンピュータ科学/工学について何を知っていて何を知らないのか確認してみることにします.
数学
線形代数・微積・確率統計・群論はやりました.フーリエ変換とラプラス変換もやりましたが,適当にやっていたのですらすら計算できません.そもそも入試の数学の成績がかなり悪く,人並みにはできるが決して得意とは言えません.
CPU
単一サイクルパスとパイプラインプロセッサの命令実行の流れはざっくり分かります.キャッシュや投機的実行,レジスタリネーミングなどの高速化はよく知りません.
OS
メモリ管理・プロセス管理をしていることやそれらの概念的な仕組みは分かります.実装はよく分かりません.
処理系
コンパイラ
書いたことがあるので基本的なことは分かります.型推論も簡単なものなら分かります.レジスタを頑張って使うとか定数畳み込みとかの最適化があることは知っていますが、詳しいことはコンパイラ様のみぞ知るという感じです.
アセンブラ
アセンブリとバイナリを 1 対 1 に変換していることは分かりますが、static とか extern な変数の扱いなどは即答できません.
リンカ
オブジェクトファイルをくっつけたり別のファイルにある関数の位置を特定したりすることは知っていますが、どんなデータ構造を使っているかなどは知りません.ハッシュテーブルを頑張っていじるとできそうな気はします.
データベース
関数従属性とか SQL とか B 木は知っていますが、状況に応じたテーブル設計はやったことがありません.
同時実行制御
よく分かりません.トランザクションとか ACID 特性とか直列可能とかは軽く習いましたが具体例は知りません.このへんは key-value store を作ったときにやればよかったんですが放置しています.
ネットワーク
OSI 参照モデルの各層の役割は知っています.
IP
BGP と OSPF は概要を調べたことはあります.概念的なことは分かりますが,ネットワークを自分で構成したことがないので自分のものにはなっていません.
TCP と HTTP
TCP の再送制御とか輻輳制御とかは勉強しました.TCP のライブラリを使って HTTP サーバを作ったことはあって,そのときに HTTP 1.1 の仕様を眺めたことはあります.HTTP 2 と 3 については新しい機能を把握していますが、そんなに活かしたことはないです.
インフラ
Docker は使えますが,Kubernetes はデカすぎてまだ触れる気になりません.Ansible は localhost に作用するものだけは自分で書いたことがあります. 前述の通りネットワークを組んだことがないのでやってみたいんですが題材や機会がないので放置しています.
アルゴリズムとデータ構造
学部のこういう授業でやるようなやつはだいたい知っていますが、実装したことのないやつもあります.またアルゴリズムやデータ構造の処理の時間計算量をフォーマルに解析するのもあまりやったことがないです.
暗号
RSA と準同型暗号しか知りません.準同型暗号は「準同型性があると暗号化したまま計算できてうれしいね!」.ということしか知りません.あと証明書の仕組みとか何も知らないのでそろそろ勉強しようなというところです.
分散システム
CAP 定理だけ知っています.よく分かってないので「A と P 被ってない?」みたいなことを思っています.分散システムはあまりにカオスそうなので興味があります.
ソフトウェア開発
テスト
単体テストは書けます.どう設計するとテストが書きやすいかなどの方法論はまだ知らないです.CI/CD は簡単なものなら生やせますが,あまり複雑なことはできません.
開発手法
アジャイルとウォーターフォールの違いは分かります.それ以外のことは分かりませんが,いまのところ学習の優先度は低いです.
おわりに
基本的なことは踏破しつつあるので,ガッツリ深めていく分野を見つけたいところです.今はネットワークやデータベースなどカバー範囲の広い分散システムが面白そうだなと思っています.とはいえまた気が変わる(ひどいときは寝て起きたら興味を失っていたりする)と思うので,もうしばらくは興味の向いたものを気ままに勉強しようと思います.