Skip to content

Latest commit

 

History

History
1865 lines (1557 loc) · 148 KB

File metadata and controls

1865 lines (1557 loc) · 148 KB

コーディング面接の大学

私はもともとこれをソフトウェアエンジニアになるための短いトピックリストとして作成しましたが、 今日それは大きなリストに成長しました。この学習計画を経て、私はAmazonで ソフトウェアエンジニアとして雇われました!! おそらく、あなたは私ほど勉強する必要はないでしょう。とにかく、必要なものはすべてここにあります。 私は数ヶ月間、1日約8〜12時間勉強しました。これが私のストーリーです: Google の面接のために8か月間フルタイムで勉強した理由 注意してください: あなたは私ほど勉強する必要はありません。私は、知る必要のないことに多くの時間を無駄にしました。詳細については、以下をご覧ください。貴重な時間を無駄にすることなく、必要なことを勉強するのを手伝います。 ここに掲載されている項目を学べば、Amazon、Facebook、Google、Microsoftなど 大手企業を含む、ほぼすべてのソフトウェア会社の面接に備えることができます。

あなたに最高の幸運がありますように!

翻訳:

翻訳中:

これは何?

ホワイトボードでのコーディング - HBOのシリコンバレーから

これは、大企業のソフトウェア エンジニアになるための私の数か月にわたる学習計画です。

必須:

  • コーディングの経験 (変数、ループ、メソッド/関数など)
  • 忍耐
  • 時間

