Open19
コンピュータサイエンスのカリキュラム標準
ネタ元
J17-CS: カリキュラム標準コンピュータ科学領域(CS)
CS2013: Curriculum Guidelines for Undergraduate Programs in Computer Science
CC2020(Computing Curricula 2020): Paradigms for Global Computing Education.
位置づけ
- J17-CSは情報処理学会が定める日本の大学向けのカリキュラム標準
- J17-CSはACMが定義したCS2013を出発点に検討されている
- だいたい10年周期ぐらいで見直されてる
- CS2013はグローバルなコンピュータサイエンスのカリキュラム
- ACMはAssociation for Computing Machineryの略称
- ACMは世界でもっとも影響力のあるアメリカの計算機科学分野の学会
- CC2020はコンピュータサイエンスも含めたコンピュータ技術カリキュラムの横断的なレポート
- Computer Engineering
- Computer Science
- Cybersecurity
- Information Systems
- Information Technology
- Software Engineering
- with data science
動向
- CC2020では知識ベースの学習からコンピテンシーベースの学習へと移行が進んでいる
- Competency = Knowledge + Skills + Dispositions
- 教育界では、キャリアを成功させるには3つのことが必要と言われている
- Knowledge -「know-what」- 中核となる概念や内容に対する習熟度と、新しい状況への適用
- Skills -「know-how」- 確実に結果を出すためのタスク遂行能力
- Dispositions - 「know-why」- 知的、社会的、道徳的な傾向
リンク集
知識体系
- Software Development Fundamentals:ソフトウェア開発基礎
- Discrete Structures(DS):離散構造
- Algorithms and Complexity(AL):アルゴリズムと計算量
- Systems Fundamentals(SF):システム基礎
- Programming Languages(PL):プログラミング言語
- Software Engineering(SE):ソフトウェア工学
- Social Issues and Professional Practice(SP):社会的視点と情報倫理
- Parallel and Distributed Computing(PD):並列分散処理
- Operating Systems(OS):オペレーティングシステム
- Architecture and Organization(AR):アーキテクチャと構成
- Networking and Communication(NC):ネットワークと通信
- Human-Computer Interaction(HCI):ヒューマンコンピュータインタラクション
- Information Assurance and Security(IAS):情報セキュリティ
- Information Management(IM):情報管理
- Intelligent Systems(IS):知的システム
- Graphics and Visualization(GV):グラフィックスと視覚化
- Media Representation(MR):メディア表現
- Computational Science(CN):計算科学
- Platform-Based Development(PBD):プラットフォームに依存した開発
カリキュラム構成
- CS2013の知識体系は18のエリアから構成される
- エリアはさらにユニット・トピックスから構成される
- 各トピックスはCore(必須科目)かElective(選択科目)に分類される
- さらにCoreはTier1(必修)とTier2(選択必修)に分類される
- J17-CSも同様の構成をとっている
- J17-CSでは、Tier1が166時間、Tier2が142時間である
- ↑の知識体系は、Tier1を2ポイント、Tier2は1ポイントとして重み付けした場合のランキング
全体像
- 大学に通わない場合、基本情報から入る人が多い
- カリキュラムの網羅度は比較的高いので、とっかかりとしては良い気がする
- ただ基本情報はどうしても浅くなるし、ただの暗記科目になるのがデメリット
- 推奨書籍
- みんなのコンピュータサイエンス:薄いのでサラッと読める
- 教養としてのコンピューターサイエンス講義:情報系以外の人向けに書かれているので優しい
- 入門 コンピュータ科学:網羅性が高いので結構いい本だが、2015年出版なので事例が少し古くなってきた
- コンピュータシステムの基礎:網羅性が高い、教科書感あるが2021年出版と新しい
Software Development Fundamentals:ソフトウェア開発基礎
- ソフトウェア開発に必要な基本概念と技術を扱うエリア
- ソフトウェア開発プロセス全体に焦点をあて、初年度で習得すべき事項
- 他のテーマを学ぶ際の前提知識を提供し、広く浅い
- テーマ
- プログラミングの基本:変数、条件式、ループ、関数、入出力
- アルゴリズムの基礎概念:役割、反復、再帰、分割統治
- 基本的なデータ構造:配列、文字列、構造体、抽象データ型(スタックやキュー)
- 設計の基本的な考え方と原則:抽象化、カプセル化と情報隠蔽、ふるまいと実装の分離
- 開発方法の基礎:エラーの種類、仕様、コードレビュー、テスト、デバッグ、ドキュメント
- 職業プログラマの場合はさすがにだいたい知ってそう
- 本当にソフトウェア開発をしたことがない人向けの知識
- ただプログラミングの入門書だけだとカバーできないかも
- 推奨サイト
- ハーバード大学 CS50(日本語版):Webで無料公開されている、ホントに初心者向け
Discrete Structures(DS):離散構造
- いわゆる離散数学とか言われるやつ
- コンピュータサイエンスの文脈では微積分や線形代数は入らない
- 微積分や線形代数は一般教養科目として当然やるよね?的なアレだろうか
- テーマ
- 集合、関係、関数
- 論理:命題論理や述語論理
- 論証の技法:命題の逆・裏・対偶、背理法、帰納法など
- 場合の数と整数
- グラフと木
- 確率
- データ構造とアルゴリズム以外の応用事例
- 証明:形式仕様記述、検証、データベース、暗号
- グラフ理論:ネットワーク、オペレーティングシステム、コンパイラ
- 集合論:ソフトウェア工学、データベース
- 確率論:Intelligentシステム、ネットワーク、および多くのアプリケーション
- 重要だとか言われるわりに、学ぶ前に重要性を実感できないジレンマがある
- 数学書から漂う、圧倒的これ何の役に立つの?感
- 実際に勉強してみると、ちょこちょこ離散数学の用語が技術書に出てくることに気付く
- ゴリゴリに証明とかできなくても、数学的な語彙力を身につけるだけでも最初はいい気がする
- 最初にやるべきなのは論理と集合
- やりはじめてだいぶ経ってから気づいたが、この2つは数学における公用語となっている
- 公理や定理がこの2つを使って記述されているので、論理と集合の基本的な記号の意味がわからないと、そもそも数学書が読めない(英語でいえばアルファベット
- こういうの誰も教えてくれないが、これって常識なのだろうか。。
- 推奨書籍(学び直し)
- 小学校6年間の算数が1冊でしっかりわかる本:自信がない人はココから(筆者はやりましたw
- 中学校3年間の数学が1冊でしっかりわかる本:実は中学のほうが計算が楽
- 推奨書籍(読み物)
- 数学ビギナーズマニュアル:記号や数学独特の言い回しなどが学べる、数学初心者必携の書
- はじめまして数学:数学と仲良くなるための本
- 数学ガール シリーズ:有名な数学を題材にした青春小説
- 数学ガールの秘密ノート シリーズ:無印より数学の難易度が低くてページ数も少ない
- 推奨書籍(離散数学全般)
- プログラマの数学:数学書では最も平易な部類なので、学び直し勢はここからいきましょ
- やさしく学べる離散数学:証明が少なめなので初級者には理解しやすい/テーマごとに簡単な練習問題もついていて理解を深められるのもグッド
- マグロウヒル大学演習 離散数学:演習問題が豊富で、全部ではないが解答も多く掲載されているので独学者にはありがたい存在
- 推奨書籍(個別テーマ)
- まったくゼロからの論理学:論理学を学ぶにはこの本が最高
- 集合とはなにか:集合論の入門として有名で、数学ガチ勢でなければこのレベルで十分
- 最短経路の本 レナのふしぎな数学の旅:グラフ理論を物語で学べる異色の小説
- 離散数学以外の大学数学については下記参照
Algorithms and Complexity(AL):アルゴリズムと計算量
- コンピュータサイエンス界の花形でありロックスター
- コンピュータサイエンスのあらゆる先端分野でベースとなる
- 計算理論もこの枠内に収まるらしい
- テーマ
- 計算量の解析:最悪時評価・平均時評価、Big O記法、時間量と空間量
- アルゴリズム設計の手法:貪欲法、動的計画法、分割統治法、再帰的探索、発見的解法
- 基本データ構造とアルゴリズム:数値処理、ソート、サーチ、二分探索木、グラフ
- 形式言語、計算可能性、計算量の基礎
- アルゴリズムの応用分野
- 人工知能
- データベース
- 分散コンピューティング
- グラフィックス
- ネットワーキング
- オペレーティングシステム
- プログラミング言語
- セキュリティ
- 有名な教科書もいくつかあり、日本語訳も出ている
- 競プロ対策本みたいなのもある
- なぜかC++が多く、最近はPythonも増えてきた(Goは全然ない
- 推奨書籍(アルゴリズム)
- なっとく!アルゴリズム:アルゴリズム本で何度も挫折した人にオススメしたい
- 珠玉のプログラミング:アルゴリズムの重要性をコラムを通して楽しく学べる稀有な本
- 問題解決力を鍛える!アルゴリズムとデータ構造:アルゴリズム設計の手法がわりと手前に出てくるのはよい
- 推奨書籍(計算理論)
- 白と黒のとびら:オートマトンを題材にした異色のファンタジー小説
- 計算できるもの、計算できないもの:Pythonを使って計算理論に入門する本
- アンダースタンディング コンピュテーション:Rubyを使って計算理論に入門する本
- 計算理論の基礎:計算理論と言えばコレ!というほど有名だが、数学力がないと面食らう
- 推奨書籍(有名どころ/筆者未読)
Systems Fundamentals(SF):システム基礎
- コンピュータサイエンスの各分野に共通して現れる基本概念
- もともとバラバラに教えられていたが、複数の分野で活用できる統一した説明を与える
- 原理の共通性の理解が目的
- コンピュータサイエンス業界の横断的関心事といえる
- テーマ
- 計算パラダイム:論理式、逐次処理、並列処理、パイプライン、スケーリング
- レイヤ間通信:プログラムの抽象化、インタフェース、ライブラリ、OSとアプリケーション
- 状態と状態機械:連続と離散、クロック、組合せ回路、順序回路、ネットワークプロトコル
- 並列処理:逐次処理と並行処理、要求並行性とタスク並行性、スレッド、クライアントサーバ
- 性能評価:ベンチマーク、データ収集と評価、アムダールの法則
- リソース割当てとスケジューリング:リソースの種類、スケジューリングの種類、プリエンプティブスケジューリング
- 近接と性能向上:光の速度、遅延、キャッシュ、メモリ階層
- 仮想化と分離:保護と性能、間接化のレベル、仮想記憶、仮想マシン
- 冗長化による信頼性向上:バグと欠陥、検査と再試行、冗長コーディング、複製
- 意外とこのトピック単体で学ぶのは難しい
- 統一的に学べる書籍はあまり思い浮かばない
- パタヘネあたりのコンピュータアーキテクチャ本が比較的網羅性が高いかもしれない
- 基本といえば基本だが、意外と知識が虫食い状態の人は多そう
- 推奨書籍
- なし:ピンポイントで学ぶのは諦めて、他の知識体系の中でしっかり学ぶ
Programming Languages(PL):プログラミング言語
- オブジェクト指向言語と関数型言語を重視
- プログラミングの入門ではなく、言語のパラダイムを学ぶ
- 職業プログラマだとオブジェクト指向言語が多いと思うので、関数型をやるのが手っ取り早い気がする
- テーマ
- オブジェクト指向プログラミング:オブジェクト指向設計、クラス、情報隠蔽、コレクション
- 関数型プログラミング:副作用のないプログラム、構造を持つデータ、関数閉包、高階関数
- 型システムの基本:型、型安全性と型エラー、静的な型と動的な型の比較
- イベント駆動プログラミングとリアクティブプログラミング:イベント、ハンドラ、MVC
- プログラムの表現:コンパイラ、抽象構文木
- 言語翻訳と実行:インタプリタ、言語処理系内部のフェーズ、実行時表現、メモリレイアウト
- 推奨書籍(プログラミング)
- プログラミングの基礎:OCamlで関数型言語の基礎が学べる/デザインレシピが地味にいい
- オブジェクト指向入門 第2版 原則・コンセプト:入門と書いてあるが入門書ではない
- 推奨書籍(言語処理系)
- RubyでつくるRuby:簡単すぎて拍子抜けするかもしれない
- Go言語でつくるインタプリタ:Goで結構本格的なインタプリタが実装できてかなり面白い
- コンピュータシステムの理論と実装:後半でVMとコンパイラを実装する書籍
- プログラム意味論の基礎:かなりムズいが、型システム入門に行く前に挑戦しよう(筆者は前半でドロップアウトしたが
- 推奨書籍(有名どころ/筆者未読)
Software Engineering(SE):ソフトウェア工学
- ソフトウェア開発ライフサイクルの構成要素を学ぶ
- 大学よりも職場の方が学びやすい、数少ない領域
- アカデミックな書籍は実践的な意味ではイマイチな場合が多い
- テーマ
- ソフトウェアプロセス
- 要求工学
- ソフトウェア設計
- ソフトウェアの構築
- ソフトウェアの検証と妥当性確認
- ソフトウェアプロジェクトマネジメント
- ツールと環境
- ソフトウェア進化・発展
- ソフトウェアの信頼性
- 推奨書籍(全般)
- 実践ソフトウェアエンジニアリング:極めて網羅性が高い
- Googleのソフトウェアエンジニアリング:まったくアカデミックではないが極めて実践的
Social Issues and Professional Practice(SP):社会的視点と情報倫理
- コンピュータサイエンスの文脈でこれに触れてる人ほとんどいないが非常に重要視されている
- J17-CSでもかなり熱が入っている印象
- テーマ
- 社会におけるコンピュータ
- 専門家としての倫理的責任
- 知的財産権
- プライバシーと市民的自由
- 専門家としてのコミュニケーション能力
- 持続可能性
- 推奨書籍
- はじめての技術者倫理:技術者向けの倫理についてわりとライトに解説していて読みやすい
- 技術者の倫理 入門:いかにも教科書チックだが一つ一つが非常に丁寧に説明されている
- 情報倫理:メディアリテラシーやSNS利用時のモラルなど、技術者以外も身につけるべき項目を網羅
Parallel and Distributed Computing(PD):並列分散処理
- 並列分散といいつつ、分散は選択科目扱い
- とはいえWebシステムでは分散処理も必須なのでフォローしたい
- 並列と並行は異なる概念だが、Webアプリケーション開発では並行のほうが重要
- 機械学習とかでGPUをぶん回す人は並列処理のほうが重要かも(よく知らない
- テーマ
- 並列性の基礎
- 並列処理への分割
- 通信と協調
- 並列アーキテクチャ
- 並列アルゴリズム、解析とプログラミング
- 分散システム(選択科目)
- 推奨書籍(並行処理)
- Go言語による並行処理:並行処理の入門書としてはこれが最も平易
- 並行プログラミング入門:Rustメインだがアセンブリも説明していて好感が持てる
- 並行コンピューティング技法:原則がシンプルにまとまっている前半だけでも読む価値あり
- 推奨書籍(分散処理)
- 分散システム:基礎がサラッと学べて入門に最適/タネンバウム本は入手が難しいのでこちらで代替しよう
- データ志向アプリケーションデザイン:この本は激ヤバで絶対に読むべき書籍のひとつ
Operating Systems(OS):オペレーティングシステム
- OSの概念的な理解が主要テーマ
- スコープに入ってなさそうだが、Linuxについては別途フォローしたい
- テーマ
- オペレーティングシステムの概要
- オペレーティングシステムの原理
- 並行性
- スケジューリングとディスパッチ
- メモリ管理
- セキュリティと保護
- 一般的なソフトウェア開発者はシステムプログラミングから入るのもいいかもしれない
- システムプログラミングをしようとするとOSの概念の理解が必要になるし
- 推奨書籍(OS全般)
- オペレーティングシステム:プロセス・並行処理・メモリ・ファイルの4つの話題に絞って解説があり、初学者がOSの概念を学ぶには適切なボリュームに保たれている
- Xinuオペレーティングシステムデザイン:OSを実装レベルで学べる/コンテキストスイッチの実装とかが載っていて興味深い
- Androidを支える技術 Ⅱ:モバイル端末のOSの設計が学べる異色の本
- 推奨書籍(Unix/Linux)
- [試して理解]Linuxのしくみ:カーネルの基礎を学ぶならこの本から始めよう
- Linux Kernel Development:洋書だがLinuxカーネルの重要なアルゴリズムなどが学べる良書
- 詳解 システム・パフォーマンス:チューニングの前提となる仕組み部分の解説が秀逸
- 推奨書籍(システムプログラミング)
- Linuxプログラミングインタフェース:超絶に分厚いが、Linuxで一冊だけ選ぶならコレ
- 詳解UNIXプログラミング:UNIX系OSを網羅し、絶大な影響を与えた伝説の書
- ふつうのLinuxプログラミング:システムプログラミングがはじめての人にオススメしたい
- Goならわかるシステムプログラミング:C言語がどうしてもイヤな人はGoから入る手も
Architecture and Organization(AR):アーキテクチャと構成
- ここでいうアーキテクチャはコンピュータアーキテクチャである
- 電子回路にはじまり命令セットアーキテクチャまで
- OSより下のレイヤを扱うイメージ
- テーマ
- ディジタル回路とディジタルシステム
- 機械レベルでのデータの表現
- アセンブリ言語レベルでのコンピュータの構成
- メモリシステムの構成とアーキテクチャ
- インタフェースと通信
- 推奨書籍(コンピュータアーキテクチャ)
- コンピュータの構成と設計:パタヘネでおなじみの定番の一冊
- コンピュータアーキテクチャのエッセンス:プログラマ向けにハードウェアの基本を解説
- プロセッサを支える技術:パタヘネがしんどい人はこちらでサラッと入門するのもあり
- 推奨書籍(アセンブラとコンパイラ)
- コンピュータシステムの理論と実装:NANDゲートにはじまりCPU、VM、コンパイラまで実装する最高の書/コンピュータサイエンスで一冊だけ選ぶならコレ
- コンピュータシステム:コンパイラがどういうアセンブラを出力するかを豊富な練習問題で学べる/分厚くて気圧されるが、やりきれると相当自信になる
- 低レベルプログラミング:上述のコンピュータシステムをもう少しライトにした感じ。
- Binary Hacks:低レイヤのツールがいろいろ紹介されていて面白い
Networking and Communication(NC):ネットワークと通信
- HTTPだけでなく、上から下までまんべんなく学ぶ
- アプリケーションレイヤについては意外と深堀りしないので別途フォローが必要(DNSとか)
- テーマ
- 導入
- ネットワークアプリケーション
- 信頼性のあるデータ配信
- 経路制御と転送
- ローカルエリアネットワーク
- リソース割当てと通信品質
- モビリティ管理
- 推奨書籍(ネットワーク全般)
- コンピュータネットワーク:大著だが物理層を含めた全レイヤを一気通貫で学ぶならコレ
- コンピュータネットワークとインターネット:こちらも全レイヤを網羅しているが、もう少しライト
- 推奨書籍(TCP/IP)
- マスタリングTCP/IP 入門編:物理層とかいいかなって場合は、こちらがライトでオススメ
- TCP技術入門:比較的最近の動向も知りたい場合にオススメ
- 推奨書籍(アプリケーション層)
- プロフェッショナルSSL/TLS:TLSを学ぶならコレ/硬派な見た目だが意外と読みやすい
- DNSがよくわかる教科書:意外とDNSのまとまった情報は貴重
- 詳解HTTP/2:HTTP/2を全体像を掴むにはちょうどいい内容
Human-Computer Interaction(HCI):ヒューマンコンピュータインタラクション
- コンピュータサイエンスとは縁遠いイメージ
- アカデミックな世界ではなく、実務者が書いたUXやUIの本はたくさん出ている
- ただし多くの本は大学で研究されてる内容ではなく、著者のオレオレ知見が多いので留意
- テーマ
- 基礎
- インタラクションの設計
- 推奨書籍
- イラストで学ぶ ヒューマンインタフェース:この領域の幅広い話題にバランス良く触れられる
- ヒューマンコンピュータインタラクション:よりインタラクションにフォーカスして学ぶならこちら
Information Assurance and Security(IAS):情報セキュリティ
- コンピュータサイエンスの中では珍しく直接的に役立つ
- 無知がそのままリスクに直結する
- 実務的には選択科目も含めて学んでおいたほうが無難
- Webシステムでは選択科目も有益なものが多い
- テーマ
- セキュリティの基礎概念
- 設計の原則
- 防御プログラミング
- 脅威と攻撃
- ネットワークセキュリティ
- 暗号化
- Webセキュリティ(選択科目)
- プラットフォームセキュリティ(選択科目)
- セキュリティポリシーとガバナンス(選択科目)
- デジタルフォレンジック(選択科目)
- 安全なソフトウェア工学(選択科目)
- 推奨書籍(セキュリティ全般)
- この一冊で全部わかるセキュリティの基本:はじめて学ぶ場合に全体像をサラッと学ぶのによい
- セキュリティ技術の教科書:セキュリティ全般をわりと詳細に学べる良書
- 推奨書籍(個別テーマ)
- 暗号技術入門:暗号はセキュリティの要なので、一冊ぐらいは暗号の本を読んでおきたい
- セキュア・バイ・デザイン:DDDをベースにセキュリティをどう組み込むか解説した意欲作
- Container Security:洋書だがLinuxとDockerのセキュリティメカニズムが網羅的に学べる良書
- Webブラウザセキュリティ:ブラウザを題材にした変わり種
Information Management(IM):情報管理
- いわゆるデータベースを扱う領域
- ただしいきなり技術の話をするのではなく、情報とはなにかというメタな話からはじまる
- RDBMSのSQL、トランザクション、物理設計などは選択科目扱い
- テーマ
- 情報管理の概念
- データベースシステム
- データモデル
- 推奨書籍
- リレーショナルデータベース入門:リレーショナルモデルを数学的にきっちり理解したい人向け教科書
- データベースシステム:数式の証明まではいいやって場合は、こちらのほうがライト
- 理論から学ぶデータベース実践入門:理論と実践の橋渡しを試みた書籍で、数学に馴染みが薄い場合はこの本がとっつきやすい
Intelligent Systems(IS):知的システム
- 世は大AI時代である
- AI=機械学習と思っている人もいそうだが、機械学習はAIの一分野にすぎない
- この領域は数学の素養がないとほとんど専門書が読めない
- 数学できない人はビジネス書で雰囲気を感じるぐらいしかできない(ツライ
- テーマ
- 基本問題
- 基礎的探索戦略
- 基礎的知識表現と推論
- 基礎的機械学習
- 推奨書籍
- イラストで学ぶ 人工知能概論:機械学習以外も含めて、人工知能の全体像を掴むのに最適
その他の領域
- Graphics and Visualization(GV):グラフィックスと視覚化
- 基礎概念
- Media Representation(MR):メディア表現
- 情報のディジタル表現
- 標本化、量子化、圧縮
- Computational Science(CN):計算科学
- モデリングとシミュレーションへの導入
- Platform-Based Development(PBD):プラットフォームに依存した開発
- 必須なし(すべて選択科目)