SCOT(スワジランド技術短大)、悪戦苦闘 その一

SCOT 実習中のJAVAクラス
SCOTのレクチャーでは、学生たちはひとクラスに約30名ほどいて、そのうち自分のPCを持っているのは7・8人です。 今学期に入って、前の学期には利用できたPCラボが利用できなくなり、コンピュータ学科なのに実習機がなく、プロジェクタもなく、ホワイトボードもない、という劣悪な環境です。 けれども「設備がないのでレクチャーできない」ではJICAボランティアの沽券にかかわる、とフリップチャート用の大きな紙を自前で用意して壁に貼って、マジックペンで説明を書き、実習はPCを持つ学生の周りに持たない学生が集まって、「みんなで議論しあってプログラムを作れ」とワイワイガヤガヤやっている、という状況です。
SCOT 実習中のJAVAクラス
SCOTでのレクチャーを重ねるにしたがって、学生たちの現在レベルが見えてきて、私に依頼されたのは「JAVAプログラミング」を彼らに教える、ということなのだけれども、どうも彼らの現在レベルは「JAVAを学習する前にプログラミングの基本事項をもっとしっかり身につけるべき」という印象を持っていて、もっと「ぶっちゃけた言い方」をするならば、「君たち、JAVAでOOP(Object Oriented Programming オブジェクト指向プログラミング)やるには10年はやいぞ!」というのが私が受けた第一印象でした。
「JAVAでOOP」に入る前にいくつか課題を出して、彼らの「プログラミングに関する現時点の理解度」を試してみました。
課題は2つ用意しました。 ひとつは、コマンドライン引数をJAVAプログラムで受け取る練習問題。 もうひとつは、「文字を使って簡単な図形を描く、アルゴリズム抽出・構築とJAVAの反復処理」の基本的な練習問題。 

コマンドライン引数を受け取る練習問題は、以下のものです。

EX12 Make a java program which display command line parameters(arguments) shown below;
    Program name may be ‘ex12.java’.
    When you execute ex12 with parameters(arguments) below;
      java ex12 Today is Monday February 4
    Then, you will get output shown below;
       1 : Today
       2 : is
       3 : Monday
       4 : February
       5 : 4

問題にとりかかる前に、JAVAでどのようにしてコマンドライン引数を受け取るか、さらにパラメータの数をどのようにして知ることが出来るか、についてひととおり説明しました。
   「コマンドラインの引数はmainメソッドの引数:String[] args に
    JAVA自身がセットしてくれます。
    あなたがたは配列argsを参照すればいいだけで、
    自分で値をセットする必要はありません。
    引数は空白で区切られ、引数の数は、
    JAVA自身がargs.lengthにセットしてくれます」
というような説明です。

そして学生たちに作業を始めさせ、およそ一時間ほどたったころ、ひとりの学生が「できたので見てください」というので見てみると、下記のようなプログラムを書いていました。

   public class ex12 {
     public static void main( String[] args ) {
        args[0] = “Today”;
        args[1] = “is”;
        args[2] = “Monday”;
        args[3] = “February”;
        args[4] = “4”;
        System.out.println( args[0] + args[1] + args[2] + args[3] + args[4] );
     }
   }

上のJAVAプログラムがコンパイルできてしまうのも問題なのですが、学生クンはこれを
   java ex12
と実行して、当然のことながら、args[0] = ・・・で実行時エラーになりました。
コマンドライン引数を与えずに、コマンドライン引数を参照しようとするのだから、エラーになって当然なのですが、学生クンはどうしてエラーなのか理解できない、という表情で私を見ます。
「メッセージがあなたに何を伝えたいと考えているか、メッセージをもう一度よく見なさい」とつきはなしてみます。
しかし、彼の場合、根本的に「コマンドラインで引数を与え、それをJAVAプログラムで受け取る」という概念が理解できていないようです。

SCOT 実習中のJAVAクラス
また、彼にかぎったことではありませんが、学生たちはエラーメッセージを読み取ろうとしません。 コンパイル時にせよ、実行時にせよ、エラーが生じると、プログラムコードを思いつくままに修正したり、ほとんどの場合、レクチャラーを呼んで「どこをどう修正すべきか」の指示を待ちます。メッセージの英語が難解なのも一因かもしれませんが、「エラーメッセージが伝えたいとおもっていることを読む」という訓練が彼らには必須です。プログラミング作法のレベルの問題なんでしょうね。

