なんやかんやあり、伸ばしたいスキルを整理したり自分のスキルセットの棚卸しをしたりしていた。また、最近は有給消化期間で暇なのでふだんの業務から離れた領域の学習をしてみたいと思い、基礎分野であるデータ構造やアルゴリズムやコンピュータアーキテクチャについて学んだりしている。
そんな中、漠然と「ソフトウェアにもっと詳しくなりたい」「基礎を学びたい」と思いつつもそもそも基礎ってなんだっけ?という問いがあり、色々調べていたら"情報専門学科におけるカリキュラム標準"という便利そうなものを見つけた。自分で場当たり的に学習計画を立てるよりは既存の体系立てられたカリキュラムを参考にするほうが良いだろう、ということで"掘-ディグ-"ってみた。
この記事をエントリポイントに、カリキュラム標準J17 https://t.co/In8Y31P3u4 に辿り着いた / 他4件のコメント https://t.co/FsQU5OaPNs “業務知識と計算機科学の知識 - 発声練習” (16 users) https://t.co/QeRFxzfnSG
— ohbarye (@ohbarye) 2020年5月24日
情報専門学科におけるカリキュラム標準とは
日本には情報処理教育委員会という組織があって情報専門教育に関するあれこれをやっており、その活動の一つにカリキュラム標準の策定があるとのこと。
カリキュラム標準J07
カリキュラム標準J07-情報処理学会からそのまま引用する。
世界標準である米国IEEE/ACMのCC2001-CC2005を土台として、日本の情報専門教育の状況に対応した見直しを行い、コンピュータ科学(J07-CS) 情報システム(J07-IS) ソフトウェアエンジニアリング(J07-SE) コンピュータエンジニアリング(J07-CE) インフォメーションテクノロジ(J07-IT) の5つの領域と、広く情報について学ぶ内容を定めた一般情報処理教育GEについてまとめたカリキュラム標準です。幅広い情報教育分野のなかで、各知識領域について体系的に学んでいくべき 指針となるカリキュラム構成や最低限習得させるべき項目をコアと指定 しています。
計算機科学、と漠然と捉えていたものはJ07以降の教育カリキュラムでは5領域にわたるらしい。
また、ボリュームを変えずに5分割というイメージかと思いきや、総体のボリュームは増えていそう。その背景には「もともとの計算機科学のカリキュラムが数学など基礎分野に寄りすぎている」という指摘があったようだ。大学なので基礎を教えるのは当然な気もするが…。*1
とにかく、従来は計算機科学1領域がカリキュラムの対象だったが、社会の変化と計算機の爆発的な普及により、ACMとIEEEが定めた大学カリキュラム案CC2005では5つの領域になった。
この図はCC2205 Overviewを元にJ07用に改変したもので、各領域の分担範囲がわかる便利図(以下、分担範囲図と呼称する)だ。各領域の具体的な内容については後で見ていく。
カリキュラム標準J17
カリキュラム標準J17-情報処理学会からそのまま引用する。
J07の策定から10年が経過し、技術の内容が大きく変化したこともあり、今回全面的な見直しを行い、J17として公表することとした.
J17は、従来からの6カリキュラム標準に加えて、世の動きに合わせて情報セキュリティ、データサイエンスという発展中の対象領域についても、別立てに側面別カリキュラム標準をおく方針を立てている.ただし、現時点では、サイバーセキュリティに対する側面別カリキュラム標準J17-CyberSecurityの素案だけを提示する段階にある.
要はJ07はアップデートされ、現在ではJ17が運用されているということだった。
CyberSecuriry領域はまだ素案のみ、追加されたGEは基礎教養的な内容で既存の領域を薄くカバーするものなので本記事で掘り下げるのは元々の5領域のみとする。
各領域の担当
情報処理教育委員会に便利な説明があるので引用しながら見ていく。
CS (Computer Science)
CS は,情報の表現・蓄積・伝達・変換に関するアルゴリズム的プロセスを,理論・分析・設計・実現・評価の各面にわたって系統的に扱う領域である。この領域の根底にある問題意識は,「何が効率よく自動化できるか」である。
http://www.ipsj.or.jp/12kyoiku/acre/CS.html より
一般的に…かどうかは知らないが自分がイメージするコンピュータサイエンスはまさにこんな感じの領域だ。分担範囲図でもわかるように基礎領域であり、この分野の応用範囲は非常に多岐にわたる。
以下のトピックを扱い、掘り下げていく領域。
- アルゴリズムとデータ構造
- オペレーティングシステム
- 計算理論
- コンピュータシステムの構成とアーキテクチャ
- 情報ネットワーク
- 数値計算・記号計算
- ソフトウェア方法論・ソフトウェア工学
- 知的システム
- データベース・情報検索
- ヒューマンコンピュータインタラクション
- プログラミング言語
IS (Information System)
IS は,社会や組織の問題点を見つけ出し,組織の変革を行い,費用対便益の高い情報システムの開発・導入を創造的・効果的に実現するために必要となる,理論・技術・技量を幅広く扱う領域である。この領域の根底にある問題意識は,「いかにして最大の費用対便益をもたらすか」である。
http://www.ipsj.or.jp/12kyoiku/acre/IS.html より
突然"社会"とか"組織"とか出てきて応用感が強い。
学習領域もわリと応用感強いのだが、CSやSE領域の学習の土台の上で以下をやっていくらしい。
- データ管理
- 分析と設計
- 組織における情報システムの役割
- 情報システムを囲む環境
- 多様な情報システムの事例理解
- 情報システム開発の実践に必要な問題形成・モデリング・プロジェクト管理についての十分な量の実習
- 立場や国を超えてのコミュニケーション能力・プレゼンテーション能力を得させるための十分な量と深さをもった学習
SE (Software Engineering)
SE は,CS およびソフトウェア工学 を基にし,「体系化された方法論および計量技法を用いて,ソフトウェアシステムを開発,運用および保守すること」を目的とする領域である。
http://www.ipsj.or.jp/12kyoiku/acre/SE.html より
クライアントワーク・受託開発における開発サイクル全般をカバーするような内容だ。産業界からの要請にめちゃめちゃ応えている感があるが、これもCSの基礎や数学の土台の上で学ぶもののようだ。
- ソフトウェア技術者としての社会的責任の遂行と実践に必要となる,情報倫理・社会・法律・経済・安全に関する事項の学習
- ソフトウェアシステムに関わる,要求分析,設計,検証・正当性確認,実現および保守に関する基礎的技術の学習
- ソフトウェアシステム開発の実践に必要な,プロジェクト管理・プロダクト構成管理・プロセス管理・リスク管理・品質計量尺度に関する基礎的技術の学習
- ソフトウェア開発プロジェクトに参加するために必要な,つぎの視点からのコミュニケーション能力養成
- 提案作成,プレゼンテーション,聞き取りと分析
- 計画,折衝,協調,技術・経済の両面からの意思決定,統括
シラバス的なものを読むとOOP、形式手法、アーキテクチャ設計、テスティング、CI/CDとかに触れていたりもする。
CE (Computer Engineering)
CE は,情報のプロセスを応用各面にわたって系統的に扱い,ハードウェアでの実現を目指す領域である. http://www.ipsj.or.jp/12kyoiku/acre/CE.html より
分担範囲図の中で唯一最下部をカバーするのがCE。基盤技術、システムプログラムに関する項目が並ぶ。
- コンピュータシステム(論理設計,集積回路,コンピュータアーキテクチャ,電子回路,ディジタル回路,など)
- 情報通信(信号処理,符号理論,情報ネットワーク,ディジタル通信,など)
- コンピュータ応用(画像処理,音声処理,マルチメディア処理,データベース,人工知能,など)
かなり応用ぽい内容も含まれているじゃん、とは思った。
IT (Information Technology)
ITは,情報システムから,アプリケーション技術,そしてシステム基盤に至るまでの広い範囲にわたって,組織や個人の情報技術に関する広範なニーズに答えることを目指す領域である.
https://www.ipa.go.jp/files/000024071.pdf より
これはめちゃめちゃ広い…。
具体的な要素のプロット
さて、5領域のイメージがわかったところで、各5領域のBOK*2やシラバスから具体的なトピックを抜粋し、分担範囲図にプロットしてみた。そうすることでより具体的なスキルマップとしての価値が生まれると考えたからだ。
結論から言うと、難しすぎて頓挫した。情報科学全般で扱う項目の数が多すぎる*3のですべてを抜き出すことはできず、また、複数領域にまたがる項目が多すぎて図上に正確にプロットできない。
いちおうできたのはこんな感じ。
要素が隣接していることや重なっていることや要素の大きさなどに全く意味はないので注意。
観察
当然ながら特定の技術要素や製品の名前などは浮かんでこない*4。大学で扱う基礎分野なので基礎分野なので数年〜十数年は廃れない内容が並んでいるはず。雑多ではあるがこの概観から「自分に足りないもの」を見つけてやっていけるかも。項目間の関係性のグラフこそが本当に欲しかったもののような気がしてきた。
CS領域≒情報科学という誤った認識を抱いていたため、扱う範囲の広さに面食らった。実際には各要素の背景や周辺には数学であったり電子工学であったり組織論であったりが存在するので、全てを修めるのは数年かけても難しそうだとわかってきた。
コミュニケーション・リーダーシップ・ネゴシエーションなどといったソフトスキルも情報科学の一分野(IS, IT, SE)に含まれていることもまた意外だった。コラボレーションや開発の手法も確かに大きくは変わらない…か。
区分けを見るとわかるようにScienceとEngineeringは密接に関わってはいるものの問題意識が異なるということが再確認できた。
自分と照らし合わせて
2020年5月現在の自分の経験・専門領域を重ねてみた。右上から中心にかけての黄色部分がそれ。
調べながら「そうだろうな」とは思っていたのだけど、やはり過去7,8年の経験とそこで得た知識の大半はIT, IS, SEあたりとわかってきた。まぁITは広すぎるので上の表現でカバーしている範囲はちょっと盛り過ぎている気がするが…。
最近は学べば学ぶほど「ワイ、何も知らんな…」という気持ちになっていたのだが、業務や趣味の開発を通じて(それとは知らずとも)基礎領域の一部には足を突っ込んでいるとわかりちょっと安堵した面もある。
基礎分野を学習すればするほど「オレはいったい今まで何を…」という気持ちになる pic.twitter.com/AHAt7lYMhi
— ohbarye (@ohbarye) 2020年5月11日
現在学んでいるデータ構造やアルゴリズムやコンピュータアーキテクチャ、そしてその周辺やさらに背景にある領域が、5領域全てに登場する基礎分野であると改めて再確認できたので引き続きやっていく気持ち、というか避けられない気持ちになった。
T字とかΠ型とかH型とかトライアングル型とかの分類から外れたこういうスキル棚卸しと分析もたまには良いかもしれない…と思ったけど棚卸しにはなってないな、これ。
*1:http://next49.hatenadiary.jp/entry/20080618/p1 に詳しい
*2:Body of Knowledgeのこと。PMBOKとか https://ja.wikipedia.org/wiki/%E7%9F%A5%E8%AD%98%E4%BD%93%E7%B3%BB
*3:とりわけIT領域は本当に広すぎる…これだけで全部カバーしているのではと思うほど。 http://www.acm.org/binaries/content/assets/education/it2017.pdf
*4:そういうのが見たい人はDeveloper Roadmapへ