雑種路線でいこう

ぼちぼち再開しようか

はぢめてのぷろぐらみんぐ

気付いたら長男が保育園の年長になっていた.幼稚園の年長というと,ぼくがPC-6001のMicrosoft N-60 BASICで親父お手製のプログラムで足し算や引き算を覚えた頃で,テープレコーダからプログラムを読み込むために"load"とか"run"といった命令は覚えていたし,プログラム名を入力するためにアルファベットの小文字を覚えたり,だらだらとプログラムが流れるのが楽しくて,"list"というコマンドで遊んだりした頃だ.そろそろうちの子にも,お絵描きやWebブラウズやGoogle Earthばかりでなく,プログラミングの醍醐味を教えねば.
あの時代はオープンソースも何も,プログラミングの方法としてはBASICと機械語しかなくて,売り物プログラムであっても,基本的に何もかも丸見えであった.さっぱり中身は分からなかったけど,子供なりにBASICプログラム部分の定数を適当に書き換えて変化を眺めてるだけで楽しかった記憶がある.BASICは間違えた入力をしてもエラーを返してくれるからいいが,機械語は間違えた命令を入れた途端に暴走するし,何せZ80機械語の16進ダンプなんて幼稚園児のガキには何かさっぱり分からなかった.
僕があまり教育熱心でないせいもあって,うちの長男はひらがなは解するけれどもアルファベットは解しない.けれども何故かDellのロゴをみると「デル」と分かっているし,MacWindowsとの区別はついているようだ.井の頭線好きな長男が渋谷に行きたがったとき,用がないので下北沢までしか行かなかったのだが「なぜ渋谷にいきたいの」と聞いたら「ぼくのマック,開いても画面が出なくて壊れてるから,直しに行かなきゃ」といわれて驚いた.前に次男によってキーボードをペリペリと剥がされたiBook G4をアップルストア渋谷に直しにいったのを覚えていたらしい.
で,これから書こうとしているのはプログラミングを何から教えるか,という問題である.BASICはもともと1960年代に教育用言語として開発された経緯もあり,いろいろな意味で教育用言語として適していたのであるが,時代遅れの感が否めない.VBAとかVB.NETとかもあるが,あれは言語仕様の一部がBASICというだけで,教育用言語としての配慮には欠けている.僕が初学者向けプログラミング言語に求める条件は,

  • 触って楽しいこと
  • 段階的な学習が可能であること
  • 言語仕様が単純で,優れた教材・文書があること
  • 学習者にとって関心を持ちうる処理を自動化できること
  • その言語を習熟することで,一通りの概念や手法を学べること
  • 学習の各段階で,動くプログラムを通じて理解度を確認できること

である.昔のBASICはこの条件を満たしていた.音を鳴らしたり,絵を描くことが対話型シェルで簡単にできた.今のVBAVB.NETは,実用向けで言語仕様が過度に複雑になった上に,子供にとって楽しくないし,VB.NETに至ってはコンパイル型言語でIDEの操作方法とか,子供にとってはやたらと煩雑な学ぶべきコトが多すぎて,おおよそ初学者向けとはいえない.
わたしが個人的に優れた初学者向けコンピュータ言語と考えるのは,幼稚園児や小学生向けであればSqueak,中学生以降でテキスト形式のプログラミング言語を学ぶとしたらRubyPythonである.わたしが初学者向けプログラミング言語に求めるのは,

  • 純粋なオブジェクト指向
  • 学習の各段階で教えるべき内容に集中できる簡便さ
  • 習熟度に応じて高度な内容にも踏み込むことのできる柔軟さ
  • 書いたプログラム断片をすぐに実行できる対話型シェルを持つこと
  • 今日の主要プログラミング言語と近い文法を持つこと (CやJavaを読んで雰囲気を掴める程度)

である.
JavaC#VB.NETが失格なのは,対話型シェルを持たず,IDEの操作方法が煩雑であること,コンパイル型のプログラミング言語であること,最初にパッケージやクラスの宣言が必須なこと,GUIなど業務アプリ構築用につくられていて遊ぶには楽しくないことなどである.PythonRubyは対話型シェルを持っているし,まず処理そのものを記述し,次に関数(メソッド)を使って構造化し,最後にクラスを使ってモデル化する,という順で教えることができる.
とはいえ幼稚園児や小学校低学年では,そもそも記号操作そのものができる子とできない子とで開きもあるし,プログラムを書く作業そのものが楽しくない.だからSqueakでお絵描きの延長線上でプログラミング環境に親しんでもらい,絵を描いて満足する子はそれでいいし,Hacker予備軍はeToysでプログラミングの醍醐味を知って,なにげにSmalltalk Browserを開いてオブジェクト指向の神髄に触れて欲しい気もする.とゆー訳で我が家では長男や次男がPCにログインすると自動的にSqueakが立ち上がる設定にしているのであるが,相変わらず適当な絵を描くばかりだし,最近はSqueakを閉じてGoogle Earthをグリグリやっている時間の方が長いようだ.
C, C++, Java, Java Script, PHP, Perl, Ruby, Pythonあたりは微妙に違うけど,一つ覚えれば他の言語も眺めているだけで雰囲気を掴める程度に似た言語であって,この手のALGOLの末裔というかCの亜種をひとつ覚えたら,次はLISPとかPrologHaskellOCamlとか,全く違う系統の言語を齧ってみるのもいい気がする.プログラミングというのは実はもっと奥が深いのに,ある種の商業主義の結果として,Cの亜種ばかりが幅をきかせていることを理解できるだろう.言語仕様の単純さや教科書のことを考えると,ここしばらくid:higeponが勉強しているSICPSchemeなんかが面白いんじゃないだろうか.*1
Guy Lewis Steele Jr.はたまたま青学の井田先生のゼミで8年くらい前に会ったことがあるんだけど,Schemeという素晴らしくエレガントな言語をつくった後に,JavaのようなC言語屋もSmalltalk屋も納得してスムーズに入れる現実的な言語をつくって,あー世の中,天才っているんだなー,と.
どっちにしても今時のオープン系で一般に使われている言語なんて大概は同根で,あんまり細かい差異を問うても不毛という気がする.ただ,初学者にとっては敷居が低ければ低いほどいいし,教育用プログラミング言語の在り方という議論を抜きに,職業教育としてコンピュータ言語が取り上げられがちな現状には危惧を覚える.「とりあえず,よく使われているからCとかJava」ではなく,「教えるべき概念は○○と××で,そのカリキュラムに適しているのは△△」といった順番で考える必要があるだろう.まぁOSの中身を教えるには事前にCを学んでおいて欲しいとか,その手の依存関係もあるんだけど.
僕は自分の子供には,敷居が低く美しく奥の深い言語から触らせるし,これから勉強するひとに対しても,できるだけ彼らがIDEの操作方法とか細かい言語仕様といった枝葉末節ではなく,データ構造やアルゴリズムといったプログラミングの本質に近いところで悩めるような教育が行われることを切に願う.また,いわゆるエンタープライズ・アプリケーション開発での開発生産性だけでなく,そういった教育用言語としても,言語間で健全な競争や技術革新が行われることを望む.

自分の体験から行くと、Java をやる前までは OO とかサパーリわからんでした。そんなわけで OO の学習には Java はとてもいい気がする。言語仕様も小さいし、テキストも豊富だし。

*1:僕の本棚にあるSICPは飾りです.偉いさんにはそれが分からんのです.ごめんなさい