對於那些即將開始找工作的人來說,如果你沒有諸如斯坦福大學這樣的名校計算機學位,那麼你可能會擔心自己無法獲得頂尖科技公司的工作機會。也許身邊有人告訴你,以你的資歷不足以在微軟或者 Facebook 這樣的公司找到工作。但本文的作者用自己的切身經驗表示,你可以。

本文將分享作者在Facebook、谷歌、亞馬遜、LinkedIn、微軟、Twitter、Pinterest、Snapchat 等頂級科技公司的面試經歷,講述他是如何獲得多個科技公司的 Offer,並最終在 Twitter 獲得夢寐以求的工作的。

個人背景

我的大學很普通,並沒有藤校光環。我在愛達荷州的一所社區學院學習了兩年,然後在一所天主教大學獲得了計算機學位。

興趣使然,我在大學三年級時開始學習計算機科學。當時我唯一擁有的類似電腦的東西就是中國版的山寨任天堂 SNES 。當我把磁帶放進去時,它老是出問題。

爲了在大學期間自己養活自己,我不得不做多份兼職。

畢業時我開始找正式的工作,我採用廣撒網的策略,向多個知名科技公司都投遞了申請,並且有幸得到了幾次電話面試的機會。

最初自己缺乏面試經驗,自認爲面試官會問一些鏈表或者二叉樹之類的問題。然後實際並非如此,因此我面試失敗了。

勇往直前

我沒有過多地探究自己是否優秀。我知道自己的學習能力非常強,我需要的只是一個機會。

正如大家所說的那樣,要廣撒網。而我也正是這樣做的。

我接下來做了一件非常引以爲傲的事情。我編寫了一個簡單的 Python 腳本,它可以從Craigslist 上自動抓取一些含有關鍵字的職位列表,並將這些職位對應的郵件聯繫方式存到電子表格中。

這並不是最聰明的解決辦法,但在 Craigslist 上發帖的人對他們所要招聘職位的描述出奇地準確。

然而,Craigslist 並不喜歡人們抓取他們網站上的內容。爲了解決這個問題,我通過一個 VPN 運行我的腳本,並利用定時器每隔幾分鐘就暫停腳本。雖然它並不完美,但運行情況也還可以。

最後,我搜集了來自舊金山、波特蘭、斯波坎和西雅圖的大約500個公司的招聘電子郵件。我根據這些職位的具體發佈時間和其它信息對結果進行了過濾,並通過添加越來越多的特性來改進它。

後來我發現已經有一些腳本在爬取 Craigslist 上的信息並自動發送電子郵件。這些大多是海外公司,它們希望把自己推銷到美國市場。

我採用了一個變通方法,我精心製作了電子郵件,我在郵件標題裏使用了那些公司發佈的招聘信息裏的一些關鍵詞。然後,我在郵件正文部分添加了更多的細節信息,讓郵件內容看起來更加個性化,不像是模板。我做了一個快速的A/B測試,就這樣,我收到的應聘公司的回覆率從2-3%增加到了10%。

在發送的大約500封應聘電子郵件中,我收到了大約50份回覆,其中一小部分給了我電話面試的機會。我之所以只發500封電子郵件,這是因爲我時間不夠,我需要儘快找到一份工作。我需要儘可能地提高面試通過率,而不是獲得儘可能多的面試機會。

幸運的是,我最終在西雅圖的一家創業公司找到了一份初級軟件工程師的工作。這家創業公司當時位於 Kirkland,所以我必須坐45分鐘的巴士才能趕上面試的時間。

接下來我在這家公司工作了3年半。我在那裏學到了很多東西,比如亞馬遜 AWS、EC2、DynamoDB、SQS 和 Docker。我在這段時間裏成長了很多,我學習瞭如何編寫模塊化的、可維護的代碼,我學會了如何進行軟件設計,我也學會了如何處理人事方面的問題。

我所在的團隊成員大都是行業佼佼者,他們都曾供職過很多知名公司,比如微軟、亞馬遜、LinkedIn。我把自己定位成一塊“海綿”,盡情地從他們身上進行吸收和學習,這對我的職業生涯產生了非常巨大的影響。

初創公司的日子

