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

カスタム検索

2013-08-13

プログラミングは「教わる」ものか、「学ぶ」ものか?

人気ブログ、Life is beautifulの著者である中島氏が、『プログラミングは「教わる」ものか、「学ぶ」ものか?』というお題に対して回答を述べている。回答の要旨はこうだ。

わたしの答えは、「“教わる”のではなく“学ぶ”もの」です。

わたし自身が、独学でやってきましたから。高校生のころ、『TK-80』を組み立てて初めてプログラムを書くようになってからずっとです。大学ではプログラミングを“教わる”授業も受けましたが、残念ながら仕事には何も役に立ちませんでした。

社会人になってMicrosoftでWindowsの開発にかかわった時も、まずやったのはひたすらソースコードを読む作業。誰かにプログラミングを教わったという記憶がありません。

正直なところ、この回答には異論があるし、これからコンピュータについて学ぼうとする人にとっても弊害があるように思うので、今日はそのことについて語ろうと思う。

明確な答えはない

当然ながら、論理的(あるいは論理学的)には当然「プログラミングは"教わる"ものか、"学ぶ"ものか」という問いに対して明確な答えを出すことは出来ない。どちらが良いかということを導出することのできる公理など存在しないからだ。

「“教わる”のではなく“学ぶ”もの」というのがひとつのアプローチであるのは間違いない。だが断言してしまうのはどうか。中島氏個人の経験から「学ぶ」というアプローチが有効だったというのは理解できるが、それが常に「真」の命題であるかというと、そうではないだろう。様々な条件によって「教わる」のが良いケースと「学ぶ」のが良いケースがわかれるだろう。どちらのほうが良いアプローチかをという問いに対してある種の答えを出すには、統計学的に「教わった」場合と「学んだ」場合にどちらのほうが優秀な人材を排出できるかを調べなければならない。そうやって出した答えですら、あくまでも統計学的に有意な回答であって真理ではない。

自身の経験だけに頼って断言してしまうのは危険ではないか。

個人差がある

「教わる」のと「学ぶ」のとどちらが良いのかということを決める上で、一番大きな要因は個人差だろう。自分で「学び」ながら知識を吸収するのが得意な人も居れば、「教わる」ことで内容をよく咀嚼できる人も居るからだ。

前段で“教わる”ものではないと書いたように、プログラミングとは常に「解き方そのものを考える」作業なので、算数の鶴亀算に近いところがあります。

とこのように中島氏は仰るけれども、鶴亀算だって自分で考えて解ける子供と教わって初めて解ける子供に分かれるだろう。鶴亀算が苦手でも通過算なら分かるという子供だって居るかも知れない。個人差というものを考慮しない議論は危険である。

時代背景が違う

中島氏が独学でTK-80上でプログラミングを「学んだ」頃と今では時代が違う。今は誰でも安価に、そして手軽に高性能なパソコンあるいは開発環境が手に入るし、様々な有益な書籍も多数販売されている。書籍による学習を「学ぶ」と捉えるか「教わる」と捉えるかという議論はあるが、書籍は著者から内容を教わっているのだという見方を否定しなければならない理由はない。今はQ&Aサイトも多数あり、質問すると見知らぬ人がわざわざ「教えて」くれたりする。勉強会も活発に行われているが、当然そのような会合に参加するのは「人から教わる」ということである。勉強会で仲良くなった人に教えを乞うたり、意見を交換するといった活動も有意義である。

手に入る道具が異なれば、もちろん取るべき戦略も異なってくる。スキルを身につけたければありとあらゆる手段をフル活用するべきだ。あえて「学ぶ」という方法だけに限定するべきではない。

目的によって答えは異なる

プログラミングのスキルを身につけると一言で言っても、最終的なゴールは様々である。稀代のスーパーハッカーを発掘したいのか、それともそこそこのスキルを持った多くのプログラマのレベルを底上げしたいのかによって、取るべき戦略は異なるだろう。

いずれにしても、自身のスキルを向上させるためには勤勉でなければならないが、「どのような努力をするか」は「何を目標にするか」次第だと言える。私の場合は天才でも何でもないので、自身のレベルの底上げに勤しむ日々である。

日本のプログラマの現状

よしんば中島氏のようなスーパーハッカーになったところで、日本の社会では活躍する場が少ないという問題がある。ITゼネコンと呼ばれるようなIT産業構造、ノリが完全に体育会系のベンチャー企業では、立派なスキルを身につけても活かしきれない場合が多いのではないだろうか。そのような状況下では、「スーパーハッカーになろう」というゴール設定が困難であるかも知れない。

「教わる」のが適した分野

以前、プログラミングを教育する前に必要なことというエントリで語ったが、コンピュータそのものの仕組みというのは「教える」のに適したテーマであると思う。何故ならば、コンピュータの仕組みは単に「どうなっているか」を説明すればよく、「解き方」は要求されないからだ。アーキテクチャを考える側に立てばどのような設計にするかということについて議論が必要だろうが、基礎だけであれば論旨がブレることもない。さらに興味が出てくれば「なぜそのようなアーキテクチャになっているか」ということについて、自分で調べることもできる。

コンピュータアーキテクチャについての知識はプログラミングをする上で大きな武器となる。プログラミングをいきなり教えるのもひとつのアプローチかも知れない。しかしプログラミングをする上で基礎となるコンピュータの仕組みを教えるというのも疎かにしないで欲しいと思う。

なお、プログラミングは技術なので評価は難しいが、コンピュータアーキテクチャについての「知識」は評価が比較的容易であるということを特筆しておきたい。試験ができるというのは、学校教育に組み込みやすいはずだ。

まとめ

効果的なスキルの身につけ方は、個人差や状況によって大いに左右される。どのような学習方法が良いかを探り当てるには試行錯誤が必要だろう。コンピュータが好きでコンピュータの道を志そうと思うなら、興味の湧いたことを色々やってみるのがいい。学校で教えるカリキュラムをどうするべきかという点についても、様々な実験が必要になるだろうし、常に時代に合わせてアップデートしていかなければならないだろう。

自身の学習について、常に最適なアプローチを選択するのは難しい。日々試行錯誤の連続である。ただし一つだけ言えるのは、スキルを身につけるには「教わる」にしろ「学ぶ」にしろ、実行することが不可欠であるということだ。我々は日々努力を怠らないようにしたいものである。

0 コメント:

コメントを投稿