2015年9月2日
私が挫折を繰り返したのちにコーディングを習得するに至った経緯
本記事は、原著者の許諾のもとに翻訳・掲載しております。
Project Eulerは、プログラミングを楽しく段階的に学ぶ手段を提供するWebサイトです。
Colin Hughesが11歳くらいの時、彼の両親は何とも変わったおもちゃを家に持ち帰りました。それはカラフルでもなく、漫画のようなものでもありません。レーザや車輪、点滅するライトが付いているようにも見えませんでした。しかも、そのおもちゃの箱に描かれていたのは、カッコいい主人公や悪役の姿ではなく、箇条書きの文とQWERTYキーボードの絵でした。そのおもちゃの名は、「ORIC-1 Micro Computer」です。中にはカセットテープが2つと、数本のコード、そして130ページに及ぶプログラミングのマニュアルが入っていました。
どう考えても、11歳の少年には最悪のプレゼントでしょう。それでも彼の両親は129ポンド(当時の為替レートで約4万5000円)以上するものを買ったという理由もあって、とにかく使ってみるよう息子に言い聞かせました。そしてColinは両親の言うとおりにしました。彼はその時のことを、「まるで二度と抜け出せない穴に吸い込まれたようだった」と語っています。
Colinがそう言った理由はよく分かります。これは1983年の話で、ORIC-1の計算能力は今の目覚まし時計くらいしかありませんでした。それでもORIC-1には人を引き付ける、何か不思議な魅力があったのです。電源を入れると、画面には”Ready”の文字と、その下で点滅するカーソルが表示されます。その画面は、いつでも誰でも歓迎する招待状のようなもので、ユーザは何かキーを打って反応を待つのです。
ORIC-1のマニュアルに従えば、”hello”という文字を出力するところから始めて、1時間以内にBASIC(初心者向け汎用記号命令コード)で短いプログラムを書けるようになります。デジタル音楽を再生したり、画面上に面白い絵を無作為に描画したりするプログラムです。そしてユーザがより高度な内容に挑戦したいと思った場合のみ、マニュアルはその方法を示してくれます。
ORIC-1が非常に魅力的だった理由に、”命令を打ち込むと素晴らしいことができる”という必要最小限の形になるまで、コンピュータを簡素化したことが挙げられます。ORIC-1によって、コンピュータの本質的なマジックがあらわになったのです。どういうわけか10行から20行のコードが音に変わり、ORIC-1はひとかたまりの文字列に命を吹き込んでいるかのようでした。
Colinが夢中になるのもうなずけます。実際、ORIC-1自体はおもちゃではありませんが、おもちゃを作り出すことができるものです。必要なのは特別な青写真だけでした。
彼はひとたびBASICを習得するとすぐ、自分で簡単なコンピュータゲームを作るようになりました。続けて、ゲームを改良するために三角法や微積分学、ニュートン力学を独学で勉強しました。また重力や摩擦、粘性をモデル化する方法も学び、ゲームにおいて賢い敵を作成する方法を習得したのです。
これらの内容に加え、Colinは教え方も学びました。そして専門知識がないにも関わらず、彼はORIC-1やマイクロコンピュータなどを通じて、若いころから、ある種のセンスを身につけていきました。それは、分かりやすさと複雑さ、制約と無制約などの適切なバランスをつかむセンスです。こうして何も知らなかった生徒は、先生すら追い越し、予想に反して誰よりも早く熟達の域に近づきました。
このセンスが役に立ったのは、彼が数年後に Project Euler を立ち上げた時のことです。この一風変わったWebサイトは、これまで何万人もの新人プログラマを鍛えてきました。Project Eulerは控えめな存在でありながらも、教育における革命の始まりを象徴しています。
2000年代初頭、中学校から高校へ上がる頃に、私はどうしてもコードを書いてみたくなりました。それはまさに”猿まね”のような衝動でした。当時、私がよく見ていたのはTechTVというケーブルテレビ局の番組です。TechTVはコンピューティングやガジェット、ゲーム、Webに焦点を当てていて、派手さはないものの非常に人気がありました。もう1つ夢中になったのはアンジェリーナ・ジョリー主演の『 サイバーネット 』という1995年公開のカルトクラシック映画です。この映画では、サイバー犯罪の濡れ衣を着せられた10代の天才ハッカーたちが、真実を明らかにするために戦う様子が描かれています。
そんな世界に憧れていた私は、ある行動に出ました。皆さんのご想像どおり、無駄に熱意がある偏屈な愚か者が取る行動です。私は母親に頼んで、車でショッピングモールまで送ってもらい、Ivor Horton著の『 Beginning Visual C++ 6 』という重さ2キロの1,181ページもある本を買ったのです。当時私が想像していたのは、まるで合成映像のようにその本を読み進め、1章ずつ順調に専門知識を習得していく自分の姿でした。
ところが実際は、1週間で燃えつきました。この教科書は、内容が濃く淡々としていて、演習問題が難しかったのです。そして間違いなく今まで読んだ本の中で、更に言えば今まで経験したことの中で一番つまらないものでした。そして私は、その本を手に取った時と同じくらい素早く、それを手放しました。
驚くべきことに、私はこのサイクルを数回繰り返しました。プログラミングをしている人を見ると格好よく思えて、自分も勉強をしようと決意しては本を探し、内容が難しくなるとすぐに挫折していました。
私はしばらくの間、自分の頭ではプログラミングは無理なのだと考えていました。もっと数学ができて、賢くないとダメだと思っていたのです。
ところが実際は、教わる私の問題ではなく、指導側の問題であることがわかりました。一連の構造化された原理で読者を振り回すような本は、最悪な本です。そんなものは無視して、単純に楽しめば良かったのです。
この事実を誰よりも理解していないのはアメリカのカレッジ・ボードです。カレッジ・ボードには、AP Computer Scienceという高校のカリキュラムを決める責任があります。APカリキュラムは、プログラム教育の在り方を示すモデルにならなくてはいけません。ところが実際は、本来は面白い内容が、いかにして退屈で辛い道のりに変わってしまうかを示す好例になっています。
画像訳:
Ⅰ. オブジェクト指向プログラム設計
ソフトウェア(コンピュータプログラム)設計における全体目標は、与えられた課題を正確に解くことである。また理解しやすく、状況変化に適用でき、全体的もしくは部分的に再利用可能なプログラムの指定と設計も目標に含まれる。設計プロセスは、解決すべき課題を完全に理解した上で進めなくてはならない。
A. プログラム設計
- 課題の内容と目的、目標を読み理解する
- データを抽象化、カプセル化する
- クラスの仕様とクラス間の関係(is-a関係、has-a関係)を読み理解する
- 与えられたクラス階層を理解して実装する
- クラスとクラスライブラリを用いた既存コードから、再利用可能なコンポーネントを特定する
B. クラス設計 - クラスを設計し実装する
- 適切なデータ表現とアルゴリズムを選択する
- 機能的な分割を行う
- 継承により与えられたクラスを拡張する
Ⅱ. プログラムの実装
プログラム実装の全体目標はプログラム設計と同様である。共通の要求事項を満たすクラスは、他のプログラムでも容易に再利用できるよう設計しなければならない。オブジェクト指向デザインはプログラム実装において重要な要素である。
A. 実装技術 - 方法論
a. オブジェクト指向開発
b. トップダウン開発
c. カプセル化と情報隠蔽
d. 手続きの抽象化
B. プログラミング構成 - プリミティブ型とオブジェクトの対比
- 宣言
a. 定数宣言
b. 変数宣言
c. クラス宣言
d. インタフェース宣言
カレッジ・ボードはこの科目の授業内容を決める際、トップダウンアプローチを取ったのではないかと思います。恐らく、どこかの部屋に集まり、”この学科で終了の際、何を習得できているべきか”を話し合ったに違いありません。まず、コンセプトや専門用語、コードや暫定的な試験問題などをリストアップし、それらを”モジュール”化し、一連の説明に続く演習問題を作成したのだと想像します。そして、完成した学科を教師に与え、教師としてはそれを忠実に守るしかなかったのだと思います。
プロセスがどうであれ、高校の数学教師であるPaul Lockhartは、カレッジ・ボードの作成した授業は悪夢であると、高校での数学の授業の残念な現状況を自身の書いた小冊子『 A Mathematician’s Lament(数学者の嘆き) 』で雄弁に語っています。ここで語られていることは、プログラミングにも当てはまります。
Lockhartは、多くの”題材”を”取り上げ”ようとする教育者の思惑が、楽しい問題を楽しくない問題にしていると解説し、現行のシステムが教育の弊害を及ぼしていると言っています。
下の図を見てください。
長方形の中で三角形の占める割合を考えるのは面白いのではないでしょうか。3分の2でしょうか。少し考えてみてください。
答えを出すのに苦労されている人は、本当の意味で数学を勉強していないからです。つまり、簡単な図形を使った自由回答問題を解く勉強をしていないということです。そうした問題を解くには大変な努力を必要としますが、楽しくもあります。忍耐力や創造力、また、あらゆるところで洞察力が必要になります。どちらかというと、教科書のつまらない問題を解いているというより、パズルを解いている感覚です。
時間をかけて考えれば、下のように、長方形を2分するという賢いアイデアが浮かぶかもしれません。
これで長方形は2つになりました。両方の長方形が、三角形の一辺によって半分になっているのが分かります。つまり、三角形の中と外の空間が同じであるため、元の三角形は長方形の半分を占めていると結論づけることができます。
これが数学であり、数学の感触です。この、多くを語らないということが、数学者の芸術の一例です。つまり、架空の創造物について単純で洗練された質問を投げかけ、納得のいく美しい説明を作り上げるということです。このように純粋なアイデアの分野は他にありません。面白く、楽しく、自由なのです。
しかし、学校の数学とは感じが違います。創造力の過程はひっくり返され、創造力は損なわれています。
これだから、学校で履修されている数学を見るのは心が痛むのです。豊かで素晴らしい想像の冒険は、不毛な”事実”の暗記や公式の解き方の方法にまとめられてしまっています。図形に関する単純で自然な質問、やりがいのある発明や発見のプロセスを踏む機会の代わりに、生徒に与えられるのは次のようなものです。
(三角形の面積の公式: A=1/2bh)
“三角形の面積は底辺の2分の1かける高さ”です。生徒はこの公式を暗記し、”練習問題”で繰り返し”応用”しなければなりません。創造することのスリルや喜び、痛みや苦しみまでもが失われます。これでは、問題を解いているといえません。問題と答えが同時に与えられているのですから、生徒はこれ以上やることはありません。
私の場合は、大学1年の時に見つけた単純な問題のおかげで、ハッカーになろうという努力にブレイクスルーが訪れました。
10より小さい自然数のうち3の倍数または5の倍数を全て挙げると、3、5、6、9である。これらの和は23である。
1000より小さい自然数のうち3の倍数または5の倍数の和を求めよ
このパズルが私をプログラマにしてくれたのです。これは、Project Eulerの 問題1 でした。また、これはORIC-1を学び小さなイギリスのグラマー・スクールの算数の先生となり、そして、無数の私のような未熟者の師匠となったColin Hughesが2001年に出題したものです。
問題自体はLockhartの三角形の問題によく似ています。全くの初心者の気を引くことができるほど単純な問題ではあるものの、考えられるよう適度に難しくしています。
これの素晴らしいところは、プログラミングをしたことがない人やプログラミングとは何かさえ知らない人でも、3時間以内にこの問題を解くコードを書くことができるようになることです。実際に目撃しました。必要なのは渇望だけです。答えが欲しいと思うだけで良いのです。
これは教育の上でも重要な要素で、生徒に答えを出したいと思わせなければなりません。後は、教師はヒントや質問に対応できるようにすれば良いのです。”教えることが少ない生徒ほど、良く学ぶ”のです。
ORIC-1の前に子どもを座らせるようなものです。子どもは、本来好奇心が強いものです。子どもは、砂場やLEGOブロックのように、自分で何かを作り出さなければならない白紙状態が好きです。子どもにそのマシンで何ができるのかをちょっと見せるだけで、他に何ができるか強く興味を持つはずです。丸のサイズを少し小さくしたり、歌のスピードを少し速くしたりする方法を知りたくなります。頭の中で想像したゲームを実現するためにとことん努力するでしょう。
もちろん、その過程でそもそも教えようとしていた全ての概念を学ぶことになります。学んだ概念は、ただ教えられたのではなく、解きたい問題に取り組む過程で教わったことなので、忘れることはありません。
スイスの数学者であるLeonhard Eulerにちなんで名付けられたProject Eulerは、Colin Hughesや厳選された8、9名で構成されたチームが、解かずにはいられない問題を作成し提供しています。そのため、人気があります(150,000人以上のユーザが2,630,835の解決策を提出しています)。ORIC-1のユーザマニュアルのように問題がまとめられているため、教科書としてはとても役立ちます。Hughesはこれを”帰納的な連鎖学習”と呼んでいます。
問題の難易度には幅があり、問題を解く経験は学習を連鎖的に誘導します。つまり、問題を1つ解くことで新しい概念を知ることになり、それまで手の届かなかった問題に着手することが可能になるのです。そのため、Project Eulerの参加者は、ゆっくりではありますが、確実に全ての問題を解いていくことができるのです。
このアイデアはゲームデザイナの間で良く知られています。プレイヤーにゲームを最高に楽しんでもらう方法は、常にプレイヤーの能力の限界まで難しくすることなのです。こつは、レベルの難易度を段階ごとに上げていき、前のレベルよりも次のレベルを難しくすることです。新しいスキルを難易度の低いレベルで紹介し、失敗のしにくい場面での実演を見せて、難易度の高いレベルで適応できるようにするのです。この時、プレイヤーはそのスキルを使えるようになるまで、進むことはできません。この結果、学習曲線は緩やかに上昇します。
Project Eulerは、出題順がよく考えられた340(訳注:現在は500以上)の面白いコンテンツを備えたビデオゲームのような構成になっていて、魅力があります。 このように 1ページに1問が出題されています。例えばこの問題では、モノポリーを(6面のサイコロではなく)4面のサイコロでプレイする際に、最も止まりやすいマスのトップ3を見つけ出します。問題文の最後には、解答を入力できる欄があり、通常、答えは1つの整数になります。”ルール”は1つだけで、問題を解くために使うプログラムは、処理時間が1分以内でなければいけない、ということだけです。
更に素晴らしい特徴が1つあります。問題に正解すると、正解者たちが解決方法をシェアするフォーラムにアクセスできるのです。正解できるレベルに達するほど、既に問題を十分に理解していますから、新たなアイデアを仕入れるにはもってこいの機会です。
多くの経験豊かなプログラマが、新しい言語を学ぶためにProject Eulerを利用する理由もここにあります。各問題のフォーラムは、いわばロゼッタストーンのようなものです。ごく簡単な問題について、PythonやC、Assembler、BASIC、Ruby、Java、JやFORTRANで書かれた解答を見つけられるかもしれないのです。
プログラマではない人でも、各問題のフォーラムで起きていることを見るために、Project Eulerの問題を解く価値はあります。フォーラムでは、教育者や技術者、ジャーナリストたちが何十年にも渡って話題にしてきたテーマについて、何かしらの発見があるでしょう。過去9年間、フォーラムはProject Eulerのサイト上で高い人気を誇っています。フォーラムはグローバルな分散型の教室であり、自己学習をする人々を育むコミュニティです。ここでは年配者から若者まで、200を超える国からの参加者が発見の喜びを分かち合っています。
この方式は、世の中に広がりつつあります。遊び感覚で取り組める、ボトムアップ的なこのやり方がプログラミングを学ぶ最高の方法だとしたら、他の分野でも同じことが言えるのではないでしょうか? 英語や生物学におけるProject Eulerも可能ではないでしょうか?
たぶん可能でしょう。ただし実際問題として、プログラミングが非常に特殊な活動であると理解することは、役に立つと思います。プログラミングには、際立った特徴が2つ挙げられます。
1つ目の特徴は、プログラミングにはもともと中毒性があるということです。コンピュータは、実に高速です。1980年代においてでさえ高速でした。つまり、プログラムを変更してから結果を確認するまで、ほとんど時間がかからないということです。そのような短時間のフィードバックのサイクルは、心理的に大きな影響を与えます。数分毎に、ささやかな見返りが得られるのです。恐らく、少量のドーパミンが分泌されるのでしょう。解決策を見つけては微調整、見つけては微調整という繰り返しにより、プログラムは少しずつ改良され、心に描いていた形に近づいていきます。
これは重要なことです。なぜなら、学習とは難しい問題を解決することが全てであり、難しい問題を解くというのは、あきらめないことが全てだからです。ですから、取りつかれたような興奮状態で、何時間も問題に取り組むきっかけを与えてくれるマシンは、実に効果的な学習ツールと言えます。
2つ目の特徴は、1つ目とは対照的になりますが、最初に見た印象では、プログラミングにはまるで実体感がないという点です。そこには、コードがテキストであるという単純な事実があります。
例えば、パイプが詰まって流し台が壊れたとします。あなたは配管の修理人を呼ぶ代わりに、自分で修理しようと思い立ちます。パイプの状態を写真に撮ってGoogleで検索し、同じようなトラブルの解決方法を説明しているページを、5つか6つすぐに見つけられれば、実に簡単です。これだという解決策を見つけて、すぐに自宅の流し台の修理に適用できれば最高ですよね。
しかし残念なことに、それは無理な話です。Bob Villaの日曜大工のビデオをコピー&ペーストすれば、ガレージの扉を修理できるわけではありません。
ところが驚いたことに、こうした作業をプログラマは一日中行っているのです。というのも、コードがテキストだからです。
なぜ多くのプログラマが自己学習しているのかについて説明するのは、大いに役立つと思います。プログラミング上の問題の解決方法をシェアするのは簡単です。たぶん、他のどんなことをシェアすることよりも簡単でしょう。なぜなら、情報交換の媒体であるテキストがそのまま、アクションの媒体となるからです。コードはそれ自体が説明となります。実行可能な状態にするための翻訳は不要です。
プログラマはそうした利点を日々活用しています。Webの世界はコードで溢れかえっています。なぜならコードはテキストであり、テキストは安価で手軽で、簡単に検索できるからです。コピーが推奨されていて、誰かのひんしゅくを買うこともありません。初心者プログラマは、独学する必要などありません。
IBMのスーパーコンピュータDeep Blueに勝利したことで有名な、チェスのグランドマスターであるGarry Kasparovは、コンピュータによってゲームの習得方法がどのように変わってきたかについて次のように述べています。
強力なチェスのソフトウェアが急速に普及したことにより、良くも悪くも、多くの予想外の影響がありました。子どもたちはコンピュータが大好きで、コンピュータに自然に慣れ親しみます。ですから、チェスとコンピュータの融合に関して同じことが起きても驚くことはありません。大変強力なソフトウェアが紹介されたことで、小さい頃からプロのトレーナーに師事しなくても、若者たちは家庭で、トップレベルの相手と対戦することができるようになりました。今では、チェスの伝統がほとんどなく、コーチもいないような国から天才が輩出されています。
今や、チェスを学ぶ生徒は、どんな人間よりも上手にプレイする無料のプログラムをダウンロードできます。プログラムをスパーリング相手として練習し、プログラムをコーチとして学びます。重要なゲームや序盤の定跡事典として利用したり、個々の配置の高度な技術的分析に活用したりできます。自宅に居ながらにしてチェスの達人になれるのです。
このような考えは、論理的にどのように帰結するのでしょうか。文章の書き方や微分方程式の解き方、飛行機の操縦法など、何かを学ぶ最良の方法はソフトウェアをダウンロードすること、という未来を想像してみてください。現在のチェスのプログラムのように、楽し過ぎて病み付きになるような帰納的な連鎖学習によって、初心者から達人の域に達するまでサポートしてくれるのです。
そんなことはあり得ないと思う方は、私がプログラムからプログラムを学んだということについて、よく考えてみてください。そのプログラムを作ったプログラマは、やはり、25年以上も前にプログラムからプログラムを学んだのです。
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
- Twitter: @yosuke_furukawa
- Github: yosuke-furukawa