我在加入的第一家創業公司工作期間,所做的幾乎全部都是後臺開發方面的工作,中間會涉及一些開發運維。我開始編寫一些函數來添加或修改一個影響範圍很小的特性,不過這是一個瞭解代碼庫並進行一些代碼審查的好機會。

一年之後,我開始負責代碼庫的一部分,然後我的任務是將一組特性轉換爲服務。這是這家創業公司 SOA 階段的開始。我們開始將站點的各種組件轉換爲服務,我就是在這個過程中學習了更多有關 RESTful 服務、身份驗證、AWS 服務、發佈/訂閱、分佈式系統等方面的知識的。

有趣的是,我並不是通過書本或正規的教育來學習這些知識的。相反,是因爲我在實際工作中需要開發完成一系列功能部件,但我在這方面存在知識瓶頸。

所以我想,那就邊學邊做吧。

很多時候,我都陷入了分析癱瘓狀態,在這種狀態下,我過度分析了各種情形場景,最終無法取得進展。

那些艱難的時刻其實是最好的學習機會。我開始學習功能範圍、監視、警報和文檔方面的知識。這個過程的每一步都揭示出我需要學習更多的東西。不管是作爲一個普通人還是軟件工程師,過去2到3年都是我人生中成長最快的時期。

我如何準備面試

在經歷了第一次求職面試中的各種艱難曲折後,我告訴自己,在未來的求職面試中我必須做好充足的準備。

我對自己擅長的、不擅長的以及可以改進的地方進行總結,從而爲未來的面試做好充分準備。我將它分爲三個類別:數據結構、算法和系統設計。

我的正式職業生涯的編程語言基本都是 PHP ,在大學裏也學過 C++,所以我想嘗試一些更簡單、更不繁瑣的面試。因爲這個原因,我選擇了Python。這是一門非常強大的語言,並且易於學習,支持許多開箱即用的數據結構,並且可以在白板上快速書寫。我是通過 Youtube 上的一些視頻教程學習 Python 的,此外還閱讀了教學文檔。我選擇學習 Python 的另一個原因是,它具有很高的可讀性,而且在白板上書寫很容易。

首先是用 C++ 語言寫的降序排序:

#include<bits/stdc++.h>

usingnamespacestd;

intmain()

{

intarr[] = { 1, 10, 0, 4, 5}

intn = size(arr)/ sizeof(arr[ 0]);

sort(arr, arr + n, greater< int>());

for( inti = 0; i < n; i++) {

cout<< arr[i] << " ";

}

return0;

}

以下代碼是 C++ 和 Python 之間的一個簡單的比較:

a = [ 1, 2, 4, 5, 1000]

a. sort( reverse=True)

printa

我積累的經驗的是,很多應聘者在面試過程中會在簡潔方面犯錯。在45分鐘的面試中,你需要用大部分的時間來解決實際問題。

吐血建議:選擇一種簡潔的編程語言,這樣你就可以在白板上更快地寫代碼。

面試準備模式

我花了大約一個星期的時間在 LeetCode、HackerRank 和 Project Euler 中做了一些簡單的測試,以便熟悉它們的接口,並讓自己開始習慣使用 Python 編寫代碼。

第一週我對自己在某些編程語言方面的能力水平進行了摸底。我又花了一週時間來進行一些設計上的準備,並儘可能做到深入和廣泛。

這對我來說是非常有趣的,因爲我經常查看 iOS 應用,並試圖弄清楚它們是如何開發出來的。例如,如何從頭開始開發 Instagram?(我在 Facebook 面試時曾被問到這個問題)。

我的專業背景是 API 設計和服務導向式架構。因此,我藉此機會展示了我將如何設計自己的 Instagram 版本。因爲我在一些業餘項目中積累了一點 iOS 應用編程經驗,所以我在回答這個面試問題時可以稍微講一下回調和推送等方面的內容。

我一開始講的是我想在自己的 Instagram 版本中加入的一些功能:點贊、上傳照片和簡單的時間軸。我非常瞭解這些場景的功能,因此我能夠構建一個非常可靠的 API。

然後我畫了一些概要設計圖片,介紹了客戶端如何與後端交互,以及後端如何存儲數據。

我從小處着手,然後在需要的地方添加更多的組件,並主動尋找瓶頸所在。我做了一些有根據的猜測(而非盲目的猜測),以及每一項技術是如何融入進去的。同樣重要的是,也需要知道什麼技術無法很好地融合進去。

