1 文句は言うな。長い道のりを覚悟するか、ほったらかして鳥を眺めに行こう
本当に優れたプログラマーになりたい人、専門家になりたい人、究極の人物になりたい人にとって、本当にやる価値があるならば、10年を費やすことは大したことではないですよね?
最初の一歩はこの弾丸を飲み込むことだ。このプロセスには10年どころか一生かかることを受け入れること。やりたいからやるのだ。嫌々やっている人は、その道の専門家にはなれない。
2 たくさんのコードを書く
同時にたくさんたくさんコードを書く。良いコードである必要はない。長い間、あなたが書くコードは良いコードではないだろう。良いコード、良いtasteは、大量の実践によって培われるものだ。新しいツール、新しいアルゴリズム、新しい問題に興味を持ったら、あるいは何か問題に直面したら、できるだけコードを書いて実践し、それを使ってみることだ。
学習のプロセスは決して止まらない。毎日できる限り学び、得られる最大の「走行距離」を稼ぐという姿勢で学べば、遠くまで行けるだろう。どんな1日/1週間/1ヶ月でも、面白いことを学ばなければ失敗だ、という状態に入ること。毎日、クールで面白いことが十分に学べるほどある。たとえ15年間学んできたとしても、それらを見つけるのは難しくなるが、まだ見つけることは可能だ。プログラミングの世界のすべての知識を掌握できる人はいない。だから、学ぶことが何もないと感じたら、新しいプロジェクトを見つけて、もっとコードを書こう。
これらを行っているとき、注意して、その中からパターンを探そう。例えば、自動化して実行できる有用なもの、または書いた多くのコードのうち共有ライブラリとして分離できるもの、その他の集中できる場所などだ。特定のタスクに適したシンプルなプログラミング言語を探せ。同じタスクが苦手なプログラミング言語を見つけ出し、なぜいくつかの言語がこれらのタスクにおいて他よりも生産性が高いのかを考えよう。
しかし最も重要なのは、たくさんたくさんコードを書くことだ。ただし、覚えておいてほしい、やっていることが面白くなくなったら、続ける必要はない。その間にプロセスを楽しめないならね。
3 もっと多くのコードを読む
いくつかのプロジェクトを積み重ねたら、他の人のコードを読み始めよう。最初のうちは、これはとても難しい。彼らはあなたがやったことのないことをたくさんやっているし、慣れないスタイルを使っているかもしれないし、学んだことのないプログラミング言語を使っているかもしれない。面白いと思ったら、できるだけそのコードを読もう。与えられたプロジェクトのコードを深く分析することを心配する必要はない、少なくとも最初のうちは。
新しいコードを読むことは、新しい考え方を示してくれ、思考を広げるのに役立つ。思考を広げることは、進歩し続けるためにとても重要だ。前進するときに新しい学ぶべきものを発見し続けられるようにしてくれる。
必ず他のプログラマーと交流しよう。なぜその特定のことをしたのか、どのようにしたのか、別の角度から物事を行っているかどうかを尋ね、自分のコードについてアドバイスがあるかどうかも尋ねよう。丁寧にすること。上級プログラマーはとても忙しいからだ。敬意を払えば遠くまで行ける。この業界は人との繋がりが密で、評判が重要だ。
4 多くのプログラミング言語を学ぶ。いくつかで専門家になる
実際には余分な時間はあまりないだろう。少なくとも、よほど幸運でない限り、多くの言語を同時に学ぶには十分な時間はない。だから、多くのプログラミング言語を浅いレベルで学び、何がそれらを人気にしているのか、何がそれらをよく使われる分野で得意にしているのか、それらの欠点は何かを十分に理解すればいい。拡張が重要だ。命令型言語やOO言語のような一つのタイプの言語に限定せず、関数型言語や宣言型言語も学んで視野を広げよう。
Lispの方言を学ぼう。日常のコーディングでは使わないだろう。しかし、それを学び実践することで、より良い思考者になれる。単純な再帰システムの魅力についてより深く理解できるだろう。思わず「あはっ」と叫んでしまう瞬間が来るまで、学び続け実践し続けよう。その瞬間までは、それは奇妙な構文と不格好な使い方の塊だと思うだろう。残りのキャリアを通じて、それは人類が設計した最も目を見張るようなエレガントな概念になるだろう。
その後、純粋な関数型言語を学ぼう。Haskellをお勧めする。Haskellは、他の関数型言語(Lispの方言を含む)が使わない方法で、純粋に関数思考を使うことを強制する。モナドを設計する目的を理解したとき、あるいは他の「あはっ」という瞬間に、あなたは思考力とエレガントなシステムを設計する能力のより高いレベルに到達するだろう。
最後に、宣言型言語を学ぼう。SQLもそれに該当するが、やや弱い。Prologがよく推奨される。他にはXAML、XSLT、XQueryがある。宣言型言語では、コンピュータに何をしてほしいかを伝え、コンピュータがそれをどう行うかを考える。一方、命令型言語ではその逆で、コンピュータにどうやってやり遂げるかを伝え、それが正しくあなたの望んだことを行うことを期待する。関数型言語では、データ領域の型がどのように変換されるかを記述する。
5 自分でプログラミング言語を作る
それは複雑である必要も、高度である必要も、特にエレガントである必要もない。独自のアイデアである必要すらない。私はしばしばLispインタプリタを書くことを勧める(Lispの方言で書くならなお良い)。これは基礎知識を学ぶためのとても良い方法だ。実際、コンピュータプログラミング設計の基礎について良い感覚を得られる:字句解析、構文解析、コンパイル、解釈、仮想マシン、そして基本的な設計上の選択が各分野での言語の実用性にどのように影響するか。
この過程で以下の3つのものを得られるだろう:
1)選んだツールがどのように動作するかについてより深い認識が得られ、より効率的なコードを書けるようになる。
2)主流の言語やツールの背後にある設計上の選択の理由に気づき始めるだろう。これにより、使うツールをより効果的に選べるようになる。
3)ツールや言語の中にまだ発見されていない可能性を垣間見ることになる。そうすることで視野が広がり、学んだり実験したりできる新しい面白くてクールなものを発見できるようになる。
6 他の誰も学んだことのないことを学ぶ
これは最も困難であり最後のステップだ。また別の10年だ。興味を持ち続け、面白いことをやり続け、楽しませてくれないことからは離れよう。