プログラミングを独習するには10年かかる


プログラミングを独習するには10年かかる

著者: Peter Norvig

日本語訳: yomoyomo、竹中明夫


以下の文章は、Peter Norvig による Teach Yourself Programming in Ten Years の日本語訳である。

本翻訳文書については、以下の方々にご教示を頂きました。ありがとうございました。

  • Kawai さん:誤訳の訂正
  • 三好博之さん:誤訳の訂正
  • 竹中明夫さん:2001年7月改版分の訳、誤訳の訂正(共訳者にクレジット)
  • Toshihiko Ono さん:誤訳の訂正
  • アクビさん:訳注3に関する情報

どうしてみんなそんなに急ぐの?

どの本屋に足を運んでも、『7日で学ぶ Java』といったハウツー本を見かけるし、そのそばには Visual Basic や Windows やインターネットなどについて、同じように数日や数時間で学べると売りこむ本が無限のバリエーションで並んでいる。Amazon.com で以下の条件で検索してみたところ、

     pubdate: after 1992 and title: days and
      (title: learn or title: teach yourself)
     (タイトルに「日」と、「学ぶ」か「独習」という単語を含む、
       1992年以降に出版された本)

248件ものヒットがあった。そのうち上から78冊はコンピュータ関連の書籍だった(79番めは『30日で学ぶベンガル語』)。「日」を「時間」に置き換えてみたところ、とてもよく似た結果が得られた。253冊がヒットし、上から77冊がコンピュータ関連の書籍で、78番目は『24時間で学ぶ文法と文体』だった。上位200冊のうち、96%がコンピュータ関連書籍だった。

結論としては、誰もがコンピュータについて学ぶのに大わらわであるか、さもなくばコンピュータというものが、他のどんなものより、学ぶのがどういうわけか信じられないくらい易しいということになる。だって数日や数時間で学ぶベートーベンやら、量子物理やら、犬の調教といった本は皆無だもの。

『3日で学ぶ Pascal』といった題名が意味するところを分析してみると:

  • 学ぶ:3日間では、いくつか意味のあるプログラムを書いたり、その過程での成功や失敗から学ぶ時間などありはしない。経験を積んだプログラマーと一緒に作業を行い、そうした環境における生活がどういうものかを理解する間もない。早い話、大したことを学ぶ時間がないということだ。よってそうした書籍は、うわべだけ精通することについて説くばかりで、深い理解にはつながらない。アレキサンダー帝が言ったように、生兵法は怪我の元なのだ。
  • Pascal:3日間で Pascal の文法を学ぶことは可能かもしれないが(類似する言語を既に知っていれば)、その文法の使い方までは十分に学べない。つまり、例えばあなたが Basic プログラマーならば、Basic スタイルで Pascal の文法を利用するプログラムの書き方は学べるかもしれないが、Pascal が実際のところ、何に向いているか(向いてないか)を学ぶことはできない。さて、ここでのポイントは何だろう? Alan Perlis[訳注1] はかつて、「プログラミングに対する考え方に影響を与えないような言語は知る価値はない」と言った。ここで考えられるポイントは、あなたが Pascal(それよりどちらかといえば Visual Basic や JavaScript などの方が現実には多いだろう)をほんのちょっと学ばなければならないとしたら、それは特定の業務を行うために、既存のツールを使う必要があるからだろう。しかし、それではプログラミングを学ぶことにはならない。その業務のやり方を学んでいるだけなのだ。
  • 3日間:残念ながら、これでは十分ではない。次項で解説する。

プログラミングを独習するには10年かかる

研究者 (Hayes, Bloom) によると、チェス、作曲、絵画、ピアノ演奏、水泳、テニス、そして神経心理学や位相幾何学の研究を含む、広範な分野のいずれについても、専門技術を身につけるにはおよそ10年かかるそうだ。近道など実在しないようなのだ。4歳にして音楽の神童だったモーツァルトでさえ、超一流の楽曲を作り出すまでに13年以上を要している。別のジャンルになるが、ビートルズが突如現れナンバーワンヒットを連発し、エド・サリバン・ショーに出演したのは1964年だった。しかし、彼らは1957年からリバプールやハンブルグの小さなクラブで演奏していたわけで、また彼らは初期から大衆の支持を獲得したが、彼らがはじめて批評的にも大きな成功を得た『サージェント・ペパーズ』がリリースされたのは1967年である。サミュエル・ジョンソン[訳注2]は、「どんな分野であれ、生涯にわたる努力なくして優れたものには達し得ない。それよりも安い代償で手に入れることはできないのだ」と、それには十年以上かかると考えた。またチョーサーも「人生はとても短く、技を習得するにはとても時間がかかる」と嘆いている。

