プログラミングを学ぶ3つの理由
筑波大学の久野先生と、「プログラミングを学ぶ理由を、いくつか取り上げて整理してみよう」ということを行ないました。
久野先生も僕も、1998年ころから共通して主張し続けていたのが、「(1) コンピュータや情報システムを理解するには、プログラミングを学ばなくてもいい。しかし、プログラミングを学んだ方が、遥かに効率的に、正確に、コンピュータのことを理解できるようになる」というものです。
この意見をさらに増強すべく、2004年ころからいい始めてきたのが「(2) 近隣諸外国では、小学校5年生程度でプログラミングを含む情報教育を始めてきているのに、日本がこのままだと、将来がまずい」というものです。これは、「プログラミングを学ぶとどうなるのか」という積極的な理由ではなく、「プログラミングを学ばないとどうなるか」という理由なので、イマイチ説得力がない。
そこで、もう少し説得力がありそうな、それでいて、久野先生と僕で「そりゃそうだ!」と言える理由づけをしようと議論しました。結論は「(3) プログラミングは、未来を正確に予想するために必要」というものです。解説が必要なので、ここに書いてみます。
物理の場合、物がどのように動くかを記述する基本は運動方程式です。運動方程式を記述するために必要なのが、速度や加速度、変位などの量です。運動方程式を記述するとn秒後の球の位置などがわかるようになります。化学の場合、二つの物質の反応を表すのが化学式と化学反応式です。化学式の前提となるのが元素記号であり、化学物質の性質を表す沸点、融点、原子量などの数値です。
ちょっとまとめ直すと、運動方程式は物の動きという未来を、化学反応式は物質の反応という未来を語る非常に重要な概念です。このように見てみると、プログラムも同じ役目を持っていることがわかります。それは、プログラムと入力のペアがコンピュータの動作と言う未来を語ることができるという意味です。そして、物理の「速度、加速度」に相当し、化学の「融点、沸点、原子量」に相当する「情報」の概念は、おそらく「コンピュータの動作、情報量、入力の形式、出力の形式」になるのでしょう。
物理 | 化学 | 情報 |
---|---|---|
速度、加速度 | 融点、沸点、原子量 | コンピュータの動作、情報量、入力の形式、出力の形式 |
運動方程式 | 化学式、化学反応式 | プログラム |
ところで産業革命を支えたのは、物理であり化学でした。そこから機械工業、化学工業が起こってきたともいえます。今後の情報社会を支えていく私たちが、プログラミングを知らないというのは、運動方程式を立てたこともなく、化学式を見たこともない人が、機械を利用したり、化学物質を利用したりするということになるわけで、これは相当恐いことだといえそうです。
言い替えるなら、「情報を学ぶにあたり、プログラミングを学ばなくてもよい」というのは「物理を学ぶのに運動方程式は不要である。速度、加速度だけやればいい。」「化学を学ぶのに化学式は不要である。融点、沸点、原子量だけやればいい。」というのに近いように見えます。
反論もあるでしょう。大歓迎です。お待ちしています。
| 固定リンク
この記事へのコメントは終了しました。
コメント
横浜清陵総合高校の五十嵐です。
賛否の意見ではありませんが、コメントをさせていただきます。
例えば高校では、生徒全員に対してプログラミング教育を行うということでは無理がありそうです。生徒の食いつきも心配ですし、興味を引いて教えることができる教員の不足も心配しているからです。
神奈川のある進学校の情報Bでは、StarLogoを使ったモデル化とシミュレーションの授業を行いましたが、StarLogoのプログラミングを教えたクラスでは失敗し、その後のクラスではパラメータを変更するだけに変更していました。この後者の授業を見学させていただきましたが、生徒は十分に興味を持って授業をうけていました。この先生は指導力もある方ですが、このような事例を聞いています。見学会の様子は神奈川県情報部会のサイトで報告されています。
http://www.johobukai.net/johobukaikenkyu0605.htm
私は、必修の情報ではプログラミングへの興味を抱くしくみを作り、選択科目で抽出した学生に対して本格的に指導するという方が効率も良いし、情報嫌いも作らずにすむかと考えています。
本校の情報Aでは、エディタでタグを打ってHTMLを記述しますが、これもテキストや画像というオブジェクトに対して、挟んだタグでメソッドを与え、また、属性を変更させているので、オブジェクト指向プログラミングの基礎になっています。(少し無理はありますが。)そんな説明を受けて興味を持った生徒が「アルゴリズム」や「Webプログラミング」という科目を選択していきます。
普通科高校では選択科目を置く余裕がないとの声も聞こえますが、ぜひ短期集中講座などの方法で希望する生徒を伸ばしてあげていただきたいとも思います。
投稿: VX | 2007年2月27日 (火) 00:56
五十嵐先生、おはようございます。
「HTMLをタグで作らせて、試行錯誤しながらデバッグを繰り返す」という作業は、僕の考えでは、プログラミング入門に見えます。
それから、今夜、改めて書こうと思っていますが、僕も久野先生も1980年代のプログラミング教育のやりかたと同じやりかたを復活させようとは思っていません。昔、野球のピッチャーが手をぐるぐる回してから投球していたように、スキージャンプの選手が空中で手を広げていたように、昔のやりかたはいま見ると駄目なところがたくさんあって、それを改善してきたのがいまの姿です。プログラミングも同じです。
ドリトルに代表される新種のプログラミング言語は、小学生でも十分に遊べる道具でありながら、オブジェクト指向の要素がふんだんに採り入れられています。2007年には2007年の教育用プログラミング言語がある、と僕は思います。
また、これは何度もあちこちで主張しているのですが、「プログラミングの体験をさせたい」のであって、「プログラミングの能力を得させたい」ではないのです。だから、生徒の失敗体験も大いに結構と思っています。先生は失敗しちゃいけませんけど。
投稿: たつみ | 2007年2月27日 (火) 08:41
かつて、総合的な学習の時間でCプログラミングを教えたことがあります。
私の講座を選んだ20名のうち、プログラミングに興味を示したのは15名。但し、学習が定着したのは2名だけでした。
難しい課題を出さず「例題演習」のスタイルで課題ソースを書いたプリント配り、
1.そのまま打って動作させる
2.設問どおりに変更して動作させる
3.変更したらどう変わったかを確認する
というスタイルをとりました。
「順次処理」「反復」「分岐」の基本構文を軸に、「キー入力の受付」「画面表示」を反復練習しました。
要は、世の中に出回っているソフトは「このような作業で作られる」というプロセスの一端に触れ、「自分でソフトを作ることが出来る」ということを分かってほしかった。
投稿: はたやん | 2007年3月 2日 (金) 01:49
はたやんさん、こんにちは
最近気になってきたのは、教育用プログラミング言語の持つ特徴が、学習者の readiness とどう関係しているかということです。
つまり、数学について関心を持っていたり、数学についてある程度の訓練を受けてきた人と、そうでない人では、どんな言語から学び始めればいいかが違うんだろうということです。
まだ、うまくは分類できてませんが、
・でてくる単語が
A. 母国語のまま
B. 母国語以外
C. 文字以外
・初等的な文の揺れ(文法エラー)
1. 冗長に設計されている
2. フォローして動く
3. 無視して動く
4. エラーの前まで動いて、そこで止まる
5. 動かない
で、全部で8通りあります。
ドリトルはA1、HTMLはB3、ビスケットはC2、C言語などのプロ用言語はB5に該当します。人間がインタプリタだとすれば、レシピはB2、楽譜はB4ですね。数式はB2といえるのかな。
いずれにしても、C言語を入門で行なう時は、数学の readiness が必要かなーって気がしています。
こういうことって、ちゃんと研究している人がいるのか調べているんですけどなかなか見つからないですね。
投稿: たつみ | 2007年3月 2日 (金) 12:42
授業でPENを使っていて思ったことなのですが,構造化って初学者にとってわかりやすいことなんでしょうか。前に去年の農工大の入試問題がフローチャートではif〜gotoのループだったのに,TUATLEのプログラムではループの構文を使っていたという話をしましたが,はたしてどちらがわかりやすかったんだろうと。ループが簡単にわかるんだったら,数列のΣの意味がもっと簡単にわかるはずじゃないのかと思ったりもします。
投稿: わたやん | 2007年3月 4日 (日) 00:30
それ単独だけならフローチャートみたいに「ひたすら追って」行くのが分かりやすいのかも知れません。しかし普通の言語では今はgotoベースでプログラムしませんから、多少の差ならがんばって構造化した制御構造を教えるのがいいと思ってます。
投稿: 久野 | 2007年3月 4日 (日) 00:54
後のことを考えたら,構造化のブロックで考えられるようにした方がいいのは間違いないと思うのです。でも,その前に一度if〜gotoでのループを一度見た方がいいのか,見ない方がいいのかというところで迷いがあります。構造化の方が抽象化が1レベル上になってる分わかりやすいのかわかりにくいのか,どちらのイメージも想定できるので決めがたいのです。
先日,オフラインでは初対面の友人と飲んだときに「我々古い人間はC#やJavaやC++の参照渡しの裏にポインタを想像してしまうのでCやアセンブラを経ずにいきなりそれらの言語に飛び込む人のことを心配してしまうのだけれど,新しい人たちは別の形で理解してしまうので心配いらないのかもしれない(そして我々はその「別の形の理解」を理解できない)」というようなことを話しました。そういえばBASICも基本は参照渡しだったような気もしますが,それを自分がどんな風に理解していたのか,今ではわからなくなってしまいました。
投稿: わたやん | 2007年3月 6日 (火) 01:20
そうですねえ、CやC++の場合は構造のある型の「そのもの」と「参照」
両方が使えるからややこしい。Javaだと参照しかないから、常にこういう
風に指しているんだよ、みたいに教えればそれで納得してくれるんでは、
と思っています。ところでC#とJavaは「参照の値渡し」しかないですよね。
C++には参照渡しがあるけど。そこがまたややこしいんですけどね。
投稿: 久野 | 2007年3月 6日 (火) 16:38