例如,爲什麼要使用 Cassandra 而非 MySQL 來存儲某些信息,爲什麼要使用 OAuth 而不是簡單的認證,是使用 Cassandra 還是 Memcached 來緩存數據,是使用流媒體還是批處理等等。

在這裏,你需要探索的領域還有很多。因此僅僅通過一個小時的溝通是不夠的。爲了能夠更好地回答這類面試問題,你必須閱讀並學會權衡和取捨。一個行業的技術優勢和劣勢是什麼。爲此,我推薦一個網站:HighScalability。

回答這類面試問題時,要做到就像和同事進行一次頭腦風暴一樣,做盡可能廣泛和深入地探索。

你要知道,這些面試的目的是要了解你的知識面的廣度和深度,這是一個讓你脫穎而出的機會,這一點很重要。我在 Youtube 上看了一段關於如何解決設計問題的視頻,它爲我在回答設計類面試題中提供了巨大的幫助。我從中學到的兩個主要經驗是:推動設計對話並展示自己。

我列出了自己在下面這些領域裏的能力水平:數據結構(鏈表、散列映射、二進制樹、二進制搜索樹、堆、數組)、算法(二進制搜索、哈希、動態規劃、排序)和特定語言的語法和庫(例如,Python的lambda、附加和索引)。

我選擇了自己最不擅長的領域並開始研究它:算法。

算法從來都不是我的強項。我大學畢業已經有一段時間了,在我的日常工作中,我沒有花太多時間在二進位搜索上。我對每個算法的運行原理的使用場景有一些初步瞭解,但我無法在10分鐘內寫出二分查找程序,不管是在白板上還是在面試官面前都是如此。

我從亞馬遜上買了一堆精美的細馬克筆,效果非常好。但面試時的馬克筆通常都不好用,我通常在面試時會花2-3分鐘找一支能用的筆,而這2-3分鐘是你浪費不起的。另外,細馬克筆允許你在一個白板上寫5-8行代碼。

小建議:自己準備一盒馬克筆。

我花了50美元從 Costco 買了一塊白板,從亞馬遜買了一些相關書籍,然後開始了我的編程實踐。我確保我在二分查找、遞歸、動態規劃、BFS 和 DFS 上做了專項訓練。很多的面試問題都是圍繞遞歸和二分查找展開的。我所見過的最好的面試問題是那些有很多不同解決方案的面試問題。

在參加谷歌的面試時,我曾被問到一個與文件系統目錄有關的問題,以及如何遍歷這些目錄(提示:遞歸)。我很快就解決了這個問題,然後面試官問了如何在那個目錄中找出一個丟失的文件。這個問題相對更難一點,但是我還是解決了。然後我們討論瞭如何重建目錄,如何對它進行序列化和反序列化,我們花了大量的時間討論文件目錄在底層是如何運行的。對我來說,這是一次非常愉快的面試。

面試頂尖科技公司

可以這麼說,參加這類面試是一次令人神經崩潰的經歷,給人的感覺如同坐過山車。

我是根據下面這個方式來分配我的時間的:20%的時間用於簡歷製作,20%的時間用於調查研究,60%的時間用於面試準備。

我將自己20%的時間都用在整理自己的簡歷上,而我的簡歷至少有三年時間都沒有更新過了。我仔細研究了我過去做過的所有事情,並選擇了一些我從頭負責到底的項目,項目的複雜性則是其次。

我之所以會這麼做,主要有兩個方面的原因。從頭到尾負責一個項目需要紀律和領導能力,這是我想向面試官重點突出的兩個能力。其次,對於那些我從頭到尾負責的項目,我可以向面試官深入且廣泛地描述項目的各個方面。這一點在我參加 Twitter 的面試時回答有關設計的面試問題時發揮了重要的作用,在 Twitter 的面試中,面試官不僅對我負責的項目的設計工作進行了嚴格的考察,而且還對背後的決策進行了考察。我會把20%的時間用於調查研究。這裏說的調查研究是指對自己感興趣的公司進行調查,並尋求內部推薦的機會。通過內部推薦的方式能夠大大提高求職信的回覆率。

根據我自己的實際經驗,我向20多家創業公司和中等規模的公司發送了求職信,只有少數幾家公司回覆了。但是如果得到對方公司內部員工推薦的話,那麼對方公司幾乎都會在一週時間內給我回覆信息。

