Open19

コンピュータサイエンスのカリキュラム標準

tmknomtmknom

位置づけ

  • 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」- 知的、社会的、道徳的な傾向

リンク集

tmknomtmknom

知識体系

  1. Software Development Fundamentals:ソフトウェア開発基礎
  2. Discrete Structures(DS):離散構造
  3. Algorithms and Complexity(AL):アルゴリズムと計算量
  4. Systems Fundamentals(SF):システム基礎
  5. Programming Languages(PL):プログラミング言語
  6. Software Engineering(SE):ソフトウェア工学
  7. Social Issues and Professional Practice(SP):社会的視点と情報倫理
  8. Parallel and Distributed Computing(PD):並列分散処理
  9. Operating Systems(OS):オペレーティングシステム
  10. Architecture and Organization(AR):アーキテクチャと構成
  11. Networking and Communication(NC):ネットワークと通信
  12. Human-Computer Interaction(HCI):ヒューマンコンピュータインタラクション
  13. Information Assurance and Security(IAS):情報セキュリティ
  14. Information Management(IM):情報管理
  15. Intelligent Systems(IS):知的システム
  16. Graphics and Visualization(GV):グラフィックスと視覚化
  17. Media Representation(MR):メディア表現
  18. Computational Science(CN):計算科学
  19. Platform-Based Development(PBD):プラットフォームに依存した開発

カリキュラム構成

  • CS2013の知識体系は18のエリアから構成される
    • エリアはさらにユニット・トピックスから構成される
    • 各トピックスはCore(必須科目)かElective(選択科目)に分類される
    • さらにCoreはTier1(必修)とTier2(選択必修)に分類される
  • J17-CSも同様の構成をとっている
    • J17-CSでは、Tier1が166時間、Tier2が142時間である
    • ↑の知識体系は、Tier1を2ポイント、Tier2は1ポイントとして重み付けした場合のランキング

全体像

tmknomtmknom

Software Development Fundamentals:ソフトウェア開発基礎

  • ソフトウェア開発に必要な基本概念と技術を扱うエリア
    • ソフトウェア開発プロセス全体に焦点をあて、初年度で習得すべき事項
    • 他のテーマを学ぶ際の前提知識を提供し、広く浅い
  • テーマ
    • プログラミングの基本:変数、条件式、ループ、関数、入出力
    • アルゴリズムの基礎概念:役割、反復、再帰、分割統治
    • 基本的なデータ構造:配列、文字列、構造体、抽象データ型(スタックやキュー)
    • 設計の基本的な考え方と原則:抽象化、カプセル化と情報隠蔽、ふるまいと実装の分離
    • 開発方法の基礎:エラーの種類、仕様、コードレビュー、テスト、デバッグ、ドキュメント
  • 職業プログラマの場合はさすがにだいたい知ってそう
    • 本当にソフトウェア開発をしたことがない人向けの知識
    • ただプログラミングの入門書だけだとカバーできないかも
  • 推奨サイト
tmknomtmknom

