ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2013-06-13

プログラミングを教育する前に必要なこと

Rubyの作者、我らがMatzが政府がプログラミングを義務教育にしようとしていることに対して苦言を呈している。Matzが指摘している問題点は3つ。

  1. 誰が教えるか。あるいは教えることが出来る教師は揃っているのか。
  2. どのように評価するか。プログラミングは芸術に近いのにどうやって点をつけるのか。
  3. 何を教えるか。

詳しいことは元記事を見て頂きたい。もちろん私はMatzの苦言には大いに賛同している。正直政府は無計画にキャッチーなネタをぶちあげているだけにしか見えない。だが、コンピュータについての教育は一切役に立たないのかというと、そうでもないように思う。dankogai氏がMatz氏の記事を受けて、コンピュータを遊び道具として置いとけみたいなことを書いてるけど、それもどうかなと思う。遊び道具として置いといたところで、自発的にプログラミングをしようと思う子供などほとんど居ないだろう。せいぜいゲームで遊ぶか、みんなエロサイトを覗いて喜ぶ程度ではないだろうか。

そこで、今日は「子供に何を教えるべきか」ということについて提言をしてみたい。

コンピュータそのものについて教えろ!

いきなりプログラミングそのものについて教えることには反対だ。なぜなら、プログラミングはコンピュータがどうなっているか、つまりその構造について知らなければ理解できないからである。プログラミングは、組み込みやデバイスの操作、通信などを除けば、コンピュータ上のリソース(メモリやディスク)に対する操作に終始している。コンピュータにはどのようなものがあって、それを操作するにはどうすれば良いか。それで何ができるかということについてまずは理解しなければ、プログラミングは難しい。

「どのように何かをするか」という以前に、そもそも「何ができるか」「そこに何があるか」を知らなければならない。それは何も低レベルの(ハードウェアに近い)分野に限った話ではない。高度に抽象化されたJavascriptを用いたウェブページ上の開発であっても、HTMLがどのようなものであるかを知らなければそれをどう操作できるか、それ以前に「一体何を表現できるのか」ということすら分からないだろう。

つまり、プログラミングを教える以前にきっちりと「コンピュータの使い方」あるいは「構造」を学ぶ必要があると思う。

コンピュータとは一体如何なる存在なのか。つまりハードウェアの動作原理に関わる知識がまず最初に必要であろう。CPUはどのように命令を実行するか、レジスタとは何か、メモリとは何か、ディスクとは何か。

次にOS上で扱える仮想的なオブジェクトにはどのようなものがあるのか。ファイルとは何か、ユーザーとは何か、プロセスとは何か、パッケージとは何か等々。

そして種々のアプリケーションの使い方。ファイラー、エディタ、ブラウザ、ゲーム等。エディタはどれにすべきかという話になると不毛な論争に終始するのでその話題にはあまり触れず、せめて文字コードがどのように表現されるかということついては教えておきたいように思う。

それらが分かってようやく、じゃあ「アプリケーションを開発するにはどうすればいいか」というステージに移れるのではないだろうか。つまり開発環境についての教育である。どんな道具があるのか、それで何を実現できるかが分からずに、方法だけ教えても徒労に終わるだろう。

数学の知識

当然ながら、コンピュータを理解するには、そしてプログラミングができるようになるには数学あるいは算数の知識が必要である。電卓があれば高速に計算できる技能は不要だが、それでも四則演算をするとどのような結果が得られるかについて知っている必要はあるだろう。分野によっては集合や代数の知識が必要になる(例えばデータベースでは)が、それよりも何よりもまずコンピュータを理解するには二進数が何かということを理解する必要があるように思う。でなければ「ビット」という概念について説明ができないからだ。

パンを作りたければまず小麦を育てなければならない。それと同様に、「プログラミング」ができる人を育てたいなら、まずはその前提知識となる数学のカリキュラムを工夫すべきではないか。

英語の知識

プログラミングをするなら、基本的な英単語が分かってからのほうが良いと思う。なぜなら、プログラミング言語は多くの場合英語で表現されているからだ。

main、int、float、try、catch、begin、end、use等々。(intやfloatは省略形ではあるが。)少なくともこういったキーワードとして使われている単語の意味がわかったほうがプログラミングに有利であることは疑いの余地はない。

プログラミングを教えるなら、こういった前提知識を教えてからでも遅くはないだろう。

OSの選定

学校教育で「コンピュータの仕組み」について教えるならばオープンなOSを選ぶべきであり、WindowsやOSXは除外しなければならないという点だけは主張しておく。今ならやはりLinux一択ではないだろうか。

「社会に出てからは圧倒的にWindowsばかりになるからWindowsにすべきだ」という意見もあるだろう。だが、この意見は以下の2点の反論をしたい。

まず、プログラマーは非Windows率が高いという点だ。プログラミングの教育が最終目標であるならばこの点は見過ごせない。IT系の勉強会にでかけると、Macユーザー、Linuxユーザーが数多く居る。見たことがない人は驚かされるだろう。

