コンピュータサイエンスを独学した時にやったこと
新卒で入社した SIer を辞めた後、ぼくはアルバイトをしつつコンピュータサイエンスを学ぶことを生活の主軸に置いた。
勉強することの洗い出し
コンピュータサイエンスと一言でいっても、勉強すべきことの範囲は多岐に渡る。
ただ、何を勉強するかに関してはとても単純で、コンピュータサイエンス専攻の学生がなにを学ぶのかを調べれば良いだけだった。
ぼくは大学のカリキュラム、とくに体系立ったカリキュラムの資料が公開されている東大の理学部情報科学科の資料を参考にした。

https://www.is.s.u-tokyo.ac.jp/files/2024/utokyo_ISguide2024.pdf より
上記は、最新の学科パンフレットからカリキュラムのページを抜粋したもので、大学の学部生が 2 年間で学ぶ内容だ。(東大の学部は、最初の 2 年は教養学部で一般教養を学び、後半の 2 年でそれぞれの専攻の専門分野を学ぶ。)
ぼくが参照していたカリキュラムは約 10 年ほど前のものであるが、上記の最新のものを見ても、当時からほとんど変わってはいない。
ソフトウェア業界は日々目まぐるしく進化をしているが、その基礎となる情報科学の主要科目はそうそう変わるものではないのだ。
ちなみに、上記の学科パンフレットは、カリキュラム以外にも「どういった内容を学ぶのか」という詳細や、情報科学科の学生の進路、研究室紹介など興味深い内容が盛りだくさんだ。
当時のパンフレットを何度もくまなく読んだことを覚えている。
そんなカリキュラムを読んで、まさにぼくが勉強したいこと、知りたいようなことがたくさん科目としてあることを知り、初めて見たときはとてもワクワクしたものだった。
そして、それらの科目をなるべく網羅的に学習することを目標とした。
実際にやっていたこと
書籍での勉強
コンピュータサイエンスの独学でなにをしたのかというと、基本的には本を読んで勉強することが中心だった。
学生が授業を受けるのと同様な体験を、なるべく書籍を読んで身につけようと考えていたのだ。
学生は実際には、宿題や試験、実験などの演習がたくさん課されることによって「ちゃんと身につく」レベル感は圧倒的に高く、本を読むだけでは正直到底及ばない部分は大きいが、そこは仕方がなかった。(でも心底学生さん方が羨ましいと思えた)
シラバス等を読むと、科目によっては教科書の指定があったりする。
また、指定がなくとも、分野によっては、あらゆる教育機関で教科書的に扱われていたりするような古典的な名著があったりするので、それらをしっかりと読むことを心がけるようにした(本に関しては後述)。
競技プログラミング
プログラミングのスキルをつけたい、向上させたいと思っていたこともあり、アルバイトで業務経験を積む以外にもコーディングをしたいと考え、競技プログラミングをよくやっていた。
アルゴリズムやデータ構造の勉強も兼ねて、という部分もあったが、実際には楽しくてやっていた部分が大きい。
競技プログラミングは賛否両論だが、実際にコードを書く練習としてはぼくはとてもよいと思う。(なお、競技プログラミングの経験がいかに役に立ったかに関しては、下記の記事参照)
なお、当時はまだ AtCoder が創業される前で、ぼくは TopCoder に頻繁に参加していた。1年弱で黄色までなった(今の AtCoder だと多分青くらい)。
読んだ本
勉強にあたって実際に読んだ本、勉強した本を紹介する。
(覚えているもののみで、もうちょっと色々読んだ気もする)
CPUの創りかた
実際の電子回路で 4bit の CPU を自作する本。
CPU がどういう仕組みなのかがこれを読むととてもよく理解できる。
そしてめちゃくちゃ読みやすいし、とても面白い。伝説的な名著。
CPUを理解したいなら、絶対に読んだほうがいいと言い切れる。
なお、ぼくはまだ自作できていないが、いつかやってみたいという野望はいまだに持ち続けている。(いま考えてみると、いつか息子と一緒に夏休みにでも取り組んでみるのがいいかもしれない)
図解でわかるはじめての電子回路
『CPU の創りかた』を読んでいて、そもそも電子回路とはなにかがよく分かっていなかったので、こちらを読んで勉強した。
NAND の構成などを学んだりした(気がする。実はそこまで内容は覚えていないが、とてもわかりやすかったことだけは覚えている)
電気の基本としくみがよくわかる本
そもそも「トランジスタとはなんなのか」「なぜスイッチのような挙動ができるのか」ということがまったくわかっていなかったため、トランジスタの説明が細かくちゃんと、電気の基本から書いてある本を探して見つけた本。
トランジスタの仕組みが分かった時「とうとうここまでこぎ着けて理解できた気がする…!」とじんわりと感動したことを覚えている。
コンピュータの構成と設計
通称『パターソン&ヘネシー』『パタヘネ』。
ぼくが読んだのはたしか第4版だったと思う。
現代のコンピュータのハードウェア(主に CPU)がどのようにできていてどのように動いているかを学べる。
全部は読みきれなかったが、そんなに難しい内容でもないのにとても深みのある名著。
計算理論の基礎 1. オートマトンと言語
形式言語理論の教科書的な本。
オートマトン、正則言語、文脈自由文法に関する理論。
計算機モデルや計算可能性理論(チューリングマシンなど)や、正規表現エンジン、言語処理系(コンパイラなど)の基礎理論となる科目。
「コンピュータの行う『計算』とはなにか」ということと、「言語とはなにか」ということが「論理」というものによって自分の中で関連付けられていった経験はなかなか感動的だった。
データ構造とアルゴリズム
東大の理情の 3 年生の授業で教科書として使われていた書籍。
基本的なデータ構造とアルゴリズムが網羅されている。
プログラミングコンテストチャレンジブック
「蟻本」として有名な、競技プログラミング関連では必携の書。
第 1 版が出版されたばかりの時に買った。
競技プログラミングをやるなら絶対に読んだ方がいい、伝説的な名著。
最初の方はかなり苦労しながら読んだが、新しいアルゴリズムを理解できて感動したことは数多くあった。
アルゴリズムとデータ構造に関しても、この本でかなりのことを学んだ。
他にも数冊読んだ気もするが、忘れたので省略(OS とネットワークの本も読んだはず)。
上記にあげた本ではいまだにおすすめできる本も多いが、新しい本でもうちょっと良いと思える本もあったりする。
それはまた別途記事にしてまとめてみたい(OS とネットワーク関連の本も含めて)
ちなみに、当時本当にお金がなくて節約も頑張っていたので、本もなるべく中古のものを探したりブックオフでめぼしいものを見つけたりして入手していた。
あの頃はあの頃で、夢に突き進んでいるような感じで、いろいろな意味で青春のようだったとも思う。
でも、アルバイトはしていたものの、正直ものすごく孤独を感じていた。
同志がいない。よき相談相手もいない。
友達とはたまに会ったり電話したりしていたものの、普段、人と話す機会はほとんどなかった。
自由だったが、孤独だった。
窮屈ではなかったが、さびしくはあった。
勉強自体は本当にとても楽しかったが、だれかと話したい、だれかと一緒に何かをしたいとも思っていた。
ただ、ソフトウェアエンジニアとして、いろいろなものを作れる人になりたいという一心だったからこそ頑張れた。
そして今となってみると、あの頃積み上げたものは、やはりエンジニアとしての大事な大事な下地になったと間違いなく言える。
その一年ちょっとの間にある程度のコンピュータサイエンスの基礎を学んだことによって、その後のエンジニアとしてのキャリアでかなりの飛躍をすることができたと思う。
しかし、結局はその 1 年程度の勉強ではまったく足りていなかった。
それから数年仕事をした後で、またみっちりコンピュータサイエンスを学びたいと思ったぼくは、その後、社会人大学院で情報科学を専攻し、再びコンピュータサイエンスを学び直すことになる。
その話はまた後日書いてみようと思う。