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

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

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

私は数ヶ月間、一日に約8-12時間勉強しました。これは私の話です:なぜ私はグーグルインタビューのために8ヶ月間フルタイムで勉強したのですか

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

ここにリストされている項目は、ほぼすべてのソフトウェア会社での技術面接の準備に役立ちます。 アマゾン、フェイスブック、グーグル、マイクロソフトなどの巨人を含みます。

あなたに幸運を祈ります!

翻訳:
翻訳中:

それはなんですか。

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

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

必須:

  • コーディング(変数、ループ、メソッド/関数など)の経験が少ない
  • 辛抱
  • 時間

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

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


目次

学習計画

研究テーマ

仕事を得る

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

Optional Extra Topics & Resources


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

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

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

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

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

使い方

以下のすべてはアウトラインであり、上から下に順番に項目に取り組む必要があります。

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

gitを使用したくない場合

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

マークダウンを認識するコード エディターで開いている場合は、すべてが適切に書式設定されていることがわかります。

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

あなたがgitに慣れているなら

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

  1. GitHub リポジトリをフォークする: [フォーク] ボタンをクリックします。

    https://github.com/jwasham/coding-interview-university

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

  2. ローカル リポジトリに複製します。

    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
    
  3. 変更が完了したら、すべてのボックスに 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:モダンで非常に表現力豊かで、非常に便利で、インタビューで書くコードを減らすことができるので、私はそれを学びました。

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

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

コーディング面接のために

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

  • C++
  • ジャワ
  • ニシキヘビ

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

  • ジャバスクリプト
  • ルビー

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

あなたは言語に非常に快適で、知識が豊富である必要があります。

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

言語固有のリソースについては、こちらをご覧ください。

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

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

あなたが快適になる言語で、1つを選択するだけです。あなたはたくさんの読書とコーディングをするでしょう。

C

ニシキヘビ

ジャワ

選択肢:

C++

選択肢:

インタビュー準備本

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

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

時間に余裕がある場合:

次のいずれかを選択します。

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

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

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

1.あなたはそれをすべて覚えていないでしょう

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

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

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

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

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

無料で自分で作る:

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

しかし、あなたが私の言うことを聞きたくないのなら、ここに行きます:

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

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

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

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

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

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

これは非常に重要です。

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

あなたはあなたが学んだことを問題解決に適用する必要があります、さもなければあなたは忘れるでしょう。私はこの間違いを犯しました。

トピックを学習し、リンクリストなど、ある程度快適に感じたら:

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

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

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

このための多くのリソースがあります。そのまま頑張ってください。

4.フォーカス

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

カバーされていないもの

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

  • ジャバスクリプト
  • HTML、CSS、およびその他のフロントエンド テクノロジ
  • .SQL

デイリープラン

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

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

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

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

コーディング問題練習

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

次に、戻ってこれを読んでください。

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

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

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

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

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

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

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

コーディングの問題

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

問題解決:

面接質問ビデオのコーディング:

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

始めましょう

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

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

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

まあ、それで十分です。

「コーディングインタビューのクラッキング」を通過すると、これに関する章があり、最後にクイズが表示されます さまざまなアルゴリズムの実行時の複雑さを特定できる場合。それはスーパーレビューとテストです。

データ構造

より多くの知識

樹木

分別

要約として、15のソートアルゴリズムの視覚的表現を次に示します。 このテーマの詳細については、「一部のテーマに関する追加の詳細」の「並べ替え」セクションを参照してください。

グラフ

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

さらに多くの知識


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
    • 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
  • 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.

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.

Computer Science Courses

Algorithms implementation

Papers

ライセンス

CC-BY-SA-4.0