情報機械研究所

コンピューターの、スゴイところとオモシロイところ。

コンピュータサイエンスって何だろう

両手の上に、データを象徴する青い複数の小さな立方体が浮かんでいる写真

北米など海外では数十年の歴史がありながら、日本ではあまり聞かない学問分野であるコンピュータサイエンス。「コンピュータに関する学問」ではなく、「森羅万象を、情報の動きとして表現することで、自然法則を発見したり便利なモノを創り出す」ことを目的とした学問分野です。

「プログラミング教育」への関心が高まっている日本。社会におけるコンピュータ活用の重要性が増していることを反映した動きと言えますが、コンピュータ活用全般を扱う学問分野である「コンピュータサイエンス」への関心は高くないようです。プログラミングは、コンピュータを動かすための手段であって、コンピュータサイエンスを構成するスキルの一つ。例えていうならば、「自動車の重要性が高まっているので、自動車を作る工具の使い方の教育を始めようとしているが、そもそも自動車を動かすのに利用している自然法則や、内燃機関などの自動車の構成要素についての教育については論じない」というようにわたしには見えています。

コンピュータサイエンスの楽しさを知ってもらおう!」が目的のこのブログ。まずは一般にはあまり知られていないコンピュータサイエンスが何なのか、を今回は解説してみようと思います。

関連記事:

コンピュータサイエンス」の誕生は1962年

米国で最初のコンピュータサイエンス学科が出来たのはPurdue大学で、それは1962年のことでした。それ以降、「コンピュータサイエンス」は主に米国やカナダなどの北アメリカの大学でよく使われる言葉となりました。同じ分野を、欧州では「インフォマティクス(infomatics)」と呼ぶことが多いようです。

関連情報:

コンピュータサイエンスは「サイエンス」か?

「サイエンス」と言えば科学、なので「コンピュータサイエンス」は理学系の分野かといえばそうとも言えません。理学というのは自然法則を発見することを主目的にしています。確かに、コンピュータサイエンスは情報に関する自然法則を解き明かしている面もありますが、それだけではありません。便利なものを創り出す、という工学の側面もありますし、実験ではなく論理によって法則を導き出す数学の面も持っています。実はコンピュータサイエンスはこのように、理学・工学・数学の3つの大分野にまたがる学問領域であって、たんなる「サイエンス」とも言えない広がりを持っているのです。

コンピュータサイエンスが解決する課題

コンピュータサイエンスは、その名に反して「コンピュータを学ぶ分野」ではありません。

