logo
Published on

Web Developerとしてのコンピュータサイエンス基礎学習カリキュラム

Authors

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 AreaTier1Tier2Tier1学習時間順
Algorithms and Complexity(AL): アルゴリズムと計算量19193
Architecture and Organization(AR): アーキテクチャと構成01616
Computational Science(CN): 計算科学1014
Discrete Structures(DS): 離散構造3742
Graphics and Visualization(GV): グラフィックスと視覚化2113
Human-Computer Interaction(HCI): ヒューマンコンピュータインタラクション449
Information Assurance and Security(IAS): 情報セキュリティ3611
Information Management(IM): 情報管理1914
Intelligent Systems(IS): 知的システム01016
Networking and Communication(NC): ネットワークと通信3711
Operating Systems(OS): オペレーティングシステム4119
Platform-based Development(PBD): プラットフォームに依存した開発0016
Parallel and Distributed Computing(PD): 並列分散処理5108
Programming Languages(PL): プログラミング言語8206
Software Development Fundamentals(SDF): ソフトウェア開発基礎4301
Software Engineering(SE): ソフトウェア工学6227
Systems Fundamentals(SF): システム基礎1894
Social Issues and Professional Practice(SP): 社会的視点と情報倫理1155

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時間
    • 『プログラミングの基礎』
      • 「デザインレシピ」というアプローチを用いたプログラムの実装方法とデータ構造とアルゴリズムについて
  • 予備リソース

  • MIT対応科目

    • Introduction to Computer Science Programming in Python(6.100A)
    • Fundamentals of Programming(6.1010)
    • Software Construction(6.1020)
  • 関連記事

Discrete Structures(DS): 離散構造

Algorithms and Complexity(AL): アルゴリズムと計算量

  • 概要
    • コンピュータを問題解決に役立てるには目的に応じて効果的な計算方法を選択・設計する必要がある。そのためにはアルゴリズム(算法)を作る考え方の枠組みやその効率、限界についての本質的な部分をよく理解することが必須であり、情報科学やソフトウェア工学の基盤的役割を果たすアルゴリズムと計算量について理解する必要がある
    • 一般的なアルゴリズム、アルゴリズムパラダイム、データ構造の入門
  • 目的
    • 複雑な問題をより効率的に解決するためのアルゴリズムの理論と活用及び限られたリソースの中でも効率的な解法を導き出すための計算量についての理論と活用方法を理解し、実務に取り入れることができるようになること
  • 目標
    • 実務または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): プログラミング言語

Software Engineering(SE): ソフトウェア工学

Parallel and Distributed Computing(PD):並列分散処理

Operating Systems(OS): オペレーティングシステム

Networking and Communication(NC): ネットワークと通信

Information Assurance and Security(IAS): 情報セキュリティ

Information Management(IM): 情報管理

Architecture and Organization(AR): アーキテクチャと構成

  • 概要
    • Systems Fundamentals(SF)の知識を基盤として、より抽象度が高いハードウェアの構築や高度なソフトウェアレイヤに対するインタフェースの知識を習得し、コンピュータシステムの各構成要素の特性や周囲とのやりとりを理解し応用できるようになること
  • 目的
    • プログラムを実行するコンピュータのアーキテクチャや構成を理解し、性能を最大限活かしたソフトウェアの開発を行えるようになること
  • 目標
    • ハードウェア、ソフトウェア、コンパイラ、OSといったコンピュータの構成要素を1つずつ組み上げ、アプリケーションを動かすまでを実装することで、コンピュータが動作する理論と実装を理解する
  • リソース
  • 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): グラフィックスと視覚化

  • 今回の目的から逸れるので初期スコープからは除外