コーディングインタビュー大学
私はもともと、ソフトウェアエンジニアになるための研究トピックの短いやることリストとしてこれを作成しました。
しかし、それはあなたが今日見る大きなリストに成長しました。この学習計画を経て、私は採用されました
アマゾンのソフトウェア開発エンジニアとして!
あなたはおそらく私ほど勉強する必要はないでしょう。とにかく、必要なものはすべてここにあります。
私は数ヶ月間、一日に約8-12時間勉強しました。これは私の話です:なぜ私はグーグルインタビューのために8ヶ月間フルタイムで勉強したのですか
ご注意:私ほど勉強する必要はありません。私は知る必要のないことに多くの時間を無駄にしました。詳細については、以下をご覧ください。貴重な時間を無駄にすることなく、そこにたどり着くお手伝いをします。
ここにリストされている項目は、ほぼすべてのソフトウェア会社での技術面接の準備に役立ちます。
アマゾン、フェイスブック、グーグル、マイクロソフトなどの巨人を含みます。
あなたに幸運を祈ります!
翻訳:
翻訳中:
それはなんですか。

これは、大企業のソフトウェアエンジニアになるための私の数ヶ月の学習計画です。
必須:
- コーディング(変数、ループ、メソッド/関数など)の経験が少ない
- 辛抱
- 時間
これはソフトウェアエンジニアリングの学習計画であり、Web開発ではないことに注意してください。グーグル、アマゾンのような大規模なソフトウェア会社、
FacebookとMicrosoftは、ソフトウェアエンジニアリングをWeb開発とは異なると見なしています。たとえば、アマゾンは
フロントエンドエンジニア(FEE)およびソフトウェア開発エンジニア(SDE)。これらは2つの別々の役割と面接です
それぞれが独自の能力を持っているので、それらは同じではありません。これらの企業は、コンピュータサイエンスの知識を必要とします
ソフトウェア開発/エンジニアリングの役割。
大学のコンピュータサイエンスプログラムでは学ぶべきことがたくさんありますが、面接には約75%を知っているだけで十分であるため、ここで取り上げます。
完全なCS独学プログラムのために、私の学習計画のためのリソースはカムランアーメドのコンピュータサイエンスロードマップに含まれています:https://roadmap.sh/computer-science
目次
学習計画
研究テーマ
仕事を得る
---------------- このポイントより下のものはすべてオプションです----------------
Optional Extra Topics & Resources
なぜそれを使うのですか?
大企業のソフトウェアエンジニアとして働きたい場合、これらはあなたが知らなければならないことです。
私のようにコンピュータサイエンスの学位を取得するのを逃した場合、これはあなたに追いつき、あなたの人生の4年間を救うでしょう。
私がこのプロジェクトを始めたとき、私はヒープからのスタックを知らず、Big-Oについても、木についても何も知りませんでした。
グラフを走査します。並べ替えアルゴリズムをコーディングする必要がある場合、それはひどいものだったでしょう。
私が今まで使ったすべてのデータ構造は言語に組み込まれていて、それらがどのように機能するのかわかりませんでした
ボンネットの下。私が実行していたプロセスが「
メモリ」エラーが表示され、回避策を見つける必要があります。私は人生でいくつかの多次元配列を使用し、
何千もの連想配列がありますが、データ構造を最初から作成したことはありません。
それは長い計画です。数ヶ月かかる場合があります。あなたがすでにこれの多くに精通しているなら、それはあなたにはるかに短い時間で済むでしょう。
使い方
以下のすべてはアウトラインであり、上から下に順番に項目に取り組む必要があります。
私は、進捗状況を追跡するためのタスクリストを含む、GitHubの特別なマークダウンフレーバーを使用しています。
gitを使用したくない場合
このページで、上部にある[コード]ボタンをクリックし、[ZIPのダウンロード]をクリックします。ファイルを解凍すると、テキストファイルを操作できます。
マークダウンを認識するコード エディターで開いている場合は、すべてが適切に書式設定されていることがわかります。

あなたがgitに慣れているなら
このような項目を確認できるように新しいブランチを作成し、括弧内にxを入れるだけです:[x]
-
GitHub リポジトリをフォークする: [フォーク] ボタンをクリックします。
https://github.com/jwasham/coding-interview-university

