coding-interview-university - ソフトウェアエンジニアになるための完全なコンピュータサイエンス研究計画。

(A complete computer science study plan to become a software engineer.)

Created at: 2016-06-06 10:34:12
Language:
License: CC-BY-SA-4.0

コーディングインタビュー大学

私はもともと、ソフトウェアエンジニアになるための研究トピックの短いやることリストとしてこれを作成しましたが、今日見られる大きなリストに成長しました。この研究計画を経て、Amazonのソフトウェア開発エンジニアとして採用されました!おそらく私ほど勉強する必要はないでしょう。とにかく、必要なものはすべてここにあります。

私は数ヶ月間、1日約8〜12時間勉強しました。これが私の話です:Googleのインタビューのために8か月間フルタイムで勉強した理由

注意:私ほど勉強する必要はありません。知る必要のないことに多くの時間を無駄にしました。詳細については、以下をご覧ください。貴重な時間を無駄にすることなく、そこにたどり着くお手伝いをします。

ここにリストされている項目は、Amazon、Facebook、Google、Microsoftなどの巨人を含むほぼすべてのソフトウェア会社での技術面接の準備になります。

幸運を祈ります!

翻訳:
進行中の翻訳:

スポンサーになり、コーディングインタビュー大学をサポートしてください!

特別な感謝:


2018年に設立されたOSSCapitalは、初期段階のCOSS(商用オープンソース)スタートアップファウンダーのサポートに専念する最初で唯一のベンチャーキャピタルプラットフォームです。


クラウド向けに構築された開発環境

GitLab、GitHub、Bitbucketとネイティブに統合された、Gitpodは、すべてのブランチの開発環境を自動的かつ継続的に事前構築します。その結果、チームメンバーは、新しい機能を構築している場合でも、バグを修正したい場合でも、コードレビューに取り組んでいる場合でも、新しいタスクごとに新しい開発環境でコーディングを即座に開始できます。


それは何ですか?

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

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

必須:

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

これはソフトウェアエンジニアリングの研究計画であり、Web開発ではないことに注意してください。Google、Amazon、Facebook、Microsoftなどの大規模なソフトウェア会社は、ソフトウェアエンジニアリングをWeb開発とは異なるものと見なしています。たとえば、Amazonにはフロントエンドエンジニア(FEE)とソフトウェア開発エンジニア(SDE)がいます。これらは2つの別々の役割であり、それぞれが独自の能力を持っているため、それらの面接は同じではありません。これらの企業は、ソフトウェア開発/エンジニアリングの役割のためにコンピュータサイエンスの知識を必要としています。


目次

研究計画

研究のトピック

仕事を得る

----------------このポイントより下のすべてはオプションです----------------

オプションの追加トピックとリソース


なぜそれを使うのですか?

大企業のソフトウェアエンジニアとして働きたいのなら、これらはあなたが知らなければならないことです。

私のようにコンピュータサイエンスの学位を取得できなかった場合、これはあなたに追いつき、あなたの人生の4年を救うでしょう。

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

それは長い計画です。数ヶ月かかる場合があります。あなたがすでにこれの多くに精通しているならば、それはあなたにずっと少ない時間しかかからないでしょう。

それの使い方

以下はすべて概要であり、上から下に向かって順番に取り組む必要があります。

進行状況を追跡するためのタスクリストなど、GitHubの特別なマークダウンフレーバーを使用しています。

gitを使いたくない場合

このページで、上部にある[コード]ボタンをクリックしてから、[ZIPをダウンロード]をクリックします。ファイルを解凍すると、テキストファイルを操作できます。

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

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

gitに慣れている場合

新しいブランチを作成して、次のような項目を確認できるようにします。角かっこにxを入れるだけです:[x]

Fork a branch and follow the commands below

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

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

git clone [email protected]:<your_github_username>/coding-interview-university.git
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つに習熟していれば十分です。

この研究計画のために