我並不善於交際,我認識的能引薦給我感興趣的公司的人其實並不多。爲了解決這個問題,我會經常使用 LinkedIn。LinkedIn裏有一個搜索功能,我經常用它來搜索1度聯繫人和2度聯繫人。所謂1度聯繫人,就是通過接受邀請直接建立聯繫的會員。你可以查看他們的個人檔案和人脈信息,不受限制地向對方發送站內信,還可以在你的個人首頁看到對方的動態消息。所謂2度聯繫人,就是已經與你的1度聯繫人建立聯繫的會員。通俗理解就是你好友的好友,一般是沒有建立直接聯繫,但和你可能有交點的人羣。免費賬戶可以看到2度人脈的個人檔案,可以看到和對方的共同聯繫人,但不可以直接發站內信。

LinkedIn的搜索功能

這是非常重要的,因爲給一個人你不認識的人直接打求職電話是非常困難的。當接到陌生電話時,人們通常都非常謹慎,通過這種方式很難快速建立信任關係。LinkedIn 在我調查研究階段對我的幫助非常大。

回顧我面試過的所有公司,以下是我對每一家公司的看法:

  • Facebook/Google:很機械化。標準的面試流程,我和這些公司無法建立任何情感連接。
  • Pinterest:在這家公司的面試體驗並不是最好的,但這家公司是一個很酷的公司,產品也很酷。
  • 微軟:我非常喜歡我所面試的團隊,尤其是團隊經理。標準的面試問題,但是非常個性化。是我的第二選擇,當然這個因人而異,微軟每個團隊的面試風格是各不相同的。
  • Amazon:標準的面試流程。大概有50%的人會喜歡這種面試風格,也有大概50%不喜歡這種面試風格。
  • Twitter:面試流程非常有趣和個性化。我個人非常喜歡它的面試流程,非常重視個人和我過去做過的事情。
  • Snapchat:在洛杉磯有非常酷的辦公室,有很多人都決定在創業的大潮中加入其中。
  • Lyft:離我住的地方不遠,辦公室很不錯,標準的面試流程,我對這家公司沒有太強烈的感覺。

面試 Twitter

從很多方面來說,我認爲要通過 Twitter 的面試都是非常困難的。但與此同時,Twitter的面試流程比我面試過的其他任何公司都更有趣、也更個性化。

Twitter 的面試流程大致是這樣的:與一個工程經理進行簡單的電話面試。接下來是一到兩輪的技術電話面試,這取決於你的表現。如果通過電話面試,他們會把安排你到應聘工作地點進行現場面試,我是在西雅圖參加的現場面試。一共有3輪1小時15分鐘的現場面試,每場面試都有兩個面試官。

最開始的兩輪技術電話面試都是標準化面試,你需要在一個共享的編碼文檔中通過編程來解決實際的問題。

現場面試更像是一種雙方的互動交談,也不會讓人感到太害怕恐懼。面試官會問一些關於你過去參與過的項目的深度問題,他們會詢問你過去做過的事情。如果你過去曾負責過一個項目,那麼面試官就會問一些有關這個項目的問題。面試官鼓勵你用這些項目作爲參考,並從中來試探你的想法。

其它公司的面試感受

相比之下,我覺得 Facebook 和谷歌的面試更加機械化。他們有1-2輪的技術電話面試,5到6輪的現場編程考覈。每一輪面試都需要你在白板上進行編碼,還要要求你在一個相對合理的時間內完成一個近乎完美的解決方案。

Facebook 有兩輪編程面試,一論設計面試,一輪行爲面試。

谷歌有5輪編程面試,都和設計無關,期間沒有一位面試官問我之前做過的項目。雖然我並不認爲這是一種糟糕的面試方法,但這種面試讓我感覺太機械化了,並沒有給工程師提供多少機會來展示他們的能力。有些人在這種面試中表現得非常好,就像有些學生在考試中表現優異一樣。

我並不是喜歡在 Pinterest 的面試體驗。我認爲 Pinterest 這款產品本身非常有意思,他們的工程技術團隊似乎也在解決一些非常酷的技術問題。但是我在 Pinterest 的面試體驗卻是非常糟糕的。