これはソフトウェア エンジニアリングの学習計画であり、フロントエンド エンジニアリングやフルスタック開発ではないことに注意してください。 他の場所でのキャリア パスのスーパー ロードマップとコースワーク (詳細については https://roadmap.sh/ を参照)。

大学のコンピューター サイエンス プログラムでは学ぶべきことがたくさんありますが、面接には 75% 程度知っていれば十分なので、ここではそれについて説明します。 完全な CS 独学プログラムについては、私の学習計画のリソースがカムラン アーメッドのコンピューター サイエンス ロードマップに含まれています: https://roadmap.sh/computer-science


目次

学習計画

研究のテーマ

なぜこれを使用するのか

大企業でソフトウェア エンジニアとして働きたいのであれば、これらのことを知っておく必要があります。

私のようにコンピューター サイエンスの学位を取得できなかった場合は、これで人生の 4 年間取り戻すことができます。

このプロジェクトを始めたとき、私はヒープからのスタックのことも、Big-O のことも、木についても、何も知りませんでした。 グラフを横断します。もし私が並べ替えアルゴリズムをコーディングしなければならなかったとしたら、それは酷いことになるでしょう。 私がこれまで使用してきたデータ構造はすべて言語に組み込まれており、それがどのように機能するのかわかりませんでした。 ボンネットの下にはまったくありません。実行しているプロセスで「不足」が発生しない限り、メモリを管理する必要はありませんでした。 「memory」エラーが発生した場合は、回避策を見つける必要があります。私は人生でいくつかの多次元配列を使用しましたが、 何千もの連想配列を作成しましたが、データ構造を最初から作成したことはありません。

長い計画ですね。何か月もかかるかもしれません。しかし、すでにこの内容の多くに精通している場合は、時間ははるかに短くなります。

使い方

以下はすべて概要であり、順に項目に取り組む必要があります。

私は進捗状況を追跡するためのタスク リストを含む、GitHub 風マークダウン を使用しています。

git を使用したくない場合

このページで、上部近くの「Code」ボタンをクリックし、「Download ZIP」をクリックします。ファイルを解凍すると、テキスト ファイルを操作できるようになります。

マークダウンを理解できるコード エディターで開いている場合は、すべてが適切にフォーマットされていることを確認できます。

リポジトリを zip ファイルとしてダウンロードする方法

git に慣れている場合

新しいブランチを作成して、次のような項目を確認できるようにします。括弧内に x を入力するだけです: [x]

  1. GitHub リポジトリ: https://github.com/jwasham/coding-interview-university をフォーク ボタンをクリックしてフォークします。

    GitHub リポジトリをフォークする

  2. ローカル リポジトリにクローンを作成します。

    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  # 個人の進捗を元のレポにプッシュバックしないようにするため
  3. 変更を完了したら、すべてのボックスに X を付けます。

    git commit -am "Marked personal progress"
    git pull upstream main  # 元のレポからの変更でフォークを最新に保つ
    
    git push # フォークにプッシュするだけ

自信を無くさないでください


ビデオリソースに関する注意

一部のビデオは、Coursera または EdX クラスに登録することによってのみ視聴できます。 これらは MOOC と呼ばれます。 場合によっては、クラスが開催されていないため、数か月待たなければならず、アクセスできないこともあります。

オンラインコースのリソースを、YouTube ビデオ (できれば大学の講義) など、いつでも利用できる無料の公開ソースに置き換えて、特定のオンラインコースの開催中だけでなく、いつでも学習できるようにするのは素晴らしいことです。

プログラミング言語を選択してください

コーディング面接に使用するプログラミング言語を選択する必要がありますが、コンピューターサイエンスの概念を学習するために使用できる言語も見つける必要があります。

できれば、どちらか 1 つの言語に習熟するだけで済むように、言語が同じであることが望ましいです。

この学習計画について

学習計画を立てたとき、そのほとんどで C と Python の 2 つの言語を使用しました。

  • C: 非常に低いレベル。ポインタとメモリの割り当て / 割り当て解除を処理できるため、データ構造を実感できます。 そしてアルゴリズムが骨の中に組み込まれています。Python や Java などの高水準言語では、これらは表示されません。日々の仕事ではそれは素晴らしいことですが、これらの低レベルのデータ構造がどのように構築されるかを学んでいるときは、実際に近いと感じるのは素晴らしいことです。
    • C はどこにでもあります。勉強していると、書籍、講義、ビデオなど、あらゆる場所で例を見ることができます。
    • C プログラミング言語 第 2 版
      • これは短い本ですが、少し練習すれば C 言語をうまく扱えるようになります。 すぐに上達します。C を理解すると、プログラムとメモリがどのように機能するかを理解するのに役立ちます。
      • 本を深く読み込む必要はありません(読み終える必要さえありません)。C で快適に読み書きできるところまで進んでください。
  • Python: 現代的で表現力が非常に豊かです。非常に便利で、面接で記述するコードの量も少なくて済むため、私はこれを学びました。

これが私の好みです。もちろん、好きなことをしてください。 必要ないかもしれませんが、新しい言語を学習するためのサイトをいくつか紹介します。

コーディング面接用

面接のコーディング部分には、使い慣れた言語を使用できますが、大企業の場合は、次の言語を選択するのが確実です。

  • C++
  • Java
  • Python

これらを使用することもできますが、最初に読んでください。注意事項がある場合があります:

  • JavaScript
  • Ruby

面接の言語の選択について私が書いた記事は次のとおりです: Pick One Language for the Coding Interview.

これは私の投稿の元の記事です: Choosing a Programming Language for Interviews

言語に非常に慣れており、知識が豊富である必要があります。

選択肢について詳しくは、次を参照してください。

ここで言語固有のリソースを参照してください

データ構造とアルゴリズムに関する書籍

C

Python

Java

C++

面接対策本

たくさん買う必要はありません。正直なところ、「コーディング面接の攻略」で十分だと思いますが、さらに練習するためにさらに購入しました。しかし、私はいつもやりすぎます。

これを両方購入しました。彼らは私にたくさんの練習をさせてくれました。

時間がたくさんある場合:

1 つ選択してください:

私と同じ間違いを犯さないでください

このリストは何か月もかけて大きくなり、はい、手に負えなくなりました。

より良い経験をしていただくために、私が犯したいくつかの間違いを以下に示します。そして、何か月も時間を節約できます。

1. すべてを覚えているわけではない

時間もビデオを見て大量のメモを取りましたが、数か月後には覚えていないことがたくさんありました。 3日間かけてメモを見直し、フラッシュカードを作成して復習しましたが、そんな知識は必要ありませんでした。

私と同じ間違いを犯さないように、

Retaining Computer Science Knowledge を読んでください。

2. フラッシュカードを使用する

この問題を解決するために、一般とコードの 2 種類のフラッシュカードを追加できる小さなフラッシュカード サイトを作成しました。 各カードには異なる形式があります。どこにいても携帯電話やタブレットでレビューできるように、モバイルファーストのウェブサイトを作成しました。

無料で独自に作成します。

フラッシュカードの使用はお勧めしません。 フラッシュカードが多すぎて、ほとんどがトリビアです。必要ありません。

しかし、私の言うことを聞きたくない場合は、ここからどうぞ:

やりすぎて、アセンブリ言語や Python のトリビアから機械学習や統計まで、あらゆるものをカバーするカードがあることに注意してください。 必要なものが多すぎます。

フラッシュカードに関する注意: 初めて答えを知っていると気づいたときは、その答えを既知としてマークしないでください。 本当に理解するには、同じカードを見て何度か正しく答える必要があります。 繰り返すことで知識が脳に深く定着します。

私のフラッシュカード サイトを使用する代わりに、Anki が私に何度も勧められてきました。 繰り返しシステムを使用しているので、覚えやすくなります。ユーザーフレンドリーで、すべてのプラットフォームで利用でき、クラウド同期システムを備えています。 iOS では 25 ドルかかりますが、他のプラットフォームでは無料です。

Anki 形式のフラッシュカード データベース: https://ankiweb.net/shared/info/25173560 (thanks @xiewenya).

一部の学生は、空白に関する書式の問題について次の手順を実行することで修正できると述べています。デッキを開いて、カードを編集し、カードをクリックし、「スタイル」ラジオ ボタンを選択して、メンバー「white-space: pre;」を追加します。カードクラスへ。

3. 学習中にコーディング面接の質問をする

これは非常に重要です。

データ構造とアルゴリズムを学習しながら、コーディング面接の質問に答え始めます。

問題を解決するには、学んだことを応用する必要があります。そうしないと忘れてしまいます。私はこの間違いを犯しました。

トピックを学習し、リンク リスト などにある程度慣れたら:

  1. 面接対策本のいずれかを開きます(または、以下にリストされているコーディングに関する問題の Web サイト)
  2. 次の学習トピックに進みます。
  3. その後、戻って別の 2 つまたは 3 つのリンク リストの問題を解きます。
  4. 新しいトピックを学ぶたびにこれを行います。

学習後ではなく、学習している間も問題を解き続けてください。

あなたは知識のために雇われているのではなく、その知識をどのように応用するかによって雇われているのです。

以下に示すように、これに関する多くのリソースがあります。続けて。

4. 集中する

気を散らすものがたくさんあり、貴重な時間が奪われてしまう可能性があります。集中力と集中力は難しいです。歌詞のない音楽をかける と、かなり集中できるようになります。

取り上げられていないもの

以下は一般的なテクノロジですが、この学習計画には含まれていません:

  • Javascript
  • HTML、CSS、およびその他のフロントエンドテクノロジ
  • SQL

日次計画

このコースでは多くの主題について説明します。おそらくそれぞれに数日、場合によっては 1 週間以上かかる場合があります。それはあなたのスケジュール次第です。

毎日、リストの次の主題を取り上げ、その主題に関するビデオをいくつか見てから、 このコース用に選択した言語でそのデータ構造またはアルゴリズムの実装を作成します。

私のコードはここで見ることができます:

すべてのアルゴリズムを覚える必要はありません。独自の実装を作成できる程度に理解できれば十分です。

コーディングに関する質問の練習

なぜこれがここにあるのでしょうか? 面接する準備ができていません。

その後、戻ってこれを読んでください。

プログラミングの問題を練習する必要がある理由:

  • 問題の認識、および適切なデータ構造とアルゴリズムがどこに適合するか
  • 問題の要件を収集する
  • 面接で行うのと同じように、問題について自分なりに説明する
  • コンピューターではなく、ホワイトボードまたは紙にコーディングする
  • 解決策のための時間と空間の複雑さを考え出す (下記の Big-O を参照)
  • テストあなたの解決策

面接で体系的かつコミュニケーション的に問題を解決するための素晴らしい入門書があります。これはプログラミングのインタビュー本からもわかります が、私はこれが素晴らしいと思いました: Algorithm design canvas

コードを紙ではなく、ホワイトボードまたは紙に書きます。コンピューター。いくつかのサンプル入力を使用してテストします。次に、それを入力してコンピュータでテストします。

家にホワイトボードがない場合は、画材店で大きな描画パッドを購入してください。ソファに座って練習することもできます。 こちらは私の「ソファホワイトボード」です。写真ではスケールを調整するためにペンを追加しました。ペンを使っていると、消せたらいいのにと思うでしょう。 すぐに散らかります。鉛筆と消しゴムを使用します。

my sofa whiteboar

コーディングの問題の練習は、プログラミングの問題の答えを覚えることではありません。

コーディングの問題

ここ の主要なコーディング インタビュー ブックを忘れないでください。

問題の解決:

コーディング インタビューの質問ビデオ:

チャレンジ/練習サイト:

  • LeetCode
    • 私のお気に入りのコーディングの問題サイト。おそらく準備する 1 ~ 2 か月分の購読料を払う価値があります。
    • コードのウォークスルーについては、上記の Nick White と FisherCoder のビデオを参照してください。
  • HackerRank
  • TopCoder
  • Codeforces
  • Codility
  • Geeks for Geeks
  • AlgoExpert
    • Google のエンジニアによって作成されたこれは、スキルを磨くための優れたリソースでもあります。
  • Project Euler
    • 非常に数学に重点が置かれており、コーディング面接にはあまり適していません

始めましょう

さて、話は十分です、学びましょう!

ただし、学習中に上記のコーディング問題に取り組むことを忘れないでください。

アルゴリズムの複雑さ/Big-O/漸近分析

まあ、それだけで十分です。

「コーディング インタビューの解読」を進めると、これに関する章があり、最後に、さまざまなアルゴリズムの実行時の複雑さを特定できるかどうかを確認するクイズがあります。それはスーパーレビューとテストです。

データ構造

その他の知識

ツリー

ソート

概要として、15のソートアルゴリズム を視覚的に表したものを次に示します。 この主題についてさらに詳細が必要な場合は、一部の主題に関する追加の詳細 の「並べ替え」セクションを参照してください。

グラフ

グラフはコンピューター サイエンスの多くの問題を表すために使用できるため、このセクションはツリーや並べ替えと同様に長くなります。

さらに多くの知識


最終レビュー

このセクションには短いビデオが含まれます。非常にすぐに見て、重要な概念のほとんどを確認できます。
頻繁にリフレッシュしたい場合に便利です。

履歴書を更新する

面接プロセスと面接一般的な面接の準備

模擬面接:

面接が来るときのことを考えてください

面接で聞かれる約 20 の質問と、以下の項目の内容を考えてください。それぞれに対して少なくとも 1 つの回答を用意してください。 達成したことについて、単なるデータではなくストーリーを作成します。

  • なぜあなたはこの仕事をしたいです?
  • あなたが解決した難しい問題は何ですか?
  • 直面した最大の課題は何ですか?
  • 見た中で最高/最悪のデザインは何ですか?
  • 既存の製品を改善するためのアイデア
  • 個人としても、チームの一員としても、どのようにすれば最も効果的に働くことができますか?
  • あなたのスキルや経験のうち、その役割において資産となるものはどれですか、またその理由は何ですか?
  • [ジョブ x / プロジェクト y] で一番楽しかったことは何ですか?
  • [ジョブ x / プロジェクト y] で直面した最大の課題は何ですか?
  • [ジョブ x / プロジェクト y] で直面した最も困難なバグは何ですか?
  • [ジョブ x / プロジェクト y] で何を学びましたか?
  • [ジョブ x / プロジェクト y] でもっと良くできたことは何ですか?

面接官に質問があります

私の意見の一部 (答えはすでに知っているかもしれませんが、彼らの意見やチームの視点が欲しいです):

  • チームの規模はどれくらいですか?
  • 開発サイクルはどのような感じですか?ウォーターフォール/スプリント/アジャイルをやっていますか?
  • 締め切りに追われるのはよくあることですか?それとも柔軟性があるのでしょうか?
  • チーム内での意思決定はどのように行われますか?
  • 週に何回会議がありますか?
  • 職場環境は集中力を高めますか? -何に取り組んでいますか?
  • 何が気に入っていますか?
  • 仕事生活はどのような感じですか?
  • ワークライフバランスはどうですか?

仕事に就いたら

おめでとう!

学び続けます。

本当に終わったことはありません。


************************************************* ************************************************* *
************************************************* ************************************************* *

これより下はすべてオプションです。初心者レベルの面接には必要ありません。
ただし、これらを学習することで、より多くの CS 概念に詳しくなり、より適切な準備が整います。
ソフトウェアエンジニアリングの仕事なら何でも。あなたは、より総合的なソフトウェア エンジニアになるでしょう。

************************************************* ************************************************* *
************************************************* ************************************************* *

追加の書籍

これらは、興味のあるトピックに飛び込むことができるようにここにあります。
  • Unix プログラミング環境
    • 懐かしいけどおいしい
  • Linux コマンドライン: 完全な紹介
    • 現代的なオプション
  • TCP/IP 図解シリーズ
  • ヘッドファーストデザインパターン
    • デザインパターンへの優しい入門書
  • デザインパターン: 再利用可能なオブジェクト指向ソフトウェアの要素
    • 別名「ギャング・オブ・フォー」本またはGOF
    • 正規のデザインパターンブック
  • アルゴリズム設計マニュアル (Skiena)
    • 振り返りと問題認識として
    • アルゴリズム カタログの部分は、面接で得られる難易度の範囲をはるかに超えています。
    • この本は 2 つの部分から構成されています。
      • データ構造とアルゴリズムに関する授業用教科書
        • 長所:
          • アルゴリズムの教科書と同様に、良いレビューです
          • 産業界や学界の問題を解決した彼の経験からの素敵な話
          • C でのコード例
        • 短所:
          • CLRS と同じくらい高密度または透過不可能である可能性があり、場合によっては、一部の被験者にとっては CLRS の方が優れた代替手段になる可能性があります。
          • 第 7 章、第 8 章、および第 9 章は、いくつかの項目が十分に説明されていなかったり、私よりも多くの頭を必要としたりするため、理解しようとすると苦痛になる可能性があります。
          • 誤解しないでください。私はスキエナと彼の教え方、マナーが好きですが、ストーニー ブルックの材料ではないかもしれません。
      • アルゴリズムカタログ:
        • これがこの本を購入する本当の理由です。
        • この本はアルゴリズムのリファレンスとして優れており、最初から最後まで読むものではありません。
    • Kindleでレンタルできる
    • 答え:
    • 正誤表
  • アルゴリズム (ジェフ エリクソン)
  • 素晴らしいコードを書く: 第 1 巻: マシンを理解する
    • この本は 2004 年に出版されており、やや古いですが、コンピュータを簡単に理解するのに最適なリソースです。
    • 著者は HLA を発明したものであるため、HLA での言及と例については、話半分に聞いてください。広く使用されていませんが、アセンブリがどのようなものかを示す適切な例
    • これらの章は、優れた基礎を築くために読む価値があります。
      • 第 2 章 - 数値表現
      • 第 3 章 - 2 進数演算とビット演算
      • 第 4 章 - 浮動小数点表現
      • 第 5 章 - キャラクター表現
      • 第 6 章 - メモリの構成とアクセス
      • 第 7 章 - 複合データ型とメモリ オブジェクト
      • 第 9 章 - CPU アーキテクチャ
      • 第 10 章 - 命令セットのアーキテクチャ
      • 第 11 章 - メモリのアーキテクチャと構成
  • アルゴリズム入門
    • 重要: この本を読む価値は限られています。この本はアルゴリズムとデータ構造についての優れたレビューですが、優れたコードの書き方については教えてくれません。適切なソリューションを効率的にコーディングできなければなりません
    • スタインがゲームに遅刻したため、別名 CLR、場合によっては CLRS
  • コンピュータ アーキテクチャ、第 6 版: 定量的アプローチ
    • より充実した、より最新の (2017) が、より長い治療期間を必要とする場合

システム設計、スケーラビリティ、データ処理

4 年以上の経験がある場合は、システム設計に関する質問が予想されます。

追加の学習

これらは、あなたが総合的なソフトウェア エンジニアになるのに役立ち、次の点に注意するために追加しました。
テクノロジーとアルゴリズムを活用できるため、より大きなツールボックスが手に入ります。

一部の主題に関する追加の詳細

これらは、上ですでに示したいくつかのアイデアを補強するために追加しましたが、含めたくはありませんでした
あまりにも多すぎるため、上記で説明しました。あるテーマについてやりすぎるのは簡単です。
今世紀中に採用されたいですよね?

ビデオ シリーズ

座って楽しんでください。

コンピューター サイエンス コース

アルゴリズムの実装

論文

ライセンス

CC-BY-SA-4.0