研究計画を立てたとき、私はそのほとんどにCとPythonの2つの言語を使用しました。

  • C:非常に低いレベルです。ポインタとメモリの割り当て/割り当て解除を処理できるため、データ構造とアルゴリズムを骨の中に感じることができます。PythonやJavaのような高級言語では、これらはあなたから隠されています。日常業務では、それは素晴らしいことですが、これらの低レベルのデータ構造がどのように構築されているかを学ぶときは、金属に親しみを感じるのは素晴らしいことです。
    • Cはいたるところにあります。勉強している間、どこでも本、講義、ビデオで例を見るでしょう。
    • Cプログラミング言語、第2巻
      • これは短い本ですが、C言語をうまく理解できるようになり、少し練習すればすぐに習熟できます。Cを理解すると、プログラムとメモリがどのように機能するかを理解するのに役立ちます。
      • あなたは本の奥深くに行く必要はありません(あるいはそれを終える必要さえありません)。Cで読み書きできる場所にたどり着くだけです。
      • 本の中の質問への回答
  • Python:現代的で非常に表現力豊かで、非常に便利で、インタビューで書くコードを減らすことができるので、私はそれを学びました。

これが私の好みです。もちろん、あなたは好きなことをします。

あなたはそれを必要としないかもしれません、しかしここに新しい言語を学ぶためのいくつかのサイトがあります:

あなたのコーディングインタビューのために

面接のコーディング部分を行うのに慣れている言語を使用できますが、大企業の場合、これらは確かな選択です。

  • C ++
  • Java
  • Python

これらを使用することもできますが、最初に読んでください。警告があるかもしれません:

  • JavaScript
  • ルビー

これが私がインタビューのための言語の選択について書いた記事です: コーディングインタビューのために1つの言語を選んでください。これは私の投稿が基づいていた元の記事です:インタビューのためのプログラミング言語の選択

あなたはその言語に非常に慣れていて、知識が豊富である必要があります。

選択肢についてもっと読む:

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

データ構造とアルゴリズムの本

この本は、コンピュータサイエンスの基礎を形成します。

使いやすい言語で1つ選択してください。あなたはたくさんの読書とコーディングをするでしょう。

C

Python

Java

あなたの選択:

C ++

あなたの選択:

面接準備本

これらをたくさん購入する必要はありません。正直なところ「コーディングインタビューのクラッキング」で十分かもしれませんが、もっと練習するためにもっと購入しました。しかし、私はいつもやりすぎです。

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

延長戦がたくさんある場合:

次のいずれかを選択してください。

私の間違いをしないでください

このリストは何ヶ月にもわたって増えていきましたが、そうです、手に負えなくなりました。

ここに私が犯したいくつかの間違いがありますので、あなたはより良い経験をするでしょう。そして、あなたは何ヶ月もの時間を節約するでしょう。

1.あなたはそれをすべて覚えていない

私は何時間ものビデオを見て、たくさんのメモを取りました、そして数ヶ月後、私は覚えていないことがたくさんありました。私は3日間メモを読み、フラッシュカードを作成したので、確認することができました。私はその知識のすべてを必要としませんでした。

私の間違いを犯さないように読んでください:

コンピュータサイエンスの知識を保持する

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

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

無料で自分のものを作りましょう:

フラッシュカードの使用はお勧めしません。あまりにも多く、それらの多くはあなたが必要としない雑学です。

しかし、あなたが私に耳を傾けたくないのなら、ここに行きます:

私は船外に出て、アセンブリ言語やPythonの雑学から機械学習や統計まで、すべてをカバーするカードを持っていることを覚えておいてください。必要なものには多すぎます。

フラッシュカードに関する注意:答えを知っていることに初めて気付いたときは、それを既知としてマークしないでください。あなたが本当にそれを知る前に、あなたは同じカードを見て、それを数回正しく答えなければなりません。繰り返しは、その知識をあなたの脳の奥深くに置きます。

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

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

一部の学生は、次の手順で修正できる空白のフォーマットの問題について言及しています。デッキを開き、カードを編集し、カードをクリックし、[スタイリング]ラジオボタンを選択し、メンバー「空白:pre;」を追加します。カードクラスに。

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