Pinterest 有三輪編程面試、一輪設計面試。在這4輪面試中,設計面試是最讓我失望的。爲什麼這麼說呢?面試官遲到了,他花了幾分鐘時間瀏覽我的簡歷,然後開始在白板上畫一些 API。他簡短地描述了他期望 API 做什麼,並問我該如何解決這個問題。我們闡明瞭 API 的特性,然後我開始使用白板描述我的解決方案,大概5分鐘後,我轉過頭髮現他竟然睡着了。這次面試體驗太糟糕了。我在一項調研問卷中向招聘人員反饋了這個問題,但是沒有收到任何回覆。

我就不詳細和大家分享我在面試中被問到的所有問題的細節了,不過我想和大家分享我在準備面試的過程中學到的一些經驗和有用的技巧。

我的面試總結:

  • 簡歷內容一定要做到實事求是。大多數公司的面試官會問一些關於你的簡歷上的內容的問題,面試官通常能夠根據你的回答判斷你的簡歷內容是否作假。此外,對一個項目做到100%的瞭解要比對10個不同項目分別只有10%的瞭解要好得多。
  • 簡歷最好只用一頁。對於科技公司來說尤其如此,因爲科技領域有一個普遍的共識,只有當你有博士後的研究經歷或者親自深度負責過很多項目,這時你的簡歷有2頁或更多頁纔是合理的,否則最好用一頁。
  • 多社交併建立自己的人脈網絡。軟件工程師職位的競爭非常激烈,這些頂尖的科技公司每天要篩選成千上萬份簡歷。如果你應聘的公司內部有員工幫你內推,那麼你的簡歷被關注的可能性會更高。
  • 精心準備面試內容。每一個對你感興趣的公司都想知道你爲什麼對他們感興趣。一個糟糕的回答是:我現在急需找到一份工作賺錢支付賬單。一個不那麼糟糕的回答是:我在網上瀏覽,發現了你們公司,好像你們在做一款非常有趣的產品。一個很好的回答是:我知道你們公司在X領域做了一些有趣的工作來實現Y。我在過去做過一些工作,這是我學過的關於A、B、C的知識,這些知識可能與X領域有關。我對Y非常感興趣,因爲......(不要將這當作一個固定的模板。相反,你應該從中找到模式,——做充分的調查研究,向你應聘的公司展示爲什麼你和這家公司是非常匹配的。)

其它建議

技術面試是非常困難的。然而,最好的機會是留給那些做了充分準備的人。

  • 早做準備,而且要做充分的準備。每個人都知道他們應該爲面試做準備,但大多數人都不知道如何才能真正做好準備。就像任何值得做的事情一樣,需要刻意練習才能在某件事上有出色的表現。而刻意練習意味着你需要有一套系統。
  • 建立一套用來練習技術技能的系統。我會根據1-10分的評分方式對自己的表現進行評分,並努力提升自己最不擅長的領域。我花了好幾天時間研究不同類型的面試問題,直到我完全掌握了每個概念。我每天都在 Evernote 上做筆記,筆記內容包括編程技巧、常見錯誤和誤解、用於解決特定問題的框架等等。

我的筆記

  • 將你掌握和學會的知識記在本子上。我同時使用 Evernote 和 OneNote 來記錄和追蹤事情。我用 OneNote 來記錄技術方面的內容或代碼,因爲我可以按照自己喜歡的方式來對這些筆記進行格式化。我用 Evernote 寫一些文章或感想。上面的圖片顯示的是我在架構和系統設計上的一些想法。

