これは私自身についての実話です。理性的な生命体がどのようにして少しずつ狂気へと向かっていくのか?

私はスーツを着てオフィスに座り、頭の中にはぼんやりとした起業のアイデアがありました。それから、私はプログラミングを学ぶことにしました。かつて、数人がRubyという言語を使って簡単にオフィス業務を自動化できると自慢しているのを偶然聞いたことがあります。「ふん、Rubyか」と思いました。家に帰って、Rubyをググりました。15秒後、私は適当にRubyチュートリアルを選んで、学び始めました。

一週間後、私は人生初のハッカーズミートアップに参加しました。会場の誰もがScalaやClojure、Goについて話していました。彼らは本当にたくさん学んでいるんだなと思いました。そして振り返って、O'Reillyの本を3冊借りて、それぞれ約50ページずつ読みました。

何ですって?なぜ一冊も最後まで読まなかったのかって?それはね、どの本も最初は簡単でわかりやすいのに、途中から前提を置き始めるからだよ。あなたはこの知識を持っている、あなたはあのツールを使える、という前提をね。でも、それらを私は全然知らないんだよ、わかる?

私の友人の一人がEmacsを学ぶべきだと言い、彼の設定ファイルをくれました。私は自分の設定ファイルを自分で変更できるように、基本的なLisp構文を学ぶのにさらに数時間費やしました。

そこに一人の人物が私のそばを通りかかり、私がEmacsを使っているのを見て、「まだEmacsを使ってるのか?(表情は想像してね)、Vimの方がいいって知らないのか?」と尋ねました。「ふん、Vimか」と思い、私はVimの膨大なキーボードショートカットを暗記し始めました。

エンジニアたちはよくこんな話題を議論します。テキストエディタはどれが最強か? そして、エンジニアたちはこれを宗教戦争とみなしています。評価基準は客観的なものではなく、歴史的な対立にあるのです。

当時、私はタイピングが速ければ速いほど、プログラミングも速くなると考えていました。そこで、伝統的なキーボード配列を捨てて、プログラマー必須のDvorak配列を使い始めました(下の画像のように)。客観的に見て、これはプログラマーにとって最も効率的なキーボード配列です。

上のキーボード配列を見て、文字キー、数字キー、特殊文字キーのうち、位置が変わっていないものがいくつあるか分かりますか? 答えは一桁です。

Linuxを無事に起動でき、1分間に10語タイピングできるようになった頃、私は本とUdacityのコースを通じてPythonを学び始めました。

7か月にわたる苦しい戦いの末、私は最初のソフトウェアエンジニアの仕事を得ました。

CTOが私を面接したとき、私は学んだすべてのツールと、使っているハイスペックな設定ファイルについて話しました。CTOは礼儀正しく話を聞き、時折うなずいていました。自分の広範な知識を自慢し終えると、彼は私を一目見て、「実は、ほとんどのことには多くの解決策があるが、意味があるのはそのごく一部だけだ」と言いました。

4年前、私の会社はRuby on Railsで製品を構築することを決定しました。言語の選択について、すべてのエンジニアは異論がありませんでした。現在も彼らのオリジナルコードの多くはそのまま動いています。全エンジニアがMacBookを使っています。MacBookは信頼性が高いだけでなく、製品で使用しているUbuntu Linuxサーバーと非常によく似ているからです。ここのエンジニアはVimとEmacsのどちらが優れているかを論じたりしません。全員が使うテキストエディタはRubyMineです。これは強力な統合開発環境(IDE)で、デフォルト設定がとても使いやすいです。ここの全エンジニアが使うツールは完全に同じなので、誰でも好きな席を選び、すぐに左右の同僚とペアプログラミングを始めることができ、開発環境の設定に悩む必要がありません。まったく同じ設定を使うことで、2人の開発者間のコラボレーションが非常に容易になります。

Ruby on Railsはできませんでしたが、会社は私が仕事をこなせると判断しました。なぜなら、私はPythonとDjangoができ、ハッカソンで優勝したことがあり、会社はこれらが能力を示していると考えたからです。

最初の数週間は本当に大変でした。その大変さは、新しいチームに加わり、新しい言語、新しいフレームワーク、新しいコードベースを使うことだけから来るのではなく、周りの人たちが皆、自虐的な態度でプログラミングを学んでいることに気づいたからでもあります。

私は図書館やカフェに何か月も一人で座り、毎日ただやみくもにコマンドラインでさまざまなツールをインストールし、Linuxドライバをデバッグし、括弧の不一致といった細かい問題を解決していました。思い付く限りのオンラインコースに手を出し、数え切れないほどのMOOCコースに登録しました。ある月の評価で5位に上がるまで、実際には何も学んでいなかったと思います。これらの経験から、プログラミングは決して勝てない戦いだという印象を受けました。私は、普通に見えるプログラマーたちの過去が実はとても暗く、彼らが多くのことを経験し、長く抑圧してきたのだと理解し始めました。言うまでもなく、プログラミングを学ぶことはまったく反社会のな仕事です。

5474239b87b81

前の仕事を辞めて最初の週末、私はこの自撮り写真をアップロードしました。その日は早起きし、きちんとしたスーツを着ました。スーツを着たのは、自分に「これからプログラミングを学ぶんだ」と意識づけるためでした。Facebookのキャプションは「私の新しいオフィス――ダイニングテーブル。私は毎日朝8時から夕方6時まで働き、本当に休む必要があるときだけ休んでいます」。日常生活では、プログラマーのように話し、彼らのように考えました。今ではその言葉にすっかり慣れました。

