コンピュータ・サイエンス(CS)とは?
【AI要約】CSは理論の核、CSEは応用を広く含む。“何を通じて学ぶか”は大学と人で変わる。
👩💻 弟子: 「師匠、どうして大学にいってCSを勉強するんですか?」
🧑🏫 師匠: 「CSはコンピュータ・サイエンスのことだよね。理工系でコンピュータについて勉強するなら工学分野もまとめてComputer Science and Engineering (CSE)、直訳すると「コンピュータ理工」だね。」
👩💻 弟子: 「CSとCSEは別モノなんですか?」
🧑🏫 師匠: 「CSは数学みたいに人間が作ったコンピュータの理論を研究する分野で、コンピュータやデータベースの理論とか、アルゴリズムなんかが含まれている理学系の部分だね。学部の名前だと情報工学とかコンピュータ理工とか情報科学なんて呼ばれていて、CSEに分類されるところがほとんどかな。基本、どこでもCSは含まれていると考えていいよ。CS専門の学科だとしても応用的な要素が必ず含まれているはず。」
👩💻 弟子: 「CSだけを勉強するわけじゃないんですね」
🧑🏫 師匠: 「CSEでもCS分野を研究する学生はいるけど、CSEなら工学系の授業は多いよ。CS以外だと最近はデータサイエンス系学科が新設されているけれど、医療データの分析、とか、経営の最適化、とか応用分野と一緒になってアピールされているよね。」
👩💻 弟子: 「CSと一緒に何を勉強するか、ですか?」
🧑🏫 師匠: 「大学で何を学べるかちゃんと調べた方がいいよ。だいたいどこでもプログラミングとかOSの仕組みとか似たようなことは勉強するわけだけど、歴史的にその大学の得意分野があるし。だからCSを学ぶといっても、何を通してどう学ぶかは人によって違うよね。コンピュータは応用が広いから、CSでその基礎的な考え方を勉強するのは楽しいと思うよ。」
コンピュータ・サイエンス(CS)は一分野を指す言葉であると同時に、コンピュータ・エンジニアリング(CE)に関連する応用を含む場合もあり、厳密に分類することが難しい名称です。
CSを研究する場合でもその周辺分野や応用分野に関わることはあり、「CSを学ぶ」という表現が広範な意味合いを持つことになります。
Wikipediaでは Computer science (CS)、 Computer engineering (CE)、 Computer Science and Engineering (CSE) などの項目が立てられていますが、日本では進学時に「コンピュータについて学べる学問分野」としてひとまとめに認識はされても、それより細かな分類は意識されていない印象です。
専攻分野によっては違和感がある表現かもしれませんが、ここでは広くコンピュータについて勉強するといった意味合いで説明しています。
コンピュータが使えればCSは不要?
【AI要約】「使える」だけだと発想も限られる。仕組み理解は可能性の上限を引き上げる。
👩💻 弟子: 「なるほど。でもコンピュータはみんな使っていますよね? いまさら詳しくなる必要なんてありますか?」
🧑🏫 師匠: 「使えることと、仕組みを知っていることは別だよね? 仕組みを知ってた方が良くない?」
👩💻 弟子: 「仕組みを知らなくても使えているのなら、それは良いことなんじゃないですか?」
🧑🏫 師匠: 「そうきたか。いい時代だね。でもコンピュータを使うだけじゃ、いま使えるソフトウェアや機械の範囲のことしかできないよね。」
👩💻 弟子: 「それが問題なんですか?」
🧑🏫 師匠: 「なるほど。ちょっと整理してみようか。」
コンピュータに詳しくなるとは
👩💻 弟子: 「昔ならともかく、いまのコンピュータは何でもできますよね。」
🧑🏫 師匠: 「それは思いつく事が、いまのコンピュータで出来る事に制限されていることに気がついていないだけだよ。」
👩💻 弟子: 「?? 自分の考えが制限されているんですか?」
🧑🏫 師匠: 「コンピュータでなくても、家電でも、道具に慣れてくると、自然とその範囲で考えるようになるよね。」
👩💻 弟子: 「それが出来ることの全部じゃないんですか?特に大学で学ぶ必要があるとは思えないですけどね。」
🧑🏫 師匠: 「そこは曲げないね。例えば、自動車は免許があれば誰でも運転できるよね。」
👩💻 弟子: 「そうですね。最近は免許を取る友達も少ないですけどね。」
🧑🏫 師匠: 「自動車はあると便利だよ。さて、もし自動車の調子が悪くなったらどうする?」
👩💻 弟子: 「その車を買ったところや、専門店で診てもらいます。」
🧑🏫 師匠: 「免許を持って操作できるからといって、中身が分かっているわけじゃないよね。」
👩💻 弟子: 「それはそうですね。」
🧑🏫 師匠: 「詳しい人がいるから道具は便利に扱うことができるんだよ。それに、意味も分からず操作するのはストレスが溜るよね。理屈が分かっていればストレスも減るよ。」
👩💻 弟子: 「たしかにコンピュータを使うのが嫌だっていう人はいますね。」
🧑🏫 師匠: 「紙みたいにアナログの良さはあるけれど、面倒だからってコンピュータを避けるのはもったいないよね。道具としてコンピュータの性能を限界まで引き出したいとか、必要のために改造したいなら、CSの知識はあった方がいいよ。」
大学で何を学ぶのか
【AI要約】すぐ効く技より“長く効く基礎”。歴史と原理が応用力を生む。
👩💻 弟子: 「でも、それって大学に行かないと学べないんですか?」
🧑🏫 師匠: 「そんなことはないね。コンピュータの仕組みを知るだけなら、高校の情報科目でも十分な説明をしているよ。」
👩💻 弟子: 「高校の情報科目は専門用語が羅列されていて、暗記科目みたいでちょっと嫌でしたね。」
🧑🏫 師匠: 「暗記みたいに感じるのは、その技術の歴史的な背景や、必要性を説明してもらっていないからじゃないかな。」
👩💻 弟子: 「技術の歴史とかって必要ですか?」
🧑🏫 師匠: 「雑学かもしれないけれど、単純にコンピュータについて詳しくなったりするのは楽しくない?」
👩💻 弟子: 「ゲームの作り方とか教えてくれるんですか?」
🧑🏫 師匠: 「研究テーマがゲームっていう人はいるけど、授業でそういうPractical(実践的)なことは教えないかな。ゲームの作り方を教えてくれる専門学校にいけばUnityなんかのゲームエンジンを扱えるようにはなるんじゃないかな。」
👩💻 弟子: 「大学じゃ教えてくれないんですか?」
🧑🏫 師匠: 「大学で新しい問題に取り組むには、すぐに役立つ実践的な事よりも、基礎的な理論や思考力を鍛える方が良いんだよ。」
👩💻 弟子: 「??」
なんで具体的なことを教えてくれないの?
🧑🏫 師匠: 「いまある技術の使い方は専門学校が得意で、大学では授業で基礎的な考え方を学んで、研究だと、将来、役に立つかもしれない理論や技術が多いんじゃないかな。」
👩💻 弟子: 「いますぐに使える、必要ってわけじゃないんですね。」
🧑🏫 師匠: 「AI関係は関心が高いと思うけど、ただ便利な道具の使い方を教えることはないよね。」
👩💻 弟子: 「具体的なことは教えないと。」
🧑🏫 師匠: 「教えるけれど、優先順位は低くなるよね。余裕があればやった方がいいのは間違いない。」
大学の授業科目を眺めていると、数学やプログラミング、よく分からない科目名が並んでいて、これを全部勉強するのかと思うと疲れてしまいそうです。
大学にも依りますが、全部を勉強するというよりも基礎的な全員が学ぶべき科目から、専攻によって取るべき科目が変化していくのが普通です。
そういう話しはオープンキャンパスで、直接その大学の先生に質問するのが一番の近道です。
また、大学の授業では演習授業で具体的な内容を通して、学んだ理論の確認や技術の修得を目指します。
それでも授業の中心は抽象度の少し高い、仕組みや方法論などの説明になります。これは適用範囲の広さの違いによるものです。
大学ではより長く使えて応用が効く事柄について授業を通して修得する傾向が強いといえます。
どうして大学でCSを学ぶことと、仕事ができることは別なのか
【AI要約】学位は即戦力保証ではないが、“学び続ける力”の土台になる。
👩💻 弟子: 「でも、やっぱり大学でCSやCSEを学ばなくても就職できますよね。IT業界で活躍している人もいるって聞きますよ。」
🧑🏫 師匠: 「そうだね。出来る人はどんな道を進んでも活躍すると思うよ。そういう点では学位は関係ないよね。」
👩💻 弟子: 「さっきと違うこといってません?」
🧑🏫 師匠: 「学位だけあってもダメだけど、学位を取るために努力した経験は貴重だよね。活躍している人は自分で学べる人だから学位なんて関係ない。君はそういうタイプかな?」
👩💻 弟子: 「どちらかというと出来る人の後ろについて教えてもらっています。」
🧑🏫 師匠: 「それが普通だよね。僕もそんなタイプだったよ。」
👩💻 弟子: 「師匠にもそんな時代があったんですね。」
🧑🏫 師匠: 「でも、少しずつ自分なりに工夫することを続けていくと、すごく出来る人とは別に自分なりに出来るようにはなったよ。」
👩💻 弟子: 「その時にCSで学んだ事は役に立ちましたか?」
🧑🏫 師匠: 「正直、授業の内容がそのまま役に立ったことはないかな。手書きの地図に位置情報をGPS情報からマッピングするアプリを作った時には位置を近似するのに学んだ知識は役に立ったけど。」
👩💻 弟子: 「そんな機会は普通はないですよね。」
🧑🏫 師匠: 「大学は卒業した後も学び続けられる人材を育成することが最大のミッションなんじゃないかな。その点では卒業して良かったと思っているよ。」
👩💻 弟子: 「その点では別にCSじゃなくても良いんじゃないですか?」
🧑🏫 師匠: 「どんな山でも頂上まで到達すれば見える景色は一緒だよね。コンピュータを極める方法は1つじゃないよ。でも将来コンピュータに関わる仕事に就くのであれば早めに大学でCSを含むCSEについて学ぶ事は仕事にも直結するし、具体的で分かりやすいテーマだからオススメだよ。」
【解説】経験者が感じる違和感
大学で学ぶことはある分野について網羅的に学ぶことができるので、知識のムラができにくいことは利点の一つといえます。
しかし誤解を怖れずにいえば、大学で研究されている1つの学問分野が役に立つか、立たないか、ということを考えることには意味がありません。
その一方で、これを拡大して大学で学ぶことに意味はないというのも暴論だと思います。
研究活動そのものは狭い分野での専門性を高める性質上、役に立たせるために必要な調整といった要素との折り合いがうまくありません。
しかしそれらの活動を通して修得した知識や経験をどう活かすかは、学んだ者たち次第です。
例えば、心理学の1分野であるアドラー心理学を学んだカウンセラーがそのメソッドを全てのケースに適用することは、研究活動としては有益かもしれません。しかしカウンセラー自身の満足にはなっても、クライアントの利益になるとは限りません。ほとんどのケースではむしろ有害でしょう。
カール・ポパーは反証可能性から 「科学」 とそうでないものを区別しましたが、アドラー学派が全ての現象をアドラーのメソッドを使って説明したことからポパーはそれが科学的ではないと批判しています。
アドラー心理学は他人の行動原理を理解して他者を受容したり、自分の潜在的な行動原理を理解するには有益で、大学で研究する価値はありますし、特に若い人達には知って欲しいと思っています。
しかし、1つの理論で全てを説明するとか、そうに違いないと決めつけるカール・ポパーが批判した行為は、科学者として反省するべき態度です。
臨床家であれば様々なメソッドの適用可能性を検証した上で、対象の利益を最優先する総合的なアプローチを採用するはずです。
コンピュータ・サイエンスについても同様で、古典的なデータベース理論は学ぶ価値のある体系を持っていますが、その知識をRDBMS以外を受け入れないための理由として利用すれば、それは良い態度とはいえないでしょう。
理論的には劣るとしても、それが採用される背景がきちんと理解できるエンジニアでなければいけません。反対に安易に理解ができるからと既存の技術との十分な比較・検討なしに新しい技術を採用することは避けるべき態度です。
一方で仕事と直接関係のないプログラミング言語の作り方や、CPUをCADで設計してVerilogで動作させたり、オペレーティングシステムを改造したりするような経験は、大学のような時間的制約が緩い環境でないと得られないすばらしい体験だといえます。
大学に進学するとは、他では得られない体験を求めるということなのだと思います。
その点では大学生活に満足したとしても、大学での教育や経験そのものが役に立つかという問いには、「役に立つ」の定義があいまいであることから後からでも何とかなるんじゃないか、という答えになるのだと思います。
"Ironies of Automation" (自動化の皮肉)
これは1983年に出版された論文のタイトルで、高度な自動化によって人間の負担が軽くなると思われたものが、ひとたび問題が発生すると自動化以前よりも高度な知識・能力を要求される事態になることを指摘しています。
自動化以前であれば通常のフローとして対応できていたものが、自動化によって仕組みが複雑になったため、うまく動作しなくなるとその解決が難しくなる様を皮肉だと表現しているわけです。
現代のエンジニアはまさに、「より高度な知識・技術」が求められる未知の状況にどう対応できるか、が問われる状況にいます。
大学がすぐに使える知識・技術だけを教えないのは、まさにこのような状況に対応できる人材を輩出するためです。
最終的に頼りになるのは自分自身
問題を解決するという最も強いインセンティブを持つのは現場で最前線にいるエンジニアです。
そして、そんなフロントラインに立っている人達が高い能力を持っていることが重要なポイントになってきます。
一般的に「コンピュータ・サイエンスを学ぶ理由」は、次のように説明されます。
- コンピュータを構成する技術の本質を理解する
- コンピュータを効果的に利用することで、自身の問題解決能力を向上する
他にもリテラシーを高める、であるとか、思考の抽象化力を高める、といった説明もあるでしょう。
この中にある、コンピュータを効果的に利用できる や リテラシー の部分を操作に習熟するといった理解に留めている人もいるでしょう。
また、情報処理資格者試験がよく知られていることから、資格を取得するための勉強 といった印象を抱く人達もいるようです。
この操作の習熟や資格取得というのは、自動車でいう運転免許を取得するようなものです。
情報処理資格はもう少しレベルが高いですが、試験であるため対策をすれば合格する可能性は全ての人にあります。
情報処理技術者試験は実務経験があれば比較的楽に取得できますが、未経験者が座学のみで取得するには少しハードルが高いと思います。
資格の取得を目的とするよりも、自身の知識の整理、実力の証明などを目的にする方が有意義だと思います。
私がエンジニアの面接に立ち合う際には、資格を持っていた場合には関連する実務経験について質問をします。資格だけを持っている場合には、「それで何ができるんですか?」という質問が少し厳しく感じられるでしょう。
しかし、実際に求められるエンジニアとしてのレベルは、実際に求められる商品を開発できる能力だったり、障害発生時に対応できる能力となります。
自動車でいえば修理や改造できる能力を取得すると考えると違いが判りやすいでしょうか。
大学でコンピュータサイエンスを学ぶことと、このレベルの知識・技術を習得することの間には確かに差があります。
しかし、あるべきエンジニアの姿を目指すのであればコンピュータ・サイエンスに関する知識・能力を大学で修得する事には大いに意味があります。
【後日談】CSの学位を取っても、就職がうまくいかない?
【AI要約】企業は“理論×実践の接点”を見る。学びを可視化(作品・経験)しよう。
👩💻 弟子: 「最近はCSを勉強しても就職できないって聞きますよね。」
🧑🏫 師匠: 「人によって大学で何を学ぶかは違うし、企業が求める能力も様々だからね。」
👩💻 弟子: 「CSを学んだことは評価されないんですか?」
🧑🏫 師匠: 「たしかにCSの専門家でデータベースの内部構造に詳しくても、MySQL? PostgreSQL? 何それ?って感じだと、開発職としての就職は厳しいんじゃないかな。」
👩💻 弟子: 「ただ大学を卒業しただけでは就職は厳しいってことですか?」
🧑🏫 師匠: 「そういうもんじゃない?アメリカで就職が厳しいことは聞いてるけれど、そもそも新卒を採用するような文化じゃないし、新卒採用に依存しない点で産業構造が違うし。」
👩💻 弟子: 「日本は恵まれているんですね。」
🧑🏫 師匠: 「そこが日本の良いところだと思うよ。20年以上前から企業は新人を教育する余裕がなくなったと言われているけれど、基本は新卒採用が多いからね。」
👩💻 弟子: 「けっきょく、何をすればいいんですかね。」
🧑🏫 師匠: 「エラーについて調べてGoogleやChatGPTで簡単に解決できないことがあれば、後から同じ経験をした人のためにまとめてQiitaに投稿するとか、GitHubで公開されているアプリケーションを改造してPR送ってみるとか、形に残るポートフォリオは意識した方がいいよね。」
【後日談】正解を探すのは間違い?
【AI要約】科学は永遠の暫定解。反証可能性を知ることが、思考の自由を守る。
🧑🏫 師匠: 「進路は決まった?」
👩💻 弟子: 「師匠から話しかけるのは珍しいですね。どうするのが正解なんですかね。」
🧑🏫 師匠: 「正解を探すっていう思考パターンは受験勉強の弊害だね。世の中の課題に正解なんてないんだよ。」
👩💻 弟子: 「でも大学で研究して正解を探しているんじゃないんですか?」
🧑🏫 師匠: 「科学的な探求っていうのは、現状で人間がわかっていることの限界を広げているだけだね。どんな理論も将来否定されるかもしれないし、少なくとも微妙な修正は常に続いているし。」
👩💻 弟子: 「科学ってそんなに不確かなものなんですか?」
🧑🏫 師匠: 「科学は実験で再現できることも大切だけど、反証可能性っていう科学理論は否定できなきゃいけない、っていうのが大切な捉え方の一つだね。」
👩💻 弟子: 「再現できるだけでいいんじゃないですか?」
🧑🏫 師匠: 「そう思うよね。でもそれだけだと科学を装った詐欺にあうよ。少なくとも完全な理論なんてないっていう前提を心に刻んでおかないといけない。」
👩💻 弟子: 「大学に通う人が詐欺に合うんですか?」
🧑🏫 師匠: 「騙されて他人に危害を加えてしまうような人達は、高学歴な人達にもいるんだよ。能力も高いから利用しようとする人達もいるし。ある種の正しさを求めることや、容易に理解できることを求める事は危険なことだね。」
👩💻 弟子: 「そんなもんですかね。」
【後日談】レイヤー思考 vs レイヤー指向
👩💻 弟子: 「セキュリティって難しいですよね。ファイアウォールで全部防げないんですか?」
🧑🏫 師匠: 「セキュリティは何にでもあって、どこにでもあるからね。」
👩💻 弟子: 「それって、何にでもセキュリティを考えないといけないんですか?」
🧑🏫 師匠: 「レイヤーでシステムを考えないと理解できないかもね。レイヤー思考とでもいうのかな。」
👩💻 弟子: 「レイヤーってOSIの参照モデルをネットワークの講義で習いましたけど、レイヤーで考えるってどういうことですか?」
🧑🏫 師匠: 「OSI参照モデルはメインフレームのような大規模システムを写しとったような構造になっていて、TCP/IPでは4層であるとか、いろいろ批判はあるけど、情報セキュリティについて考えるには良い出発点だよ。システム全体の通信を考える時に、ハードウェアレベルのセキュリティ、OSレベルのセキュリティ、アプリケーションレベルのセキュリティ、という具合にレイヤーを通過する度にどんなセキュリティ上の対策が取れるか検討しないとだね。」
👩💻 弟子: 「その全部に対応しなきゃいけないって大変ですよね。」
🧑🏫 師匠: 「リスク管理について学ぶと、危険性を受け入れることも対応の一つだと教わるよ。リスクを受け入れて何もしないというのもアリだね。」
👩💻 弟子: 「それって良いんですか?」
🧑🏫 師匠: 「検討した上で何もしないなら問題ないよ。問題になるのは検討すらしなかったとか、思いもつかなかったという場合だね。」
👩💻 弟子: 「大人は法律を知らなかったといって罪を逃れることはできないですもんね。」
🧑🏫 師匠: 「そんな感じかな。いまあるシステムを理解する時にはレイヤー思考で、新しいシステムを検討する時にはレイヤー指向でコンポーネント毎に分けて設計するんだよ。プログラミングを学んだばかりだと特定のOSじゃないと動かないとか全部の機能を密結合で組み上げがちだけど、設計上よく分離された疎結合なシステムは保守も楽だし、セキュリティも確保しやすいよ。」
👩💻 弟子: 「でも1つのシステムで全部の面倒をみてくれるなら楽でいいんですけどね。」
🧑🏫 師匠: 「まぁ銀の弾丸はないからね。」