これはとても重要です。

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

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

トピックを学習し、それをある程度快適に感じたら、たとえば、リンクリスト

  1. コーディングインタビューブック(または以下にリストされているコーディング問題のWebサイト)の1つを開きます。
  2. リンクリストに関して2つまたは3つの質問をします。
  3. 次の学習トピックに進みます。
  4. 後で戻って、別の2つまたは3つのリンクリストの問題を実行します。
  5. あなたが学ぶそれぞれの新しいトピックでこれをしてください。

後ではなく、これらすべてのことを学んでいる間、問題を続けてください。

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

これには多くのリソースがあり、以下にリストされています。立ち止まるな。

4.フォーカス

貴重な時間を費やす可能性のある気晴らしがたくさんあります。集中力と集中力は難しいです。歌詞のない音楽をオンにすると、かなり集中できるようになります。

カバーされていないもの

これらは普及しているテクノロジーですが、この調査計画の一部ではありません。

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

デイリープラン

このコースは多くの科目をカバーしています。それぞれにおそらく数日、あるいは1週間以上かかるでしょう。それはあなたのスケジュールに依存します。

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

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

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

コーディング質問練習

Why is this here? I'm not ready to interview.

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

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

  • 問題の認識、および適切なデータ構造とアルゴリズムが適合する場所
  • 問題の要件を収集する
  • 面接のように問題を解決する方法を話します
  • コンピューターではなく、ホワイトボードまたは紙でのコーディング
  • ソリューションの時間とスペースの複雑さを考え出す(以下のBig-Oを参照)
  • ソリューションのテスト

面接では、系統的でコミュニケーション的な問題解決のための素晴らしいイントロがあります。これはプログラミングのインタビューの本からも得られますが、私はこれが傑出していることを発見しました: アルゴリズム設計キャンバス

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

自宅にホワイトボードがない場合は、アートストアから大きな描画パッドを入手してください。ソファに座って練習することができます。これが私の「ソファホワイトボード」です。縮尺のために写真にペンを追加しました。ペンを使うなら、消せたらいいのにと思います。すぐに散らかってしまいます。鉛筆と消しゴムを使います。

私のソファのホワイトボード

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

コーディングの問題

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

問題を解決する:

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

チャレンジサイト:

始めましょう

さて、十分な話、学びましょう!

ただし、学習中は上からコーディングの問題を行うことを忘れないでください。

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

まあ、それで十分です。

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

