最近、私はSteve Yeggeの記事を大量に読みました。その中に「Practicing Programming」(プログラミングの練習)という2005年に書かれた記事があり、読んで私は非常に驚きました。

あなたが信じていることとは正反対に、ただ毎日仕事に没頭することは本当の意味での鍛錬とは言えません。会議に参加しても対人スキルは鍛えられないし、メールの返信をしてもタイピングスキルは向上しません。定期的に時間を確保して集中的に鍛錬しなければ、物事をより良くすることはできません。
私は多くの優秀なプログラマーを知っています。これはアマゾンで働く上での最高の「特典」の一つです。彼らをよく観察すると、彼らが常に鍛錬していることに気づくでしょう。彼らはすでに優秀ですが、それでも鍛錬を忘れません。彼らの鍛錬方法はさまざまですが、この記事ではそのうちのいくつかだけを紹介します。
私の知る限り、これらの優秀なプログラマーがこれほど成功しているのは、常に鍛錬し続けているからです。完璧な体型は定期的な運動によって得られ、維持するためには鍛錬を続けなければなりません。そうしなければ体型は崩れてしまいます。プログラミングやソフトウェアエンジニアリングも同じです。
これは重要な違いです。私は毎日車で通勤していますが、運転技術はプロのレーサーには遠く及びません。同様に、毎日プログラミングをしていても、それだけでプロのプログラマーになるには不十分かもしれません。では、普通の人をプロのレーサーやプロのプログラマーに変えるものは何でしょうか?何を鍛える必要があるのでしょうか?
答えは『サイエンティフィック・アメリカン』に掲載された「The Expert Mind」(専門家の思考)という記事の中にあります。
エリクソンは、重要なのは経験そのものではなく、「努力を伴う学習」、つまり自分の能力の限界を超えるものに絶えず挑戦することだと提唱しました。熱狂的な愛好家がチェス、ゴルフ、楽器の演奏に膨大な時間を費やしても、アマチュアレベルに留まることがあるのはそのためです。一方、訓練を受けた学生は比較的短期間で彼らを追い越すことができます。注目すべきは、上達に関しては、チェスに費やす大量の時間(さまざまな大会に出場する場合でも)は、専門的な訓練ほど効果的ではないように見えることです。訓練の主な価値は、弱点を発見し、それに的を絞って改善することにあります。
「努力を伴う学習」とは、ちょうど自分の能力の限界にある問題、つまり失敗する可能性が高い問題に頻繁に取り組むことを意味します。ある程度の失敗を経験しなければ、成長できないかもしれません。絶えず自分自身に挑戦し、自分の限界を超えていかなければなりません。

そのような挑戦は仕事の中で遭遇することもありますが、必ずしもそうとは限りません。鍛錬を職業上の仕事から切り離すことは、プログラミングの分野ではしばしば「コーディングカタ(Code Kata)」と呼ばれています。

Code Kataの概念は、David Thomasによって提唱されました。彼は『達人プログラマー』(The Pragmatic Programmer)の著者の一人です。この概念は主に、特定の技術やスキルを繰り返し練習することで、それを完全に習得することを指しています。——訳者注


いわゆる「型(カタ)」とは、一連の動作のことです。この概念は武道から借用されたものです。

コーディングカタの例(つまり、努力して学習し、プログラミングスキルを磨く方法)を見たいのであれば、Steve Yeggeの記事にはいくつか良い提案があります。彼はそれらを「実践演習」と呼んでいます。

1. 自分の履歴書を書く。関連するスキルをすべてリストアップし、100年後も通用するものをマークする。各スキルを10点満点で採点する。

2. 尊敬するプログラマーをリストアップする。一緒に働いている人々を含めるようにしよう。仕事を通じて彼らからスキルを学べるからだ。彼らの長所を1〜2つ書き留める。それは自分が向上させたいと思っている分野でもある。

3. ウィキペディアの「計算機科学」のセクションを閲覧し、「コンピュータ分野の先駆者」というカテゴリを見つけ、そのリストから一人を選んで、彼の業績を読む。読んでいる間に興味のあるリンクはすべて開くこと。

4. 20分間、他の人のコードを読み通す。優れたコードを読むのも、ひどいコードを読むのも有益であり、両方を交互に読むこと。それらの違いが分からない場合は、尊敬するプログラマーに助けを求め、優れたコードとひどいコードの例を見せてもらう。読んだコードを他の人にも見せて、彼らの意見を聞く。

5. お気に入りのプログラミングツールを10個リストアップする。最も頻繁に使い、なくてはならないと思うツールだ。その中からランダムに1つ選び、1時間かけてドキュメントを読む。その1時間の間に、そのツールの知らなかった新機能を学んだり、新しい使い方を発見したりするよう努める。

6. プログラミング以外に自分が最も得意なことは何かを考えてみる。そして、どのような鍛錬によって、その分野で熟達し専門的になったのかを考えてみる。それはプログラミングの仕事にどのような示唆を与えるだろうか?(これらの経験をプログラミングにどう応用できるだろうか?)