そして、コンピュータには代替の手段が数多く存在するということを教えられる。WindowsでもLinuxでも同じことができるということである。特定の環境でしか何かができないというのは、コンピューティングの本質ではない。反対に、Windowsでしかできないことがあるということも実感できるだろう。これも大事な教育である。

教育とはショートカットであるべきだ

dankogai氏のように「学校"教育"なんて役に立たない」という意見にも一定の説得力はある。学校は万能ではないし、何よりも学習の主体は学校ではなく生徒だ。生徒自身が能力を伸ばさなければ、教育というものには何の意味もない。それでもなお、私は教育というものには一定の価値があると考えている。

すなわち、教育とはショートカットであるべきだ。

全てを独学で学び、学校など要らないという人も居るだろう。だがそれは稀有な存在であり、世の中は圧倒的に何らかの指導が必要な人のほうが多い。だいいち、独学といっても一切何の知識もなくコンピュータに触れているだけでプログラミングができるようになるわけではないだろう。(一台のコンピュータとともに1年間幽閉されていればプログラマーになれるだろうか?)独学をする上でも必ずたくさんの書籍のお世話になっているはずだ。先人の知恵がなければ、コンピュータについて理解し、プログラミングができるようになることはないのである。

そして、独学で学ぶということはとてもコストが高い。書籍には良書もあれば薄っぺらい内容のものもある。手当たりしだい読むのも良いが、それにはかなりの時間と資金が必要である。「そのぐらいの対価を支払う気概がなければプログラマーになんかなれない」という意見もあるだろう。苦労して回り道しなければ本当に理解することなどできないという人もいる。しかしそれらは根性論ではないか。当然根性は必要である。だがそれはどんな分野であっても同じことだろう?

回り道をすることで得られるものもある。だが、それは「多くの人材を育てよう」というコンテキストで語られることではないように思う。(多くの人が回り道ばかりしていたら世の中は進歩するだろうか。)同じレベルの知識やスキルを身に付けるならば、より短い時間で、少ないコストでできるに越したことはない。回り道よりもショートカットしたほうがレースでは有利なのである。

自分が若い頃にそのようなショートカットがあればどれだけ良かっただろう。そう思わずには居られないのである。

2 コメント:

Unknown さんのコメント...

日頃より拝読させていただいている者です。

今回の貴方の記事に関しては非常に残念だと感じました。

>>すなわち、教育とはショートカットであるべきだ。

申し訳ないですが、極めて頂けません。
なぜそのような功利主義的発想になるのでしょう?

「学ぶ」事の最大の成果はそのエクスペリエンスにあると考えます。
(決して結果より過程が重要と申し上げている訳では
無いです。「成し遂げる」という事を求められる境涯に至る前の
段階では様々な「経験」が貴重だと申し上げている)

従って、私は小飼氏の意見に大いに共感しますし
貴方ほどの人物がそこを理解しないことを残念に思います。

Mikiya Okuno さんのコメント...

freeradius rsync さん

コメントありがとうございます。

> なぜそのような功利主義的発想になるのでしょう?

突き詰めればそうなるということです。特に基礎学習はショートカットに他ならないと私は思っています。0という概念を発見したのはインド人ですが、今日我々はそれを再発見するのではなくただただ学校で習います。発見は素晴らしいことですが、皆がそれをしていては学べる範囲は広がりません。学習をショートカットするメリットは、より多くの範囲の物事を知り得ることです。学びに使える時間は限られていますので、より多くのことを学ぼうとするなら近道を通るというのが良いと思います。

私はこれまで様々な本を読んで来ました。それは先人の知恵を拝借して手っ取り早く知識を得るためであり、なおかつ未知の知識を得るためでもあります。そのショートカットがなければ私にはその知識は得られなかったでしょう。そういった意味では、先人の知識を拝借するのはすべてショートカットであると思います。特に義務教育の範囲で教える内容はショートカットであるべきです。

あと、書き方が悪かったですが、小飼氏のいうように「自由に使うこと」を否定しているわけではありません。それをする前にやることがあるだろうということです。例えば絵の描き方を教える場合でも、単に絵の具と紙を与えるだけでなく、色の作り方、濃淡の付け方、塗り方などの基礎知識を与えれば、それらを使いこなして絵を描くことができるでしょう。

ただ与えるだけでも中には上手に「絵を描く」子供も出てくるでしょう。しかしそれは一部の天才だけです。人間誰もが天才であるというわけではありません。凡人にはショートカットして背中を押してあげたほうが良いと考えています。そうすれば凡人でもより高度な楽しみ方ができるでしょう。

プログラミング(ないしはコンピュータの使い方)であっても、基礎的な概念や使い方を教えたほうが、より応用した使い方をできると考えています。効果的に学習したいなら、順序良く学んだほうがいいです。(他に例えるなら、四則演算を教える前に方程式を教えても無駄だということです。)それがこのエントリの主旨です。

最後にひとこと。こういうふうに考えるのは私の経験則であって、絶対に正しいというわけではないということは重々承知しております。私は凡人なのでこのような考え方に立っているのだと思います。あなたのエクスペリエンスこそ大事だというのもひとつの考え方だと思います。そして世の中には両方の視点が必要であると思います。

コメントを投稿