わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

プログラムの読み方

前回の授業のアンケートで,自由記述欄に,興味深い回答が2つ,ありました.
一つは,「資料のプログラムの説明を,丁寧にしてほしい」で,もう一つは,「プログラムの資料に,意味があるのか.読んで,授業では理解したつもりになっても,自分で同じプログラムは書けそうにない」です.
5回目の授業から,プログラムファイルを書いた資料を配布するようにしましたが,これの,授業での取り上げ方についての苦言を書いてくれたのだと解釈しました.
後者のコメントは,プログラムを書くのは,書く授業でやっているから,もっと文法の説明に時間をとってほしいという要望なのかもしれません.もしそういう意図だったなら,すまんが,今日の授業のアンケートに,その旨を書いておいてください.
さて,なぜソースファイルを資料として配布しているかについて,理由を説明したいと思います.
まず,配布するプログラムに限らず,僕の授業のWebページでリンクしているサンプルプログラムはすべて,僕自身が作ったものです.
今年度の授業のために作ったものもあれば,前年度の授業の引き継ぎもありますし,2年以上前に書いたもの,またこの科目と別の授業で作ったものからのコピーもあります.
ただし,授業で提示したり,みなさんに自習してもらったりするにあたり,授業の前に一つ一つ点検し,コードだけでは理解しにくいものには適宜,/* */によるコメントをつけてから,Web公開や,資料印刷をしています.
ファイルの一つ一つ,1行1行に心をこめています.単純ミスもすることがありますが,資料印刷後に気づけば,授業中に指摘し,書き直してもらいますし,授業の前後に限らず,Webのほうも修正します.
それでみなさんがそのプログラムをどのように読むかですが,次の3点を心がけてください.
まず,この資料は,受け取った時点でみなさんのものなので,鉛筆で書き加えていってください.僕が言うことの中で,重要そうだと思ったことや,それと別に,疑問に感じた行に,丸でも矢印でもいいので印をつけて,メモを残すのです*1.そこが,試験で問われるところ,試験に出れば適切な答えを書かないといけないところです.
資料は試験で参照できないルールですので,じゃあ授業中から,試験持ち込み可能なノートに書けばいいのかというと,学習には非効率です.授業中は資料に上書きしていき,あとで,ノートに転記することをお勧めします.
2番目の心がけですが,プログラム全体で何をしようとしているのか,そして,1行1行で何をしようとしているのかを把握し,日本語で説明できるようになってください.
って,プログラム全体で何をするのかというのは,ファイルの最初のところに,コメントとしてありますし*2,Webで見れば,ファイル名と並んで,書いています.
レポートや試験では,ほとんどコメントのないコードを提示しまして,これは何をするプログラムあるいは処理なのかを答えてもらいますので,資料を見ながら,今のうちからその訓練をしてください.
そして,プログラムの1行1行は,コメントのようにそれがなくても動作に支障のないものもあれば,そこがないとコンパイルエラーや論理エラーになるという,必要不可欠なコードもあります.なくしても一応動くけれど,ある場合と,挙動が違ってくる,ということもあります.
そういったことを踏まえて,それぞれの行が,あるいは文が,何をするものなのか,そしてもし余裕があれば,そこをなくすと何が起こるかとか,その行をなくして,代わりに別の処理を書いても同じ動作になるものはないかとかを考えてみてください.
プログラムを読むときの心がけの3番目はですね,そうやって,コードと処理の対応付けや,プログラムファイルと処理との対応付けを必死に試みてほしいのですが,十分に理解したら,いったんそれを忘れてください.そして,1週間後でも1か月後でも,あるいは試験前でも試験中でも,コードを見たら,何が書かれているかを,思い出せるように,知識を蓄え,頭の中で整理してください.
コードと処理の対応付けを機械的に覚えるというのは,ダメです.そういうのがたくさんあれば,って実際たくさんこの授業では提供するのですが,すぐに新しいコードと区別がつかなくなってしまいます.
忘れたら,思い出せない,他の似たのと区別できない,という学び方は,最悪です.
次の新しいことを理解する前に,今学ぶべきことを理解して,いったん忘れてみて,日数が経ってから改めて確認する,という学習習慣をつけてみてください.
「学びて時にこれを習う」,というのは,孔子の言葉として,中学校で教わりましたよね?
さてですが…プログラムを理解すること,その1行1行を理解することができるようになれば,数学の理解に使ってみてください.
数学関係の必修科目でですね,その定理は数式を使わなければどう表現できるのか,また定理や補題を証明するための式変形では,どんな公式や,すでに証明した定理を使用しているのかといったことを考えるのです.
プログラムが,数学の定理や系に相当し,公式や補題は,Cでいえば関数に相当しそうです.自作関数かもしれませんし,ライブラリ関数かもしれません.
応用の可能性は,まだあります.研究です.
研究室に入れば,論文を読み,卒業論文を書くことになりますが,そこで読んだり書いたりする論文も,集中するときは1行1行に心をこめて読み書きし,終えると,肉体的にも精神的にもへとへとになるでしょう.そして,いったん忘れていいのです.
それから後になって,あの論文が自分の卒論のキーペーパーになりそうだと分かれば,改めて読み直せばいいのですし,社会人になってからも,「卒業論文ではナニナニのことを書いたけど,あのときは人生の中で一番勉強したなあ」くらいに思い出してくれればいいのです.

*1:話は研究室に飛びますが,ゼミで資料をもとに発表してもらったら,疑問のところに線を引いて,短評や質問文を書いています.誰かがそれを指摘したら,左上に黒丸をつけて,誰も質問していないところと区別し,自分の番に質問・コメントするようにしています.

*2:最近の授業の配布資料は,ファイルの先頭のコメントは,ファイル名のみにしています.