---
type: article
title: はぢめてのぷろぐらみんぐ
timestamp: 2006-05-05T00:00:00Z
profile: sorane-okf/0.1
noFontEmbedding: true
---

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

<p>気付いたら長男が保育園の年長になっていた．幼稚園の年長というと，ぼくが<a class="okeyword" href="g:mohican:keyword:PC">PC</a>-6001の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a> N-60 BASICで親父お手製のプログラムで足し算や引き算を覚えた頃で，テープレコーダからプログラムを読み込むために"load"とか"run"といった命令は覚えていたし，プログラム名を入力するためにアルファベットの小文字を覚えたり，だらだらとプログラムが流れるのが楽しくて，"list"というコマンドで遊んだりした頃だ．そろそろうちの子にも，お絵描きやWebブラウズや<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Earth">Google Earth</a>ばかりでなく，プログラミングの醍醐味を教えねば．

<br />
あの時代はオープン<a class="okeyword" href="g:mohican:keyword:ソース">ソース</a>も何も，プログラミングの方法としてはBASICと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>しかなくて，売り物プログラムであっても，基本的に何もかも丸見えであった．さっぱり中身は分からなかったけど，子供なりにBASICプログラム部分の定数を適当に書き換えて変化を眺めてるだけで楽しかった記憶がある．BASICは間違えた入力をしてもエラーを返してくれるからいいが，<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>は間違えた命令を入れた途端に暴走するし，何せ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Z80">Z80</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>の16進ダンプなんて幼稚園児のガキには何かさっぱり分からなかった．<br />
僕があまり教育熱心でないせいもあって，うちの長男はひらがなは解するけれどもアルファベットは解しない．けれども何故か<a class="keyword" href="http://d.hatena.ne.jp/keyword/Dell">Dell</a>のロゴをみると「デル」と分かっているし，<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>との区別はついているようだ．<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%E6%A4%CE%C6%AC%C0%FE">井の頭線</a>好きな長男が渋谷に行きたがったとき，用がないので下北沢までしか行かなかったのだが「なぜ渋谷にいきたいの」と聞いたら「ぼくのマック，開いても画面が出なくて壊れてるから，直しに行かなきゃ」といわれて驚いた．前に次男によってキーボードをペリペリと剥がされた<a class="keyword" href="http://d.hatena.ne.jp/keyword/iBook">iBook</a> G4を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C3%A5%D7%A5%EB%A5%B9%A5%C8%A5%A2%BD%C2%C3%AB">アップルストア渋谷</a>に直しにいったのを覚えていたらしい．<br />
で，これから書こうとしているのはプログラミングを何から教えるか，という問題である．BASICはもともと1960年代に教育用言語として開発された経緯もあり，いろいろな意味で教育用言語として適していたのであるが，時代遅れの感が否めない．<a class="keyword" href="http://d.hatena.ne.jp/keyword/VBA">VBA</a>とか<a class="keyword" href="http://d.hatena.ne.jp/keyword/VB.NET">VB.NET</a>とかもあるが，あれは言語仕様の一部がBASICというだけで，教育用言語としての<a class="okeyword" href="g:mohican:keyword:配慮">配慮</a>には欠けている．僕が初学者向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>に求める条件は，</p>

<ul>
<li>触って楽しいこと</li>
<li>段階的な学習が可能であること</li>
<li>言語仕様が単純で，優れた教材・文書があること</li>
<li>学習者にとって関心を持ちうる処理を自動化できること</li>
<li>その言語を習熟することで，一通りの概念や手法を学べること</li>
<li>学習の各段階で，動くプログラムを通じて理解度を確認できること</li>
</ul><p>である．昔のBASICはこの条件を満たしていた．音を鳴らしたり，絵を描くことが対話型シェルで簡単にできた．今の<a class="keyword" href="http://d.hatena.ne.jp/keyword/VBA">VBA</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/VB.NET">VB.NET</a>は，実用向けで言語仕様が過度に複雑になった上に，子供にとって楽しくないし，<a class="keyword" href="http://d.hatena.ne.jp/keyword/VB.NET">VB.NET</a>に至っては<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>型言語で<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>の操作方法とか，子供にとってはやたらと煩雑な学ぶべきコトが多すぎて，おおよそ初学者向けとはいえない．<br />
わたしが個人的に優れた初学者向けコンピュータ言語と考えるのは，幼稚園児や小学生向けであれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/Squeak">Squeak</a>，中学生以降でテキスト形式の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>を学ぶとしたら<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a>か<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>である．わたしが初学者向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>に求めるのは，</p>

