私はもともとこれをソフトウェアエンジニアになるための短いトピックリストとして作成しましたが、 今日それは大きなリストに成長しました。この学習計画を経て、私はAmazonで ソフトウェアエンジニアとして雇われました!! おそらく、あなたは私ほど勉強する必要はないでしょう。とにかく、必要なものはすべてここにあります。 私は数ヶ月間、1日約8〜12時間勉強しました。これが私のストーリーです: Google の面接のために8か月間フルタイムで勉強した理由 注意してください: あなたは私ほど勉強する必要はありません。私は、知る必要のないことに多くの時間を無駄にしました。詳細については、以下をご覧ください。貴重な時間を無駄にすることなく、必要なことを勉強するのを手伝います。 ここに掲載されている項目を学べば、Amazon、Facebook、Google、Microsoftなど 大手企業を含む、ほぼすべてのソフトウェア会社の面接に備えることができます。
あなたに最高の幸運がありますように!
翻訳:
翻訳中:
これは、大企業のソフトウェア エンジニアになるための私の数か月にわたる学習計画です。
必須:
これはソフトウェア エンジニアリングの学習計画であり、フロントエンド エンジニアリングやフルスタック開発ではないことに注意してください。 他の場所でのキャリア パスのスーパー ロードマップとコースワーク (詳細については https://roadmap.sh/ を参照)。
大学のコンピューター サイエンス プログラムでは学ぶべきことがたくさんありますが、面接には 75% 程度知っていれば十分なので、ここではそれについて説明します。 完全な CS 独学プログラムについては、私の学習計画のリソースがカムラン アーメッドのコンピューター サイエンス ロードマップに含まれています: https://roadmap.sh/computer-science
大企業でソフトウェア エンジニアとして働きたいのであれば、これらのことを知っておく必要があります。
私のようにコンピューター サイエンスの学位を取得できなかった場合は、これで人生の 4 年間取り戻すことができます。
このプロジェクトを始めたとき、私はヒープからのスタックのことも、Big-O のことも、木についても、何も知りませんでした。 グラフを横断します。もし私が並べ替えアルゴリズムをコーディングしなければならなかったとしたら、それは酷いことになるでしょう。 私がこれまで使用してきたデータ構造はすべて言語に組み込まれており、それがどのように機能するのかわかりませんでした。 ボンネットの下にはまったくありません。実行しているプロセスで「不足」が発生しない限り、メモリを管理する必要はありませんでした。 「memory」エラーが発生した場合は、回避策を見つける必要があります。私は人生でいくつかの多次元配列を使用しましたが、 何千もの連想配列を作成しましたが、データ構造を最初から作成したことはありません。
長い計画ですね。何か月もかかるかもしれません。しかし、すでにこの内容の多くに精通している場合は、時間ははるかに短くなります。
以下はすべて概要であり、順に項目に取り組む必要があります。
私は進捗状況を追跡するためのタスク リストを含む、GitHub 風マークダウン を使用しています。
このページで、上部近くの「Code」ボタンをクリックし、「Download ZIP」をクリックします。ファイルを解凍すると、テキスト ファイルを操作できるようになります。
マークダウンを理解できるコード エディターで開いている場合は、すべてが適切にフォーマットされていることを確認できます。
新しいブランチを作成して、次のような項目を確認できるようにします。括弧内に x を入力するだけです: [x]
GitHub リポジトリ: https://github.com/jwasham/coding-interview-university
をフォーク ボタンをクリックしてフォークします。
ローカル リポジトリにクローンを作成します。
git clone https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.git
cd coding-interview-university
git remote add upstream https://github.com/jwasham/coding-interview-university.git
git remote set-url --push upstream DISABLE # 個人の進捗を元のレポにプッシュバックしないようにするため
変更を完了したら、すべてのボックスに X を付けます。
git commit -am "Marked personal progress"
git pull upstream main # 元のレポからの変更でフォークを最新に保つ
git push # フォークにプッシュするだけ
一部のビデオは、Coursera または EdX クラスに登録することによってのみ視聴できます。 これらは MOOC と呼ばれます。 場合によっては、クラスが開催されていないため、数か月待たなければならず、アクセスできないこともあります。
オンラインコースのリソースを、YouTube ビデオ (できれば大学の講義) など、いつでも利用できる無料の公開ソースに置き換えて、特定のオンラインコースの開催中だけでなく、いつでも学習できるようにするのは素晴らしいことです。
コーディング面接に使用するプログラミング言語を選択する必要がありますが、コンピューターサイエンスの概念を学習するために使用できる言語も見つける必要があります。
できれば、どちらか 1 つの言語に習熟するだけで済むように、言語が同じであることが望ましいです。
学習計画を立てたとき、そのほとんどで C と Python の 2 つの言語を使用しました。
これが私の好みです。もちろん、好きなことをしてください。 必要ないかもしれませんが、新しい言語を学習するためのサイトをいくつか紹介します。
面接のコーディング部分には、使い慣れた言語を使用できますが、大企業の場合は、次の言語を選択するのが確実です。
これらを使用することもできますが、最初に読んでください。注意事項がある場合があります:
面接の言語の選択について私が書いた記事は次のとおりです: Pick One Language for the Coding Interview.
これは私の投稿の元の記事です: Choosing a Programming Language for Interviews
言語に非常に慣れており、知識が豊富である必要があります。
選択肢について詳しくは、次を参照してください。
たくさん買う必要はありません。正直なところ、「コーディング面接の攻略」で十分だと思いますが、さらに練習するためにさらに購入しました。しかし、私はいつもやりすぎます。
これを両方購入しました。彼らは私にたくさんの練習をさせてくれました。
1 つ選択してください:
このリストは何か月もかけて大きくなり、はい、手に負えなくなりました。
より良い経験をしていただくために、私が犯したいくつかの間違いを以下に示します。そして、何か月も時間を節約できます。
時間もビデオを見て大量のメモを取りましたが、数か月後には覚えていないことがたくさんありました。 3日間かけてメモを見直し、フラッシュカードを作成して復習しましたが、そんな知識は必要ありませんでした。
私と同じ間違いを犯さないように、
Retaining Computer Science Knowledge を読んでください。
この問題を解決するために、一般とコードの 2 種類のフラッシュカードを追加できる小さなフラッシュカード サイトを作成しました。 各カードには異なる形式があります。どこにいても携帯電話やタブレットでレビューできるように、モバイルファーストのウェブサイトを作成しました。
無料で独自に作成します。
フラッシュカードの使用はお勧めしません。 フラッシュカードが多すぎて、ほとんどがトリビアです。必要ありません。
しかし、私の言うことを聞きたくない場合は、ここからどうぞ:
やりすぎて、アセンブリ言語や Python のトリビアから機械学習や統計まで、あらゆるものをカバーするカードがあることに注意してください。 必要なものが多すぎます。
フラッシュカードに関する注意: 初めて答えを知っていると気づいたときは、その答えを既知としてマークしないでください。 本当に理解するには、同じカードを見て何度か正しく答える必要があります。 繰り返すことで知識が脳に深く定着します。
私のフラッシュカード サイトを使用する代わりに、Anki が私に何度も勧められてきました。 繰り返しシステムを使用しているので、覚えやすくなります。ユーザーフレンドリーで、すべてのプラットフォームで利用でき、クラウド同期システムを備えています。 iOS では 25 ドルかかりますが、他のプラットフォームでは無料です。
Anki 形式のフラッシュカード データベース: https://ankiweb.net/shared/info/25173560 (thanks @xiewenya).
一部の学生は、空白に関する書式の問題について次の手順を実行することで修正できると述べています。デッキを開いて、カードを編集し、カードをクリックし、「スタイル」ラジオ ボタンを選択して、メンバー「white-space: pre;」を追加します。カードクラスへ。
これは非常に重要です。
データ構造とアルゴリズムを学習しながら、コーディング面接の質問に答え始めます。
問題を解決するには、学んだことを応用する必要があります。そうしないと忘れてしまいます。私はこの間違いを犯しました。
トピックを学習し、リンク リスト などにある程度慣れたら:
学習後ではなく、学習している間も問題を解き続けてください。
あなたは知識のために雇われているのではなく、その知識をどのように応用するかによって雇われているのです。
以下に示すように、これに関する多くのリソースがあります。続けて。
気を散らすものがたくさんあり、貴重な時間が奪われてしまう可能性があります。集中力と集中力は難しいです。歌詞のない音楽をかける と、かなり集中できるようになります。
以下は一般的なテクノロジですが、この学習計画には含まれていません:
このコースでは多くの主題について説明します。おそらくそれぞれに数日、場合によっては 1 週間以上かかる場合があります。それはあなたのスケジュール次第です。
毎日、リストの次の主題を取り上げ、その主題に関するビデオをいくつか見てから、 このコース用に選択した言語でそのデータ構造またはアルゴリズムの実装を作成します。
私のコードはここで見ることができます:
すべてのアルゴリズムを覚える必要はありません。独自の実装を作成できる程度に理解できれば十分です。
なぜこれがここにあるのでしょうか? 面接する準備ができていません。
プログラミングの問題を練習する必要がある理由:
面接で体系的かつコミュニケーション的に問題を解決するための素晴らしい入門書があります。これはプログラミングのインタビュー本からもわかります が、私はこれが素晴らしいと思いました: Algorithm design canvas
コードを紙ではなく、ホワイトボードまたは紙に書きます。コンピューター。いくつかのサンプル入力を使用してテストします。次に、それを入力してコンピュータでテストします。
家にホワイトボードがない場合は、画材店で大きな描画パッドを購入してください。ソファに座って練習することもできます。 こちらは私の「ソファホワイトボード」です。写真ではスケールを調整するためにペンを追加しました。ペンを使っていると、消せたらいいのにと思うでしょう。 すぐに散らかります。鉛筆と消しゴムを使用します。
コーディングの問題の練習は、プログラミングの問題の答えを覚えることではありません。
ここ の主要なコーディング インタビュー ブックを忘れないでください。
問題の解決:
コーディング インタビューの質問ビデオ:
チャレンジ/練習サイト:
さて、話は十分です、学びましょう!
ただし、学習中に上記のコーディング問題に取り組むことを忘れないでください。
まあ、それだけで十分です。
「コーディング インタビューの解読」を進めると、これに関する章があり、最後に、さまざまなアルゴリズムの実行時の複雑さを特定できるかどうかを確認するクイズがあります。それはスーパーレビューとテストです。
[ ] 動画:
[ ] オンラインコース:
[ ] 線形プロービングを使用して配列で実装する
[ ] ノート:
ヒープソートについては、上記のヒープデータ構造を参照してください。ヒープソートは素晴らしいですが、安定していません。
[ ] カリフォルニア大学バークレー校:
[ ] バブルソート(動画)
[ ] バブルソートの分析(動画)
[ ] 挿入ソート、マージソート(動画)
[ ] 挿入ソート(動画)
[ ] マージソート(動画)
[ ] クイックソート(動画)
[ ] 選択ソート(動画)
[ ] ソート コードを結合:
[ ] クイックソートコード:
[ ] 実装
[ ] 必須ではありませんが、お勧めします:
概要として、15のソートアルゴリズム を視覚的に表したものを次に示します。 この主題についてさらに詳細が必要な場合は、一部の主題に関する追加の詳細 の「並べ替え」セクションを参照してください。
グラフはコンピューター サイエンスの多くの問題を表すために使用できるため、このセクションはツリーや並べ替えと同様に長くなります。
ノート:
[ ] MIT(ビデオ):
[ ] スキエナ講義 - 素晴らしい導入部:
[ ] グラフ (レビューなど):
フルcourseraコース:
次のことを実装します。
この件についてさらに詳細が必要な場合は、一部の件名に関する追加の詳細 の「文字列マッチング」セクションを参照してください。
このセクションには短いビデオが含まれます。非常にすぐに見て、重要な概念のほとんどを確認できます。
頻繁にリフレッシュしたい場合に便利です。
模擬面接:
面接で聞かれる約 20 の質問と、以下の項目の内容を考えてください。それぞれに対して少なくとも 1 つの回答を用意してください。 達成したことについて、単なるデータではなくストーリーを作成します。
私の意見の一部 (答えはすでに知っているかもしれませんが、彼らの意見やチームの視点が欲しいです):
おめでとう!
学び続けます。
本当に終わったことはありません。
************************************************* ************************************************* *
************************************************* ************************************************* *
これより下はすべてオプションです。初心者レベルの面接には必要ありません。
ただし、これらを学習することで、より多くの CS 概念に詳しくなり、より適切な準備が整います。
ソフトウェアエンジニアリングの仕事なら何でも。あなたは、より総合的なソフトウェア エンジニアになるでしょう。
************************************************* ************************************************* *
************************************************* ************************************************* *
これらは、興味のあるトピックに飛び込むことができるようにここにあります。
4 年以上の経験がある場合は、システム設計に関する質問が予想されます。
これらは、あなたが総合的なソフトウェア エンジニアになるのに役立ち、次の点に注意するために追加しました。
テクノロジーとアルゴリズムを活用できるため、より大きなツールボックスが手に入ります。
AVL ツリー
スプレーツリー
赤/黒の木
2-3 検索ツリー
2-3-4 ツリー (別名 2-4 ツリー)
N 配列 (K 配列、M 配列) ツリー
B ツリー
これらは、上ですでに示したいくつかのアイデアを補強するために追加しましたが、含めたくはありませんでした
あまりにも多すぎるため、上記で説明しました。あるテーマについてやりすぎるのは簡単です。
今世紀中に採用されたいですよね?
固体
ユニオン検索
さらに動的プログラミング (ビデオ)
高度なグラフ処理 (ビデオ)
MIT 確率 (数学的で、ゆっくり進めてください。これは数学的なことに適しています) (ビデオ):
文字列のマッチング
並べ替え
NAND からテトリスへ: 第一原理から最新のコンピューターを構築する
座って楽しんでください。