ここに掲載されている項目を学べば、Amazon、Facebook、Google、Microsoftなど
大手企業を含む、ほぼすべてのソフトウェア会社の面接に備えることができます。
あなたに最高の幸運がありますように!
これは何?
これは、Webエンジニア(独学で、CS学位なし)から大企業のソフトウェアエンジニアを目指すための私の複数月の学習計画です。
これは、 新人ソフトウェアエンジニア 、またはソフトウェア/ Webエンジニアからソフトウェアエンジニア(CSの知識が必要な場合)に転職する人を対象にしています。
長年のソフトウェアエ開発経験をお持ちの場合は、より面白い面接を期待してください。
あなたに何年ものソフトウェア/Web開発経験がある場合、Google、Amazon、Facebook、Microsoftなどの大規模なソフトウェア会社は、ソフトウェア/Web開発力ではなくソフトウェア工学に関して見ており、そのためにはCSに関する知識が必要となることをご了承ください。
SREまたはシステムエンジニアになりたい場合は、オプションのリスト(ネットワーク、セキュリティ)から詳細を調べてください。
なぜこれを使用するのか
私はこのプロジェクトを始めたとき、ヒープからスタックを知りませんでしたし、Big-O とは何か、木構造に関すること、グラフをたどる方法を知らなかったのです。
ソートアルゴリズムをコーディングしなければならない場合は、あまりうまくいきませんでした。
これまで使用してきたすべてのデータ構造は言語に組み込まれていて、どのようにしてそれらがどのようにして動作するのか分かりませんでした。
私が実行していたプロセスが "メモリ不足"エラーを出さない限り、メモリを管理する必要はありませんでしたが、回避策を見つけなければなりません。
私は人生で数多くの多次元配列を使用していましたが、何千もの連想配列を使用しましたが、データ構造を一から作成したことはありません。
それは長い計画です。あなたに数ヶ月かかるかもしれません。
すでに多くのことに慣れていれば、それほど時間がかかりません。
それの使い方
下のすべてがアウトラインです。
アイテムを上から下に順番に取り組まなければなりません。
私はGithubの特別なマークダウンフレーバーを使用しています。
新しいブランチを作成して、このような項目をチェックできるようにしてください.xを角かっこに入れてください:[x]
ブランチをフォークし、以下のコマンドに従ってください。
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
変更を完了した後にXですべてのボックスにマークを付ける
git add .
git commit -m "マークされたx"
git rebase jwasham/main
git push --force
あなたは十分にスマートではないと感じないでください
ビデオリソースについて
一部のビデオは、Coursera、EdX、またはLynda.comクラスに登録することによってのみ利用できます。
これらはMOOCと呼ばれています。
時にはクラスがセッションに入っていないので、数ヶ月待つ必要があるため、アクセス権がありません。
Lynda.comコースは有料です。
オンラインコースビデオに付随するYouTubeビデオなど、無料で常時利用可能なパブリックソースを追加することに感謝します。
私は大学の講義を使うのが好きです。
面接のプロセスと一般的な面接の準備
面接のための1つの言語を選ぶ
面接のコーディングの部分に慣れ親しんだ言語を使用することはできますが、大企業にとってはこれらの選択肢が確実です。
これらを使用することもできますが、最初に読んでください。注意が必要な場合があります:
あなたは言語に非常に慣れて知識が必要です。
選択肢についてもっと読む:
私は学習しているので、以下に含まれるC、C ++、Pythonの学習を見ることができます。
いくつかの本があります、下を参照してください。
ブックリスト
これは私が使ったものよりも短いリストです。これは時間を節約するために省略されています。
面接の準備
もし余分な時間があれば:
コンピュータアーキテクチャ
短期:
もっと時間があれば(私はこの本が欲しい):
言語固有
面接の言語を選択する必要があります(上記参照)。 ここで私の推奨する言語です。私はすべての言語のためのリソースがありません。私は追加を歓迎する。
これらのうちの1つを読んだら、コーディングの問題を開始するために必要なすべてのデータ構造とアルゴリズムの知識が必要です。
あなたがレビューをしたくない場合は、このプロジェクトのビデオ講義をすべてスキップすることができます。
C++
私はこれらの2つを読んだことはありませんが、Sedgewickによって高く評価され書かれています。彼は素晴らしいです。
C++の推奨事項がある場合は、私に知らせてください。包括的なリソースを探しています。
Java
OR:
Python
始める前に
このリストは何ヶ月にもわたって成長しました。
ここで私が作ったいくつかの間違いがあります。
あなたはより良い経験をするでしょう。
1.あなたはそれをすべて覚えていない
私は数時間のビデオを見て、豊富なメモを取りました。
そして数ヶ月後に私は覚えていないほどでした。
私はメモを書き、フラッシュカードを作って見直すことができるように3日間過ごしました。
あなたが私と同じ間違いをしないように読んでください:
2.フラッシュカードを使用する
この問題を解決するために、私は2種類のフラッシュカード、一般とコードを追加できる小さなフラッシュカードサイトを作った。
各カードのフォーマットは異なります。
私はモバイル先のウェブサイトを作ったので、どこにいても電話とタブレットを見直すことができました。
あなた自身を無料で作る:
覚えておいてほしいのですが,私はやりすぎてしまい、アセンブリ言語,機械学習のためのPythonのトリビア,統計に至るまですべてのカードをカバーしています。
何が必要なのかはあまりにも大変です。
フラッシュカードについての注意: 最初に答えを知っているときは、それを既知のものとしてマークしないでください。
あなたは本当にそれを知る前に、同じカードを見て、それを正しく数回答えなければなりません。
繰り返すことで、その知識があなたの脳に深く浸透します。
私のフラッシュカードサイトを使用する代わりに
Ankiが何度も私に勧められています。
繰り返しシステムを使用して覚えやすくなります。
ユーザーフレンドリーで、すべてのプラットフォームで利用でき、クラウド同期システムを備えています。
iOSでは25ドル、他のプラットフォームでは無料です。
3.レビュー、レビュー、評価
私は、ASCII、OSI参照モデル、Big-O記法などのチートシートを用意しています。私は余裕があるときに勉強します。
プログラミングの問題から30分ほど休み、フラッシュカードを通過してください。
4.フォーカス
貴重な時間を費やす可能性のある注意散漫がたくさんあります。集中と集中が難しい。
カバーされていないもの
これらは一般的な技術ですが、この調査計画の一部ではありません:
- SQL
- Javascript
- HTML、CSS、およびその他のフロントエンド技術
日々の計画
一部の科目は1日を要し、いくつかは複数日を要する。
いくつかは、何も実装することなく学習しているだけです。
毎日私は以下のリストから1つのテーマを取り上げ、そのテーマに関するビデオを見て、以下の実装を書いています:
- C - struct*と何か他のものをargsとする構造体と関数を使用する。
- C++ - 組み込み型を使用しない
- C++ - 連結リストのSTLのstd :: listのような組込み型の使用
- Python - 組み込み型を使用する(Pythonの練習を続ける)
- 簡単なassert()文を使って、時には正しく動作することを保証するテストを書く
- あなたはJavaや他の何かをするかもしれませんが、これは私のことです。
なぜこれらすべてのコード?
- 私はそれが病気になるまで練習、練習、練習をし、何の問題もありません(忘れてはいけないことがいくつかあります)
- 生の制約内で作業する(ガベージコレクションの助けを借りずにメモリを割り当てる/解放する(Pythonを除く))
- 組み込みの型を利用して、実際の使用のために組み込みのツールを使用した経験を持ちます(本番環境で自分のリンクされたリストの実装を書くつもりはありません)
私はすべてのテーマでこれらのすべてをやる時間がないかもしれませんが、私は試してみます。
あなたは私のコードをここに見ることができます:
あなたはすべてのアルゴリズムの内容を暗記する必要はありません。
コンピューターではなく、ホワイトボードや紙にコードを書く。いくつかのサンプル入力でテストします。次に、コンピュータでテストします。
前提知識
アルゴリズムの複雑さ/ Big-O / Asymptotic解析
講義の中には数学的にも余裕がある場合は、下にジャンプして
離散数学ビデオを見て、背景知識を得る。
データ構造
-
配列
-
連結リスト
-
スタック
-
キュー
-
ハッシュテーブル
その他の知識
木
-
木 - メモと背景
-
二分探索木:BST
-
ヒープ/優先度つきキュー/二分ヒープ
ソート
まとめとして、ここには
15ソートアルゴリズムの視覚的表現があります。
このテーマの詳細が必要な場合は、[いくつかの科目の追加の詳細]の[ソート]の項を参照してください(#additional-detail-on-some-subjects)
グラフ
グラフはコンピュータサイエンスの多くの問題を表現するために使用することができるので、このセクションは木やソートのように長いです。
Skienaの本(下記の書籍の節を参照)と面接の書籍
さらに多くの知識
-
再帰
-
動的プログラミング
-
オブジェクト指向プログラミング
-
デザインパターン
-
組み合わせ(nCk)と確率
-
NP、NP-完全/近似アルゴリズム
-
キャッシュ
-
プロセスとスレッド
-
論文
-
テスト
-
スケジューリング
- OSで、どのように動作するか
- オペレーティングシステムのビデオから収集できます
-
システムルーチンを実装する
- 使用するプログラミングAPIの下にあるものを理解する
あなたはそれらを実装できますか?
-
文字列の検索と操作
このテーマについてさらに詳しく知りたい場合は、[いくつかの科目の追加の詳細]の「文字列のマッチング」の項を参照してください(#additional-detail-on-some-subjects)
-
トライ木
-
浮動小数点数
-
Unicode
-
バイト順(エンディアン)
-
ネットワーキング
システム設計、スケーラビリティ、データ処理
最終レビュー
このセクションでは、重要な概念のほとんどを見直すためにかなり短いビデオを見ることができます。
あなたが頻繁に再学習をしたいならいいですね。
コーディングの質問練習
上のすべてのコンピュータサイエンスのトピックを知ったので、コーディングの問題に答える練習をしましょう。
コーディング質問の練習は、プログラミング問題への回答を記憶することではありません。
プログラミングの問題を練習する必要がある理由
- 問題の認識、そして適切なデータ構造とアルゴリズムの適合
- 問題のための要件を集める
- 面接であなたのように問題をあなたの方法で話している
- コンピュータではなく、ホワイトボードや紙でのコーディング
- ソリューションの時間と空間の複雑さが増す
- ソリューションのテスト
面接では、体系的でコミュニケーション的な問題解決の素晴らしいイントロがあります。あなたはプログラミングの面接の本からもこれを手に入れるでしょうが、私はこの優れた発見しました:
アルゴリズム設計キャンバス
自宅にホワイトボードはありませんか?それは理にかなっている。私は変わった人で、大きなホワイトボードを持っています。ホワイトボードの代わりに、
アートストアから大きなドローイングパッドを拾い上げます。あなたはソファに座って練習することができます。これが私の「ソファホワイトボード」です。
私はスケールの写真にペンを追加しました。ペンを使うと、あなたは消すことができます。すぐに厄介になる。
補足:
プログラミングの問題を読んでやる(この順番で):
コード演習/挑戦
あなたの脳を学んだら、脳を働かせてください。
できるだけ多く、毎日コーディングの課題に取り組んでください。
コーディング面接質問ビデオ:
チャレンジサイト:
チャレンジレポ:
疑似面接:
面接に近づいたら
あなたの履歴書
- クラッキングでの準備項目の再開を参照してください。コーディング面接とプログラミング面接の公開
面接が来たときに考えてください
あなたが得る20の面接の質問と、以下の項目の行を考えてみましょう。
それぞれ2-3の答えがあります。
あなたが達成したことについての物語だけでなく、データを持ってください。
- なぜあなたはこの仕事をしたいです?
- あなたが解決した厳しい問題は何ですか?
- 最大の課題に直面した?
- ベスト/最悪のデザインが見られる?
- 既存の製品を改善するためのアイデア。
- 個人として、そしてチームの一員として、どのようにベストを尽くしていますか?
- あなたのスキルや経験のうち、その役割の資産とその理由は?
- [job x / project y]で一番楽しかったことは何ですか?
- [job x / project y]に直面した最大の課題は何ですか?
- [job x / project y]で直面した最も難しいバグは何でしたか?
- [job x / project y]で何を学びましたか?
- あなたは[job x / project y]で何を良くしていますか?
面接官に質問があります
私の中には(私は既に知っているかもしれませんが、彼らの意見やチームの視点が必要です):
あなたのチームはどれくらいの規模ですか?
- あなたの開発サイクルはどのように見えるのですか?あなたはウォーターフォール/スプリント/アジャイルをしますか?
- 締め切りまでのフローは共通ですか?それとも柔軟性はありますか?
- あなたのチームではどのように意思決定が行われますか?
- 週に何回会議がありますか?
- あなたの仕事環境が集中するのに役立つと思いますか?
- 何をしているの?
- それについて何が好きですか?
- 仕事の生活はどうですか?
一度あなたは仕事を得た
おめでとう!
学び続けます。
あなたは決して本当に終わらない。
*************************************************** *************************************************** *
*************************************************** *************************************************** *
この点以下のものはすべてオプションです。
これらを勉強することで、より多くのCSコンセプトにさらされることになります。
任意のソフトウェアエンジニアリングジョブ。あなたはもっと豊富なソフトウェアエンジニアになるでしょう。
*************************************************** *************************************************** *
*************************************************** *************************************************** *
その他の書籍
その他の学習
これらの話題は面接では出てこないかもしれませんが、
特定のテクノロジとアルゴリズムを認識するためには、より大きなツールボックスが必要になります。
追加科目の詳細
私は既に上記のいくつかのアイデアを強化するためにこれらを追加しましたが、それらを含めたくありませんでした
それはちょうどあまりにも多くのためです。それは科目にそれを過ごすのは簡単です。
あなたは今世紀に雇われたかったですね。
ビデオシリーズ
座って楽しんでください。 「ネットフリックスとスキル」:P
コンピュータサイエンスコース