Discrete Structures(DS):離散構造

  • いわゆる離散数学とか言われるやつ
    • コンピュータサイエンスの文脈では微積分や線形代数は入らない
    • 微積分や線形代数は一般教養科目として当然やるよね?的なアレだろうか
  • テーマ
    • 集合、関係、関数
    • 論理:命題論理や述語論理
    • 論証の技法:命題の逆・裏・対偶、背理法、帰納法など
    • 場合の数と整数
    • グラフと木
    • 確率
  • データ構造とアルゴリズム以外の応用事例
    • 証明:形式仕様記述、検証、データベース、暗号
    • グラフ理論:ネットワーク、オペレーティングシステム、コンパイラ
    • 集合論:ソフトウェア工学、データベース
    • 確率論:Intelligentシステム、ネットワーク、および多くのアプリケーション
  • 重要だとか言われるわりに、学ぶ前に重要性を実感できないジレンマがある
    • 数学書から漂う、圧倒的これ何の役に立つの?感
    • 実際に勉強してみると、ちょこちょこ離散数学の用語が技術書に出てくることに気付く
    • ゴリゴリに証明とかできなくても、数学的な語彙力を身につけるだけでも最初はいい気がする
  • 最初にやるべきなのは論理と集合
    • やりはじめてだいぶ経ってから気づいたが、この2つは数学における公用語となっている
    • 公理や定理がこの2つを使って記述されているので、論理と集合の基本的な記号の意味がわからないと、そもそも数学書が読めない(英語でいえばアルファベット
    • こういうの誰も教えてくれないが、これって常識なのだろうか。。
  • 推奨書籍(学び直し)
  • 推奨書籍(読み物)
  • 推奨書籍(離散数学全般)
  • 推奨書籍(個別テーマ)
  • 離散数学以外の大学数学については下記参照
tmknomtmknom

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

  • コンピュータサイエンス界の花形でありロックスター
    • コンピュータサイエンスのあらゆる先端分野でベースとなる
    • 計算理論もこの枠内に収まるらしい
  • テーマ
    • 計算量の解析:最悪時評価・平均時評価、Big O記法、時間量と空間量
    • アルゴリズム設計の手法:貪欲法、動的計画法、分割統治法、再帰的探索、発見的解法
    • 基本データ構造とアルゴリズム:数値処理、ソート、サーチ、二分探索木、グラフ
    • 形式言語、計算可能性、計算量の基礎
  • アルゴリズムの応用分野
    • 人工知能
    • データベース
    • 分散コンピューティング
    • グラフィックス
    • ネットワーキング
    • オペレーティングシステム
    • プログラミング言語
    • セキュリティ
  • 有名な教科書もいくつかあり、日本語訳も出ている
    • 競プロ対策本みたいなのもある
    • なぜかC++が多く、最近はPythonも増えてきた(Goは全然ない
  • 推奨書籍(アルゴリズム)
  • 推奨書籍(計算理論)
  • 推奨書籍(有名どころ/筆者未読)
tmknomtmknom

Systems Fundamentals(SF):システム基礎

  • コンピュータサイエンスの各分野に共通して現れる基本概念
    • もともとバラバラに教えられていたが、複数の分野で活用できる統一した説明を与える
    • 原理の共通性の理解が目的
    • コンピュータサイエンス業界の横断的関心事といえる
  • テーマ
    • 計算パラダイム:論理式、逐次処理、並列処理、パイプライン、スケーリング
    • レイヤ間通信:プログラムの抽象化、インタフェース、ライブラリ、OSとアプリケーション
    • 状態と状態機械:連続と離散、クロック、組合せ回路、順序回路、ネットワークプロトコル
    • 並列処理:逐次処理と並行処理、要求並行性とタスク並行性、スレッド、クライアントサーバ
    • 性能評価:ベンチマーク、データ収集と評価、アムダールの法則
    • リソース割当てとスケジューリング:リソースの種類、スケジューリングの種類、プリエンプティブスケジューリング
    • 近接と性能向上:光の速度、遅延、キャッシュ、メモリ階層
    • 仮想化と分離:保護と性能、間接化のレベル、仮想記憶、仮想マシン
    • 冗長化による信頼性向上:バグと欠陥、検査と再試行、冗長コーディング、複製
  • 意外とこのトピック単体で学ぶのは難しい
    • 統一的に学べる書籍はあまり思い浮かばない
    • パタヘネあたりのコンピュータアーキテクチャ本が比較的網羅性が高いかもしれない
    • 基本といえば基本だが、意外と知識が虫食い状態の人は多そう
  • 推奨書籍
    • なし:ピンポイントで学ぶのは諦めて、他の知識体系の中でしっかり学ぶ
tmknomtmknom

Programming Languages(PL):プログラミング言語

  • オブジェクト指向言語と関数型言語を重視
    • プログラミングの入門ではなく、言語のパラダイムを学ぶ
    • 職業プログラマだとオブジェクト指向言語が多いと思うので、関数型をやるのが手っ取り早い気がする
  • テーマ
    • オブジェクト指向プログラミング:オブジェクト指向設計、クラス、情報隠蔽、コレクション
    • 関数型プログラミング:副作用のないプログラム、構造を持つデータ、関数閉包、高階関数
    • 型システムの基本:型、型安全性と型エラー、静的な型と動的な型の比較
    • イベント駆動プログラミングとリアクティブプログラミング:イベント、ハンドラ、MVC
    • プログラムの表現:コンパイラ、抽象構文木
    • 言語翻訳と実行:インタプリタ、言語処理系内部のフェーズ、実行時表現、メモリレイアウト
  • 推奨書籍(プログラミング)
  • 推奨書籍(言語処理系)
  • 推奨書籍(有名どころ/筆者未読)
tmknomtmknom

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

  • ソフトウェア開発ライフサイクルの構成要素を学ぶ
    • 大学よりも職場の方が学びやすい、数少ない領域
    • アカデミックな書籍は実践的な意味ではイマイチな場合が多い
  • テーマ
    • ソフトウェアプロセス
    • 要求工学
    • ソフトウェア設計
    • ソフトウェアの構築
    • ソフトウェアの検証と妥当性確認
    • ソフトウェアプロジェクトマネジメント
    • ツールと環境
    • ソフトウェア進化・発展
    • ソフトウェアの信頼性
  • 推奨書籍(全般)
tmknomtmknom

Social Issues and Professional Practice(SP):社会的視点と情報倫理

  • コンピュータサイエンスの文脈でこれに触れてる人ほとんどいないが非常に重要視されている
    • J17-CSでもかなり熱が入っている印象
  • テーマ
    • 社会におけるコンピュータ
    • 専門家としての倫理的責任
    • 知的財産権
    • プライバシーと市民的自由
    • 専門家としてのコミュニケーション能力
    • 持続可能性
  • 推奨書籍
    • はじめての技術者倫理:技術者向けの倫理についてわりとライトに解説していて読みやすい
    • 技術者の倫理 入門:いかにも教科書チックだが一つ一つが非常に丁寧に説明されている
    • 情報倫理:メディアリテラシーやSNS利用時のモラルなど、技術者以外も身につけるべき項目を網羅
tmknomtmknom

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

  • 並列分散といいつつ、分散は選択科目扱い
    • とはいえWebシステムでは分散処理も必須なのでフォローしたい
    • 並列と並行は異なる概念だが、Webアプリケーション開発では並行のほうが重要
    • 機械学習とかでGPUをぶん回す人は並列処理のほうが重要かも(よく知らない
  • テーマ
    • 並列性の基礎
    • 並列処理への分割
    • 通信と協調
    • 並列アーキテクチャ
    • 並列アルゴリズム、解析とプログラミング
    • 分散システム(選択科目)
  • 推奨書籍(並行処理)
  • 推奨書籍(分散処理)
tmknomtmknom

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

  • OSの概念的な理解が主要テーマ
    • スコープに入ってなさそうだが、Linuxについては別途フォローしたい
  • テーマ
    • オペレーティングシステムの概要
    • オペレーティングシステムの原理
    • 並行性
    • スケジューリングとディスパッチ
    • メモリ管理
    • セキュリティと保護
  • 一般的なソフトウェア開発者はシステムプログラミングから入るのもいいかもしれない
    • システムプログラミングをしようとするとOSの概念の理解が必要になるし
  • 推奨書籍(OS全般)
  • 推奨書籍(Unix/Linux)
  • 推奨書籍(システムプログラミング)
tmknomtmknom

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

  • ここでいうアーキテクチャはコンピュータアーキテクチャである
    • 電子回路にはじまり命令セットアーキテクチャまで
    • OSより下のレイヤを扱うイメージ
  • テーマ
    • ディジタル回路とディジタルシステム
    • 機械レベルでのデータの表現
    • アセンブリ言語レベルでのコンピュータの構成
    • メモリシステムの構成とアーキテクチャ
    • インタフェースと通信
  • 推奨書籍(コンピュータアーキテクチャ)
  • 推奨書籍(アセンブラとコンパイラ)
    • コンピュータシステムの理論と実装:NANDゲートにはじまりCPU、VM、コンパイラまで実装する最高の書/コンピュータサイエンスで一冊だけ選ぶならコレ
    • コンピュータシステム:コンパイラがどういうアセンブラを出力するかを豊富な練習問題で学べる/分厚くて気圧されるが、やりきれると相当自信になる
    • 低レベルプログラミング:上述のコンピュータシステムをもう少しライトにした感じ。
    • Binary Hacks:低レイヤのツールがいろいろ紹介されていて面白い
tmknomtmknom

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

  • HTTPだけでなく、上から下までまんべんなく学ぶ
    • アプリケーションレイヤについては意外と深堀りしないので別途フォローが必要(DNSとか)
  • テーマ
    • 導入
    • ネットワークアプリケーション
    • 信頼性のあるデータ配信
    • 経路制御と転送
    • ローカルエリアネットワーク
    • リソース割当てと通信品質
    • モビリティ管理
  • 推奨書籍(ネットワーク全般)
  • 推奨書籍(TCP/IP)
  • 推奨書籍(アプリケーション層)
tmknomtmknom

Human-Computer Interaction(HCI):ヒューマンコンピュータインタラクション

  • コンピュータサイエンスとは縁遠いイメージ
    • アカデミックな世界ではなく、実務者が書いたUXやUIの本はたくさん出ている
    • ただし多くの本は大学で研究されてる内容ではなく、著者のオレオレ知見が多いので留意
  • テーマ
    • 基礎
    • インタラクションの設計
  • 推奨書籍
tmknomtmknom

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

  • コンピュータサイエンスの中では珍しく直接的に役立つ
    • 無知がそのままリスクに直結する
    • 実務的には選択科目も含めて学んでおいたほうが無難
    • Webシステムでは選択科目も有益なものが多い
  • テーマ
    • セキュリティの基礎概念
    • 設計の原則
    • 防御プログラミング
    • 脅威と攻撃
    • ネットワークセキュリティ
    • 暗号化
    • Webセキュリティ(選択科目)
    • プラットフォームセキュリティ(選択科目)
    • セキュリティポリシーとガバナンス(選択科目)
    • デジタルフォレンジック(選択科目)
    • 安全なソフトウェア工学(選択科目)
  • 推奨書籍(セキュリティ全般)
  • 推奨書籍(個別テーマ)
tmknomtmknom

Information Management(IM):情報管理

  • いわゆるデータベースを扱う領域
    • ただしいきなり技術の話をするのではなく、情報とはなにかというメタな話からはじまる
    • RDBMSのSQL、トランザクション、物理設計などは選択科目扱い
  • テーマ
    • 情報管理の概念
    • データベースシステム
    • データモデル
  • 推奨書籍
tmknomtmknom

Intelligent Systems(IS):知的システム

  • 世は大AI時代である
    • AI=機械学習と思っている人もいそうだが、機械学習はAIの一分野にすぎない
    • この領域は数学の素養がないとほとんど専門書が読めない
    • 数学できない人はビジネス書で雰囲気を感じるぐらいしかできない(ツライ
  • テーマ
    • 基本問題
    • 基礎的探索戦略
    • 基礎的知識表現と推論
    • 基礎的機械学習
  • 推奨書籍
tmknomtmknom

その他の領域

  • Graphics and Visualization(GV):グラフィックスと視覚化
    • 基礎概念
  • Media Representation(MR):メディア表現
    • 情報のディジタル表現
    • 標本化、量子化、圧縮
  • Computational Science(CN):計算科学
    • モデリングとシミュレーションへの導入
  • Platform-Based Development(PBD):プラットフォームに依存した開発
    • 必須なし(すべて選択科目)