プログラミングいかに教えるか (2000/12/28)

 以下の文書は2000年2月12日に、埼玉大学教養学部の「社会系グループ」メーリングリストに流したメールです。この「社会系グループ」については1つ前の別項「統計をいかに教えるか」で説明しました。以下の文書はその「統計をいかに教えるか」に続き、プログラミングを授業で教えることの問題を議論したものです。
 この文書もそのままこのサイトに掲載するのをためらっていたのは、「統計をいかに教えるか」と同じです。
 メール中で出てくる人名はすべてアルファベットに置き換えました。むしろ誉めているので匿名にする必要はないと思いますが、当人の了解を得ていないことによる措置です。
 今年度の後期、すなわち現在、私はやはりプログラミングの授業をしています。が、はやりダメでした。授業は進まないし、教育効果もほとんどありません。授業を開設する必要はなかった。来年度はプログラミングの授業は、やるとしても義務範囲外の授業として行なうと思います。来年度は友人の事情で外部で非常勤を引き受けたので、たぶん開かないと思います。

---------------------------------------------------------------
Subject:プログラミングをどう教えるか?(高木)

Socio な皆様           高木英至

 「『現実的』カリキュラム」、「統計をどう教えるか?(高木)」に続き、このメールではプログラミングについて以下のことをお伝えします。
1.プログラミングを教えることが次第に困難になってきた。
2.困難になった理由は計算機環境の変化と、学生の質の変化だと思う。
3.プログラミングをどう教えるか? そもそも学生に教える必要があるか? について、皆さんのご意見を伺いたい。
4.私(高木)はディシプリンの中で情報的な要素を定着させることを考えている。


1.プログラミングを教えるのが困難になった

 外国の例を考えても、プログラミングは社会学、心理学などの研究法の授業の選択肢の1つであり続けています。私は学部時代に、ありきたりに FORTRAN を学び、その後統計プログラムを作る以外はプログラミングには触れて来ませんでした。大学院の頃にSPSSなどの統計パッケージが普及したので、programming-less で統計処理もできるようになりました。あらためてプログラミングに触れたのは埼玉大学に着任して後です。私にプログラミングを教える資格・適性があるかどうかは微妙ですが、専門のための application と割り切れば罪はなかろうと思います。私が授業でプログラミングを始めたキッカケは、学生にパソコンを実験用具として使わせるためでした。その後、用途は「実験用」から「シミュレーション」に移行しました(学生に実験をやらせることが無理になったことに伴います)。
 私にとり、「2単位のプログラミングの授業」の様式が固まったのは1990年前後です。ちなみに1990年度の夏学期の授業記録によれば、次のスケジュールで授業を実施しました。
------------------- 1990年度授業、夏学期 ----------------------
使用言語:Pascal
テキスト:小林牟史 『ターボパスカル Ver.5 トレーニングマニュアル』JICC 出版局
4月14日:ガイダンス
4月21日:パソコンの操作、基本的命令(OS→当時は MS-DOS)
      (1) 定数と変数の区別、(2) 変数の型
(連休)
5月12日:制御文(if ... then ... else.; while ... do .; repeat ... until.;
for ... do.)
実習事項:(1) グラフィックで線を引く。(2) 乱数を使う。(3) インクルード・ファイルを使う。
5月19、26日:手続き、関数、標準関数
  実習事項:2次元図形の平行移動、対称移動
6月2日:集合型の扱い、制御文 case 〜 of
  実習事項:簡単なアニメ
6月9、16日:配列、レコード型
  実習事項:再び、簡単なアニメ
6月23、30日:ファイルからの読み込み、ファイルへの書き出し
  実習事項:データの表示、平均値を求める
7月7、14日:統計処理初歩、最終課題提示
  実習事項:最大値・最小値、カテゴリー度数を求める