ここでプログラミングで成功するための、私なりのレシピを紹介すると:

  • プログラミングに興味を持ち、それを楽しみのためにやること。それが十分に楽しいことでありつづければ、十年でも喜んで続けるだろうから。
  • 他のプログラマーと話をし、他人のプログラムを読むこと。これはいかなる書籍やトレーニングコースよりも重要なことだ。
  • プログラムを書くこと。学習する最良の方法は、実践による学習だ。より専門的に表現するなら、「特定領域において個人が最大限のパフォーマンスを発揮するのは、長期にわたる経験があれば自動的に実現されるというものではなく、非常に経験を積んだ人であっても、向上しようという真剣な努力があればこそ、パフォーマンスは増し得る」(p. 366) ものであり、「最も効果的な学習に必要なのは、その特定の個人にとって適度に難しく、有益なフィードバックがあり、なおかつ繰り返したり、誤りを訂正したりする機会のある、明確な作業である」(p. 20-21) のだ[訳注3]。『Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life』[訳注4]という本は、この観点についての興味深い参考文献である。
  • もし望むなら、四年間大学で(あるいは大学院に行き、更に)学ぶこと。そうすれば成績証明書を必要とする職に近づけるし、その分野についてより深い理解を得ることになる。でも、学校を楽しめないのなら、(熱意があれば)仕事をやる過程で同じような体験を得ることはできる。いずれの場合にせよ、本による学習だけでは十分ではない。「コンピュータ・サイエンスの教育で誰かをプロのプログラマーにしようとするのは、ブラシや絵の具について学ばせてプロの画家にするのと同じくらい難しい」と『The New Hacker's Dictionary』[訳注5] の著者である Eric Raymond は言っている。僕がこれまで雇った中で最高のプログラマーの一人[訳注6]は、高校までしか出てなかった。でも、彼はたくさんの素晴らしいソフトウェアを作り、今では自身のニュース・グループを持ち、ストックオプションのおかげで自分のナイトクラブを買うぐらい稼いだ。
  • プロジェクトで、他のプログラマーと一緒に働くこと。いくつかのプロジェクトで、一番のプログラマーになるか、そうでなければしんがりのプログラマーになること。あなたが一番なら、プロジェクトを指揮し、他の人達にあなたのビジョンをふきこむ能力を試す機会を持つことになる。あなたがしんがりならば、達人がやることを学び、彼らはどういういうことをやりたがらないか知ることになる(そうしたことはあなたにやらせようとするから)。
  • 他のプログラマーの後についてプロジェクトに関わること。人が書いたプログラムの理解に取り組むのだ。元のコードを書いたプログラマが近くにいなければ、そのプログラムを理解したり、直すには何が必要か考えること。あなたのプログラムを後で他の人がメンテナンスしやすくするにはどうデザインしたらいいか考えることになる。
  • 少なくとも半ダースのプログラミング言語を学ぶこと。そのうちの一つはクラス抽象をサポートするもの(例えば Java や C++)、一つは関数抽象をサポートするもの(例えば Lisp や ML)、一つは構文抽象をサポートするもの(例えば Lisp)、一つは宣言的記述をサポートするもの(例えば Prolog や C++ テンプレート)、一つは coroutine をサポートするもの(Icon や Scheme)、そして一つは並列処理をサポートするもの(例えば Sisal)であること。
  • 「コンピュータ・サイエンス」の中に、「コンピュータ」があるのを忘れてはいけない。コンピュータがひとつの命令を実行したり、メモリから1ワード読み出したり(キャッシュに入っている場合とそうでない場合と)、ディスクから連続してデータを読み出したり、ディスク上に新しいロケーションを探したりするのにどれくらい時間がかかるか知っておくこと。(答えはこちら)
  • 言語標準化の作業に加わること。それは ANSI C++ 委員会かもしれないし、身内でのコーディング・スタイルについて、インデントの空白を2文字にするか4文字にするかといったレベルを決めることかもしれない。いずれにしろ、他の人がプログラミング言語のどんなところを好きなのか、どれほど深く好きなのか、そしておそらく何故そんなに好きなのかってことも少しは学ぶことになる。
  • できるだけ早く、言語標準化の作業から離れる分別を持つこと。

