1 年ほど前に友人から「コンピュータサイエンスの勉強は独学でどうやってするのでしょうか?」と質問されたことがあり、またその友人に「1 年たってなにか変化ありましたか?」と聞かれたのでいい機会だと思って振り返ることにします。
ここでのコンピュータサイエンスとは、離散数学や物理レイヤ、言語処理も含み、かつインターンや就活で尋ねられるような成果物的な、サイエンスではないものも広く含みます。要は、学生のうちにやっておきたい!と僕が思うこと全般です。(全部を学ぶことはできませんが…。)
2019 年に考えていたこと
こちらの gist に書いてあります。当時の僕は絶対に就職できないし、インターンにもいくことはできないと悩んでいたので非常に追い詰められた文章を書いています。あと東大を退学したというのもまだひきずっているみたいですね。
内容としては、東京大学の Web で公開されているシラバスと、理学部情報科学科の方々のブログを探しに探して構成した「僕が考える最強の独学 for 2A」みたいな感じです。東京大学は 2 年生の後期から専門課程が始まるのですが、こんな内容やるんだ。広島大学のカリキュラムじゃ絶対に追いつけないぞと目の前が真っ暗になったのを覚えています。
やったこと
結果としてこのカリキュラム通りに進めることはできませんでした。
情報数学
✅ 暗号技術のすべてはコードがなく読み物として面白いですがもう少し深く知りたくて、Nigel Smart / Cryptography: An Introduction (3rd Edition)
を前半読み進めました。結果的に数学って一人でやると楽しいなということを再確認できたのでよかったです。ところどころかいつまんで読んだので、一部は大学のレポートを書くときも役に立ちました。
⛔ Nigel Smart 本があまり進んでいないことです。初等整数論を学ぶために寄り道したので仕方ない。雪江先生の代数もまだ読めてないです。
形式言語
✅ オートマトンの講義が 2 年前期にありました。正規表現の裏側のようなものを知って楽しい。
⛔ たぶんここに入るのでここに入れますが、TaPL チャレンジして爆発したのが悲しい。僕には言語処理系周りを勉強するときの吸収速度が低いみたい。(信じられないほど時間かけてもだめだった)でも、最近プログラム意味論の基礎という本が出たのでそれを読みたいと思います。僕の中では優しい順に 意味論の基礎 → CoPL → TaPL なのかなと思っている。
計算機システム
✅ CTF と Arch Linux などのいろいろな Linux を自分のパソコンに入れたらだいたいカバーできた気がします。Arch Wiki を読んでトラブルシューティングの過程で知識を身につけるとよい。
⛔ OS 周り弱いです。自作 OS 本やります…blog_os やります…
ハードウェア構成法
✅ 進捗ないです
⛔ 本が重い。あと理論によっているのでわかったかどうかわからないのがつらい。(独学だと、計測する指標を自分以外に求める必要がある。例えば友人と質問しあってあやふやなところを認識するなど)
アルゴリズム
✅ だめですね…
⛔ 競技プログラミングをしましょう。Library Checker 埋める過程で、データ構造のエッセンスを身につけるといいんだろうなと思いつつ時間取れてない。
基礎実験
✅ アセンブリと C はいける。Scheme は少しやっただけなので微妙
⛔ 処理系の実装をしたいが、レギュレーションがわかってない(どこまで行ったら、の目安)
その他
Web サービス周り
インターンに通らないことには自信のなさを打開できないと考えて、この一年は、学生の勉強を「研究」と「開発」と分けるなら開発に振っていました。
触った技術を雑に挙げると、Rust(Actix-web, wasm), golang(gRPC), クラウド(AWS, terraform), TypeScript(React, Vue, tailwindcss, styled-components), インフラ(ネットワークの勉強, VPS でセキュリティ周りを担保する方法の調査, Docker, rootless docker の調査) みたいな感じです。思ったよりしょぼくて悲しい。
これからやりたいこと
少し余裕が出てきたので、Twitter から離れて自分の時間を大切にしたいです。ひとりで考えて、周りに感情を左右されずに淡々とこなす場面にきているのだと思うので。
🌟 本を読み切る。
今まで買った本、Booth で買った技術書典の積み残し、Kindle、達人出版、ラムダノートの本を一冊ずつ読み切りたい。めちゃくちゃ積んでしまっている。実践 Rust プログラミング入門を読み切ってみて、やはり一冊読むとインデックスが完全に頭の中にできて、内容を忘れてもすぐに引けるのがいいと感じた。それに、一冊読み切ったというのは案外大きな自信になる。
🌟 中規模のソースコードを書く
Web はなんだか今は飽きが来ていて、低レイヤは勉強段階なので、なにか新しい分野で中規模のソースコードを書きたい。今まで軽いサンプルとか、軽いソルバとかしか書いてこなかったので、エラー処理やファイル分割といった設計の初歩すらできない。これはまずい。
題材としては、インフラ周りのツールか、GUI ソフトウェアあたりが新鮮でよさそうと思っている。
🌟 競技に出る余裕を身につける
やはり CTF も競技プログラミングも自分の力を飛躍的に押し上げてくれるのは間違いない。でも競技なのでメンタルにも影響がでるし、簡単なのばかり解くところに落ち着いてしまうとつらくなる。周りを気にせず、CTF なら問題ファイル一式が残っているもので writeup も出回っているものをじっくり時間をかけてなるべくすべて攻略する方式がよいと思ってきた。なので、競技にはあまり出ずに時間をかけて取り組む方針がよさそう。いずれは競技に出てメンタル影響受けても大丈夫な余裕を持ちたい。
終わりに
去年考えていたことは今でも正しいと思っているので特に勉強する題材に変わりはない。でも、もう少しこれからは CS 寄り、開発から離れたところを意識したいと思います。