プログラミングをどのような観点に着目して学生に学んでほしいとお考えですか?またそれを落とし込むためのどのような教育を実施していますか?
何かしらのソフトウェアを制作する際、それが何をするものなのか、一番外側の部分をしっかりと把握して全体をとらえること、それを構造的に分解して個々のパーツをきちんと組み上げること、そして最後にきちんとテストをして正しく動くことを確認するという流れをしっかりと学んで欲しいです。
そのために、お茶の水女子大学 理学部 情報科学科では C を中心にしつつ Java や関数型言語 OCaml などいろいろな言語を使って講義をしています。 C では、ポインタ操作やメモリ構造を意識したプログラミングなど低レベルの記述を求められますが、情報科学科を卒業したからにはそういったことも扱える人になって欲しいです。
一方で、より抽象度の高い言語を使うことで、細部にとらわれずに高度なプログラミングをできるようになっていきます。それを通して全体から細部までプログラミングの流れを伝えられると考えています。
講義では C や Java 、 OCaml など、具体的なプログラミング言語を使いますが、これは特定のプログラミング言語に習熟して欲しいということではなく、むしろその奥に潜む考え方を学んで欲しいということです。いろいろなプログラミング言語を経験することで、将来、どのような言語でプログラミングをすることになっても対応できるように教えています。
プログラミングを学ぶ際に大事な「関数定義に関するデザインレシピ」
プログラミングの際に重要となる考え方として「デザインレシピ」という枠組みを強く意識して教えています。デザインレシピは、マティアス・フェライゼンという研究者が彼の著書『HOW TO DESIGN PROGRAMS』で提唱しているプログラミング方法論ですが、彼の国際会議での特別講演を聞いて感銘を受け、即座に教育に取り入れました。私の著書『プログラミングの基礎』の中でもその考え方を詳しく説明しています。
図:左が『HOW TO DESIGN PROGRAMS』、右が浅井先生の著書『プログラミングの基礎』
デザインレシピの考え方の概略は以下のようにまとめられます。
- 目的:作成するプログラムが何をするのかを考える。何を受け取り何を返すのかを特定し、それをもとにプログラムのヘッダを作成する。
- 例:プログラムの動きをより明確かつ具体的にするため、望まれる入力と出力の例を作成する。そして、それを実行可能なテストプログラムに変更する。
- 本体:プログラムの本体を作成する。目的のところではプログラムが「何を」するのかを考えたが、ここでは「どうやって」実現するかを考える。
- テスト:確かに望む動作をしているか、上で作ったテストプログラムを使って確認する。望む動作をしていなかったら原因をこのデザインレシピに沿って考え、誤りを正す。
重要なのは、いきなりプログラムを書き始めてはいけないということです。その前に踏むべきステップがあり、プログラムを書いた後にもすることがあるということです。デザインレシピはとても大雑把な指針ですが、プログラミング時には絶大な効果があります。
学生に目指してほしいところと、学ぶ際のきっかけになる『REALM OF RACKET』
プログラミングを通じて社会を変えたい、企業の中で中核となる人物になりたいと考えている人は是非、大学院の修士課程までは最低でも進んでいってほしいですね。情報科学自体、社会から見れば非常に需要がある分野のため、就職状況は良いことが多いです。そのため、学部4年生で就職する学生もいますが、いざプログラミングを通じて企業の中核となって活躍しようとすると、最初の数年は良いのですが、5年、10年たった時にその中でコアになってやっていけるかというと、技術力が足りず難しい場合が実は多いんです。
2年間でいいので、自分で頑張って研究して、先の見えない問題、答えのない問題に対して取り組む経験をして欲しい。それがきっと社会に出る上で大きく役に立つはずです。
プログラミングを学びたいという学生向けに一つ面白い本をご紹介します。『REALM OF RACKET』という本で、英語の本になるのですが、LISP系のプログラミング言語Racketの入門書で、最終的には簡単なゲームを作るところまで行くことができます。ゲームを作るとなると、通常はグラフィックスを出す際、どうやってウィンドウを出すの?どうやって絵を描くの?どうやって動かすの?など考えなくてはならないことが山のようにあるのですが、そういったことをすべて取っ払って、本当に簡単にゲームを作ることができるようになっているんです。
この本では、グラフィクスライブラリの使い方を説明するのではなく、ゲームを作るというのはどういうことかという問いを突き詰めて考えていて、その答えがゲームの「ロジック」です。ロジックの部分をプログラミングすることで、自分でこういう風に状態を変化させたらそれにしたがってゲームはこういう風に進む、さらにこうしてあげたらこういう風に変化するというゲームプログラミングの最も面白い部分を体験することができます。それを通して情報科学的な考え方を身につけることができる本です。
英語の本ですが、アメリカの学生が学生の視点で書いた本なので、一読してみると面白いと思いますよ。