以上すべてを考慮すると、本で学ぶだけではどこまで習得できるか疑わしいものである。最初の子どもが生まれる前は、私はハウツー本を全部読んでみても、自分が何も分かってない新参者に思えたものだ。30ヶ月後、二番目の子どもが生まれることになったとき、私は本で復習しただろうか? そんなことはしなかった。それどころか、私は自分の個人的な経験を信じていたし、専門家によって書かれた何千ページの本よりもずっと有能だと自信を持つまでになっていた。

Fred Brooks は、エッセイ No Silver Bullets[訳注7]において、優れたソフトウェア・デザイナーを育てる三段階を明らかにしている。

  1. できるだけ早期にトップデザイナーを体系的に認定する。
  2. 有望な人材の育成を責任を持って行うキャリアアドバイザーを任命し、綿密なキャリアファイルを保持する。
  3. 育成中のデザイナーが互いに交流・刺激し合う機会を与える。

以上は、既に優れたデザイナーになるのに必要な資質を持っている人が存在するということを前提にしている。そこでやるべきことは、彼らをしっかり誘導してあげることだ。Alan Perlis はそれをより簡潔に表現している。「誰でも教えてやれば、彫刻をできるようにはなる。ミケランジェロは、放っといても彫刻をしていただろう。優れたプログラマーも同様だ」

さあどうぞ、その Java の本をお買いなさいな。それが何かの役に立つかもしれない。でも、24時間や数日や数ヶ月であれ、それであなたの人生は変わらないし、プログラマーとしての実際の技能全般もまたしかり。


参考文献

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.

Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

答え

標準的な 1GHz のパソコンで2001年の夏に測定した、いろいろな演算の所用時間

execute single instruction 1 nsec = (1/1,000,000,000) sec
L1 キャッシュ・メモリから1ワードを読み出す 2 nsec
メインメモリから1ワードを読み取る 10 nsec
連続したディスク・ロケーションから1ワードを読み出す 200 nsec
ディスクから新たにロケーションを探して1ワードを読み出す 8,000,000nsec = 8msec

付録:言語の選択

何人もの人が、どのプログラミング言語を最初に学ぶべきか聞いてきた。単一の答えは存在しないが、以下のポイントを考えてみよう。

  • 友人を利用する。「どのオペレーティングシステムを使うべきだろうか。Windows、Unix、それとも Mac?」と聞かれたら、私は普通「何であれ君の友達が使っているものを使えば」と答える。友達から学ぶことで得る強みは、OS やプログラミング言語間に内在するどんな相違も相殺するだろう。また未来の友達も考慮すること。学習を続ける場合、あなたがその一部となるプログラマのコミュニティのことである。選択する言語のコミュニティは大きく成長しているだろうか、それとも小さく死にかけているだろうか? 答えを得る書籍、ウェブサイト、オンラインフォーラムは存在するだろうか? そうしたフォーラムにいる人たちのことは好きだろうか?
  • シンプルに保つ。C++ や Java といったプログラム言語は、コードの実行時の効率を気にする経験を積んだプログラマの大集団が専門的な開発を行うよう設計されている。その結果、これらの言語には、そうした環境向けの複雑な部分がある。あなたはプログラムを学ぶことに関心があるのであって、そうした複雑さは必要ない。一人の新米プログラマが学び覚えるのがやさしいように設計された言語が欲しいわけだ。
  • 動かす。あなたはどちらの方法でピアノ演奏を学ぶだろうか。鍵盤を叩けばすぐにその音が聞こえる当たり前の対話的なやり方か、それとも曲をまるごと弾き終えた後でないとその音が聞こえない「バッチ」モードだろうか? 明らかに対話モードのほうがピアノを楽に学べるし、プログラミングも同じである。対話モードを持つ言語にこだわり、それを使うこと。

以上の基準により、はじめてのプログラミング言語として私がお勧めするのは、PythonScheme である。しかし、環境が変われば他の良い選択肢もある。もしあなたの年齢が一桁なら、Alice や Squeak を好むかもしれない(年長の学習者でも楽しめるけど)。重要なのは、選択して始めることだ。


