2020 北美軟工實習小記 -前篇

North America Software Engineer Internship (SWE) Experience Share (1)

卓伯鴻
10 min readDec 27, 2019

(一)前言/背景

UMich North Campus (from UM official website)

首先,寫這篇的原因是因為初來乍到北美,要一邊上課、一邊找工作的壓力真的巨大,覺得寫下自己這學期的經歷或多或少可以幫助到,跟我一樣不是神仙(e.g. TopJohnWu),但是也想用Master的f1簽證來米國找軟體相關工作(e.g. Software Engineer)的人。稍微介紹一下我的求學歷程跟工作經驗:

Degree:
- Master: University of Michigan, Ann Arbor, Electrical & Computer Engineering (E.C.E.) Master of Science (M.S.)
- Bachelor: National Taiwan University, Electrical Engineering (E.E.) Bachelor of Science (B.S.)
Work Experience:
- Research Assistant @ NTUEE from June 2017 to Jan. 2019
- 1 IEEE conference (GlobalSIP) paper published (co-first author)
- Software Engineer Intern @ Dell EMC Taiwan from July to Aug. 2018

我找的工作大方向是2020 Summer(從五月初到八月底這段時間)的Software Engineer Internship。而在小方向上我投的項目卻蠻駁雜的,舉凡像是掛名General Software Engineer (SWE)、機器學習工程師(e.g. Machine Learning Engineer, Computer Vision Engineer)、網頁工程師(e.g. Full-stack Engineer, Backend Engineer)我都有丟,再附上今年找實習的過程與結果。

Offer: Amazon(Bay Area)
Interview: Facebook, Amazon
OA: 免洗(e.g. PureStorage, Salesforce), Hulu, Mathwork, Quora

因為每間公司的招工時程跟次數都不大一樣,所以以下我以流程來分段行文。

(二) 找工作流程

大致上分成 「投遞履歷 -> Online Assessment (OA) ->面試 」三個階段。

一、投遞履歷

主要投遞履歷方式有分三種,分別是(1) 在公司來學校宣傳的時候(e.g. career/ company day, career fair)遞上實體履歷 (2) 透過在公司的員工使用內推(referral)上傳履歷 (3) 上公司官網投遞,俗稱海投。

(1) Career Fair:

Career Fair就是學校主辦的「就業博覽會」,以U of M為例,有分成Engineer/ Non-Engineer兩次。又以Career Fair for Engineer為例,活動共有兩天,兩天展出的公司會不一樣,攤位大概有一百個,基本上所有的大公司(e.g. Google, Facebook)都會來,也會有當地的新創公司來招工,或是快速發展中的獨角獸公司。

整體來說,Career Fair的確是有可能拿到面試機會的,但同時也想當依賴機運,舉個簡單的例子,今年Apple來UM招工的組以ml engineer來說,大部分都是做Natural Language Processing(NLP)的Siri Teams,對於專業是Computer Vision(CV)的同學就相當不利,畢竟能符合擅長NLP的同學就已經非常的多了,招工的人也沒有必要擴大matching搜尋的範圍來收人,然而每年來招工的Team都會不同,因此很難保證能遇到自己適合的team來招工。

(2) Internal Refer (內推)

基本上所有公司都有這個機制,就是依靠自家員工來提供符合招工標準(?)的人並從中篩選candidate,這樣做的好處就是recruiter可以不用從成千上萬的履歷去篩人。因此,被內推的履歷是有較高的機會被看到的。

如何找人內推是一個social skill的展現,我在這方面做得不是很好,基本上我只有找大學(NTUEE)跟在UM認識的學長姐幫忙內推,數量上也不算多,大概找了二十幾位而已。然而,也可以透過LinkedIn上搭訕不認識的前輩們來得到內推機會(e.g.找在該公司的台灣人並直接問是否能幫忙內推)。在這方面,我覺得可以參考搭訕king許秉鈞 Adrian Hsu 的文章。

(3) 官網申請(海投)

所有公司都有正式投遞履歷的管道,可以在各式的求職網站上找到申請的連結(e.g. LinkedIn, Handshake)。因為所有的人都可以透過這個方法去申請,所以申請人數會非常非常的多,能被Recruiter相中並撈起來進入candidate pool的機會也小很多,我自己今年秋季海投的結果是「全滅」。但是總是有這麼幾個少數例子是靠海投找到機會的,所以也不好說完全沒有機會,只能說是有投有機會吧ww

二、Online Assessment (OA)

這個項目除了軟體工程師之外,在其他的工程師職位也是不存在的。為什麼會需要這個項目,也是要解決面對龐大的求職者數量。為了確定求職者具有最基礎的coding能力,所以公司會設計一些小題目(或去leetcode上面抄幾題)來篩選具有基礎coding能力的人,一般來說題目都不會太困難,難度大多介於leetcode easy到medium之間,能在一兩個小時內完成。因為OA是系統信,多半不會有真人Recruiter在後面把關,所以通過標準也都是「所有testcases全對」。比較用心的公司就會設計一些可以看出software design能力的有趣題目,花的時間也可能長達四甚至六小時,而評斷標準也會改為通過率與coding style等等的綜合評估,礙於oa的保密條款故不能公開透露是哪幾家用心招工的公司。

三、面試

對於internship的面試而言,一般來說都是一至兩輪,形式各異,有些是phone interview(面試官會打來)、有些是virtual interview(與面試官視訊)。對於General SWE的職位來說,大部分的公司是考刷題的內容,難度也是看面試官的心情,同一個職位有可能會遇到leetcode hard的難度,也有可能會遇到leetcode easy,面試官的好壞對求職者來說,是完全的在碰運氣。