データ構造

  • 配列

    • []アレイについて:
    • []ベクトル(自動サイズ変更を使用した可変配列)を実装します。
      • []配列とポインターを使用してコーディングを練習し、ポインター計算を使用して、インデックスを使用する代わりにインデックスにジャンプします。
      • []メモリが割り当てられた新しい生データ配列
        • 内部でint配列を割り当てることができますが、その機能は使用しません
        • 16から開始するか、開始数が大きい場合は、2〜16、32、64、128の累乗を使用します。
      • [] size()-アイテムの数
      • [] capacity()-保持できるアイテムの数
      • [] is_empty()
      • [] at(index)-指定されたインデックスでアイテムを返し、インデックスが範囲外の場合は爆発します
      • [] push(item)
      • [] insert(index、item)-インデックスにアイテムを挿入し、そのインデックスの値と末尾の要素を右にシフトします
      • [] prepend(item)-インデックス0で上記の挿入を使用できます
      • [] pop()-末尾から削除、戻り値
      • [] delete(index)-インデックスのアイテムを削除し、末尾のすべての要素を左にシフトします
      • [] remove(item)-値を検索し、それを保持しているインデックスを削除します(複数の場所にある場合でも)
      • [] find(item)-値を検索し、その値を持つ最初のインデックスを返します。見つからない場合は-1を返します。
      • [] resize(new_capacity)//プライベート関数
        • 容量に達したら、サイズを2倍に変更します
        • アイテムをポップするときに、サイズが容量の1/4の場合、サイズを半分に変更します
    • [ ] 時間
      • O(1)最後に追加/削除(より多くのスペースの割り当てのために償却)、インデックス作成、または更新
      • O(n)は、他の場所に挿入/削除します
    • [ ] スペース
      • メモリ内で隣接しているため、近接性がパフォーマンスに役立ちます
      • 必要なスペース=(配列容量、> = n)*アイテムのサイズですが、2nであっても、O(n)
  • リンクリスト

    • [ ] 説明:
    • [] Cコード(ビデオ) -ビデオ全体ではなく、ノード構造体とメモリ割り当てに関する一部のみ
    • []リンクリストと配列:
    • []リンクリストを避けるべき理由(ビデオ)
    • []お奨め:ポインタの知識へのポインタが必要です:(そのポインタが指すアドレスを変更する可能性のある関数にポインタを渡す場合)このページは、ptrからptrを把握するためのものです。このリストトラバーサルスタイルはお勧めしません。読みやすさと保守性は、巧妙さのために損なわれます。
    • []実装(テールポインタありとなしで行いました):
      • [] size()-リスト内のデータ要素の数を返します
      • [] empty()-空の場合、boolはtrueを返します
      • [] value_at(index)-n番目の項目の値を返します(最初は0から始まります)
      • [] push_front(value)-リストの先頭にアイテムを追加します
      • [] pop_front()-フロントアイテムを削除してその値を返します
      • [] push_back(value)-最後にアイテムを追加します
      • [] pop_back()-最終品目を削除し、その値を返します
      • [] front()-フロントアイテムの値を取得します
      • [] back()-最終品目の値を取得します
      • [] insert(index、value)-インデックスに値を挿入するため、そのインデックスの現在のアイテムは、インデックスの新しいアイテムによってポイントされます
      • [] Erase(index)-指定されたインデックスのノードを削除します
      • [] value_n_from_end(n)-リストの最後からn番目の位置にあるノードの値を返します
      • [] reverse()-リストを反転します
      • [] remove_value(value)-この値を持つリストの最初のアイテムを削除します
    • []二重リンクリスト
  • スタック

    • []キュー(ビデオ)
    • []循環バッファ/FIFO
    • []テールポインタを使用して、リンクリストを使用して実装します。
      • enqueue(value)-テールの位置に値を追加します
      • dequeue()-値を返し、最後に追加された要素を削除します(front)
      • 空の()
    • []固定サイズの配列を使用して実装します。
      • enqueue(value)-使用可能なストレージの最後にアイテムを追加します
      • dequeue()-値を返し、最後に追加された要素を削除します
      • 空の()
      • 満杯()
    • [ ] 料金:
      • リンクリストを使用した実装では、先頭でエンキューし、末尾でデキューするのはO(n)です。これは、最後から2番目の要素が必要であり、デキューごとに完全なトラバーサルが発生するためです。
      • エンキュー:O(1)(償却、リンクリストおよび配列[プロービング])
      • デキュー:O(1)(リンクリストと配列)
      • 空:O(1)(リンクリストと配列)
  • ハッシュ表

より多くの知識

並べ替え

As a summary, here is a visual representation of 15 sorting algorithms. If you need more detail on this subject, see "Sorting" section in Additional Detail on Some Subjects

Graphs

Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were.

Even More Knowledge


最終レビュー

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.

履歴書を更新する

仕事を見つける

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

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]?

  • If you find it hard to come up with good answers of these types of interview questions, here are some ideas:

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
    • An oldie but a goodie
  • The Linux Command Line: A Complete Introduction
    • A modern option
  • TCP/IP Illustrated Series
  • Head First Design Patterns
    • A gentle introduction to design patterns
  • Design Patterns: Elements of Reusable Object-Oriente​d 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
  • 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.

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.

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?

Video Series

Sit back and enjoy.

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

アルゴリズムの実装

論文

ライセンス

CC-BY-SA-4.0