付録:書籍やその他の情報源

何人もの人が、どの書籍やウェブページから学ぶべきか聞いてきた。私は「書籍による学習だけでは不十分」と繰り返しているが、以下のものなら勧められる。

  • Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman)[訳注8] はおそらくコンピュータ・サイエンスの最良の入門書であり、コンピュータ・サイエンスを理解する手段としてプログラミングを教えてくれる。本書はオンラインに完全なテキストがあるだけでなく、オンラインで講義のビデオを見ることもできる。本書は手ごわいので、別のアプローチなら成功するかもしれない一部の人たちを排除してしまうだろう。
  • Scheme: How to Design Programs (Felleisen et al.) は、エレガントかつ実用的なやり方でプログラムを実際にデザインする方法を扱った最高の本である。
  • Python: An Intro to CS (Zelle) が、Python を使うのに良い入門書である。
  • Python: いくつかのオンラインチュートリアルが Python.org で入手できる。
  • Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi)[訳注9] は、今日における Abelson & Sussman 本の後継者と一部から見られている。ことによると Abelson & Sussman 本よりも読みやすいながら、より広い話題を網羅するプログラミングの目的を案内する本である。本書は Oz という言語を採用しており、Oz は広くは知られていないが、他の言語を学ぶ基礎の役割を果たしている。

注記

T. Capey が、『Complete Problem Solver』の Amazon のページにおける「この商品を買った人はこんな商品も買っています」のところに現在、『21日で学ぶベンガル語』や『文法や文体を学ぶ(Teach Yourself Grammar and Style)』があるのを指摘している。そうした本を見る人たちの大部分は、このページから飛んでいるのだと推測する。


[訳註1]:ACM の初代議長を務め、チューリング賞の第一回の受賞者でもある著名なコンピュータ科学者(1922-1990)。彼の残したエピグラムは、現在もいろんなところで参照される。[本文に戻る]

[訳註2]:イギリスの文学者(1709-1784)。辞書編纂者として英語学の発展に寄与したことで有名で、彼もまた残したエピグラムで知られる。[本文に戻る]

[訳註3]:この二つの引用は、前者は、Ericsson, K. A. (1996) The Acquisition of Expert Performance: An Introduction to Some of the Issues. In K. A. Ericsson (ed.), The Road to Excellence. Mahwah, NJ: Lawrence Erlbaum. p. 1-50. 後者は、Ericsson, K. A., R. Krampe, and C. Tesch-R[oe]mer (1993) The Role of Deliberate Practice in the Acquisition of Expert Performance. Psychological Review, 3. p. 363-406. からのようである。[本文に戻る]

[訳註4]:新曜社から『日常生活の認知行動 ひとは日常生活でどう計算し,実践するか』(無藤隆・山下清美・中野茂・中村美代子訳)として邦訳が出ている。[本文に戻る]

[訳註5]:ASCII BOOKS から『ハッカーズ大辞典』(福崎俊博訳)として邦訳が出ている。なお、本文に引用されている ESR の文章がどの文章からの引用かは分からなかった。[本文に戻る]

[訳註6]:いうまでもなく、Jamie Zawinski のことである。[本文に戻る]

[訳註7]:原著発行20周年増訂版としてピアソン・エデュケーションから出た『人月の神話 狼人間を撃つ銀の弾はない』(滝沢徹、牧野祐子、富沢昇訳)に第16章「銀の弾などない ―ソフトウェアエンジニアリングの本質と偶有的事項」として収録されている。本文の引用分も、上記訳書の190ページから日本語訳を引用した。[本文に戻る]

[訳註8]:日本語訳は『計算機プログラムの構造と解釈』(ピアソンエデュケーション)。日本語版のサポートページもある。[本文に戻る]

[訳註9]:日本語訳は『コンピュータプログラミングの概念・技法・モデル』(翔泳社)。Wikipedia にページもできている。[本文に戻る]


[翻訳文書 Index]  [TOPページ]


初出公開: 2001年07月02日、 最終更新日: 2007年11月18日
著者: Peter Norvig
日本語訳: yomoyomo (E-mail: ymgrtq at yamdas dot org)、竹中明夫
 

你可能感兴趣的:(程序人生,pascal,scheme,basic,python,lisp,c++)