9月28日:最終課題提出期限
------------------------------------------------------------
 問題は、このようなことをして教育上の効果があったのか、という点です。総じて言えばさしたる効果はありませんでした。しかし一部にできる学生は出てきました。
 例えばその頃、経済学のO先生と一緒に「公共財」をテーマにして授業をやったことがあります。この授業の最終課題を「ある状況下でよりポイントを稼げる戦略を作れ」としました。集まった戦略間の対戦結果をシミュレートするプログラムを書くのにI君(社会システムコース)という学生を雇いました。学生が勝手に書いた手順をプログラミングするのは結構難しい作業です。が、I君はさして苦もなくこの作業を行えた。ちなみに、I君は相当できる学生で、日銀に就職しました。
 I君の作業をもとに、O君(社会システムコース)という学生が戦略を手直しし、シミュレーション結果を解析して卒論を書きました。私が指導した学生の中でシミュレーションで卒論を書いたのはO君だけです。ちなみにO君は現在は公認会計士になっています。
 その後、私は演習の折に Journal of Psesonality and Social Psychology (JPSP)という、社会心理学では最も権威のある雑誌にあった、コンピュータシミュレーションを使った論文を、T君(やはり社会システムコース)という学生に割り当てました。JPSP の論文を間違いなく報告するだけでも、今はここの院生でも無理です。が、その頃はそんなことが学部生でも平然と行えた。その論文を扱った授業中に私は、「T君ならこの論文のシミュレーションのプログラムを作れるんじゃない?」と言いました。しばらく時間をおいて、彼は実際にプログラムを Pascal で書いて持ってきました。
 あと、記憶に残るのはM君(現社コース)という学生です。M君は全般にできる学生でした。彼がいた頃に、上記のような授業以外に、特殊講義と称して「共同作業で長いプログラムを書く」という授業を試したことがあります。目標は大きなビルのエレヴェータのシミュレーション(待ち行列の一種)プログラムにしました。結局M君がほとんど作業したようでした。一応、もっともらしい Pascal のプログラムができました。
 今例に挙げた学生の前後(特に前)にもプログラミングについて記憶に残る学生はいます。が、ピークはその頃でした。今から思えばその頃が教養学部の全盛時代だったでしょう。
 が、現在、プログラミングで記憶に残るような学生はまったく見出せません。プログラミングの授業自体を行うことにも困難を覚えます。上記の授業スケジュールは、Windows 環境の導入以後は7段階に整理し直しました。1996 年頃はその7段階を2単位の授業でこなしたのだと思います。が、1997年度は5段階で終わり、1998、1999年度(今年)はなんと2段階目で授業が終了しています。要するに、授業を進めることができないのです。手続き(procedure)=サブルーチンも学習していないのですから、プログラミングをやったとは言えません。当然、できる学生は皆無です。


2.プログラミングの授業が困難になった理由

 私なりに考えると、プログラミングの授業をするのが困難になった理由は大別して2つあります。第1はコンピュータ周りの事情の変化、第2は学生の質の変化です。

 第1の「コンピュータ周りの事情の変化」とは以下を指します。
(1) プログラミング言語を扱う前提の知識が増えたこと
 私の世代の方は、私同様に、現在のようにスクリーンでプログラムを edit する以前の環境でプログラムを学んだと思います。当時は、1行に1枚のカードを使い、プログラムとはそのカードの束でした。コンピュータは大型/教育用の汎用機でした。FORTRAN なら FORTRAN で書いたカードの束を汎用機のカードリーダに読ませてプログラムをロードした。この環境は今から考えると恐ろしく不便です。が、一面では簡単だった。FORTRAN のカードの束の前後に数枚のコントロールカードをつけるだけで FORTRAN が使えた。だから使用者はOS環境について何も知る必要はなかった。
 が、今はそうではない。例えば Windows を使うなら Windows という環境について知っていないといけない。誰もが Windows に慣れていればよい。が、そういうものでもない。だからプログラミングと一緒に Windows について教えないといけない。
(2) 言語仕様が「進化」したこと
 私同様に古い人間は、昔の FORTRAN(FORTRAN 77 以前)はやたらと GOTO 文が多かったことを覚えておられると思います。計算時間の関係で、むしろ GOTO 文を使うことが推奨された。でも「構造化」の導入以後、GOTO は追放され、プログラムはある意味で一変した。その後、さらに「オブジェクト指向」が言語に標準的に導入された。これらの変化は何れも望ましい変化ではあるけれど、結果として学習すべきことは増えてしまった。ちなみに、私の今年の授業では、最初の3時間を『パソコンプログラミング入門以前』という本の講読に当てざるを得ませんでした。
(3) 良いテキストがなくなった
 私同様、最初に森口繁一の『JIS FORTRAN 入門』で勉強した人は多いと思います。この本は実に良いテキスト(というより問題集)でした。アメリカ流のテキストのパクリであったかも知れません。今はこういうテキストを見いだすことが難しくなりました。
 例えば私は、授業で Window 用の Object Pascal である Borland Delphi を使っています。Delphi は MS C や Visual Basic 同様、Windows 機能を使うためのパッケージが豊富についている。そのこと自体は大変結構。しかし市販の Delphi のテキストを調べると、豊富な Windows 機能の使い方にほとんどの頁を割いていて、Pascal 自体の文法は簡単に扱っているに過ぎない。Pascal だけのテキストも出ているけれど、逆に、特定の環境で特定の言語を使うのには向いていない。

 第2の「学生の質の変化」とは以下を指します。
(1) 論理的思考力の低下
 プログラミングは複数コマンドに一定の配列を与えて所期の効果へと総合する作業です。だからプログラミング能力は数学力とは異なり、むしろ複数単語に配列を与えて所期の意味を結果させる言語能力に近い。それでも、一定の論理的思考は必要です。私の印象では、現在の学生は複数のコマンドが何を結果するかを頭の中で推論することが、以前よりできなくなっています。
