ソフトウェア

大学に行かずにコンピュータサイエンスを学ぶときに優れている教科書や講義映像はどんなものがあるのか?


急速なIT化の進行によってエンジニアが不足しており、情報系の学位を取得せずに独学やプログラミングスクールを通してエンジニアになる人も増えています。そうした人たちがコンピュータサイエンスを学ぼうとしたときにおすすめの分野や本・オンライン講義などが「teachyourselfcs.com」というサイトにまとめられています。

Teach Yourself Computer Science
https://teachyourselfcs.com/

◆コンピュータ・アーキテクチャ
コンピュータが実際にどのように機能しているのかをしっかりとイメージできなければ、安定した抽象化を行うことはできません。この分野を学ぶのにおすすめなのは「コンピュータ・システム ~プログラマの視点から~」という本で、タイトルに「プログラマの視点から」とついている通り、高速で効率的で信頼性の高いソフトウェアを作成するという目的でコンピュータ・システムを理解したい人にとって優れた出発点となることができるとのこと。


よりやさしい導入を求める人には「コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方」がおすすめとのこと。この本は基本的な論理ゲートである「NAND」からテトリスを作成するまでを扱うので「Nand2Tetris」という別名がついています。前半の1章から6章までの内容は英語ですがWebサイトで公開されているほか、ムービー付きのCourseraコースも用意されています。ただし、Nand2Tetrisは現代のコンピュータ・アーキテクチャにおいて非常に重要な概念であるパイプライン処理メモリ階層がほとんど解説されていないなど、シンプルさとまとまりを重視した結果深みが犠牲になっているそうです。


◆分散システム
現代では小さなアプリケーションでも複数のマシンで動かすことが一般的になっています。そうした状況で発生するトレードオフについて知るのにおすすめなのは「データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理」とのこと。


英語でも問題ない場合は「Distributed Systems」という本が無料で利用できるほか、MITの講義がYouTubeで公開されています。

「teachyourselfcs.com」では全部で9個の分野が紹介されていますが、上記の2分野で紹介した「コンピュータ・システム ~プログラマの視点から~」と「データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理」は非常に多くのものを得られるため、特におすすめとのこと。他の分野の入り口としても機能するため、もし何から学べば良いか分からない場合はこの2冊を集中的に学ぶのが良さそうです。

◆プログラミング
コンピュータサイエンスのバックグラウンドがない経験豊富なプログラマーが知識のギャップを埋めるのにおすすめなのが「計算機プログラムの構造と解釈」です。この本は原文がCC BY-SA 4.0ライセンスで公開されており、和田英一さんが翻訳した日本語訳文を無料で利用可能なほか、この本を教科書に利用しているカリフォルニア大学バークレー校の英語講義を無料で視聴することも可能となっています。


◆アルゴリズムとデータ構造
アルゴリズムとデータ構造について解説した本は何百冊もありますが、サイトでは「アルゴリズム設計マニュアル」が推薦されています。著者による講義がYouTubeにて提供されており、ムービーで勉強したい人はそちらも合わせて視聴するのが良さそうです。


◆コンピュータサイエンスのための数学
コンピュータサイエンスは応用数学から発展した分野だとも言えるほど、数学との関係が深い分野です。関係が深いのは「離散数学」と呼ばれる分野で、その中でも論理、組み合わせ論、確率論、集合論、グラフ理論、暗号学の一部などと特にかかわりが深いとのこと。この分野を学ぶのには「ラースロー・ロヴァースの講義ノート」がスタート地点として最適だそうです。なお、ファイルはPostScript形式で配布されています。

Discrete Mathematics - Lecture Notes, Yale University, Spring 1999 - L. Lovász and K. Vesztergombi
http://www.cs.elte.hu/~lovasz/dmbook.ps

◆オペレーティングシステム
OSに関しては、無料で公開されている「Operating Systems: Three Easy Pieces」が構成や読みやすさの点で優れているとのこと。有志による日本語訳も存在しています。


◆ネットワーキング
ネットワーキングはコンピュータサイエンスの最も重要な分野の1つと言えますが、この分野について学ぶなら「インターネット技術のすべて:トップダウンアプローチによる実践ネットワーク技法」がおすすめとのこと。特にオンラインで提供されている付録の「Wireshark labs」という演習が良いと述べられています。


◆データベース
データベースは1970年代以降に発展した比較的新しい分野であり、アイデアがお金になりやすいため多くの優れた人材が企業に流れていったとのことで、あまり優れた教科書が存在していないそうです。サイトでは教科書を読む代わりにカリフォルニア大学バークレー校の講義「CS 186」のムービーを視聴することがおすすめされています。その後、PDFファイルで公開されている「データベースシステムのアーキテクチャ」などの論文を読み進めていくことが推奨とのこと。

◆言語とコンパイラ
プログラマーは言語を学びますが、コンピュータサイエンスでは言語について学び、より一般的な知識を得ることができます。この分野では、「Crafting Interpreters」が無料で利用できる良質なテキストとのこと。

古典的な名著としては「コンパイラ―原理・技法・ツール」がありますが、こちらは自習用のテキストではないため、edxの無料講義などを併用するのが良いそうです。


サイトによると、上記の各分野においてそれぞれ100時間から200時間ほど学習し、その後で気に入った分野をより詳しく見ていくのが良いとのことです。

この記事のタイトルとURLをコピーする

・関連記事
コンピューターサイエンス分野のノーベル賞とも呼ばれるチューリング賞の2018年度受賞者が決定 - GIGAZINE

MITが携わった世界を変えるコンピュータサイエンスの歴史的発明50選 - GIGAZINE

なぜトップクラスのハッカーにはロシア出身者が多いのか? - GIGAZINE

最初に「プログラミング言語」という言葉が使われ始めたのは一体いつなのか? - GIGAZINE

数学の教科書がめちゃくちゃ難しかったというソビエト連邦、その理由は? - GIGAZINE

in ソフトウェア, Posted by log1d_ts

You can read the machine translated English article here.