私の同僚たちはほとんど構文エラーに遭遇しません。IDEがその問題を解決してくれるからです。そしてエラーメッセージに遭遇したとき、数分以内に解決できない場合は、他の同僚にインスタントメッセージを送って助けを求めます。彼らは気軽に他人のデスクに飛んできて、ペアプログラミングを始めます。ここのプログラマーたちはあまり自己中心的ではなく、自分たちをエリートだとも思いません。彼らはプログラミングを苦痛だとも思っていません。あるのは大人の友人同士による建設的な会話だけです。

チームのメンバーが使うツールは高度に統一されています。Passion Projectやハッカソンでは、開発者はAngular.jsなどの新しいJavaScriptフレームワークを使うかもしれません。しかし、本当のチームでは、メンバーは既存の技術を使って製品を改善することに主に集中します。その観点から言えば、彼らは保守的です。

ThoughtBotでも同様の状況が見られます。ThoughtBotでは、全員が小さく効率的なツールセット(Rails、Vim、Postgres、Redis)を使い続けています。ツールセットが小さいため、エンジニアはその分野の専門家になりやすく、また全員が同じツールセットを使っているため、相互運用が非常に簡単になります。

つまり、本当の問題はこれです。効率的なチームが小さく固定されたツールセットを使うときに最も効率的なのであれば、人々がプログラミングを学ぶときも小さく固定されたツールセットを使うのが最良なのではないか? オンラインのプログラミングコースやプログラミングブートキャンプは明らかにそう考えています。

しかし、個人としては、選べるツールが非常に多いため、実際にどう選べばいいのか判断するのは本当に難しいです。私がこれを知っているのは、自分が経験したからです。優れたプログラマーのスキルセットはT字型で表せます。手を出している分野は多いが、本当に得意な分野は少ない。しかし、長年の蓄積により、T字型は徐々にアンダースコア型になっていきます。

私はプログラミングを学ぶ人をたくさん見てきましたが、最初から何でも学んで何でもできるようになりたいと思い、結局失敗し、プログラマーになるという夢を諦めてしまいました。そんなことがあなたにも起きてほしくありません。

あなたはもっと集中する必要があります。

早速ですが、以下に初心者が犯しやすい大きな間違いをいくつか挙げます。

  • あの言語からこの言語へ、あのフレームワークからこのフレームワークへ乗り換える、あるいはすべての言語やフレームワークを習得できると自分自身を騙すこと。
  • 伝統的で信頼できるツールを選ばず、ニッチなツールで開発環境を構築すること。
  • DockerやFamo.usのようなツールを、それらが新しいからという理由だけで学ぶこと。もっと基本的な技術すらまだ十分に習得していないのに。

私のアドバイスを一言でまとめなければならないなら、こう言います。「集中」だと。

あなたに聞きます。あなたは自分のプログラミング学習計画を「集中」という言葉で表せますか? もし計画は十分に集中していると思うなら、よし、今すぐこの記事を読むのをやめて、あなたの計画に戻って学び始めてください。なぜなら、集中力を失わせるようなことは何も言いたくないからです。

もしあなたの計画が十分に集中していないのなら、それもまた幸運です。私の言う通りにすれば、あなたも集中できるようになります。ただし、いくつかの難しい決断をするために数分かかるでしょう。待って、立ち去らないでください!

よし、あなたはまだ帰っていませんね。以下が、あなたが下す必要のある難しい決断です。

  1. ソフトウェアの種類を一つ選びましょう。Webアプリ、モバイルアプリ、ゲーム、組み込みなどです。私はWebアプリをお勧めします。十分に柔軟で、学習リソースも多く、仕事の機会も数え切れないほどあるからです。もしWebアプリに興味がなければ、このページを閉じて、Googleの検索ボックスに「getting started in _____ development」と入力し、表示された結果を一つずつクリックして見てください。
  2. プログラミング言語を一つ選びましょう:JavaScript、Ruby、またはPythonです。それぞれの言語には強みがあり、Webアプリを構築するための対応するツール(それぞれNode.js、Rails、Django)があります。自分がどの言語を学ぶべきか明確に分かっている場合を除き、JavaScriptを学ぶことをお勧めします。最も広く使われているからです。
  3. オンラインコースを一つ選びましょう。選択肢をいくつか挙げます。JavaScriptに興味があれば、FreeCodeCamp.comまたはNodeSchool.ioをチェックしてください。Rubyに興味があれば、TheOdinProject.comまたはTeamTreehouse.comをチェックしてください。Pythonに興味があれば、Udacity.comをチェックしてください。これらのコースを設計した講師たちの知恵を信じ、推奨された順序でコースを完了してください。あちこち飛び回らないでください。
  4. 新しい(または中古の)MacBookを買うか、今使っているコンピュータにUbuntu Linuxをインストールしてください。他に必要になるかもしれないツールについては、オンラインコースの推奨に従ってインストールすればよいです。

これらの決断を下してしまえば、残りの道はとても簡単です。ただ冷静さを保ち、周りの新しいツールに惑わされないようにしてください。週7日、毎日少しずつオンラインコースを学びましょう。たとえ一度に30分だけでも構いません。今日下した決断を信じてください。最後に、覚えておいてください:忍耐さえあれば、有能な人なら誰でも、もちろんあなたも例外ではなく、凄腕コーダーになれるのです。

出典:http://code.csdn.net/news/2822796