(2) マイコン少年の消滅
 1980年頃までは、パソコン(当時はマイコンと言った)はプログラミングをしなければただの箱でした。だから「マイコン少年」と呼ぶべき学生が一定数いました。が、今はパソコン自体が便利になり過ぎた。家電製品の一部になった。そこでマイコン少年は絶滅したような印象があります。
(3) 学部の雰囲気の変化
 今から考えると以前の教養学部には文化的多様性がありました。一方では文学原理主義もあったし、理科系の先生もおられた。社会科学系は政策系を中心に計量・数理に走り、現社のような軟弱社会科学もあった。現在は教官の人数も増え、表向きコースの数は増えたけれど、多様性は低下したと感じます。文学系はK先生を最後に原理主義者がおられなくなり、皆さん妙に物分かりが良くなった。社会科学はN先生を除いて総じて軟弱でまとまった。わずかに地理と社会システムの一部が理科系の伝統を保持しているくらいでしょうか?
 以前は社会システムコースで計量・数理系の授業が多かった点が大きかったと思います。社会システムコースの学生はエリート、と見られていました。人数は多くなくても、学生全体の中で彼らの存在は大きかった。私のカミさんのように、数学がまったくできない現社の学生でも、計量心理学なんて授業を無理してとったものでした。


3.で、どうする?

 私は3年ほど前からプログラミングの授業はもう止めようか、と思っています。にもかかわらず止めていないのは、判断する前に次年度の講義概要を書かなければならず、「面倒だから今年と同じ」で出してしまうためです。
 そもそもプログラミングの授業が必要か、という問題があります。
 私のコースはプログラマ養成を目的とする訳ではない。例えば統計をしたり簡単なデータベースを作る、というだけなら、プログラミングを知っている必要は今はありません。プログラミングを学ぶ必要があるのは、次のような作業を想定するからです。

(1) 非定型データの処理
 普通の調査データはデータが定型(回答者×質問数)です。この種の定型データはそのまま統計パッケージにかけられる。しかし作業によっては非定型データがある。例えば観察をしたとする。観察対象者が何時何分何秒から何秒までどのような行動をしたかを記録したとします。このような記録データは非定型です。この非定型データから一定の行動をカウントして定型データを作る、という作業を考えると、プログラムを新たに書く必要があります。(SASはある程度、非定型データが扱えます。)
(2)PCを実験装置にする
 PCを実験装置にすることは(社会)心理学では普通です。個人の反応時間をPCで記録したり、集団実験をネットワークで行ったり。そのプログラムをプログラミング言語で書く必要がある。
(3) シミュレーション
 上記の2つに比べ、より比重を増しているのがコンピュータシミュレーションです。本来の目的からすれば、学生がシミュレーションモデルを組めるようになることが理想だと思っています。

 ただ、以上のような作業を、例えば卒論で、行う学生は少なくなっている。そう考えると、プログラミングの授業を止めて別の授業をするのが効率的と考えるべき段階にあるのかも知れません。
 経済学であれば、シミュレーションの対応物を Mathematica でやるのが普通だと思います。Mathematica の利用を数学と一緒に教えることは検討すべきだと思います。(経済学の部署ではそういう授業を相当、既に取り入れているはず。)
 また、汎用言語(FORTRAN、C、Pascal 等)ではなくシミュレーション用の簡易言語(Stella、VisSim、ExTD 等)を使ってシミュレーションを教える方がよいのかも知れません。例えば物理現象のシミュレーションの場合、汎用言語でプログラムするのはやや面倒なので(例えば連続時間の事象を離散時間の事象として近似する補正を行う)、シミュレーション用の言語を使った方が良いかも知れない。ただ、私の印象では、シミュレーション用の言語は自然現象のシミュレーション用にチューンアップされていると感じます。

 今後の社会科学(教育)の大きな展開は計算実験(シミュレーション)の導入にある、と私は考えています。その意味で私は、プログラミングのような授業は必要だという認識は変えていません。が、現状は、上記のように、いくつもの困難があります。計算実験という方向をカリキュラムに反映させるとするなら、グループ単位で何らかの対応が必要だと感じています。皆様はどのようにお考えでしょうか?


4.ディシプリンにおける「情報」の定着

 ときおりN先生と次のようなことを話題にします。「マスコミと芸術系をくっつけて、プラスアルファで、1つのコアにできるんじゃない?」 私にも特に異論はありません。そのようなコアを大学院構想の「情報デザイン」としてまとめることも一案でしょう。
 が、私が考えている方向は、社会科学の中に計算実験を持ち込むことです。あくまでディシプリンの中でやる必要があります。だから「情報デザイン」というコンセプトには合いません。
 私が担当している院生のうち2人は、現在、コンピュータシミュレーションで修論を書くことになっています。うち1人は先日修論を出しました(たぶん落ちるでしょう)。彼らの作業を見ていて次のことを感じます。彼らに欠けているのは学問的アイディアであり、プログラミング技法ではありません。もう一度学問(ディシプリン)に戻ってアイディアを再構成させる必要を痛切に感じます。

メール