7. 履歴書の束を取り出し、面接官のグループと同じ部屋で1時間過ごす。各履歴書が少なくとも3人の面接官によって評価され、1〜3点のスコアが付けられるようにする。面接官によって評価が大きく分かれた履歴書について議論する。

8. 電話面接に参加する。終了後にフィードバックを書き、自分の意見を述べ、電話面接を担当した人と話し合い、同じ結論に達したかどうかを確認する。

9. 技術面接を行う。面接を受ける人は、自分があまり詳しくない分野の専門家であること。その人に、聴衆はその分野について何も知らないと仮定してもらい、最も基礎的なことから説明してもらう。彼の説明を理解するよう努め、必要に応じて質問をする。

10. 他の人の技術面接に参加する機会を得る。その間、ただ真剣に聞き、真剣に学ぶ。応募者が技術的な問題を解決しようと努力している間、自分自身の頭の中でもそれらの問題を解決してみる。

11. 実際の問題を交換できる相手を見つけ、1週間おきにプログラミングの問題を相互に出し合う。10〜15分かけて問題の解決を試み、さらに10〜15分かけて議論する(解決できるかどうかに関わらず)。

12. すぐには解決できない面接質問を聞いたら、すぐに自分の席に戻り、その問題を電子メールで自分宛に送って、後日のためのリマインダーとして残す。その週のうちに時間を見つけて、お気に入りのプログラミング言語でそれを解決する。

私がSteveのこのリストを気に入っているのは、それが非常に包括的だからだ。プログラマーの中には「鍛錬」と聞くと、いつもコーディングの難しい問題のことだと思う人もいる。しかし私の考えでは、プログラミングはコードよりも人に関わるものだ。したがって、世の中のありとあらゆる難解なプログラミング面接問題を解くことによって個人の能力を高めるという方法には限界がある。

「努力を伴う学習」については、私もPeter Norvigが"Teach Yourself Programming in Ten Years"(10年でプログラミングを独学する)という記事で述べた多くの提案が好きだ:

1. 他のプログラマーと交流する。他人のコードを読む。これはどんな書籍やトレーニングコースよりも重要だ。

2. 実際にプログラムを書く!最高の学習方法は、やりながら学ぶことだ。

3. 学部または大学院のコースでプログラミングの授業を履修する。

4. プロジェクトを見つけて取り組み、他のプログラマーとチームを組んで協力する。プロジェクトの進行中に、最も優れたプログラマーと最もひどいプログラマーを見分けることを学ぶ。

5. プロジェクトで他のプログラマーと一緒に働き、自分が書いたものではないコードを保守する方法を理解し、他の人が保守しやすいコードを書く方法を学ぶ。

6. さまざまなプログラミング言語を学ぶ。特に、現在慣れ親しんでいる言語とは異なる世界観やプログラミングモデルを持つ言語を学ぶこと。

7. ハードウェアがソフトウェアに与える影響を理解する。コンピュータが1つの命令を実行するのにどれだけの時間がかかるか、メモリから1ワードを取り出すのに(キャッシュがある場合とない場合で)どれだけの時間がかかるか、イーサネット(またはインターネット)上でデータを転送するのにどれだけの時間がかかるか、ディスクから連続したデータを読み取る、またはディスク上の別の場所にシークするのにどれだけの時間がかかるかなどを知ること。

Dave Thomasの21の実用的なコーディングカタ(CodeKata.com)からインスピレーションを得ることもできるし、地元の「プログラミング道場」(CodingDojo.org)に参加してもよい。

「努力を伴う学習」について、私にはSteveやPeter、Daveのように長い提案リストを提供することはできない。彼らほどの忍耐力は到底ない。実際、私の考えでは、「コーディングカタ」に必要なのはたった2つの技だけだ。

1. ブログを書く。私は2004年の初めにCodingHorror.comブログを、自分自身の努力を伴う学習の一形態として立ち上げた。それは最初は非常に目立たないものだったが、後に私のキャリアの中で最も重要なことの一つになった。だから、あなたもブログを書くべきだ。最終的に「天下に名を知られる」人は、往々にして効果的に書き、コミュニケーションできる人々だ。彼らの声が最も大きく、彼らがルールを決め、世界の流れをリードしている。

2. 有名なオープンソースプロジェクトに積極的に参加する。すべての大言壮語は良く聞こえるが、あなたは大ぼら吹きなのか、それとも実行する人間なのか?口だけで終わらせてはいけない。これは非常に重要だ。なぜなら、人々はあなたの言葉ではなく行動で評価するからだ。公の場に具体的で役に立つものを残すように努めよう。そうすれば、「あのプロジェクトに貢献した」と言えるのだから。

見事なコードを書くことができ、かつ見事な言葉でそのコードを世間に説明できるようになったなら、そのときあなたは最高のコーディングカタを習得したと私は思うだろう!

出典:http://www.topthink.com/topic/11711.html