また、別の学生が見せたプログラムは、こうです;
   public class ex12 {
     public static void main( String[] args ) {
       String[] array1 = new String[5];
        array1[0] = “Today”;
        array1[1] = “is”;
        array1[2] = “Monday”;
        array1[3] = “February”;
        array1[4] = “4”;
        for( int i=0; i < args.length; i++ ) {           System.out.println( i + array1[i] );         }       }     } for( int i=0; i < args.length; i++ ) { ・・・ここまで書けたのに、なぜ    array1[0] = ・・・ なのだ、と歯がゆい思いを感じながら、実行させてみます。 コマンドラインは前の学生同様、    java ex12 と与えています。 当然ながら、args.length = 0 なので、forループを素通りしてなにも表示されず、何が間違っているか理解できない学生クンは私のほうを見つめてニヤニヤするばかりです。(笑ってる場合じゃないんだよ!) 「ループに入る前に、args.length の値がどうなってるか、print してごらん」と伝えても、それが何をチェックするための操作なのか、がやはり理解できないようでした。 どう説明すればわかってくれるのか、学生クンのニヤニヤとは裏腹に、こちらは泣きたい気分になってきます。   「君はせっかくコマンドライン引数を参照する準備までできたのに、    わざわざ別の配列を用意して、実行時には引数も与えずに    引数を参照しようとしている。     いったい君の頭のなかでは何がどう組み合わされているんだか、    君の頭、かちわって見てみたいよ」 と言いたくなります。
一人の女子学生が「プログラムができたので見てくれ」と言うので見てみると、彼女はループを避けて直接プリントアウトするコードで逃げようとしていました。

   public class ex12 {
     public static void main( String[] args ) {
        String[] array1 = new String[5];
        array1[0] = “Today”;
        array1[1] = “is”;
        array1[2] = “Monday”;
        array1[3] = “Feburuary”;
        array1[4] = “4”;
        System.out.println( array1[0] + array1[1] + array1[2] + array1[3] + array1[4] );
     }
   }

彼女が、
   java ex12
と実行すると、要求された形式ではなく、単語間の空白もないのですが、「TodayisMondayFebruary4」と出力はされていて、それなりに満足そうな表情で私を見ています。
私は、ちょっと意地悪に
 「では、プログラムのコードを全く修正せずに『Tomorrow is Tuesday February 5 2013.』とプリントしてごらん」
と指示してみます。 彼女は、困惑して「そんなこと、どうやってできるの?」と私を見ます。

やはりJAVAのプログラムがコマンドラインから値を受け取る、というメカニズムが全く理解できていませんでした。

どうやって説明すればわかってくれるのだろう? 私のほうこそ「?????」なのだよ、君たち・・・

SCOTの学生たちを見ていて、彼らが「一般化」とか「抽象化」とかいう言葉であらわされる作業が苦手らしい、という印象をうけています。
問題の中に「たとえば、こういう例だとこうなる」と例として示した内容をそのままコードに書き込もうとします。
ひとつの例を抽象化して一般解を求める、という解法のスタイルが初中等教育のなかで全く訓練されていない、ということなのでしょう。
(「数列の一般項」なんてどんな風に教えているんだろう?)

毎回、レクチャーが終わったあと、学生たちに「Study Report」を書かせています。(参照:http://www.gskb.biz/swazi/?p=165)
この日、学生たちの質問のなかに、
  「Please show us complete code for this practice, then I can understand the lecture.」
というのがありました。 なんとかして解を求めようとせず、とりあえず正解を与えてほしい、という姿勢がどうもここスワジランドの初等教育からの習慣として根付いてしまっているようです。これをひっくり返すのは、今ここで私とSCOTの学生たちとの間でできることなのかどうか、自信まったくありません。 「正解を与えられて、それをコピーして、PC上で期待通り動作すれば、それでこの実習課題は完了」という受け止め方が一般的なように感じます。

おそらく彼らに正解のコードを与えれば、「Mr.Tはいい先生だ」という評価になるでしょう。 そして私の任期が終わるときには「Mr.Tはすばらしい先生だった」と感謝されるでしょう、けれど、学生たちは「学びの姿勢」が身につかないまま社会にでていくことになるでしょう。 正解のコードを与えずに、「正しいコードが書けるまでやり直してみろ」とつきはなせば、「Mr.Tの教え方は不親切でまちがっている」という評価になるのでしょう。 たぶん世界中のJICAボランティアが同じようなジレンマと悪戦苦闘中なんでしょうね。

派遣国の枠を超えた同業種ボランティアの分科会というのも、ボランティア活動としての見栄えは派手なので(また「何かやっている」というアピール度もあって)いいかもしれませんが、インターネット上にポータルサイトを作ってこうした問題を議論しあえるフォーラムなどを構築して、情報共有・知恵の共有をはかることができればきっとJICAボランティアの仕事のレベルは向上すると思うのですが・・・ どなたか、JICA本部やJOCV本部のえらい人にお伝えいただけませんか? (私は「えらい人」が苦手です)

カテゴリー: Swaziland ICT事情, Swaziland 教育事情 パーマリンク

SCOT(スワジランド技術短大)、悪戦苦闘 その一 への1件のフィードバック

  1. ピンバック: ICT分野の現況を垣間見る – JICA volunteer life in Uzbekistan

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です