- Published on
Web Developerとしてのコンピュータサイエンス基礎学習カリキュラム
- Authors
- Name
- ryyta
- @fubar1346
Why learn Computer Science
エンジニアとしてコンピューターサイエンスについての基礎的な部分の理解を固めることで、技術的な知識・スキルの向上と、発展速度の速いソフトウェア業界でも効率的かつ効果的な技術の習得スピードアップを得られるようになることを目標とする
What learning in this project
今回のプロジェクトの成功 = コンピュータサイエンスの知識基盤づくり
CS2013, J17-CSをベースとしつつ、MITの Computer Science and Engineering のカリキュラムをもとに学習リソースや環境、方法を設計し、コンピュータサイエンスとしておさえておくべき知識体系全般を学ぶ
CS2013で分類されるコンピュータサイエンスの18の知識体系から、Tier-1(あらゆるCSカリキュラムで必修)とTier-2(一部を除きCSの学士課程で必須)を参考に学習計画などを立て、適宜自分のレベルに合う方法を取りつつ進める。
また、必要に応じていくつかの知識体系は今回のプロジェクトからは除外する
Knowledge Area | Tier1 | Tier2 | Tier1学習時間順 |
---|---|---|---|
Algorithms and Complexity(AL): アルゴリズムと計算量 | 19 | 19 | 3 |
Architecture and Organization(AR): アーキテクチャと構成 | 0 | 16 | 16 |
Computational Science(CN): 計算科学 | 1 | 0 | 14 |
Discrete Structures(DS): 離散構造 | 37 | 4 | 2 |
Graphics and Visualization(GV): グラフィックスと視覚化 | 2 | 1 | 13 |
Human-Computer Interaction(HCI): ヒューマンコンピュータインタラクション | 4 | 4 | 9 |
Information Assurance and Security(IAS): 情報セキュリティ | 3 | 6 | 11 |
Information Management(IM): 情報管理 | 1 | 9 | 14 |
Intelligent Systems(IS): 知的システム | 0 | 10 | 16 |
Networking and Communication(NC): ネットワークと通信 | 3 | 7 | 11 |
Operating Systems(OS): オペレーティングシステム | 4 | 11 | 9 |
Platform-based Development(PBD): プラットフォームに依存した開発 | 0 | 0 | 16 |
Parallel and Distributed Computing(PD): 並列分散処理 | 5 | 10 | 8 |
Programming Languages(PL): プログラミング言語 | 8 | 20 | 6 |
Software Development Fundamentals(SDF): ソフトウェア開発基礎 | 43 | 0 | 1 |
Software Engineering(SE): ソフトウェア工学 | 6 | 22 | 7 |
Systems Fundamentals(SF): システム基礎 | 18 | 9 | 4 |
Social Issues and Professional Practice(SP): 社会的視点と情報倫理 | 11 | 5 | 5 |
How learning in this project
CS2013, J17-CSを念頭に、 書籍・動画を用いて MITの Computer Science and Engineering のカリキュラムに対応するような学習スケジュールで取り組む。
以下で取り上げたリソースについては、計画段階であげたものになるため、取り組む際に適宜追加・削除など変更も行いつつ取り組む。
各知識エリアごとに、
Software Development Fundamentals(SDF): ソフトウェア開発基礎
概要
- ソフトウェア開発に必要な基本概念と技術を扱う
- コンピュータサイエンスプログラムの初年度で習得すべき概念とスキルを示し、アルゴリズムの設計と簡単な解析、プログラミングの基本概念とデータ構造、基本的なソフトウェア開発方法とツールを学ぶ
目的
- ソフトウェア開発における基礎となる概念をまず浅く広く学び、今後Programming Languages、Algorithms and Complexity、Software Engineeringを学ぶ基礎を作る
目標
- ソフトウェア開発の全体を念頭に、開発の中で理解しておく概念(アルゴリズム、データ構造、ソフトウェア開発の基礎知識等)について非プログラマーに対してそれぞれの役割と概要について説明できる
リソース
- CS50
- 約180minの講義 x 10 weeks + CyberSecurity50min = 約30時間
- 『プログラミングの基礎』
- 「デザインレシピ」というアプローチを用いたプログラムの実装方法とデータ構造とアルゴリズムについて
- CS50
予備リソース
- Introduction to Computer Science Programming in Python
- MIT OCW: 45min x 12 lecture = ~9h
- Software Construction
- Introduction to Computer Science Programming in Python
MIT対応科目
- Introduction to Computer Science Programming in Python(6.100A)
- Fundamentals of Programming(6.1010)
- Software Construction(6.1020)
関連記事
Discrete Structures(DS): 離散構造
- 概要
- 情報学全般の数理的な基礎をなす分野であり、理論分野だけでなく他の多くの応用分野においても物事を的確に記述・議論するために使われる基礎知識を習得する
- 目的
- コンピュータサイエンスを理解するために必要なレベルの数学的知識を習得する
- 自分は数学的知識に乏しいが、今後長くコンピュータサイエンスを扱う領域・プログラマーとして生きていく上での基盤作りのためには理解が必須であると考えている。算数レベルの基礎中の基礎から改めて土台作りをし、「理解できる」レベルまで知識を習得する
- コンピュータサイエンスを理解するために必要なレベルの数学的知識を習得する
- 目標
- コンピュータサイエンスを学ぶものとして最低限の「離散数学について」解説できるレベルになる
- リソース
- 『小学校6年間の算数が1冊でしっかりわかる本』
- 『中学校3年間の数学が1冊でしっかりわかる本』
- 『初めから始める数学I 改訂1 新課程』
- 『初めから始める数学A 新課程』
- 『初めから始める数学Ⅱ 改訂1 新課程』
- 『初めから始める数学B 改訂1 新課程』
- 『離散数学―コンピュータサイエンスの基礎数学』
- Mathematics for Computer Science
- MIT
- Mathematics for Computer Science(6.1200[J])
Algorithms and Complexity(AL): アルゴリズムと計算量
- 概要
- コンピュータを問題解決に役立てるには目的に応じて効果的な計算方法を選択・設計する必要がある。そのためにはアルゴリズム(算法)を作る考え方の枠組みやその効率、限界についての本質的な部分をよく理解することが必須であり、情報科学やソフトウェア工学の基盤的役割を果たすアルゴリズムと計算量について理解する必要がある
- 一般的なアルゴリズム、アルゴリズムパラダイム、データ構造の入門
- 目的
- 複雑な問題をより効率的に解決するためのアルゴリズムの理論と活用及び限られたリソースの中でも効率的な解法を導き出すための計算量についての理論と活用方法を理解し、実務に取り入れることができるようになること
- 目標
- 実務またはLeetCodeなどの問題において、採用するアルゴリズムの計算量を把握し、複数の解法の中から最も効率的なアルゴリズムを適用して問題解決までいたることができる
- リソース
- 『なっとく! アルゴリズム』
- アルゴリズムの超基礎と苦手意識の克服
- 『珠玉のプログラミング』
- アルゴリズムとデータ構造への理解を深める
- 『アルゴリズムイントロダクション』シリーズ
- アルゴリズムについての世界標準の教科書
- 『アルゴリズム設計マニュアル』
- アルゴリズムの設計に焦点を当てた1冊
- Introduction to Algorithms
- Design and Analysis of Algorithms
- Algorithms(Cousera)
- スタンフォード大が提供するアルゴリズムに関する講座で、4つのコースからなる
- LeetCode
- 繰り返しアルゴリズムを用いた問題を解くことで理解を深める
- 『なっとく! アルゴリズム』
- MIT
- Introduction to Algorithms(6.1210)
- Design and Analysis of Algorithms(6.1220[J])
Systems Fundamentals(SF): システム基礎
- 概要
- コンピュータサイエンスの各分野に共通して現れる基本的概念を取り出し、コンピュータサイエンス全体を通して簡潔かつ統一された理解を形成する
- 目的
- コンピュータサイエンスを深く学ぶにあたり、押さえておくべき総論的知識を把握し、理解する
- 目標
- 『入門コンピュータ科学』で扱われている12ジャンルについて、知識のない人にもその概要を解説できる程度の理解持つ
- リソース
- 『みんなのコンピュータサイエンス』
- コンピュータサイエンスが扱う「基礎」「計算量」「戦略」「データ」「アルゴリズム」「データベース」「コンピュータ」「プログラミング」という8つのジャンルに絞り、ライトにエッセンスや背景を学ぶ
- 『入門コンピュータ科学』
- 海外大学でも採用されているコンピュータサイエンスの教科書
- 「データストレージ」「データ操作」「オペレーティングシステム」「ネットワークとインターネット」「アルゴリズム」「プログラミング言語」「ソフトウェア工学」「データ抽象」「データベースシステム」「コンピュータグラフィックス」「人工知能」「計算理論」の12のジャンルについて学ぶ
- 『コンピュータはなぜ動くのか 第2版 知っておきたいハードウエア&ソフトウエアの基礎知識』
- ハードウエア、ソフトウエア、データベース、ネットワーク、セキュリティというコンピュータを使いこなすうえで必要な知識を解説
- 『Webを支える技術』
- Web技術についての歴史やWebサービスの実践的な設計について
- 『みんなのコンピュータサイエンス』
Programming Languages(PL): プログラミング言語
- 概要
- プログラミング入門などとは切り離して言語そのものを題材とする
- 言語ごとに異なるプログラミングモデルとそれらの背景にある設計方針を理解できるようになること。また言語処理系、プログラムの静的解析、メモリ管理などを学ぶことで、言語ごとの効果的な使用方法とその限界を知ることができるようになること
- 目的
- 言語ごとの特性や言語自体の内部的な仕組みを理解できるようになることで、より効率的なプログラミングの実装や特定の言語に縛られない最適な技術の選定などが行えるようになるため
- 目標
- インタプリタとコンパイラを実装し、言語処理系や静的解析、再帰等について第三者に基本的な概念とその仕組みを解説することができる
- リソース
- 『計算機プログラムの構造と解釈』
- プログラミング言語LISPの方言であるSchemeを使用し、抽象化、再帰、インタプリタ、メタ言語的抽象といった計算機科学における概念の真髄を丁寧に解説した古典的名著
- 「関数型言語」の聖典のひとつ
- カリフォルニア大学バークレー校の講座でも視聴可能
- 『インタプリタの作り方 -言語設計/開発の基本と2つの方式による実装』
- 『Go言語でつくるインタプリタ』
- 『Writing A Compiler In Go』
- 『Goでつくるインタプリタ』のコンパイラ版
- Computer Language Engineering
- Lec 1 | MIT 6.035 Computer Language Engineering, Fall 2005
- 古いが、MITの講座
- この講座は必要なさそうであればスキップする
- 『計算機プログラムの構造と解釈』
- MIT
Software Engineering(SE): ソフトウェア工学
- 概要
- ソフトウェア開発ライフサイクルについての知識を学び、高品質なソフトウェアを開発するための技術と成果物の品質、およびプロセスを評価するための技術
- 開発プロセス、プロジェクトマネジメント、各種ツール、ソフトウェアの設計や構築(コーディング規約やセキュアなコーディング、例外処理等)も含まれる
- 目的
- 継続的な開発が続くソフトウェアにおいて、高品質の維持と効率的な開発を行うための理論と方法論について理解する
- 目標
- 「高品質なソフトウェアを継続してデリバリーしていくためにはどういう取り組みをすべきか」を理解すること、「その取り組みを実現するために何をすべきか」を理解すること、そして「高品質なソフトウェアを継続してデリバリーしていく仕組み作り」を行い実務の中で取り入れていく。またアウトプットとしてそれぞれの取り組みを細分化し、「なぜやるべきか」「どうやるべきか」を開発メンバー全員が理解できる形のドキュメントとして整備する
- リソース
- 『実践ソフトウェアエンジニアリング(第9版)』
- 個々の技術や事例について体系的な理解をする
- 500件以上の文献が参照されており、網羅的に学ぶ
- 『Googleのソフトウェアエンジニアリング』
- Googleの現役ソフトウェアエンジニアが超大規模ソフトウェアの開発と保守を支えてきたプラクティスを学ぶ。実務的
- 『継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化』
- 継続的なソフトウェアのデリバリーを実現するためのビルド、デプロイ、テスト、リリースの自動化について理解する
- 『継続的デリバリーのソフトウェア工学 もっと早く、もっと良いソフトウェアを作るための秘訣』
- 「ソフトウェア工学とは何か」から、高品質で役立つものを作る能力の向上を目指す
- 『ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ』
- このエリアにおける「ソフトウェア設計」を理解するため
- アーキテクトとなるために必要なスキル・知識を包括的に理解する
- 『ソフトウェアアーキテクチャ・ハードパーツ ―分散アーキテクチャのためのトレードオフ分析』
- このエリアにおける「ソフトウェア設計」を理解するため
- ソフトウェアアーキテクトとして、アーキテクチャ上の難題に対して効果的なトレードオフ分析を行いより良い決定ができるようにする
- 『ソフトウェア設計のトレードオフと誤り ―プログラミングの際により良い選択をするには』
- さまざまなシチュエーションにおけるトレードオフの実態とその失敗例を知る
- 『実践ソフトウェアエンジニアリング(第9版)』
- MIT
- Fundamentals of Programming(6.1010)が絡む?
Parallel and Distributed Computing(PD):並列分散処理
- 概要
- 並行性、並列実行、メモリ操作の一貫性、通信遅延など他の多くのエリアのシステム基礎概念の理解の上に形成される知識をベースとして、大規模な計算やデータ処理を効率的に行う(速度向上)ための技術やセキュリティ、耐故障性のあるシステムを作る技術を身につける
- 目的
- 並列分散処理の技術を身につけることで大規模な計算やデータ処理を効率的に行う方法を習得し、その結果アプリケーションの実装等で効率的な処理を通じたパフォーマンスの向上に繋げる
- 目標
- 開発に取り組むプロジェクト(現在はOPTEMO)において、より効率的な処理を行うための設計・実装について見直し、パフォーマンスの改善を行う
- リソース
- 『Go言語による並行処理』
- 『並行プログラミング入門 ―Rust、C、アセンブリによる実装からのアプローチ』
- 『データ志向アプリケーションデザイン』
- Introduction to High-Performance and Parallel Computing(Coursera)
- Parallel, Concurrent, and Distributed Programming in Java(Coursera)
- Couseraの動画は、書籍の後で必要であれば取り組むサブプラン
- MIT
Operating Systems(OS): オペレーティングシステム
- 概要
- 特定のOSに絞らないオペレーティングシステムの設計と実装、およびシステムプログラミングの基礎まで含む
- OSの概要と原理、設計や実装などから仮想マシンなどまで含む
- 目的
- OSはコンピュータシステムの根幹をなすものである。そのOSを理解することで、コンピュータシステム全体への理解が深まり、マルチタスクやメモリ管理等の処理等を通じて効率的でセキュアなソフトウェア開発などに繋げる
- 目標
- ミニマムなOSの実装を通じて、OSの基本的な機能や仕組みを理解し概念だけでなく仕組みレベルまで解説できる知識を習得する
- リソース
- 『Xinuオペレーティングシステムデザイン』
- 設計から実装を通してOSについて理解する
- 『Operating Systems: Three Easy Pieces』
- OSの歴史的背景なども踏まえて解説したOSについての書籍
- 有志の日本語訳
- 『詳解 システム・パフォーマンス』
- エンタープライズとクラウド環境を対象としたオペレーティングシステムとアプリケーションのパフォーマンス分析と向上について
- 『詳解UNIXプログラミング』
- Unixについての超名著。
- OS全般について学んだ後に、特定のOSについての深く学ぶために
- 『ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道』
- 世界で一番使われるOSについて理解のために
- 『Goならわかるシステムプログラミング』
- Goを使ったシステムプログラミングで、Cの知識がなくとも低レイヤーの世界に入門する
- 『詳解Rustプログラミング』
- Rustを用いてシステムプログラミング的な内容ができるが、システムプログラミングと並行でRust使うのがややハード…?
- Computation Structures
- Performance Engineering of Software Systems
- 『Writing an OS in 1000 Lines』
- C言語を用いて、シンプルなOSを実装する
- 『Writing an OS in Rust』
- Rustを用いて、小さなOSの実装をする
- 『Xinuオペレーティングシステムデザイン』
- MIT
- Computation Structures(6.1910)
- Operating System Engineering(6.1810)
- Software Performance Engineering(6.1060)
Networking and Communication(NC): ネットワークと通信
- 概要
- ネットワークの基本的な概念から、通信全般の知識について理解する
- 目的
- ネットワーク・通信の理解を通じてデータ転送の仕組みやシステム間連携の理論と実装を学び、適切かつ効率的なネットワーク設計を行えるようになることでシステムの安定・効率的な運用を実現する
- 目標
- 通信プロトコルとネットワークの仕組みを理解し、またネットワーク上を流れる情報についてそれぞれが果たす役割を解説できるようになること
- 携わるプロジェクトのインフラについて、ネットワーク観点から各種仕組みや構造について理解し非エンジニアに対して解説できるようになること
- リソース
- MIT
- Computer Systems Engineering(6.1800)
Information Assurance and Security(IAS): 情報セキュリティ
- 概要
- 情報セキュリティの基本理念と各種脅威・リスクについて理解し、またその保護と防御の仕組みを学ぶ
- 目的
- システムに対する脅威を事前に防止することまたその脅威からシステムを防御する方法を理解することで、安全なシステムを構築する方法とそれらがどのように攻撃されるかを学ぶ
- 目標
- 開発に携わるプロジェクトにおいて、セキュリティ観点で脅威となりうるものがないかを診断し、また問題がある場合にその対処方法を判断・決定できるようになる
- リソース
- 『イラスト図解式 この一冊で全部わかるセキュリティの基本』
- セキュリティの大枠を掴むための入門
- 『サイバーセキュリティの教科書』
- 『セキュアで信頼性のあるシステム構築』
- 『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』
- Webアプリケーションに絡むセキュリティについて
- 『暗号技術入門』
- セキュリティと暗号は切り離せないものであり、基本的な暗号技術の基礎を抑える
- 『セキュア・バイ・デザイン: 安全なソフトウェア設計』
- プログラミングの質を高め、安全なシステムを構築する方法を学ぶ
- 『セキュアなソフトウェアの設計と開発』
- セキュアなソフトウェア設計・開発を行うための知識・方法論
- 『コンテナセキュリティ コンテナ化されたアプリケーションを保護する要素技術』
- コンテナの仕組みと危険性・脆弱性(開発時に注意すべき箇所)、その対策方法を知る
- 『基礎から学ぶコンテナセキュリティ――Dockerを通して理解するコンテナの攻撃例と対策』
- ハンズオンスタイルでコンテナ環境でのセキュリティ対策について学ぶ
- Palo Alto Networks Cybersecurity プロフェッショナル認定証(Coursera)
- NIST / NICE の人材要件に準拠したサイバーセキュリティ人材エントリーレベルのスキルを習得するコース
- 4つのコースから構成
- 『イラスト図解式 この一冊で全部わかるセキュリティの基本』
- MIT
- Foundations of Computer Security(6.1600)
- Computer Systems Engineering(6.1800)
Information Management(IM): 情報管理
- 概要
- データベースを始め「情報とは何か」を理解し、効果的に情報を収集、整理、保存、検索し、その情報をビジネスや組織の意思決定、戦略策定、運用改善に活用するための技術と理論を習得する
- 目的
- 情報に応じた適切なデータ管理・運用について学び、概念的物理的なデータモデルを構築し、適合する手法や技術を決定し、望ましい設計を得るための実装ができるようになること
- 目標
- データベースシステムとストレージエンジンの内部で利用されている概念を理解し、データベースシステムそれぞれの特性と適切なデータモデリングを行えるようになる
- リソース
- 『リレーショナルデータベース入門―データモデル・SQL・管理システム・NoSQL』
- 「データベースとは何か」からデータベースの設計理論、SQLなどまで網羅
- 『データベースシステム』
- おもに情報系学科におけるデータベース教育を想定して、データベースシステムの基礎を解説
- 『詳説 データベース ―ストレージエンジンと分散データシステムの仕組み』
- データベースとストレージエンジンの内部で利用されている概念について
- Database systems(Coursera)
- 専門講座 - 4 シリーズ コース
- Introduction to Databases(Coursera)
- Meta Database Engineer プロフェッショナル認定証の一部
- データベースの基本的な部分についての講座
- 『リレーショナルデータベース入門―データモデル・SQL・管理システム・NoSQL』
- MIT
Architecture and Organization(AR): アーキテクチャと構成
- 概要
- Systems Fundamentals(SF)の知識を基盤として、より抽象度が高いハードウェアの構築や高度なソフトウェアレイヤに対するインタフェースの知識を習得し、コンピュータシステムの各構成要素の特性や周囲とのやりとりを理解し応用できるようになること
- 目的
- プログラムを実行するコンピュータのアーキテクチャや構成を理解し、性能を最大限活かしたソフトウェアの開発を行えるようになること
- 目標
- ハードウェア、ソフトウェア、コンパイラ、OSといったコンピュータの構成要素を1つずつ組み上げ、アプリケーションを動かすまでを実装することで、コンピュータが動作する理論と実装を理解する
- リソース
- 『コンピュータアーキテクチャのエッセンス』
- 「プロセッサ」「メモリ」「入出力(I/O)」の三分野に焦点を当て、プログラマやデベロッパー向けにコンピュータアーキテクチャの土台作りに
- 『コンピュータの構成と設計』
- パタヘネ本。定番の名著
- 『32ビットコンピュータをやさしく語る はじめて読む486』
- OSやアプリケーションが動くCPUについての名著
- 『コンピュータシステムの理論と実装』
- 「コンピュータを理解するための最善の方法はゼロからコンピュータを作ること」という考えのもと、コンピュータの構成要素をひとつずつ組み立て、コンピュータを作り上げていく
- 序盤で何度も挫折している…
- なんとCourseraで動画講座があったらしい
- 『コンピュータ・システム プログラマの視点から』
- システムに関する知識をどう活用すればよいプログラムを書けるか、プログラマの視点という統一された観点から解説
- 『コンピュータアーキテクチャのエッセンス』
- MIT
- Computer Systems Engineering(6.1800)
- Computation Structures(6.1910)
Social Issues and Professional Practice(SP): 社会的視点と情報倫理
- 今回の目的から逸れるので初期スコープからは除外
Intelligent Systems(IS): 知的システム
- 今回の目的から逸れるので初期スコープからは除外
Platform-based Development(PBD): プラットフォームに依存した開発
- 今回の目的から逸れるので初期スコープからは除外
Computational Science(CN): 計算科学
- 今回の目的から逸れるので初期スコープからは除外
Human-Computer Interaction(HCI): ヒューマンコンピュータインタラクション
- 今回の目的から逸れるので初期スコープからは除外
Graphics and Visualization(GV): グラフィックスと視覚化
- 今回の目的から逸れるので初期スコープからは除外