Evernote 用於記錄想法

  • 把所有的事情都記錄下來,即使你認爲你不會用到它也要記錄下來。我非常健忘,所以我會將我學會的任何東西都記錄下來,包括 shell 命令。我會時不時地閱讀技術博客,如果我發現任何有趣的東西,我都會立刻在 Evernote 上將其記錄下來。我會每星期或每月對記錄過的內容做一次整理優化。這個習慣在我的職業生涯中對我的幫助很大。
  • 模擬面試。這絕對是非常有價值的,我極力推薦大家這樣做。我會和朋友一起進行模擬面試,並儘可能多地練習。如果你找不到朋友一起進行模擬面試聯繫,那麼我推薦你使用 Refdash,這是一款“面試即服務”的產品。這個平臺上有一羣在谷歌、Facebook和微軟等大型科技公司工作的面試官。這些面試官會評估你的編碼和設計技能。最重要的是,在每次模擬面試後它都會給你打分,並給出一些具體可行的改進方法。
  • 容忍自己的失敗。在我整個應聘過程中,我經歷過很多次的失敗。有時失敗只是因爲你運氣不好。即使你面試失敗了,這對你來說也不是世界末日。公司在招聘的過程中傾向於說“不”,因爲這對他們來說風險更低。從長遠來看,犯假陽性的錯誤比假陰性的錯誤的成本更高。最初的幾次拒絕給人造成的打擊最大。當我剛開始面試的時候,我幾次電話面試都沒有通過,我的自信心也受到了嚴重打擊。我對自己的能力也開始心存懷疑,並開始擔心自己的技能在當今的就業市場中已經不受待見了。然而,我給自己支了一招:如果你失敗了10次,那麼再多嘗試10次。你所需要的只是一次成功,這種安慰給了我很大的信心,讓我能夠不斷嘗試,當我拿到第一個 Offer 之後,後來的其它 Offer 來得就會容易很多。

我花了大約兩個月的時間來爲我的面試做準備並做各種模擬練習。我每週大概會在這方面花20個小時,或者每個月花80小時,在全職工作之餘進行學習和記筆記。

爲了充實我的簡歷,我花了3年半的時間努力工作。在日常工作中,我會有意識地選擇那些困難且棘手的任務,這樣我就能比其他人學到更多東西。儘管我並非畢業於常青藤名校,之前也沒有在頂尖科技公司工作的經驗,但我對我所負責過的項目有一個清晰透徹的理解,並在簡歷中體現出這一點,從而讓自己在面試中能脫穎而出。這是有可能做到的,因爲我做了很多研究,並將我學到的所有東西都記錄了下來,並建立一個用來練習技術技能的系統。

要記住:堅強的人能夠生存,堅韌的人能夠茁壯成長。

小結:不要放棄,爲機會而時刻準備着,多練習,並始終充滿希望。專注於過程,並在整個過程中對自己嚴格要求。

資料推薦

  • 書籍《Elements of Programming Interviews: The Insiders' Guide》:對解決那些非常難的編程問題非常有幫助。
  • 書籍《Cracking the Coding Interview: 189 Programming Questions and Solutions》:涵蓋了大部分的計算機基礎知識。
  • OneNote:我使用這款工具來存儲代碼片段。
  • Evernote:我使用這款工具來記錄並存儲代碼之外的東西。
  • CodeRunner:我非常喜歡這款 Mac 應用,我曾多次使用它來運行特定的 Python 腳本和函數,而且效果非常好。
  • Jobscan:它提供很酷的簡歷篩選工具。
  • Refdash:由一羣前谷歌員工運營的產品。用這款產品來模擬面試的效果非常贊。我在 Refdash 上碰到的面試官曾在谷歌工作過,他爲我指出了很多我應該關注的地方,以及谷歌面試的主要評分依據。我強烈建議你嘗試一下。
  • CodePath:一個幫助人們進入科技行業工作做準備的非盈利組織。公司的兩位負責人 Tim 和 Nathan 都是很棒的人,我從他們那裏學到了很多。這個社區非常有幫助,每個人都願意伸出援手!
  • Fine-point markers:極力推薦!

在我推薦的兩本書中,我更喜歡 Cracking the Coding Interview(CTCI),它介紹了很多基礎知識,例如鏈表是如何工作的,哈希映射如何工作以及如何解決一些基本問題。

Elements of Programming Interviews (EPI)非常適合解決較難編碼的問題。我的使用方式是,首先花2-3周的時間大致瀏覽這兩本書,達到一個基本的瞭解。

接下來集中精力閱讀 EPI,因爲我會開始在那裏做更多有趣並且困難的事情,同時充分理解 CTCI 中的基本數據結構,以幫助我更容易地解決這些問題。

  • 來源:CSDN(言則整編)
  • 譯者:安翔
  • 原文:https://medium.freecodecamp.org/how-i-landed-offers-from-microsoft-amazon-and-twitter-without-an-ivy-league-degree-d62cfe286eb8
  • 程序員大咖整理發佈,轉載請聯繫作者獲得授權
相關文章