<ul>
<li>純粋な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE">オブジェクト指向</a></li>
<li>学習の各段階で教えるべき内容に集中できる簡便さ</li>
<li>習熟度に応じて高度な内容にも踏み込むことのできる柔軟さ</li>
<li>書いたプログラム断片をすぐに実行できる対話型シェルを持つこと</li>
<li>今日の主要<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>と近い文法を持つこと (Cや<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>を読んで雰囲気を掴める程度)</li>
</ul><p>である．<br />
<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a>，<a class="keyword" href="http://d.hatena.ne.jp/keyword/VB.NET">VB.NET</a>が失格なのは，対話型シェルを持たず，<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>の操作方法が煩雑であること，<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>型の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>であること，最初にパッケージやクラスの宣言が必須なこと，<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>など業務アプリ構築用につくられていて遊ぶには楽しくないことなどである．<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a>は対話型シェルを持っているし，まず処理そのものを記述し，次に関数(<a class="okeyword" href="g:mohican:keyword:メソッド">メソッド</a>)を使って構造化し，最後にクラスを使ってモデル化する，という順で教えることができる．<br />
とはいえ幼稚園児や小学校低学年では，そもそも記号操作そのものができる子とできない子とで開きもあるし，プログラムを書く作業そのものが楽しくない．だから<a class="keyword" href="http://d.hatena.ne.jp/keyword/Squeak">Squeak</a>でお絵描きの延長線上でプログラミング環境に親しんでもらい，絵を描いて満足する子はそれでいいし，Hacker予備軍はeToysでプログラミングの醍醐味を知って，なにげに<a class="keyword" href="http://d.hatena.ne.jp/keyword/Smalltalk">Smalltalk</a> Browserを開いて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE">オブジェクト指向</a>の神髄に触れて欲しい気もする．とゆー訳で我が家では長男や次男が<a class="okeyword" href="g:mohican:keyword:PC">PC</a>にログインすると自動的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Squeak">Squeak</a>が立ち上がる設定にしているのであるが，相変わらず適当な絵を描くばかりだし，最近は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Squeak">Squeak</a>を閉じて<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Earth">Google Earth</a>をグリグリやっている時間の方が長いようだ．<br />
C, <a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a> Script, <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>あたりは微妙に違うけど，一つ覚えれば他の言語も眺めているだけで雰囲気を掴める程度に似た言語であって，この手のALGOLの末裔というかCの亜種をひとつ覚えたら，次は<a class="keyword" href="http://d.hatena.ne.jp/keyword/LISP">LISP</a>とか<a class="keyword" href="http://d.hatena.ne.jp/keyword/Prolog">Prolog</a>，<a class="keyword" href="http://d.hatena.ne.jp/keyword/Haskell">Haskell</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/OCaml">OCaml</a>とか，全く違う系統の言語を齧ってみるのもいい気がする．プログラミングというのは実はもっと<a class="okeyword" href="g:mohican:keyword:奥が深い">奥が深い</a>のに，ある種の商業主義の結果として，Cの亜種ばかりが幅をきかせていることを理解できるだろう．言語仕様の単純さや教科書のことを考えると，ここしばらく<a href="http://blog.hatena.ne.jp/higepon/">id:higepon</a>が勉強している<a class="keyword" href="http://d.hatena.ne.jp/keyword/SICP">SICP</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>なんかが面白いんじゃないだろうか．<a href="#f-cef4d1a0" name="fn-cef4d1a0" title="僕の本棚にあるSICPは飾りです．偉いさんにはそれが分からんのです．ごめんなさい">*1</a><br />
Guy Lewis Steele Jr.はたまたま青学の井田先生のゼミで8年くらい前に会ったことがあるんだけど，<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scheme">Scheme</a>という素晴らしく<a class="okeyword" href="g:mohican:keyword:エレガント">エレガント</a>な言語をつくった後に，<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>のような<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%B8%C0%B8%EC">C言語</a>屋も<a class="keyword" href="http://d.hatena.ne.jp/keyword/Smalltalk">Smalltalk</a>屋も納得してスムーズに入れる現実的な言語をつくって，あー世の中，天才っているんだなー，と．<br />
どっちにしても今時のオープン系で一般に使われている言語なんて大概は同根で，あんまり細かい差異を問うても不毛という気がする．ただ，初学者にとっては敷居が低ければ低いほどいいし，教育用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>の在り方という議論を抜きに，職業教育としてコンピュータ言語が取り上げられがちな現状には危惧を覚える．「<a class="okeyword" href="g:mohican:keyword:とりあえず">とりあえず</a>，よく使われているからCとか<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>」ではなく，「教えるべき概念は○○と××で，そのカリキュラムに適しているのは△△」といった順番で考える必要があるだろう．まぁOSの中身を教えるには事前にCを学んでおいて欲しいとか，その手の依存関係もあるんだけど．<br />
僕は自分の子供には，敷居が低く美しく奥の深い言語から触らせるし，これから勉強するひとに対しても，できるだけ彼らが<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>の操作方法とか細かい言語仕様といった枝葉末節ではなく，データ構造や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>といったプログラミングの本質に近いところで悩めるような教育が行われることを切に願う．また，<a class="okeyword" href="g:mohican:keyword:いわゆる">いわゆる</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%BF%A1%BC%A5%D7%A5%E9%A5%A4%A5%BA">エンタープライズ</a>・アプリケーション開発での開発生産性だけでなく，そういった教育用言語としても，言語間で健全な競争や技術革新が行われることを望む．</p>
<blockquote cite="http://naoya.g.hatena.ne.jp/naoya/20060504/1146754891" title="naoyaグループ - naoyaの日記 - Perl の学習コスト"><p>自分の体験から行くと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a> をやる前までは OO とかサパーリわからんでした。そんなわけで OO の学習には <a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a> はとてもいい気がする。言語仕様も小さいし、テキストも豊富だし。</p>
</blockquote><div class="footnote">
<p class="footnote"><a href="#fn-cef4d1a0" name="f-cef4d1a0" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">僕の本棚にある<a class="keyword" href="http://d.hatena.ne.jp/keyword/SICP">SICP</a>は飾りです．偉いさんにはそれが分からんのです．ごめんなさい</span></p>
</div>
