![見出し画像](https://assets.st-note.com/production/uploads/images/143053595/rectangle_large_type_2_37d2261265d134b802f8a7702faa6868.jpeg?width=1200)
コンピュータサイエンスを体系的に学ぶためのロードマップ: おすすめの本と学校
コンピュータサイエンスを体系的に学びたいと思ったことはありませんか?
プログラミングをする人であれば、なぜプログラムが動くのか、効率の良いアルゴリズムの設計、さらにはオペレーディングシステム、データベース、ネットワークの実装について興味を持ったことがあるのではないでしょうか。
実際、「エンジニア3年目におすすめする書籍」、「新卒エンジニアが読んでよかった本10選」といった記事がQiita、zenn、X、はてなブックマークなどでバズっているのをよく見ます(私もそのような記事を書きました)。
このような記事がバズることは、コンピュータサイエンスを体系的に理解したいというニーズがあるということだと思います。
そのため、コンピュータサイエンスを体系的に理解したい!という人のためのロードマップをこの記事で解説したいと思います。
TeachYourselfCS: コンピュータサイエンスのブックリスト
まずはコンピュータサイエンスを体系的に学ぶためのブックリストから紹介します。
一番体系的にまとまっているなと感じるのはTeachYourselfCSです。
実はここで紹介されている書籍のほとんどが邦訳されています。
プログラミング 『計算機プログラムの構造と解釈』
コンピュータアーキテクチャ 『コンピュータ・システム プログラマの視点から』
アルゴリズムとデータ構造 『アルゴリズム設計マニュアル』
CSの数学 Mathematics for Computer Science (翻訳なし)
オペレーティングシステム Operating Systems: Three Easy Pieces (githubに翻訳あり)
コンピューターネットワーキング 『インターネット技術のすべて:トップダウンアプローチによる実践ネットワーク技法』
データベース Readings in Database Systems (翻訳なし)
言語とコンパイラ 『インタープリターの作り方』
分散システム 『データ指向アプリケーションデザイン』
そして、この中でも特に重要なのが、『コンピュータ・システム プログラマーの観点』と『データ指向アプリケーションデザイン』であると言われています。
私たちの経験では、これら2冊の本は、特にネットワークアプリケーションに取り組んでいる独学のエンジニアやブートキャンプの卒業生に、信じられないほど高い投資効果を提供します。 また、上記の他のトピックやリソースの「ゲートウェイドラッグ」としても機能する場合があります。
『コンピュータ・システム プログラマーの観点』はコンピュータアーキテクチャ、オペレーティングシステムの両方をカバーしており、コンパイラーやネットワークについても触れています。
『データ指向アプリケーションデザイン』は分散システムの教科書として紹介されていますが第一部ではデータベースの実装についても説明しています。
そのためこの2冊を読んでおけば、コンピューターアーキテクチャ、オペレーティングシステム、コンパイラー、ネットワーク、データベース、分散システムについて大体はカバーできるということになります。
さて、日本語でコンピュータサイエンスを体系的に学ぶための環境は整っていますが、ただ本を読むだけでいいのでしょうか?
もちろんプログラミングを勉強する上でコードを書くことが大事なように、コンピュータサイエンスを学ぶ上でも演習は欠かせません。
そこでおすすめしたいのが42Tokyoです。
42Tokyo: 無料のプログラミングスクール
42Tokyoは3つの点で特異なプログラミングスクールです。
一つ目は無料のプログラミングスクールであるということ、二つ目は一ヶ月に渡る入学試験があるということ、そして三つ目はコンピュータサイエンスを意識したカリキュラムであるということです。
一ヶ月に渡る入学試験Pischinについてはすでにインターネット上で様々な記事があるのでそちらを見てみてください。
この試験は、非常に良くできておりプログラミングをしたことがない人でも一ヶ月コミットすれば入門を終えることできること、また試験を受ける過程で様々な人と交流できるため、おすすめです。
さてTeachYourselfCSでおすすめされていた、『コンピュータ・システム プログラマーの観点』が使われる授業では以下のような課題が出ているようです。
Shell Lab [Updated 7/28/03] (README, Writeup, Release Notes, Self-Study Handout)Students implement their own simple Unix shell program with job control, including the ctrl-c and ctrl-z keystrokes, fg, bg, and jobs commands. This is the students' first introduction to application level concurrency, and gives them a clear idea of Unix process control, signals, and signal handling.
Malloc Lab [Updated 9/2/14] (README, Writeup, Release Notes, Self-Study Handout)Students implement their own versions of malloc, free, and realloc. This lab gives students a clear understanding of data layout and organization, and requires them to evaluate different trade-offs between space and time efficiency. One of our favorite labs. When students finish this one, they really understand pointers!
実は42Tokyoでは、これに類する課題が用意されているのです。
42のファーストサークルでは、shellの再実装をするminishell、セカンドサークルにはmallocの再実装課題もあります。
サークルについてですが、課題が授業であるとしたら、サークルとは進級度合いであると考えてもらえればわかりやすいと思います。
また、独学でコンピュータサイエンスを学ぼうとしているという人にとっても42Tokyoはおすすめできます。
独学ですとどうしても行き詰ってしまいますが、42Tokyoにはコンピュータサイエンスに関心を持っている人たちがたくさんいるからです。
42Tokyoの課題を進める上で『アルゴリズム設計マニュアル』のデータ構造やソートの章、C言語による開発スキルを磨く上で『インタプリターの作り方』も非常に役に立ちました。
そのため、TeachYourselfCSで書かれている本を読むことと42Tokyoの課題を進めることで相乗効果を狙うことができます。
コンピュータサイエンスを学習する上で軽視されがちなグラフィックスに関する課題があることもいいですね。
![](https://assets.st-note.com/img/1717494196586-aX3FDyMxnr.png?width=1200)
さらにコンピュータサイエンスを学びたい人に向けて
さて、コンピュータサイエンスの理論はTeachYourselfCSで紹介されている教科書を、コンピュータサイエンスにおける実践は42Tokyoの課題を進めていくということが、おすすめであるということが今までの結論となります。
では、両方とも終わった人には何がおすすめなのでしょうか?
実は先日、42Tokyoの学生とも同じ話をしていました。個人的には大学院大学がおすすめです。
大学院大学は学部の時に情報科学を専攻としていなかった人を対象にしているため、門徒が広く、また実は大学を卒業していなくても入学することができます。
実は大学を卒業していなくても入ることもできます。
そういえば意外にご存じない方が多かったのでここで触れておくと、JAISTは必ずしも大学の学部を卒業していなくても出願できます。
詳しくは「学生募集要項」を見て欲しいですが、社会人経験や取得資格を「学部卒業相当」と見なし、受験資格を与えるための事前審査があり、概ね5年以上の勤務経験があれば受験できることが多いようです。なんでもチャレンジしてみるものです!応援しています!
そういうわけで、コンピュータサイエンスを体系的に学びたいなと思っている人にはTeachYourselfCS、42Tokyo、大学院大学がおすすめという記事でした。