翻訳者から
これは 、 Haney Codes .NETブログからの出版物の翻訳です。 ブログの著者David Haneyは、Stack OverflowのEngineering Managerで働いています。 数年前、私はすでに彼の著者の記事を翻訳しました : 投稿の名前との混同 。
約1か月前、 Joel Spolsky (有名なブログ「Joel on Software」の著者、Stack Overflowの共同設立者-およそTransl。)とビデオ通信で話していることに気付きました。 今でもそのように書くのは馬鹿げているようです。 長い間、私のキャリアを通じて、私は定期的にJoel Spolskyを読み、多くの点で開発に関する私の見解で彼に同意しました。 そして突然顔を合わせて話します。
この会話を実現するのは簡単ではありませんでした。 このプロセスには数週間かかり、率直に言って、 非常に多くのインタビューを行う時間を見つけることは困難でした。 いくつですか?
ジョエルの前に、私は5人か6人の他の素晴らしい人々( マーク・グラヴェルとニコラス・ラーセンを含む)と話しました。 どういうわけか、私は彼らのそれぞれが最終ボスに到達するのに十分なほど印象づけることができました。 会話は約1時間続き、たぶん興奮のために5分で飛びました。 さまざまなソフトウェア開発方法論の長所と短所、過去のキャリアのミス、 Dacheの問題(私のオープンソースキャッシュ)、その他のトピックについて議論しました。 それからジョエルは驚くべきことを言いました:「スタック交換に参加してください!」その瞬間、私は素手で車を持ち上げることができるほどアドレナリンの強いサージを感じました。
数日後、私は公式に働き始めました。 この機会をうれしく思っており、とても幸運だったと思います。 これまで、Stack Exchangeは、従業員を消耗品としてではなく、人間として扱う信じられないほど資格のある専門的な組織としての地位を確立してきました。
重要:まず第一に、述べられている立場は私のものであり、Stack Exchangeや第三者によるものではありません。 この記事では、面接プロセスについての考えと、この仕事に就くのに役立った私の知識と専門的な道筋の詳細を説明しています。 これは「カバースリップ」ではなく、パスを簡単にするヒントではありません。 ここで働きたい場合は、合格したのと同じテスト(詳細は開示しません)に合格する必要があります。
この警告を使用して、Stack Exchangeでどのように仕事を得たのか、どのようにそれを行うことができるのかについて、私の考えを以下に示します。
自我はマインドキラーなので、自我を殺します。 ほとんどの開発者(私自身を含む)にはまだ巨大な「私」がいます。 彼らの自我は非常に大きいので、部屋にはほとんど収まりません。 これは自然なことであり、一日中、文字通り何もないところから堅実な収入をもたらす神聖な質の豊かなものを作り出すという事実を考慮しています。 私たちは非常に強力に感じ始めます。 会社の技術スタックを徹底的に研究した結果、ソフトウェアとハードウェアに関するすべてを知っていると結論付けました。
あなたがすべてを知っていると考えることは、プログラマーとして失敗する最も簡単な方法です。 これを信じて、あなたはもはや新製品を勉強していません(あなたはすでにそれらを知っています)。 現在の作業場所でASP.NET MVC 3をマスターしましたが、フレームワークの4番目と5番目のバージョンが登場しました...リスクが高すぎるため、新しいバージョンを学習することはないので、あなたの会社だけがアップグレードしません。 数年後、あなたは双眼鏡でそれらを見ることができないほど現代のテクノロジーに遅れをとることになります。 ちなみに、RubyとPHP、またはJavaでさえ、1行も書いたことのないギズモについて言及しましたか? MongoDB、Couchbase、Azure、EC2、その他の何千ものプログラミングプラットフォームと言語についてはどうですか? 言語とハードウェア構成に関する知識が一気に低下することを理解していただければ幸いです...開発に関するすべての知識の0.1%かもしれません。 私も同じように知っていますが、それで問題ありません。
ロックスターにならないでください。 私はこれを数年間続けてきましたが、それは私のキャリアを傷つけるだけです。 多くの企業は、従業員のエゴを意図的に与えて、彼らが価値あると感じるようにします(多くの場合、適切な支払いなしで)。 ロックスターであることは素晴らしいことのように聞こえますが、実際にはチーム内で信じられないほど爆発的な雰囲気を育むことができる危険な戦略です。 企業はロックスターを探して雇いますが、ロックスターはそれを当たり前のことと考えています。 彼らは自分自身を膨らませ、会議で堂々と議論し、他の人を妨害し、押しのけます。 彼らは「あなたが間違っているから正しい、私が正しいから」という精神で議論しています。 ロックスターは、残りは彼の気まぐれにふけるために存在すると確信しています...残りはそのような人と働くことを嫌います。
実際、あなたは実際には同じであり、100万人の偉大な開発者のうちの1人、「ロックスター」になることができます-しかし、誰も気にしません。 言葉は無価値であり、人々は必要な印象を与えるためにほとんど何でも言うでしょう。 たとえあなたが本当に良かったとしても-これについてだけ人々に話し、他のことは何もしなくても-彼らはあなたを軽deします。 優れた開発者は自慢する必要はありません。その結果は、言葉よりも雄弁に語ります。 当然、他の人はそのような人に感謝します。 「すごい、彼はとても頭がいい」または「彼女は1時間でやったが、数日かかると思っていた」というテーマでの余暇の会話は強くなり、悪くはありません。 人々が好きなようにあなたについて話すことができますが、謙虚さと現実感を保ちます。 あなたはチームや会社でさえ最高の開発者かもしれませんが、あなたはまだ人間であり、あなたはまだ仕事中です。 あなたの自我に奉仕するためにここに誰も雇われていません(あなたの毎日の仕事があなたのために働いている人でさえ)。 あなたが優れた開発者であるという事実は、あなたを人間として良くするものではありません。 それはあなたのキャリアをより成功させるだけです。 他の何千人もの開発者も職場で輝いていることを決して忘れないでください。 その総数の中でも、優秀で控えめな開発者は際立っています。 これは私の経験では非常にまれな組み合わせであり、多くの企業での採用の夢の限界です。 たとえあなたが一番かっこいい(かっこいい!)としても、他人を自慢するのはやめましょう。 彼らはあなたがどうあるべきか気にしません。
あなたがあなたの知識の限界を理解するのに十分なことを知っていることを知っている(あなたが十分に知らないことを知っているのにあなたは十分に知っている-およそTransl。) 知っていることとそうでないことを理解します。 それが真実であるとき、「わからない」と言うことを恐れないでください。 満員の部屋の前で「わからない」と言うのを恐れない開発者は珍しい。 正直に言うと、あなたは信頼と権威を築きます。 また、同僚や会社と前向きな関係を築きます。 Angular.jsやCouchbaseを聞いたことがない場合-誰もこれを覚えていませんが、時間とお金を無駄にし始めなかった場合、人々は常に感謝しています。
データ構造とアルゴリズムを理解します。 C#などの高レベルプログラミング言語は非常に抽象的であるため、多くの人は、プログラムが実行されたときに実際に「内部」で何が起こるかについて少しも考えていません。 どこでもLINQを使用するのは素晴らしいことですが、書いたものの計算の複雑さを知っていますか? ハッシュテーブルとは何か、なぜ必要なのか知っていますか? 最も効率的な方法で配列をソートできますか? そして、スタックを使用するのが最良のオプションであるシナリオを考え出しますか? 注意してください-ソートアルゴリズムのようなものを覚える必要はありません(私が試したとしてもできませんでした)が、データ構造の知識は非常に貴重です:木、ハッシュ、リスト、キュー、スタック。 並べ替え、検索、キャッシュに関する基本的な概念と組み合わせます。 優秀なプログラマと優秀なプログラマの違いを次に示します。 誰もがC#で記述できますが、呼び出された各メソッドの低レベルの「入出力」を理解している人だけが、適切でクリーンで効率的なコードを記述します。 スタックやヒープなど、データ構造がどのように機能するか、値および参照によるアドレス指定がどのように機能するかについての基本的な理解が必要です。 これらの基本原則は、すべてのプログラミング言語に適用されます。 多くの開発者は、アルゴリズムの複雑さを無視し、結果を理解せずに既製のメソッドを呼び出すだけです。 データ構造とアルゴリズムを調べてみてください。突然、あなたはパックの前に立ちます。
コードが機能している理由とコードが機能していない理由を把握してください。 Redditなどのサイトのこの画像を見たことがありますか?
この写真は面白いかもしれませんが、その人気は私を怒らせます。 彼女は、プログラミングの本質は、コードが機能しているか機能していないのかを理解することではないと述べています。 私にとって、これは受け入れられません。 優れた開発者は、それを修正する方法だけでなく、何らかの理由で物事が機能する理由を見つけたいと考えています。 コードはコンパイルされませんか? どうして? 競合状態? どうして? 「なぜ」質問をすることで、実用的な「方法」と比較して視野とスキルセットを拡大し、より良いプログラマーになることができます。 ほとんどの優秀なプログラマーは、同じ間違いを何度も繰り返しませんが、もちろん間違っています...彼らは、新しい興味深い間違いを犯します!
安っぽいコードを書いてから、Stack Overflowや同様のサイトから行をコピーして、コードが機能し始めるまでの日々を思い出します(ただし、これがどのように、なぜ起こったのかはわかりませんでした) 最近はかなり遅れています。 コードがコンパイルされない場合、99%のケースで問題の解決方法がすぐにわかります。 私のコードにバグがある場合、原則としてそれを追跡して修正する方法を知っていると同時に、将来そのような状況を回避することを学びます。 コードが機能する理由がわからないということは、クライアントが責任を負わない理由を少しでも知らない弁護士であるようなものです。つまり、役に立たない、高価で面白い光景です。 コードが機能している理由を理解してください... 私の意見では、これがプロの開発者の主要な品質です。 バグを作成するか、間違えます-OK、しかし同じエラーを数回繰り返します-OKではありません!
そこで、私はあなたに一連のスキルと主要な能力を説明しました-インタビューの中でStack Exchangeチームに見せたことです。 すべての技術的な質問が正確な(または最適な)答えを出すことができたわけではありませんが、私は謙虚で、困ったときに助けを求めたり、「わからない」と言うことを恐れません。 私の答えには効率的なデータ構造とアルゴリズムがあり、この特定の構造が問題を解決するのに最適な理由である理由を説明できました。 ミスを犯したので、ほとんどの場合、これを特定し、修正する方法を示すことができました。 開発者としての能力と実行可能性を示した後、私は最終的に夢の仕事を得ました。