-
ローカル リポジトリに複製します。
git clone git@github.com:<your_github_username>/coding-interview-university.git
cd coding-interview-university
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
-
変更が完了したら、すべてのボックスに X 印を付けます。
git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --set-upstream origin progress
git push --force
あなたが十分に賢くないと感じないでください
- 成功したソフトウェアエンジニアは賢いですが、多くの人は彼らが十分に賢くないという不安を持っています。
- 次のビデオは、この不安を克服するのに役立つ場合があります。
ビデオリソースに関する注意
一部のビデオは、CourseraまたはEdXクラスに登録することによってのみ利用できます。これらはMOOCと呼ばれます。
クラスがセッション中ではないため、数か月待たなければならないため、アクセスできない場合があります。
オンラインコースのリソースを無料でいつでも利用できる公開ソースに置き換えるのは素晴らしいことです。
YouTubeビデオ(できれば大学の講義)など、いつでもこれらを勉強できるように、
特定のオンラインコースがセッション中の場合だけではありません。
プログラミング言語の選択
コーディングインタビューにはプログラミング言語を選択する必要があります。
ただし、コンピューターサイエンスの概念を研究するために使用できる言語を見つける必要もあります。
できれば言語は同じなので、1つだけに堪能である必要があります。
この学習計画のために
私が学習計画を立てたとき、私はそれのほとんどに2つの言語を使用しました:CとPython
- C:非常に低いレベル。ポインタとメモリの割り当て/割り当て解除を処理できるため、データ構造を感じることができます
そしてあなたの骨の中のアルゴリズム。PythonやJavaなどの高水準言語では、これらはあなたから隠されています。日々の仕事では、それは素晴らしいことです、
しかし、これらの低レベルのデータ構造がどのように構築されているかを学んでいるときは、金属を身近に感じるのは素晴らしいことです。
- Cはいたるところにあります。勉強中は、本、講義、ビデオなど、いたるところに例が表示されます。
-
Cプログラミング言語、第2版
- これは短い本ですが、C言語をうまく扱えるようになり、少し練習すれば
あなたはすぐに熟練するでしょう。Cを理解することは、プログラムとメモリがどのように機能するかを理解するのに役立ちます。
- あなたは本を深く掘り下げる必要はありません(あるいはそれを終えることさえありません)。Cで読み書きしやすい場所にたどり着くだけです。
- 本の質問への回答
- Python:モダンで非常に表現力豊かで、非常に便利で、インタビューで書くコードを減らすことができるので、私はそれを学びました。
これが私の好みです。もちろん、あなたは好きなことをします。
あなたはそれを必要としないかもしれませんが、ここに新しい言語を学ぶためのいくつかのサイトがあります:
コーディング面接のために
面接のコーディング部分を行うために使い慣れた言語を使用できますが、大企業の場合、これらは確かな選択です。
これらを使用することもできますが、最初に読んでください。注意点があるかもしれません:
これは私がインタビューの言語を選ぶことについて書いた記事です:コーディングインタビューのために1つの言語を選んでください。
これは私の投稿が基づいていた元の記事です: インタビュー用のプログラミング言語の選択
あなたは言語に非常に快適で、知識が豊富である必要があります。
選択肢についてもっと読む:
言語固有のリソースについては、こちらをご覧ください。
データ構造とアルゴリズムに関する書籍
この本は、コンピュータサイエンスの基礎を形成します。
あなたが快適になる言語で、1つを選択するだけです。あなたはたくさんの読書とコーディングをするでしょう。
C
ニシキヘビ
ジャワ
選択肢:
- グッドリッチ、タマシア、ゴールドワッサー
- セッジウィックとウェイン:
- アルゴリズム
- 本をカバーする無料のコースラコース(著者によって教えられました!
C++
選択肢:
- グッドリッチ、タマシア、マウント
- セッジウィックとウェイン
インタビュー準備本
あなたはこれらの束を買う必要はありません。正直なところ、「コーディングインタビューをクラックする」でおそらく十分ですが、
しかし、私は自分自身にもっと練習を与えるためにもっと買いました。しかし、私はいつもやりすぎです。
私はこれらの両方を購入しました。彼らは私にたくさんの練習を与えてくれました。
時間に余裕がある場合:
次のいずれかを選択します。
私の間違いをしないでください
このリストは何ヶ月にもわたって増えました、そしてそうです、それは手に負えなくなりました。
あなたがより良い経験をするように私が犯したいくつかの間違いがあります。そして、あなたは数ヶ月の時間を節約するでしょう。
1.あなたはそれをすべて覚えていないでしょう
何時間ものビデオを見て、たくさんのメモを取りましたが、数か月後、覚えていないことがたくさんありました。私は3日間行きました
メモやフラッシュカードの作成を通じて、レビューすることができました。私はその知識のすべてを必要としませんでした。
私の間違いを犯さないように読んでください:
コンピュータサイエンスの知識を保持する。
2.フラッシュカードを使用する
この問題を解決するために、一般とコードの2種類のフラッシュカードを追加できる小さなフラッシュカードサイトを作成しました。
各カードには異なるフォーマットがあります。モバイルファーストのウェブサイトを作ったので、どこにいても携帯電話やタブレットでレビューできました。
無料で自分で作る:
フラッシュカードの使用はお勧めしません。多すぎて、それらのほとんどはあなたが必要としない雑学です。
しかし、あなたが私の言うことを聞きたくないのなら、ここに行きます:
私は船外に出て、アセンブリ言語やPythonトリビアから機械学習や統計まですべてをカバーするカードを持っていることを覚えておいてください。
必要なものには多すぎます。
フラッシュカードに関する注意:答えを知っていることを初めて認識するときは、既知としてマークしないでください。あなたは見なければなりません
同じカードで、あなたが本当にそれを知る前にそれを数回正しく答えてください。繰り返しはその知識をより深く入れます
あなたの脳。
私のフラッシュカードサイトを使用する代わりに、何度も私に勧められているAnkiがあります。
それはあなたが覚えるのを助けるために繰り返しシステムを使います。ユーザーフレンドリーで、すべてのプラットフォームで利用でき、クラウド同期システムを備えています。
iOSでは25ドルかかりますが、他のプラットフォームでは無料です。
Anki形式の私のフラッシュカードデータベース:https://ankiweb.net/shared/info/25173560(@xiewenyaに感謝します)。
一部の学生は、デッキを開く、カードを編集する、カードをクリックする、「スタイリング」ラジオボタンを選択し、メンバー「空白:pre;」をカードクラスに追加することで修正できる空白のフォーマットの問題に言及しています。
3.学習中に面接の質問をコーディングする
これは非常に重要です。
データ構造とアルゴリズムを学習しながら、面接の質問のコーディングを開始します。
あなたはあなたが学んだことを問題解決に適用する必要があります、さもなければあなたは忘れるでしょう。私はこの間違いを犯しました。
トピックを学習し、リンクリストなど、ある程度快適に感じたら:
- コーディングインタビューブックの1つ(または以下にリストされているコーディング問題のWebサイト)を開きます
- リンクリストに関する質問を2つか3つ行います。
- 次の学習トピックに進みます。
- 後で戻って、さらに2つまたは3つのリンクリストの問題を実行します。
- あなたが学ぶそれぞれの新しいトピックでこれをしてください。
あなたがこれらすべてのことを学んでいる間、後でではなく、問題を続けてください。
あなたは知識のために雇われているのではなく、知識をどのように適用するかです。
このための多くのリソースがあります。そのまま頑張ってください。
4.フォーカス
貴重な時間を費やす可能性のある気晴らしがたくさんあります。集中力と集中力は難しいです。音楽をオンにする
歌詞がなければ、かなり集中することができます。
カバーされていないもの
これらは普及しているテクノロジーですが、この研究計画の一部ではありません。
- ジャバスクリプト
- HTML、CSS、およびその他のフロントエンド テクノロジ
- .SQL
デイリープラン
このコースでは、多くの科目について説明します。それぞれに数日、あるいは一週間以上かかるでしょう。それはあなたのスケジュールに依存します。
毎日、リストの次の主題を取り、その主題に関するいくつかのビデオを見てから、実装を書きます
このコースで選択した言語でのデータ構造またはアルゴリズムの。
あなたはここで私のコードを見ることができます:
すべてのアルゴリズムを覚える必要はありません。独自の実装を書くことができるように、それを十分に理解できる必要があります。
コーディング問題練習
Why is this here? I'm not ready to interview.
次に、戻ってこれを読んでください。
プログラミングの問題を練習する必要がある理由:
- 問題の認識、および適切なデータ構造とアルゴリズムが適合する場所
- 問題の要件の収集
- 面接のように問題を通してあなたの道を話す
- コンピューターではなくホワイトボードまたは紙でのコーディング
- ソリューションの時間と空間の複雑さを考え出す(以下のBig-Oを参照)
- ソリューションのテスト
インタビューでは、系統的でコミュニケーション的な問題解決のための素晴らしい紹介があります。あなたはプログラミングからこれを得るでしょう
インタビュー本もそうですが、私はこれが優れていることがわかりました: アルゴリズム設計キャンバス
コンピューターではなく、ホワイトボードや紙にコードを記述します。いくつかのサンプル入力でテストします。次に、それを入力してコンピューターでテストします。
自宅にホワイトボードがない場合は、アートストアから大きな描画パッドを入手してください。ソファに座って練習できます。
これが私の「ソファホワイトボード」です。スケールのためだけに写真にペンを追加しました。ペンを使うなら、消せたらいいのにと思うでしょう。
すぐに厄介になります。鉛筆と消しゴムを使います。

コーディング問題の練習は、プログラミングの問題に対する答えを暗記することではありません。
コーディングの問題
ここであなたの主要なコーディングインタビューブックを忘れないでください。
問題解決:
面接質問ビデオのコーディング:
チャレンジ/練習サイト:
始めましょう
さて、十分な話、学びましょう!
ただし、学習中に上からコーディングの問題を行うことを忘れないでください。
アルゴリズム複雑性 / Big-O / 漸近解析
まあ、それで十分です。
「コーディングインタビューのクラッキング」を通過すると、これに関する章があり、最後にクイズが表示されます
さまざまなアルゴリズムの実行時の複雑さを特定できる場合。それはスーパーレビューとテストです。
データ構造
-
配列
- []配列について:
- []ベクトル(自動サイズ変更を伴う可変配列)を実装します。
- []配列とポインタを使用したコーディングと、インデックスを使用する代わりにインデックスにジャンプするためのポインタ数学を練習します。
- []割り当てられたメモリを持つ新しい生データ配列
- 内部にint配列を割り当てることができますが、その機能を使用する必要はありません
- 16 から開始するか、開始番号が大きい場合は、2 から 16、32、64、128 の累乗を使用します。
- []サイズ() - アイテムの数
- []容量() - 保持できるアイテムの数
- [ ] is_empty()
- [] at(index) - 指定されたインデックスのアイテムを返し、インデックスが範囲外の場合は爆発します
- [ ] プッシュ(アイテム)
- []挿入(インデックス、アイテム)-インデックスにアイテムを挿入し、そのインデックスの値と末尾の要素を右にシフトします
- []プリペンド(アイテム)-上記のインデックス0に挿入を使用できます
- [] pop() - 末尾から削除、戻り値
- [] delete(index) - インデックスでアイテムを削除し、末尾のすべての要素を左にシフトします
- []remove(item)-値を検索し、それを保持しているインデックスを削除します(複数の場所にある場合でも)
- [] find(item) - 値を検索し、その値を持つ最初のインデックスを返します。見つからない場合は-1
- []サイズ変更(new_capacity)//プライベート関数
- 容量に達したら、サイズを2倍に変更します
- アイテムをポップするとき、サイズが容量の1/4の場合は、半分にサイズ変更します
- [ ] 時間
- O(1)は、最後に追加/削除(より多くのスペースの割り当てのために償却)、インデックス、または更新します
- O(n)は他の場所に挿入/削除します
- [ ] スペース
- メモリ内で連続しているため、近接性はパフォーマンスを向上させます
- 必要なスペース=(配列容量、>= n)*アイテムのサイズですが、2nであってもO(n)
-
リンクリスト
- [ ] 説明:
- [ ] Cコード(ビデオ) - ビデオ全体ではなく、ノード構造体とメモリ割り当てに関する部分だけ
- []リンクリストと配列:
- [ ] リンクリストを避けるべき理由(ビデオ)
- []落とし穴:ポインタの知識へのポインタが必要です:
(ポインタが指すアドレスを変更する可能性のある関数にポインタを渡す場合)
このページは、ptrからptrを把握するためのものです。このリストトラバーサルスタイルはお勧めしません。読みやすさと保守性は、賢さのために損なわれます。
- []実装(テールポインタとなしでやった):
- [] size() - リスト内のデータ要素の数を返します
- [] empty() - 空の場合はブール値が真を返します
- [] value_at(インデックス) - n番目の項目の値を返します(最初の項目は0から開始)
- [] push_front(値) - リストの先頭に項目を追加します
- [] pop_front() - 先頭の項目を削除してその値を返す
- []push_back(値)-最後にアイテムを追加します
- [ ] pop_back() - 最終品目を削除し、その値を返します。
- [] front() - フロントアイテムの値を取得する
- [] back() - 最終品目の値を取得する
- []挿入(インデックス、値)-インデックスに値を挿入するため、そのインデックスの現在のアイテムはインデックスの新しいアイテムによって指されます
- []消去(インデックス) - 指定されたインデックスのノードを削除します
- [] value_n_from_end(n) - リストの最後からn番目の位置にあるノードの値を返します
- [] リバース() - リストを逆にします
- [] remove_value(値) - この値を持つリストの最初の項目を削除します
- [ ] 二重リンクされたリスト
-
スタック
-
列
- [ ] キュー (ビデオ)
- [ ] 循環バッファ/FIFO
- [ ] [総説]3分でキュー(ビデオ)
- []テールポインタ付きのリンクリストを使用して実装します。
- エンキュー(値) - テールの位置で値を追加します
- dequeue() - 値を返し、最も最近追加された要素 (front) を削除します。
- 空()
- []固定サイズの配列を使用して実装します。
- エンキュー(値) - 使用可能なストレージの最後に項目を追加します
- dequeue() - 値を返し、最も長く追加されていない要素を削除します
- 空()
- フル()
- [ ] コスト:
- 先頭でエンキューし、末尾でデキューするリンクリストを使用した悪い実装はO(n)
最後の要素から次の要素が必要になるため、各デキューの完全なトラバーサルが発生します
- エンキュー:O(1)(償却、リンクリスト、および配列[プロービング])
- デキュー: O(1) (リンクリストと配列)
- 空: O(1) (リンクリストと配列)
-
ハッシュ テーブル
-
[ ] ビデオ:
-
[ ] オンライン・コース:
-
[]リニアプロービングを使用して配列で実装する
- hash(k, m) - m はハッシュテーブルのサイズです
- add(キー、値) - キーが既に存在する場合は、値を更新します
- 存在する(キー)
- 取得(キー)
- 削除(キー)
より多くの知識
-
バイナリ検索
-
ビット演算
- [ ] ビットチートシート - (2 ^ 2から1 ^ 2および16 ^ 2)までの32の累乗の多くを知っている必要があります
- []ビットの操作について本当によく理解してください:&、|、^、~、>>、<<
- [ ] 2秒と1秒の補数
- []セットビットのカウント
- [ ] スワップ値:
- [ ] 絶対値:
樹木
-
木 - はじめに
-
バイナリ検索ツリー: BST
- [ ] バイナリ検索ツリーレビュー(ビデオ)
- [ ] はじめに(ビデオ)
- [ ] MIT (ビデオ)
- C / C ++:
- [ ] 実装:
- [ ] 挿入 // ツリーに値を挿入
- [ ] get_node_count // 格納されている値の数を取得する
- [ ] print_values // ツリー内の値を最小値から最大値まで出力します
- [ ] delete_tree
- [ ] is_in_tree // ツリーに指定された値が存在する場合は true を返します。
- [ ] get_height // ノードの高さを返します (単一ノードの高さは 1)
- [ ] get_min // ツリーに格納されている最小値を返します
- [ ] get_max // ツリーに格納されている最大値を返します
- [ ] is_binary_search_tree
- [ ] delete_value
- [ ] get_successor // 指定された値の後のツリーで次に大きい値を返し、何もない場合は-1を返します
-
ヒープ/プライオリティキュー/バイナリヒープ
分別
要約として、15のソートアルゴリズムの視覚的表現を次に示します。
このテーマの詳細については、「一部のテーマに関する追加の詳細」の「並べ替え」セクションを参照してください。
グラフ
グラフはコンピュータサイエンスの多くの問題を表すために使用できるため、このセクションはツリーやソートのように長くなります。
-
筆記:
- メモリ内のグラフを表すには、次の 4 つの基本的な方法があります。
- オブジェクトとポインタ
- 隣接マトリックス
- 隣接リスト
- 隣接マップ
- 各表現とその長所と短所をよく理解する
- BFSとDFS - 計算の複雑さ、トレードオフ、および実際のコードでの実装方法を知る
- 質問されたら、最初にグラフベースのソリューションを探し、次にない場合は次に進みます
-
[ ] MIT(ビデオ):
-
[]スキエナレクチャー-素晴らしいイントロ:
-
[]グラフ(レビューなど):
-
フルコースラコース:
-
私は実装します:
- [ ] 隣接リストを持つDFS(再帰的)
- [ ] 隣接リストを使用したDFS(スタックを使用した反復)
- [ ] 隣接行列を使用したDFS(再帰)
- [ ] 隣接マトリクスを使用したDFS(スタックを使用した反復)
- [ ] 隣接リストを持つBFS
- [ ] 隣接マトリクスを持つBFS
- [ ] 単一ソースの最短パス(ダイクストラ)
- [ ] 最小スパニング ツリー
- DFS ベースのアルゴリズム (上記の Aduni のビデオを参照):
- []サイクルをチェックします(開始する前にサイクルをチェックするため、トポロジカルソートに必要です)
- [ ] トポロジカルソート
- []グラフ内の接続されたコンポーネントをカウントする
- []強く接続されたコンポーネントを一覧表示します
- []二部グラフを確認する
さらに多くの知識
-
再帰
バックトラッキング ブループリント: Java Python
-
動的計画法
- おそらく、面接では動的プログラミングの問題は見られませんが、
動的計画法の候補としての問題。
- 各DP可溶性の問題は再帰関係として定義する必要があり、それを思い付くのは難しい場合があるため、この主題はかなり難しい場合があります。
- 関係するパターンをしっかりと理解するまで、DPの問題の多くの例を見ることをお勧めします。
- [ ] ビデオ:
- []イェール大学の講義ノート:
- [ ] コーセラ:
-
デザインパターン
-
組合せ論 (n 選択 k) & 確率
-
NP、NP完全および近似アルゴリズム
-
コンピュータがプログラムを処理する方法
-
キャッシュ
- [ ] LRUキャッシュ:
- [ ] CPUキャッシュ:
-
プロセスとスレッド
- []コンピュータサイエンス162-オペレーティングシステム(25ビデオ):
- プロセスとスレッドの違いは何ですか?
- カバー:
- プロセス、スレッド、同時実行の問題
- プロセスとスレッドの違い
- プロセス
- スレッド
- ロック
- ミューテックス
- セマフォ
- モニター
- それらはどのように機能しますか?
- デッドロック
- ライブロック
- CPU アクティビティ、割り込み、コンテキスト切り替え
- マルチコアプロセッサを使用した最新の同時実行構造
- ページング、セグメンテーション、仮想メモリ(ビデオ)
- 割り込み (ビデオ)
- プロセス リソースのニーズ (メモリ: コード、静的ストレージ、スタック、ヒープ、およびファイル記述子、I/O)
- スレッドリソースのニーズ(同じプロセス内の他のスレッドと上記(マイナススタック)を共有しますが、それぞれに独自のpc、スタックカウンター、レジスタ、およびスタックがあります)
- フォークは、新しいプロセスがメモリに書き込むまで、実際にはコピーオンライト(読み取り専用)であり、その後、完全なコピーを実行します。
- コンテキストの切り替え
- コンテキストの切り替えは、オペレーティング システムと基盤となるハードウェアによってどのように開始されますか。
- [ ] C++ のスレッド (シリーズ - 10 ビデオ)
- [ ] CS 377 Spring '14:マサチューセッツ大学のオペレーティングシステム
- [ ] concurrency in Python (videos):
-
Testing
-
String searching & manipulations
If you need more detail on this subject, see "String Matching" section in Additional Detail on Some Subjects.
-
Tries
-
Floating Point Numbers
-
Unicode
-
Endianness
-
Networking
Final Review
This section will have shorter videos that you can watch pretty quickly to review most of the important concepts.
It's nice if you want a refresher often.
Update Your Resume
Interview Process & General Interview Prep
Mock Interviews:
Be thinking of for when the interview comes
Think of about 20 interview questions you'll get, along with the lines of the items below. Have at least one answer for each.
Have a story, not just data, about something you accomplished.
- Why do you want this job?
- What's a tough problem you've solved?
- Biggest challenges faced?
- Best/worst designs seen?
- Ideas for improving an existing product
- How do you work best, as an individual and as part of a team?
- Which of your skills or experiences would be assets in the role and why?
- What did you most enjoy at [job x / project y]?
- What was the biggest challenge you faced at [job x / project y]?
- What was the hardest bug you faced at [job x / project y]?
- What did you learn at [job x / project y]?
- What would you have done better at [job x / project y]?
Have questions for the interviewer
Some of mine (I already may know the answers, but want their opinion or team perspective):
- How large is your team?
- What does your dev cycle look like? Do you do waterfall/sprints/agile?
- Are rushes to deadlines common? Or is there flexibility?
- How are decisions made in your team?
- How many meetings do you have per week?
- Do you feel your work environment helps you concentrate?
- What are you working on?
- What do you like about it?
- What is the work life like?
- How is the work/life balance?
Once You've Got The Job
Congratulations!
Keep learning.
You're never really done.
*****************************************************************************************************
*****************************************************************************************************
Everything below this point is optional. It is NOT needed for an entry-level interview.
However, by studying these, you'll get greater exposure to more CS concepts, and will be better prepared for
any software engineering job. You'll be a much more well-rounded software engineer.
*****************************************************************************************************
*****************************************************************************************************
Additional Books
These are here so you can dive into a topic you find interesting.
-
The Unix Programming Environment
-
The Linux Command Line: A Complete Introduction
- TCP/IP Illustrated Series
-
Head First Design Patterns
- A gentle introduction to design patterns
-
Design Patterns: Elements of Reusable Object-Oriented Software
- AKA the "Gang Of Four" book, or GOF
- The canonical design patterns book
-
Algorithm Design Manual (Skiena)
- As a review and problem recognition
- The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview
- This book has 2 parts:
- Class textbook on data structures and algorithms
- Pros:
- Is a good review as any algorithms textbook would be
- Nice stories from his experiences solving problems in industry and academia
- Code examples in C
- Cons:
- Can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects
- Chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have
- Don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material
- Algorithm catalog:
- This is the real reason you buy this book.
- This book is better as an algorithm reference, and not something you read cover to cover.
- Can rent it on Kindle
- Answers:
- Errata
-
Algorithm (Jeff Erickson)
-
Write Great Code: Volume 1: Understanding the Machine
- The book was published in 2004, and is somewhat outdated, but it's a terrific resource for understanding a computer in brief
- The author invented HLA, so take mentions and examples in HLA with a grain of salt. Not widely used, but decent examples of what assembly looks like
- These chapters are worth the read to give you a nice foundation:
- Chapter 2 - Numeric Representation
- Chapter 3 - Binary Arithmetic and Bit Operations
- Chapter 4 - Floating-Point Representation
- Chapter 5 - Character Representation
- Chapter 6 - Memory Organization and Access
- Chapter 7 - Composite Data Types and Memory Objects
- Chapter 9 - CPU Architecture
- Chapter 10 - Instruction Set Architecture
- Chapter 11 - Memory Architecture and Organization
-
Introduction to Algorithms
-
Important: Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently
- AKA CLR, sometimes CLRS, because Stein was late to the game
-
Computer Architecture, Sixth Edition: A Quantitative Approach
- For a richer, more up-to-date (2017), but longer treatment
System Design, Scalability, Data Handling
You can expect system design questions if you have 4+ years of experience.
- Scalability and System Design are very large topics with many topics and resources, since
there is a lot to consider when designing a software/hardware system that can scale.
Expect to spend quite a bit of time on this
- Considerations:
- Scalability
- Distill large data sets to single values
- Transform one data set to another
- Handling obscenely large amounts of data
- System design
- features sets
- interfaces
- class hierarchies
- designing a system under certain constraints
- simplicity and robustness
- tradeoffs
- performance analysis and optimization
- [ ] START HERE: The System Design Primer
- [ ] System Design from HiredInTech
- [ ] How Do I Prepare To Answer Design Questions In A Technical Interview?
- [ ] 8 Things You Need to Know Before a System Design Interview
- [ ] Database Normalization - 1NF, 2NF, 3NF and 4NF (video)
- [ ] System Design Interview - There are a lot of resources in this one. Look through the articles and examples. I put some of them below
- [ ] How to ace a systems design interview
- [ ] Numbers Everyone Should Know
- [ ] How long does it take to make a context switch?
- [ ] Transactions Across Datacenters (video)
- [ ] A plain English introduction to CAP Theorem
- [ ] MIT 6.824: Distributed Systems, Spring 2020 (20 videos)
- [ ] Consensus Algorithms:
- [ ] Consistent Hashing
- [ ] NoSQL Patterns
- [ ] Scalability:
- [ ] Practicing the system design process: Here are some ideas to try working through on paper, each with some documentation on how it was handled in the real world:
- review: The System Design Primer
- System Design from HiredInTech
- cheat sheet
- flow:
- Understand the problem and scope:
- Define the use cases, with interviewer's help
- Suggest additional features
- Remove items that interviewer deems out of scope
- Assume high availability is required, add as a use case
- Think about constraints:
- Ask how many requests per month
- Ask how many requests per second (they may volunteer it or make you do the math)
- Estimate reads vs. writes percentage
- Keep 80/20 rule in mind when estimating
- How much data written per second
- Total storage required over 5 years
- How much data read per second
- Abstract design:
- Layers (service, data, caching)
- Infrastructure: load balancing, messaging
- Rough overview of any key algorithm that drives the service
- Consider bottlenecks and determine solutions
- Exercises:
Additional Learning
I added them to help you become a well-rounded software engineer, and to be aware of certain
technologies and algorithms, so you'll have a bigger toolbox.
-
Compilers
-
Emacs and vi(m)
-
Unix command line tools
- I filled in the list below from good tools.
- bash
- cat
- grep
- sed
- awk
- curl or wget
- sort
- tr
- uniq
- strace
- tcpdump
-
Information theory (videos)
- Khan Academy
- More about Markov processes:
- See more in MIT 6.050J Information and Entropy series below
-
Parity & Hamming Code (videos)
-
Entropy
-
Cryptography
-
Compression
-
Computer Security
-
Garbage collection
-
Parallel Programming
-
Messaging, Serialization, and Queueing Systems
-
A*
-
Fast Fourier Transform
-
Bloom Filter
-
HyperLogLog
-
Locality-Sensitive Hashing
- Used to determine the similarity of documents
- The opposite of MD5 or SHA which are used to determine if 2 documents/strings are exactly the same
- Simhashing (hopefully) made simple
-
van Emde Boas Trees
-
Augmented Data Structures
-
Balanced search trees
-
Know at least one type of balanced binary tree (and know how it's implemented):
-
"Among balanced search trees, AVL and 2/3 trees are now passé, and red-black trees seem to be more popular.
A particularly interesting self-organizing data structure is the splay tree, which uses rotations
to move any accessed key to the root." - Skiena
-
Of these, I chose to implement a splay tree. From what I've read, you won't implement a
balanced search tree in your interview. But I wanted exposure to coding one up
and let's face it, splay trees are the bee's knees. I did read a lot of red-black tree code
- Splay tree: insert, search, delete functions
If you end up implementing red/black tree try just these:
- Search and insertion functions, skipping delete
-
I want to learn more about B-Tree since it's used so widely with very large data sets
-
Self-balancing binary search tree
-
AVL trees
- In practice:
From what I can tell, these aren't used much in practice, but I could see where they would be:
The AVL tree is another structure supporting O(log n) search, insertion, and removal. It is more rigidly
balanced than red–black trees, leading to slower insertion and removal but faster retrieval. This makes it
attractive for data structures that may be built once and loaded without reconstruction, such as language
dictionaries (or program dictionaries, such as the opcodes of an assembler or interpreter)
- MIT AVL Trees / AVL Sort (video)
- AVL Trees (video)
- AVL Tree Implementation (video)
- Split And Merge
-
Splay trees
- In practice:
Splay trees are typically used in the implementation of caches, memory allocators, routers, garbage collectors,
data compression, ropes (replacement of string used for long text strings), in Windows NT (in the virtual memory,
networking and file system code) etc
- CS 61B: Splay Trees (video)
- MIT Lecture: Splay Trees:
- Gets very mathy, but watch the last 10 minutes for sure.
- Video
-
Red/black trees
-
2-3 search trees
-
2-3-4 Trees (aka 2-4 trees)
- In practice:
For every 2-4 tree, there are corresponding red–black trees with data elements in the same order. The insertion and deletion
operations on 2-4 trees are also equivalent to color-flipping and rotations in red–black trees. This makes 2-4 trees an
important tool for understanding the logic behind red–black trees, and this is why many introductory algorithm texts introduce
2-4 trees just before red–black trees, even though 2-4 trees are not often used in practice.
- CS 61B Lecture 26: Balanced Search Trees (video)
- Bottom Up 234-Trees (video)
- Top Down 234-Trees (video)
-
N-ary (K-ary, M-ary) trees
- note: the N or K is the branching factor (max branches)
- binary trees are a 2-ary tree, with branching factor = 2
- 2-3 trees are 3-ary
- K-Ary Tree
-
B-Trees
-
k-D Trees
-
Skip lists
-
Network Flows
-
Disjoint Sets & Union Find
-
Math for Fast Processing
-
Treap
-
Linear Programming (videos)
-
Geometry, Convex hull (videos)
-
Discrete math
Additional Detail on Some Subjects
I added these to reinforce some ideas already presented above, but didn't want to include them
above because it's just too much. It's easy to overdo it on a subject.
You want to get hired in this century, right?
-
SOLID
-
Union-Find
-
More Dynamic Programming (videos)
-
Advanced Graph Processing (videos)
-
MIT Probability (mathy, and go slowly, which is good for mathy things) (videos):
-
Simonson: Approximation Algorithms (video)
-
String Matching
- Rabin-Karp (videos):
- Knuth-Morris-Pratt (KMP):
- Boyer–Moore string search algorithm
-
Coursera: Algorithms on Strings
- starts off great, but by the time it gets past KMP it gets more complicated than it needs to be
- nice explanation of tries
- can be skipped
-
Sorting
- Stanford lectures on sorting:
- Shai Simonson:
- Steven Skiena lectures on sorting:
-
NAND To Tetris: Build a Modern Computer from First Principles
Video Series
Sit back and enjoy.
Computer Science Courses
Algorithms implementation
Papers
ライセンス
CC-BY-SA-4.0