そもそもコンピュータとは何でしょうか?それは、「情報を動かし、情報によって動く」という特徴を持った機械、つまり「情報機械」です。そしてコンピュータが社会やわたしたちの日常生活の隅々にまで普及し、いまやコンピュータ無しの企業やコンピュータを一切使わない学術研究はあり得ないという状況です。

  • 新型の飛行機や自動車を実際に作る前に、コンピュータでシミュレーションを行ってその設計の妥当性を確かめる
  • インターネット上での安全な通信を実現する
  • SNSで、遠く離れた友人・知人と近況を共有する
  • チェスや囲碁、将棋で人間に勝るプログラムを開発する
  • ICカードをタッチするだけで、適正な運賃を払ってバスや電車を利用できる
  • センサーや無線通信を組み合わせて、動物の生態を調査する(関連ブログ記事はこちら
  • 遠く離れたブラックホールの衝突で発生した重力波の痕跡を、膨大なデータの中から検知する

一見すると何の関連も無いようなこれらの活動ですが、共通しているのは「情報を動かし、情報によって動く」というコンピュータの特性を利用して実現されているということ。つまり、これらは全てコンピュータサイエンスの成果を用いて実現されているのです

このように、わたしたちの社会を大きく変えてきたコンピュータサイエンス。それは、

  • 社会や自然界の事象を「情報の動き」として表現し、その特徴を探る
  • 実現したい事象を、「実現すべき情報の動き」として表現し、それを実際に実現する仕組みを作る

という大きく2つの活動から構成されていると言えるでしょう。

そしてコンピュータサイエンスの研究者や実践者が頻繁に直面する共通的な課題も2つあります。それは

  1. 社会の大多数の人が使う大規模なサービス、膨大なデータを使う大規模なデータ処理、のような大規模システムをどのように実現するのか?
  2. 実現したい事象は、本当に「実現すべき情報の動き」として表現できるのか?どのように表現すれば、効率的な大規模システム構築に貢献できるか?

ということ。身近な例でいえば、GoogleFacebookTwitterも上記の2つの課題に対する独特な解決法を持っていますし、自動車エンジンの制御スマートフォン人工衛星淡水イルカの保護などにおいても、上記2つの課題への独特な解決法が実際に用いられているのです。

コンピュータサイエンスの中の専門分野には何がある?

このように、幅広い活動をカバーしているコンピュータサイエンス。その中には、確立された専門分野がいくつも存在しています。例えば以下です。

  • 科学技術計算(scientific computing):
    • 航空機の翼の流体力学的特性のシミュレーションや金融工学におけるリスク分析、天文物理学での観測データ解析など、膨大な計算を、どうやって迅速・正確・効率的に行うか?
  • 人工知能(artificial intelligence):
    • 経験や蓄積データから学習することのできるコンピュータシステムをどう作るか?
  • 計算言語学自然言語処理(computational linguistics and natural language processing):
    • 人間が日常的に使っている言語(自然言語)でコミュニケーションできるコンピュータシステムをどう作るか?
    • 自然言語で書かれたデータから情報を抽出するコンピュータシステムをどう作るか?
  • コンピュータグラフィクス(computer graphics):
    • コンピュータを使って画像を作るにはどうするか?
    • 単に絵を描くのではなく、コンピュータの中の世界に物体や光源、カメラを配置して画像を「撮影」するなど、シミュレーション的な要素を多分に含んでいます
  • コンピュータビジョン(computer vision):
    • 「見る」ことで周囲の環境を理解するコンピュータシステムをどう作るか?
  • コンピュータシステム(computer systems):
    • コンピュータシステムを構成するハードウェアとソフトウェアをどう作るか?
    • ネットワーク、データベース、オペレーティングシステムなどのソフトウェアと、プロセッサなどハードウェアがあります
  • ソフトウェア工学(software engineering):
    • 「人類が生み出した最も複雑な工芸品(artefact)」と言われるソフトウェア、それをどのように正確かつ効率的に作るか?
    • 最近のソフトウェアはプログラミング言語で数百万から数千万行という大規模なものが数多くあり、それをうまく作るのは至難の業です(関連記事はこちら
  • プログラミング言語(programming languages and methodology):
    • 人間の意図をコンピュータに伝えるためのプログラミング言語はどうあるべきか?
    • プログラミング言語で書かれた指示を、どのように0と1でできた機械語に変換するか?
    • 人間の意図を正確かつ効率的にプログラミングするにはどうすればよいか?
  • HCI(human-computer interaction):
    • 人間にとって、心地よく便利なコンピュータシステムは、どのようなものか?
  • ゲームデザイン(game design):
    • コンピュータグラフィクス、人工知能、HCI(後述)、経済学、心理学、クリエイティブデザインなどの要素を組み合わせて、人が楽しめるゲームをどのように作るか?
  • 離散数学アルゴリズム(discrete mathematics and algorithms):
  • 計算の理論(theory of computation):
    • どのような問題はコンピュータによって効率的に解決できるか?どのようなアルゴリズムがあるか?
    • どのような問題はコンピュータによって効率的に解決できないか?
  • ウェブとインターネット技術(Web and Internet technology):
    • 超大規模なウェブとインターネットをどう実現するか?
    • 検索、ソーシャルネットワークなどウェブとインターネットを活用したサービスをどう実現するか?

ちなみに、筆者の大学院時代の専門は「計算の理論(theory of computation)」でした。

コンピュータサイエンスの説明と専門分野のリストは、カナダ・トロント大学コンピュータサイエンス学科のシラバスを参考にしました。

 コンピュータサイエンスとの学際分野

コンピュータサイエンスは単独で存在するのではなく、社会の様々な領域で活用されています。特に頻繁に活用が起こる分野については、それが独立した学際分野として発展してきています。例えば以下です:

プログラミングとコンピュータサイエンス

冒頭でも述べた通り、プログラミング教育への関心が高まっています。プログラミングはまさに、「コンピュータを動かす情報」を作りだす活動で、コンピュータサイエンスの必須スキル、とても大事なスキルです。

プログラミング教育の重視は、米国など諸外国でもトレンド。日本がプログラミング教育を義務教育において必修化しようという動きも、とてもよいことだと思います。ただ異なるのは、米国はプログラミングではなく「コンピュータサイエンス教育」を推進していて、プログラミングはその入口という位置づけが明確であること。

日本も、プログラミングだけで終わってしまうのはもったいないです。プログラミングを通して「情報機械」たるコンピュータを身近に感じ、それを入口として、コンピュータサイエンスの楽しさを体感してくれる子どもが増えていけばなおよいと思います。そのためにも、日本において「コンピュータサイエンスの楽しさ」を伝える活動を、今後も続けていこうと思います。

参考情報:

 (この記事はかながわグローバルIT研究所Webサイトからの転載です。)