開発の話はほとんど聞いていません。伝統的な言語をシンタクスシュガーで覆ったようなものに見えます。ほとんど聞いていないので外れているかもしれませんが。
高校での事例(保福先生)
神奈川県の高校での事例発表。
神奈川でも情報Aの割合が多く、次いでC、Bは非常に少ない。情報Bは指導しにくいとの評価もある。unpluggedの内容を情報A,B,Cで分けてみると、情報Bをかなり網羅している。情報Bを教えるのに役立つのではないか?
1クラス33人に対して、探索問題、並べ替え問題、並列処理の授業を行った。ただし、あまり時間はかけられなかった。
探索問題では、線形探索、二分探索、ハッシュ法について。unpluggedの実習を行い、特徴や長所、短所などをまとめさせた。ふだんおとなしい生徒たちが活発に議論する様子にびっくりした。
並べ替え問題では、天秤が用意できずにカードを使った。トランプは生徒が置いた場所を覚えてしまうのでよくない。微妙に大きさの違う文字を印刷したカードを使うことでそういった問題を避けた。
授業後にアンケートをとったら、100%が良いという反応で、面白い>理解しやすい>良い、という順序であった。
脳が活性化した、頭使った、印象的、楽しい、共同作業などのキーワードが多かった。
苦手意識の解消に役立つのではないか?
質問、コメント:
・中学校でやるより小学校でやった方がいいのでは?
・なぜ選択ソートとクイックソートなのか?
・現実世界とのつながりはどう考えているのか?アルゴリズムだけ教えてその先は?
・体験後に知識として定着化するアイデアは何かあるのか?(私の質問)
・次にプログラミング言語を教える必要はないのでは?
感想:
こちらも生徒との信頼関係がある中で効果的な授業を行っているように見えます。中学校の事例と違ってアルゴリズムの中に一歩踏み込んでいった印象を受けました。
私の質問の意図としては、両者とも遊び/楽しい要素を強調されていたので、単なるイベントとしてしか記憶に残らないのではないかと危惧したからです。ちゃんと知識、技術として定着する要素があればいいなと思います。多めのデータを与えて解かせる課題を設定したり、自分で問題を作らせるのも良いかもしれません。
この発表からは脱線しますが、unpluggedをプログラミング言語/プログラムに直接結びつけるのは困難かもしれません。慎重に言語を選ばないと手続き型言語の枠組みだけでは本質を見失う可能性もあります。このあたりを理解しないで指導すると結局理解を混乱させて本末転倒になるのではないかと思いました。
技術家庭科、中学3年生の授業(井戸坂先生)
unpluggedの12章すべてを授業で行った。
・画像表現では、画像をFAXのように数値的に表現して相手に伝える。
・データ圧縮では、繰り返し出てくる文字や単語を矢印で置き換える。置き換えた図から元の文章を復元する。
・エラー訂正では、(表が白、裏が黒)磁石式のカードを5×5のマトリクス状に貼り付けさせ、先生がそれを6×6になるようにカードを追加する。後ろを向いている間に1枚だけ裏返しにさせ、先生がそれを当てるというもの。後から追加したカードはパリティである。生徒は2枚裏返していて焦った。エラー訂正に関連してISBNのチェックディジットを説明。
・2進数では、1、2、4、8、16個の点を描いた5枚のカードを順に並べ、点を数えることで10進数との対応を学ぶ。
・最小全域木では、泥市を最小のコストで舗装して各家庭を結ぶ例。
・並べ替えでは、砂の入ったフィルムケースと天秤で重さの順に並び替える。
などなど。
unpluggedは学習の中に学びの要素がある。
作業型か体験型のどちらかで、グループで行える内容が多い。
生徒はコンピュータを使うよりもunpluggedの方がいいとの反応が多かった。
感想:
短期間によくここまで授業をこなせたと思いました。写真で見る生徒の表情などかなり真剣かつ楽しそうでした。自分も経験がありますが、こういった授業をやるには多分に教師のセンスが必要です。井戸坂先生はかなりの経験の持ち主と見えました。
ワークショップ「情報科学を教室に」
今年は3つのワークショップに分かれており、ロボット関係のものとどちらに参加するか迷ったのですが奥村先生の話を伺いたかったのでこちらを選びました。以下は奥村先生の問題提起のいいかげんなメモ。
アランケイの「ポップカルチャーは危険な文化」の話。考えることが重要なのに、googleコピー→powerpointペーストは、教育どころか人間をダメにしている。コンピューターがなかった頃のほうがずっとマシ。
Edward Tufteの「Cognitive Style of PowerPoint」の話。PowerPointを使っていると頭もそのような構造になってしまう。(箇条書き、関連のないものの羅列、話のつじつまを適当にあわせる、何となく納得させるなど)
ファインマンの話。space shuttleが落ちた後の調査委員会のメンバーになった。会議で驚いたのはbulletがたくさんあったこと。(bullet=箇条書きの・)議論になっておらず重要なことが話し合われていない。結局space shuttleはまた落ちた。
上記から、現在の情報教育は生徒の思考力を奪ってないか?(日経コンピュータの「実態は町のパソコン教室以下」を紹介)
http://itpro.nikkeibp.co.jp/free/NC/TOKU2/20050329/1/
データ圧縮の話。情報の教科書ではデータ圧縮を「情報を減らすこと」と表現されている。これは完璧なウソ。「QRコードをフルカラー(1600万色)にしたら1Gバイト格納できる」技術にベンチャーキャピタルが資金提供しそうになった。ちゃんと情報科学を教えないと!!
unpluggedの話。BellのManaging Gigabyteという1994年の本にあった一枚のさし絵。
Tim Bellは子どものための教科書も作っている。コンピューターを使わない(unplugged=電源オフ)でコンピューターを教える本「Computer Science Unplugged」
このワークショップでは、この本を使った2つの実践例と、大学入試センター試験の記述用言語DNCLの実装PENについて発表を行う。
基調講演(久野先生)
この会の目的としては、プログラミングがどう教育に役立つか、実際の授業はどうなっているかを知ること。
情報処理学会の簡単な歴史と教育に関わる活動の紹介、情報科目の試作教科書の案内。(サンプルが回覧された)
コンピューターシステムやソフトウェアに関係する事件を取り上げられた。
・構造計算書の偽造は、改ざんできる出力データを原本にしたのが問題。入力データを添えればいいではないか。
・1円61万株誤発注問題、フィギュアスケート採点ミス事件は、人間のミスを想定せずにシステム設計したのが問題。
→これらの事件は、情報システムに関するきちんとした理解がないから生じているのではないか?システム発注側にセンスある人材がいないために、とんでもないシステムができあがっている。
→→初等中等教育からプログラミングを重視した教育をするべき。ただし、「プログラミング」という言葉は抵抗があるようなので(excelのマクロなどを含む概念である)「手順的な自動処理」と表現している。
試作教科書では現行の情報A,B,Cをふまえて、情報I,IIの形で再構成している。特にプロジェクト管理の導入やプログラミングの具体的な体験を可能とするような内容にしている。
しかし、プログラミングを教えることにはかつてのBASIC教育を彷彿とさせ抵抗が大きい。「国民全体がプログラマになる必要がない」「プログラマにならないならプログラミングを学ぶ必要がない」といった誤解、曲解が横行している。(理科の「でんぷんのヨード反応」実験は、生徒を全員化学者にするためのものではないことと同じ)
プログラミング教育が必要な根拠としては、
・プログラミングはコンピューターの原理や構造を理解するのに必要不可欠であり、それを体験することで効果的に得られる。
・初等中等教育でプログラミングを学ぶのは世界的な常識で日本はひどく立ち後れている。国際会議でも海外の教育者に心配されてしまう。
・国民全体の情報水準を引き上げるためにもプログラミングは必要。
あとは昨年度のワークショップの内容紹介と、教育用言語ドリトルの設計についての解説があった。
会場からの質問、コメントとしては、
・初等幾何学を学べばプログラミングなんて理解できる。そっちをやったらいいじゃないか。という反論にどう答えるのか?
・人間の情報処理とコンピューターの情報処理は違う。なぜその点をふまえた内容にしないのか?
・ワードやエクセルを使うことと、プログラミングを体験することの本質的な違いはあるのか?
・試作教科書では基礎的な知識の詳細(例えば2進数)が欠けていて大学入試の試験問題が作れない。
会場に韓国の大学生が来ていたので韓国の状況が話された。
・かつては小中学校でBASICが教えられていた。最近はあまりやってない。やっているところはVisual Basicになった。
基調講演の感想としては、プログラミングを一つの「能力」のようにみなしていることに違和感を覚えたことと、プログラミングの教育とプログラミング言語の教育を同一視、あるいは不可分な関係と見ているような感じを受けたことでしょうか。
全体の共通理解の土台を築く目的で始められた基調講演でしたが、情報教育とプログラミングの関係がいまいちわからなくなったような気がしました。これは昨年も受けた印象ではありますが。
教育用プログラミング言語ワークショップ2007 -ワープロ07-
昨日は一橋大学の佐野書院で行われた表記の会合に出席しました。以下はその簡単なメモ。あくまで伊藤の聞き取った範囲の話なので内容の正確さもその程度のものとご理解ください。
pepsi学習中
いつも参考にさせていただいているid:sumimさんにリンクされてしまいました。光栄だ~
Cokeは凄い人たちに任せてもっぱらpepsiで遊んでいるのですが、せっかくなのでたらい回し関数のpepsi版を晒します。
{ import: st80 } Time : Object() Time millisecondClockValue { struct timeval tv; gettimeofday(&tv, 0); return (oop)(((tv.tv_sec * 1000 + tv.tv_usec / 1000) &0x3fffffff) << 1 | 1); } Time millisecondsToRun: block [ | initialMilliseconds | initialMilliseconds := self millisecondClockValue. block value. ^ self millisecondClockValue - initialMilliseconds ] StaticBlockClosure timeToRun [ ^ Time millisecondsToRun: self ] TakY : Object () TakY x: x y: y z: z [ x <= y ifTrue: [^ y]. ^ self x: (self x: x - 1 y: y z: z) y: (self x: y - 1 y: z z: x) z: (self x: z - 1 y: x z: y) ] [ [TakY x: 12 y: 6 z: 0] timeToRun println. ]
例によって前半はミリ秒での計測をするためのコードです。定義や呼び出しの本体は最後の10行ほどです。(id:sumimさんと同じコードが使えます)
#TimeのmillisecondsToRunの実装はrolloverの処理をはしょってますので危険な用途には使わないでください 🙂
pepsi学習中
このところ本業が忙しくてpepsiと遊ぶ時間がないのですが合間にサンプルを作りました。年度末に学生さんに出したプログラミング課題の一つ、「1000までの整数からユニークに100個を選ぶ」です。
別に凝ってもいないし人に見せるようなものでもないのですが…
{ import: st80 } "----------------------------------------------------------------" Random : Object ( seed a m q r ) Random new [ ^super new init ] Random init [ [seed := (Time millisecondClockValue bitAnd: 16r3FFFFFFF) bitXor: self hash. seed = 0] whileTrue. a := 16807 asFloat. m := 1073741823 asFloat * 2.0. q := (m quo: a) asFloat. r := (m ?? a) asFloat. ] Random next [ ^(seed := self nextValue) / m. ] Random nextValue [ | lo hi aLoRHi | hi := (seed quo: q) asFloat. lo := seed - (hi * q). " = seed rem: q" aLoRHi := (a * lo) - (r * hi). ^(aLoRHi > 0.0) ifTrue: [aLoRHi] ifFalse: [aLoRHi + m]. ] Random nextInt: anInteger [ ^(self next * anInteger) truncated ] Time : Magnitude ( _seconds _nanoseconds ) Time seconds [ ^SmallInteger value_: _seconds ] Time nanoseconds [ ^SmallInteger value_: _nanoseconds ] Time millisecondClockValue { struct timeval tv; gettimeofday(&tv, 0); return (oop)(((tv.tv_sec * 1000 + tv.tv_usec / 1000) &0x3fffffff) << 1 | 1); } "----------------------------------------------------------------" [ | r c v start msec | start := Time millisecondClockValue. r := Random new. c := Set new. [ v := r nextInt: 1000. c add: v. c size < 100] whileTrue. msec := Time millisecondClockValue - start. c println. msec println. ]
乱数生成がst80になく、joltから引っ張ってきたのでえらく長いですが、本体は一番最後のブロックです(いたって素直なコード?)。種の生成にミリ秒を使っているんでついでに実行時間も測ってみました。(startとmsecのところです)
実行するとこんな感じです。
Set(512 259 775 263 778 523 268 13 526 787 533 21 281 282 795 540 26 28 799 546 804 550 808 302 305 821 822 55 317 61 320 68 587 591 593 851 852 596 341 87 597 601 343 348 97 101 616 106 877 366 115 630 119 632 889 378 127 134 137 907 909 912 656 914 144 662 153 665 921 163 167 939 431 944 177 688 436 182 697 698 191 706 965 710 967 455 977 724 988 991 738 484 999 493 496 499 759 506 253 765) 9
9msですか。結構かかってます。最後のブロックをsqueakのworkspaceに貼付けて実行すると2msです。まあ、この程度のコードで実行時間を測っても意味ないですけどね。
Mac OSX版Squeak不具合
http://d.hatena.ne.jp/nqthm/20070212/p1
でMac OS Xの新しいVMでも日本語が扱えるように書きましたが、やっぱり微妙におかしいことがわかりました。
先の修正を行うとファイル名やディレクトリ名が読めるようになるのですが、濁点や半濁点の文字はおかしなままです。たとえば「プログラム」は「フ?ロク?ラム」となってしまいます。
うーむ。