なぜ大学の志望で CS を安易に選ぶべきではないのか?
¶ はじめに
最近はちょうど大学入試の配属(分発)の時期で、多くの受験生が情報を集めながら、どの学科に進むかを決めています。学校と学科の選択は人生の大事です。転科に期待するのは夢物語です。最初から正しい決断をする必要があります。そこで私は、自分の観点を共有し、「なぜ受験生が流行に乗って CS(資工)を選ぶことをおすすめしないのか」を話したいと思います。後で悪夢を見ることにならないように。
まず私の背景です。私は台大の生機系(生物環境システム工学)を卒業し、大学時代に CS 学科で授業やプロジェクトも経験し、現在は交大資工の大学院に在籍しています。過去に 4 社でソフトウェアのインターン経験があり、今は国家高速網路中心で工読(アルバイト)をしています。OSS 開発経験も多く、普段は CS の技術記事を書き、公開講演もいくつか行いました。興味があれば「私がコンピュータサイエンスに興味を持つまで」を読んでみてください。CS への情熱をどう見つけたかを書いています。ここで述べる観点は、私が CS の産業と学界を理解した上でのものです。
¶ CS 学科は基本的に何を学ぶのか
まず台大 CS の必修を見てみましょう。

微積分や一般化学/物理/生物といった 1 年の理工系科目はどこも似たようなものなので、あまり気にしなくていいです。
1 年前期は基本的なプログラミングを教え、1 年後期はデータ構造とアルゴリズムを履修し、「効率よく」プログラムを書くことを学びます。
2 年では、私が比較的重要だと思う科目が 3 つあります。アルゴリズム設計、システムプログラミング、オペレーティングシステムです。残りの数学は必要に応じて使えるツールを学び、デジタルシステムは回路論理の基本設計を学びます。
アルゴリズム設計は 1 年後期のデータ構造とアルゴリズムの延長で、数学を使ってより詳細に、計算方法の違いが実行時間やメモリ使用量にどう影響するかを分析します。
普段書くソフトウェアはアプリケーションで、Web、アプリ、一般ソフトなどです。一方で システムプログラミングは OS 上でより低レイヤのプログラムを書く方法を教え、OS と直接やりとりする必要があります。たとえばアプリがネットワーク接続したいとき、普通は既存ライブラリを使いますが、その裏側ではシステムレベルのネットワーク接続、スレッド管理、通信管理などを処理しています。簡単に言えば、アプリは一般ユーザー向けで、システムプログラミングはプログラマ向けのプログラムを書くようなものです。
現在の主要 OS は Windows、macOS、Linux の 3 つです。OS がなければコンピュータはただの鉄くずに過ぎません。オペレーティングシステムはハードウェアと直接やりとりし、ユーザーに便利なインターフェースを提供します。CPU、メモリ、ディスク、ネットワークなどのハードウェアを統合した使いやすいインターフェースを作ることで、私たちは Windows を開くだけで、ハードウェアを意識せずとも整然と動作するコンピュータ上で様々なアプリを動かせます。OS の授業ではその背後の原理を学びます。
3 年で私が最重要だと思うのは 計算機構造(Computer Architecture) と 計算機ネットワークです。残りの オートマトンと形式言語は、簡単に言えば「計算の本質」を理解する、とても数学的な授業です。
計算機ネットワークは、なぜインターネットが動くのか、今日どこにでもあるネットワークがどんな仕組みで構築されているのかを紹介します。
計算機構造は CPU の背後の原理を扱います。なぜ Intel や AMD の CPU が動くのか、CPU に計算タスクを投げるとハードウェアがどんな流れで処理するのか、といったことです。CPU の原理を知ることは、プログラムを書く上でも役立ちます。道具を使うときに説明書を見るのと同じです。
「プログラミングができると需要があるから CS が良い」と思う人もいるでしょう。確かにそういう面はあります。ただその理由だけなら、必ずしも CS を専攻する必要はありません。上で見た通り、CS は Web サイトやアプリの作り方を教える学科ではありません。そういう期待で CS に来ても、絶対に学べません。しかも正直、教授はあまりアプリを書かないことが多いと思います。コンピュータの背後にある科学や工学原理に興味がないなら、CS はとても退屈でつまらなく感じるはずです。
実際、多くの学科には基礎プログラミングの授業がありますし、大学の計算機センターも、Web を作る、アプリを作る、数値計算をする、といった一般教養の授業を開講していることが多いです。アプリ開発を学びたいなら、オンライン講座やプログラミング塾の方がむしろ最短ルートかもしれません。
「CS を知らないと将来不利では?」と心配なら、CS の中でも特に重要な 3 科目を履修するのがおすすめです。私はそれを データ構造とアルゴリズム、OS、計算機組織にまとめています。この 3 つを学べば、コンピュータサイエンスの神秘を覗けるでしょう。より詳しい紹介は「軟體工程師必修的三門課」を参照してください。他学科でも履修・聴講できるので、別専攻を主軸にしつつ CS を補助スキルとして学ぶのでも十分です。
最後に、CS の必修は合計しても 50 数単位しかありません。私は正直少ないと思います。3 年後期には必修がなくなり、私の生機系は必修が 70 以上あり、4 年前期にも必修がありました。だから、自分で課外学習をしたり他分野を探索したりしないタイプの学生には、CS をおすすめしません。3 年後期以降に大量の自由時間ができ、それをゲームやダラダラに使ってしまうと危険だからです。
¶ CS には他に何があるのか
必修以外は選択科目です。学部の選択科目は大学院の授業とほぼ同じで、つまり CS 学科の選択科目と CS 大学院の選択科目は同じ授業群で、大学院生と一緒に履修します。ただ心配はいりません。私は、CS の大学院レベルの授業は理工の中でも最も簡単な部類だと思っています。プログラミングができれば、だいたい何とかなります。
CS の専門分野は非常に多いです。例を挙げると次の通りです。
- 高性能計算:コンピュータをとにかく速く計算させるために工夫します。CPU を増やしたり、GPU に計算させたりします。ただし装置が増えると管理が難しくなり、装置間の通信効率も下がります。
- OS・分散システム:システムをより効率良く、より速く動かすための研究です。多くのシステムを 1 つのシステムとして扱うのが分散システムです。
- プログラミング言語:言語の設計を研究します。たとえば Python と C++ の違いなどです。
- コンパイラ:コンパイルされたプログラムをより速く動かす研究です。たとえばソースコードを変えずに、1 分かかるプログラムを 10 秒にする、などです。またコンパイラ自体を速くする研究もありますが、コンパイル時間と生成コードの性能はトレードオフになりがちです。
- コンピュータビジョン:コンピュータに人間のような視覚を与えます。たとえばパノラマ写真の合成や、複数画像から 3D モデルを復元するなどです。
- 画像処理:写真をどう処理するか。たとえば PhotoShop が内部でどう画像を処理しているか、などです。
- ネットワーク:無線、ブロードバンド、IoT ネットワークなど、通信をより速くする研究です。
- 計算機構造、組込みシステム、SoC:ハードウェアをより速くする研究です。たとえば Google は深層学習サービスのために TPU を自作し、GPU より速く計算できるようにしています。
- 人工知能:機械学習と深層学習を含みます。概念は単純で、たとえば私たちが猫と犬を区別できるように、機械にも学習させます。色、形、大きさなどの情報を使い、数学モデルを設計して、コンピュータが猫と犬を判断できるようにします。
- 自然言語処理:コンピュータが人間の言語を理解したり生成したりするための研究です。以前は確率統計が中心で、たとえば「我喜歡」の後には高確率で「你」が続く、といった考え方です。最近は機械学習・深層学習を使うことが多いです。
- 情報セキュリティ:「脆弱性」という言葉をよく聞くと思います。ウイルス、トロイ、盗聴、スパイウェアなども含み、発見と防御がこの分野の課題です。
- HCI(人機インタラクション):コンピュータ、スマホ、スマートグラス、スマートウォッチなどはすべて「人機インターフェース」です。UX やユーザーデザインは大きな学問で、たとえば OK ボタンは右、キャンセルは赤、マウスがメニューから外れたときに数秒の猶予がある、などもインタラクションの一部です。
他にも 生医信息、データベースシステム、ビッグデータ、コンピュータアニメーション、ウェアラブル、クラウド計算など多くの分野がありますが、ここでは省略します。基本要件は「プログラミングができること」です。また、CS の必修はコンピュータサイエンスの基礎なので必ず身につける必要があります。これができないと、応用分野も決してできるようになりません。
¶ CS 学科の生活
CS 学科にいながら、学科の学生会に参加して遊び回り、サークルもやって、気楽に過ごしたという話を聞くことがあります。私は、それは万に 1 つの才能だと思います。普通の人がそこまで悠々自適に過ごすのは不可能です。
実際、CS には大量のコーディングが付きものです。「大学の間に 10 万行書いていないなら合格の CS 人ではない」という話もあります。10 万行とはどれくらいか?優秀なエンジニアが 1 日に書くコードは 100 行程度だと言われます。計算すると、大学 4 年間まじめにコードを書き続ければ到達できる数です。朝から晩まで、あるいは深夜から翌日の昼まで書き続けるのは珍しくありません。CS 学生で「プログラミングができない」ということはあり得ません。下手でもいいけれど、できないのはダメです。
私が観察している強い同級生は、学期中や夏休みに必ず業界インターンに行きます。先に実務経験を積むことは成長にも就職にも役立ちます。また研究もします。大学院に進みたい、あるいは特定分野の専門家になりたいなら、その分野の理解を深めるために研究は必要です。もちろんサークルや旅行にも行きますが、残りの大部分の時間は学習、仕事、研究に費やしています。
世界を探索するのが好きな人は別分野にも行ってみると良いでしょう。多くの分野は CS と協力します。たとえば生物医学と CS は生医情報という分野を生みますし、物理、化学、大気、経済なども科学計算にコンピュータが必要です。土木にもコンピュータ補助組があり、コンピュータサイエンスは道具としてあらゆる業界に適用できます。
¶ CS の将来の進路
CS 学生の給与相場は、「プログラミングができるか」と「専門分野の理解があるか」に非常に強い正の相関があります。優れたピアニストの演奏料が三流のピアニストより高いのと同じです。新卒の給与は月給 3〜4 万から年収 100〜200 万まで幅があります。
代表的な進路はソフトウェアエンジニア、ハードウェアエンジニア、ファームウェアエンジニア、データサイエンティスト、データエンジニア、Web デザイナ、システムエンジニアなどです。会社の需要によって職務内容は柔軟に変わります。たとえばソフトウェアエンジニアが自然言語処理や画像処理を理解する必要があることもありますし、データサイエンティストは機械学習だけでなく生物の背景知識が必要な場合もあります。
一般企業でアプリや Web を開発するなら、月給は 3〜6 万程度でしょう。これは大多数の CS 学生が卒業後に進む道です。その次に、聯發科、台積電、Microsoft などの良い会社でシステムプログラム、複雑なソフトウェア、ハードウェアアーキテクチャを開発すると、年収 100 万程度が狙えます。さらに強ければ国内トップ企業でコア開発者になり 150 万を交渉できることもあります。相当強ければ、卒業直後に 200 万という話も聞いたことがあります。ただし高給を得られる人は少数で、CS 学生全体の上位 10% だけが 100 万以上を狙えるのではないかと思います。
したがって、「CS は今流行っているから必ず高給が取れる」といった非現実的な幻想を持っているなら、それは間違いです。確かに AI ブームで情報産業は非常に熱く、求人も増えています。しかし多くの求人は技術的に難易度が低く、給与もそれほどではありません。また市場は Web、Android、iOS のエンジニア需要が大きいですが、多くは技術要求が低い職種です。Web で本当に強い人材が必要なのは、Google、Facebook、Twitter のような規模のサービスくらいでしょう。給与が良い職は通常、より高度な専門領域で、需要は少なく、要求能力に達するのも簡単ではありません。
つまり、CS を学べば人生勝ち組になれるわけではありません。結局は自分の努力で強い人材になる必要があり、そうして初めて良い進路が開けます。情報産業が人気だからという理由で CS を選ぼうとしている受験生は、もう一度考えた方がいいと思います。私は情報産業はバブル化するかもしれないとも考えています。人工知能は炒作された議題だと思っていて、台大でも多くの大学院が深層学習をやっているのは奇観です。今の段階でそこまで大量の人が深層学習を研究する必要があるとは思えず、将来はさらに必要なくなるかもしれません。
¶ 結論
本記事では CS 学科の必修内容や各分野で何を学ぶかを紹介し、大学生活の実態や将来の就職状況についても述べました。
CS を学ぶということは、基本的にはコンピュータサイエンスを学び、自分で大量にコードを書く練習をすることです。自分に問いかけてみてください。コンピュータがどう動くかに興味がありますか?なぜプログラムは速く走るのか?なぜブラウザは Web ページを描画できるのか?なぜ Google は数秒で数億件から答えを見つけられるのか?Alpha Go はどうやって囲碁を打つのか?チャットボットはどうやって質問を理解するのか?Pixar のアニメーションはどう計算されるのか?NASA はどうやってロケットを制御するのか?Apple はなぜ Intel を捨てて ARM に移行したのか?
面白い問いはまだまだあります。これらが CS の探求対象です。しかし、これらの問いにまったく興味がないなら、CS を学ぶべきではないかもしれません。もちろん、興味と職業を分けて、生活のために CS を選ぶのはありです。きっと悪くない生活はできます。ただ、職業が興味でもあるなら、もっと幸せに生きられるのではないでしょうか。あなたにはもっと良い選択肢があるかもしれません。