對於通過的標準就無法說死,如果面試官很仁慈願意幫忙,有可能在答的不好的狀況下依然通過,但是成功達出最佳解就基本上都會過,因為有些面試中會參雜一些觀察個人特質的問題,這部分就是在得先去了解該公司的一些核心價值,並盡量的將自己的個人經驗帶入該公司的價值之中,我會在下一段中提及。

通過以上三個階段就代表錄取,聽b02的林哲佑學長說,再進入面試後的篩選通過率平均也是在三成左右,所以就算已經進入最後一階段的面試,也不可以掉以輕心。

(三) 對於準備上的建議

針對上述流程中,分別可以準備的內容:

一、Career Fair

對於學生來說,Career Fair就是去公司攤位與攤位上的工程師聊天,並盡力介紹自己,讓對方知道你想找的工作、你曾做過的project之類的,使他對你有印象,其中有一些小技巧像是elevator pitch,目的就是為了給工程師知道你有跟該職位很matched的skill sets,如果與工程師相談甚歡的話,就可以進一步向對方要信箱,並寄信去follow up,便有獲得面試的機會(需要一些機運),當然這整個過程,英文表達能力也很重要就是,所以建議在去跟dream company聊天之前,先找幾間一般的公司來練練手。

Career Fair的時間會是在開學的第一週或第二週,會因學校開學早晚而異,大致上是分布在九月初到十月初。對於剛來第一年的同學來說,如果在抵達美國前沒有任何準備的話,這個時程算蠻趕的,所以也是建議在出國前就寫好Resume,並可以趁早諮詢學校的職涯中心來修改履歷及準備自我介紹詞。

二、刷題

「刷題雖然可恥,但是有用。」 — b96的卡恩學長

所謂「刷題」,就是練習各家公司的面試考古題。其出題內容就是常見的演算法及資料結構,舉凡如演算法sorting, searching, dynamic programming。練習的地方就是leetcode這個網站,上面有一千多題,刷題者在練習的過程就是想辦法去把上面的題目都寫過,並能在遇到同類型的題目時,在非常短的時間內聯想到。

為何會說刷題可恥,畢竟刷題不是直接地去瞭解演算法、資料結構這些知識的本質,而是透過練習題目來走捷徑,對於想找swe的人來說,這些知識應該是非常熟悉,在面試時就算沒刷過題也可以迅速了解面試的問題本質。

然而我自己覺得「刷題可恥」這件事也是無可厚非,因為其實swe在做的事情也幾乎跟這些演算法沒什麼關係,面試會問這些也只是因為他是個很有效判斷這個人CS程度的量表,為了減低面試的成本,所以公司採取這個策略來篩選人才。然而並不是所有擅長寫code的人,都對演算法很擅長。擅長寫code的人為了不被這個篩選機制刷掉,所以選擇透過「努力」刷題來保有競爭力,個人認為也是不得已的作法。畢竟不努力刷題,也就只是把機會讓給其他更會刷題的人而已。雖然道德上覺得刷題並不這麼正確,但身體倒是挺誠實的,為了工作,我可以忍…

而刷題要怎麼刷,我覺得也不需要多說,打開leetcode,打開youtube去找教大家刷題的影片或是別人寫的刷題blog,網路上有非常多這類型的免費資源,只要願意花時間去google都找得到。

三、面試

求職者可準備的部分,除了刷題之外,還有與面試官的應對技巧。以我自身以及身旁週遭人的面試經驗為例:

在與面試官簡短寒喧、自我介紹之後,開始technical的部分,面試官通常會給出難度在leetcode medium至hard的題目。對於「非屬神仙的普通求職者」來說,題目不是剛好是考古題的話,通常都會沒辦法在第一個想法就有「最好的複雜度」的解法,此時,與面試官的互動就至為重要,沒有任何頭緒的話,至少先給出brute force的解,並在寫brute force的過程中,思考有沒有可以運用的演算法,並跟面試官討論覺得可行的實作方法以及該方法的計算複雜度。這個與面試官討論的過程,能獲得多少的提示,就完全取決於面試官。假設遇到一個仁慈的面試官,在你給出brute force之後,他會問你說「有沒有更好的解」,並可能跟你說「有沒有nlogn的解」、「有沒有不需要額外memory的方法」之類的,用最佳解的時間複雜度或空間複雜度來提示。因此,能抓到面試官給的線索,並繼續讓對話進行,也是面試中非常重要的技巧。面試最忌諱拿到題目,就直接開始埋頭狂寫code,因為面試官也需要時間來讀懂還沒debug過的code,這樣就會浪費掉了一些寶貴的時間。

一言以敝之,在面試過程中,與面試官”keep on same page”十分重要。

四、時程安排

美國之前:寫初版履歷、刷題

九月:與career center討論修改履歷、參加career fair/career day、刷題

十月:寫OA、刷題

十一月:準備面試、刷題

十二月:準備面試、刷題

其實也沒有所謂的硬deadline,我個人認為刷題能連續的複習是比較有效率的作法,在寫OA前、面試前才去抱佛腳,會花很多額外的時間,並且會打亂學業的步調 。只要有OA來、面試機會來,儘早準備好並解決掉,是比較好的作法。因為不知道公司的職缺head count什麼時候滿,早點進到candidate pool,被撈起來的機會也更大。

整體來說,我覺得找工作還是很靠機運的事情,像是有沒有被HR撈起來、遇到好不好的面試官等等,自己能把握的部分就是,認真面對並準備每個oa/面試,機會是留給準備好的人。

--

--

卓伯鴻

Currently a Software Engineer @ Microsoft Azure Compute