2016 年度 計算数学 II TA の記録 その 2

Updated:

前回の続きである。おそらくこれが、人生で最初で最後の、私が人に指導した経験だろうと思う。

前半: Ruby の基礎固め

具体的には、

  • 『たのしい Ruby』を読んで、プログラムを写経してもらう。(第 7 章「メソッド」あたりまで)
  • AtCoder の過去問を選んで、それを解いてもらう。

をした。

私が心がけたことは以下の 2 点である。

  1. 「するべき苦労」は、逃げずに受講生にさせる。
  2. 「しなくても良い苦労」は、 TA が解決する。

以下で説明する。

するべき苦労

1 学期も割いて Ruby 入門するのだから、自分の力でプログラムが書ききれるようになって欲しいと思った。具体的には、自分でバグを発見して修正できるようになってくれるとありがたいと思っていた。

さて、私は、今のところ Code Festival に毎年出ている。そこでトップクラスの学生のプログラミングの様子がエキシビションとして見られる。これを見てわかったことはいくつもあるが、今回の話に関係あるのは次の 2 つである。

  • トップクラスの学生でも、常にバグ無しで書くのは難しい。
  • しかしそのバグを修正するスピードは大変早い。

私は彼らに比べれば卑小な実力しかもっていないが、この 2 つは自分の実感にも当てはまる。バグの混入を完全に予防することは難しいが、バグを修正するスピードは鍛えられる。その結果として、自力でプログラムを書ききることができるようになる。

この目的にためには、結局、自力でプログラムを書き、自力でバグに気づいて 自力で修正する練習をするしかないと思う。だから、写経だけでなく、AtCoder の問題を解いてもらうことにした。

簡単な問題で、方針はほぼ全て与えてあり、必要ならコードを穴埋め式にしている。とは言え、 AtCoder の問題を解くのには相当時間がかかるだろうと、私は覚悟を決めていた。実際、 S さんは、はじめのうちは相当苦労していた。 1 問を解くのに 1 回の授業時間 (105 分) をフルにかけることも度々あった。バグの内容は、例えば

  • ループの外で変数を宣言して、更新し忘れている。
  • 配列の植木算的ミス

といった「誰もが通る道」が多かった。これらを、サンプルの入出力と処理系のエラーメッセージを頼りに、自分で直してもらった。自分で気づくのには、大変長い時間がかかる。待つのが大事だ。私自身通ってきた道だから、じっと待っていた。もちろんヒントは出したりしていたが、最終的には自分で気づいてもらった。これを 8 週間ほど繰り返してもらった。

読者は、いくらなんでも時間かけすぎだと思うかもしれない。しかし、私はこれが必要な時間だということに確信があった。そして、このことが最終盤で功を奏してくるのであった。

しなくていい苦労

反面、初心者が苦労する必要のない苦労は、私が取り除くことにした。例えば、以下のことをした。

  • 始めはメモ帳で書いていたので、良いエディタを紹介し、編集してもらった。
  • 改行コードの違いで悩んでいたので、直ぐに教えた。
  • ネットワーク関係で Windows 固有の問題が起きた時に解決した。

これらは、私が解決する分には勉強になるのだが、 Ruby 入門としては単なる障害であるから、私が答えを教え(その前に必要なら調べ)、解決をした。

成果発表会では、S さんから「自分で入門していたら解決できずに躓いていたであろうところをサポートしてもらえ、 Ruby 入門を果たせた」という言葉を頂いた。私の意図に気づいてもれなくてもよいのだが、本人に意図を理解してもらえたのは望外の成果であった。私は初心者に教えるのは下手だが、 S さんは東大の学生だから、教わるのも上手いのだと思った。

反省点

私の反省としては、私自身が『たのしい Ruby』をきちんと読んでいなかったことが挙げられる。前半は楽勝だから、読んだことがなかった。 S さんの進捗は把握していたので、目次を適当に見て、「まぁこのくらいの問題なら解けるだろう」と言いながら問題を選んで解説を書いた。しかし S さんは『たのしい Ruby』を前から順番に読むから、そこまでに書かれていることはご存知でも、書かれていない内容はご存じない。私が実習資料で前提とした知識が欠けていることがあった。

受講生の進捗を正確に把握するために、自分がよく知っている内容の部分も きっちり読まなくてはならない……そう考えると、人を指導するというのは大変だと思った。

長くなったから、以降は次回。