勉強するぞ! 2020年9月版

  • 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寄り、開発から離れたところを意識したいと思います。