過關斬將:美國軟體業老鳥面試考驗的十年演變/程天縱

在前篇文章〈菜鳥與老鳥,求職經歷大不同〉中提到,有經驗的軟體工程師在求職過程中,遭遇與毫無經驗的新手可能大不相同。尤其現在,有經驗的熟手屬於優勢的賣方市場,所以買方企業通常會透過各種管道,先對應徵者的經驗和能力有所瞭解。

因此,對於熟手來說,新手求職的六大步驟中對他們比較重要的,只有「現場面試」(on-site interviews)一個。

在十多年前,最能吸引有經驗軟體工程師的公司是Google;所以當時Google對有經驗熟手的面試非常謹慎和嚴苛。不僅面試次數可以多達十幾次、拖上幾星期甚至幾個月,而且面試的問題更是五花八門,令業界嘆為觀止。

「面死」人的「面試」

2018年底,前Google執行長Eric Schmidt在接受podcast訪談時,承認Google早期的招聘面試確實如所業界批評的,是如同要把應徵者「面死」般的折磨人。

曾經有一位應徵者被面試了整整16次,於是Schmidt要求內部減少面試次數,對同一位應徵者不能超過8次;而根據現在的內部統計,這個數字已經下降到了5次。

當時不僅面試次數多得嚇人,更惡名昭彰的是Google在面試時問應徵者的一些怪異問題。

例如「如果要求你把西雅圖所有的窗戶都清洗乾淨,你應該收費多少?」、「為什麼馬路上的人孔蓋都是圓形的?」、「全世界總共有多少個鋼琴調音師?」等等。

原來設計這些怪異問題的目的,是希望測試應徵者的獨立思考能力、看他們是否能提出有創意的答案,而不是只靠學校的學習成績。

2009年,一位西雅圖「求職顧問」Lewis Lin從客戶那邊收集了140個Google問過的怪異問題清單;即使是聰明絕頂的人、或是非常有經驗的軟體工程師,看了這些題目也都瞠目結舌,不知如何回答。

由於業界的差評太多,嚴重影響了公司形象,因此Google將其中16個最怪異的問題列為「面試時不允許問的問題」;而前述的三個,也都在這個「不允許問」的清單中。

不完美的面試過程

在前一篇文章中提到,我兒Jerry在職場早期有過慘痛的面試經驗,他認為面試本身就是一個「無法完美的過程」(imperfect process)。

例如,面試官通常都會專注在應徵者的口語溝通技巧,而這對於非美國本土的外國應徵者,就是一個很不公平的劣勢,只能盡人事聽天命了。

再者,應徵軟體開發工作的人,總要瞭解和回答基本的技術問題吧?但是誠如上篇文章中指出的,人生當中總有運氣不順的時候,再加上面試現場的壓力,應徵者通常無法在現場達到最佳狀態,回答內容自然也可能不盡理想。

現場面試的分類

Jerry從UCLA博士班剛畢業時,也海投了許多簡歷;有幾家公司進行到「現場面試」的階段,並且給了聘僱邀約;最終,他選擇了位於矽谷的Yahoo。

Yahoo為Jerry安排了8個現場面試時間段,基本上是從早上9點到下午5點,一整天的時間。由於來自應徵者的抱怨太多,Yahoo 後來也自我檢討改進,都控制在5個以內。

不就是招聘軟體開發工程師嗎,為什麼需要這麼多次的面試?到底企業都派些什麼樣的人來做面試官?面試的時候到底在談些什麼?

根據Jerry的經驗總結,在多次的現場面試中,至少會有一位經理來測試應徵者的工作態度、行為、以及價值觀,以確保能夠符合和融入公司的文化。

如果應徵者是比較資深、經驗豐富的工程師,那麼就可能安排一位產品經理來面試,瞭解應徵者的專業領域知識,例如產業結構、科技趨勢之類,比較「非技術性」的問題。

除了上述兩種「經理面試」之外,其他的基本上都是「技術面試」(technical interview)。

技術面試的種類

通常每個面試時段都會有一位面試官主持,偶爾也會有兩位出現;其中有一位是前來擔任「影子」(shadow)的,也就是跟著主要的面試官來學習的主管,所以應徵者的心情可以不必太受「影子」的影響。

在眾多技術面試時段當中,通常包括以下三種類型:

1. 白板測試

在現場,請應徵者到白板前寫「虛擬程式碼」(pseudo code),以測試寫程式和溝通的能力。

這個測試模擬的是真實工作場景,應徵者得在會議室中,將想法或創意直接透過畫圖或寫程式,展示在白板上。這個過程中的溝通非常重要,你要一邊寫、一邊和「虛擬同事」(在這裡就是面試官)解釋,以便讓他們瞭解你的邏輯。

有的公司會直接給應徵者一部筆記型電腦,要求在指定的「整合開發環境」(Integrated Development Environment,IDE)中直接寫程式;例如在模擬開發iOS app的環境下,用XCode工具寫程式。

這種方式主要測試的,是應徵者在電腦上寫程式碼的能力,但不必像在白板上寫虛擬碼般邊寫邊講,而是寫完之後再做解釋。

一般軟體工程師比較習慣在電腦上寫程式,比白板輕鬆自在,但是測試重點在於程式碼和語法的品質;就如同寫一篇文章,在白板上寫的是情節架構,在電腦上寫的就要看架構語法和句子的功力了。

如果你的技術能力很強、題目也不難的話,「白板測試」聽起來很簡單;但是有過經驗的人都認為,這一關其實非常困難。

因為應徵者一定會緊張。在現場無形的壓力下,一邊要解題、一邊又要提醒自己大聲說出背後的邏輯,確實不容易,所以有很多人都敗在這一關上。

(如果讀者對「白板面試」有興趣瞭解更多的話,請參閱〈美國軟體巨擘造就科技實力的人才招募手法〉一文的「技術電話面試」部分。)

2. 專業知識測試

即使光講軟體開發,也有許多不同的領域;如果沒有相關的專業知識,光是會寫程式,也不見得能成為這個領域中出色的軟體工程師。

因此,這類面試之中所考的問題,都和專業應用領域有關。

例如在行動終端應用領域,就可能會問到「在iOS或Android系統之下,如何進行記憶體管理」、「同步運算(concurrency)和多線緒運作(muti-threading)之間的關聯如何」等等。

3. 軟體架構設計

在這個面試環節,面試官會針對某個技術問題,要求應徵者設計一個軟體系統架構去解決,例如設計一個「即時聊天應用」(real-time chat application)。

面試官會依照應徵者的工作經驗,設計問題的難度;如果是資淺的應徵者,在行動應用的範圍之中,就只會要求在終端設備上做系統架構設計。

如果是資深的應徵者,則可能被要求做多系統的設計;例如主從架構(client-server architecture),或是雲、網、端的架構。

這個環節通常只要畫出許多「方塊圖」(component diagram)、以及方塊之間箭頭指向的連結關係(sequence diagram)就可以了。

面試官的經驗分享

Jerry已經在職場上工作12年了。身為軟體開發部門的主管,他經常需要招募新員工;而他在面試應徵者時首先注意的,是對方是否有足夠的自信。

雖說一個表現得十分自信的人,也未必就非常懂自己的專業,但一個表現得非常沒有自信的人,就肯定不是很瞭解自己的專業。

由於Jerry自己有過失敗經驗,也深刻瞭解雙方「資訊不對稱」的不合理情況,因此他在進行技術測試時,並不是給應徵者出些困難的技術題目,而是針對應徵者自己現在正進行的、或是過去已經完成的專案提出一些問題。

「出題目的人永遠不會錯」,因為出題的人是有備而來的;而回答問題的人,往往是出其不意。因此,回答問題的人很難表現得非常自信;所以反過來說,唯有讓應徴者談自己的專案,才能看得出他是否有自信。

Jerry經常問的一個問題,就是「你把你正在進行項目的架構圖(architecture diagram)畫出來給我看看」。

這個技術問題跟「英文語言能力」沒有什麼關係;何況又是自己的專案,如果連這個都沒有自信、或是畫不出來的話,這個應徵者的面試基本上就結束了。

軟體專案的架構圖通常是很龐大的,前來應徵的開發者未必能瞭解整個系統架構;但畫出來之後,Jerry接著就會問應徵者,負責的是系統中的哪一塊、以及這一塊如何運作。

Jerry還喜歡問應徵者的,是關於架構圖上鄰近程式模組的問題。這些模組通常是由其他隊友開發、但又必須和應徵者負責的部分整合在一起;如果應徵者也非常清楚的話,就代表他是一個好的團隊成員,而且有足夠的好奇心去瞭解隊友開發的模組細節。

這一點非常重要。一個有好奇心的軟體工程師,未來在職場裡就會自我學習成長,不必要老闆天天盯著做。

如果應徵者不瞭解鄰近模組的細節,Jerry也不會糾結在這一點上;他會請應徵者花點時間推斷或猜想,這個鄰近模組是做什麼用的。

Jerry是一個技術比較全面的主管,只要知道了應徵者所負責模組的作用、再加上瞭解鄰近模組如何連結,就可以大致找出幾個鄰近模組彼此作用的可能性;而每個可能性都會有其優缺點,他也會列入評估。

因此,從應徵者的推斷和猜想,就可以判斷出其技術能力的程度。這種面試方式無論結果如何,都不會打擊應徵者的自尊心、也不會讓他當場覺得非常難堪。

應徵者的提問

在面試結束之前,通常面試官會給應徵者一些時間提問。這個看似平常的禮貌往來,Jerry對於提問的問題卻非常重視。

如果應徵者不是客氣的隨便應付,而是提出一些好問題,那麼對於面試結果就會加分;可惜大部分應徵者並不一定會注意到這一點,不但喪失加分的機會,更糟糕的是有時還會導致扣分。

在這個可以反問面試官的環節,好的應徵者通常會設身處地,假設自己是這個企業的員工,進而問出許多好問題。

透過這些問題,面試官可以確認應徵者來面試之前是否做好準備。除了準備技術面試需要花大量時間之外,如果連公司的運作都要瞭解,就得花更多時間準備。

機會永遠屬於有準備的人,所以大部分企業和主管都希望自己員工,具有「準備」的工作態度與特質。

不好的提問或回答

  1. 應徵者:「前面幾個面試官已經回答過我的問題了,所以我沒有什麼需要再問的。」(真的沒有問題問嗎?我可能是你未來的老闆喔。)

  2. 應徵者:「那麼請你告訴我,你為什麼喜歡在這家公司上班?」(如果前面帶點鋪陳,這個問題或許是個好問題;但如果只是問這個問題,就會讓面試官覺得你在應付,只是隨便問問殺時間。)

好的問題

  1. 應徵者:「請問你如何考核一個員工的績效?如果我有幸被錄取,你對我前一、二、三個月的期望?達到什麼目標?」(這個問題讓人感覺,你是目標導向的。)

  2. 應徵者拿出手機,打開這個公司的App,然後問面試官:「我很喜歡這個App的X、Y、Z功能,但是為什麼這個App不提供A、B、C的功能呢?」(讓面試官知道你花了大量時間來研究公司的產品,而且你有心要增強或改善這個產品。)

最後還有一個小提示:如果你能夠當場記筆記,會讓面試官覺得你對於面試的過程非常慎重,而且願意不停的學習;所以,你可能會因為這個小舉動而獲得加分。

後記

我之所以寫這一系列「美國軟體工程師求職」相關的文章,主要原因是以下幾點:

  1. 科技產業硬體發展已經有百年歷史,但軟體技術的高速發展只是近十年的事。在未來幾十年中,軟體技術和產業仍然會是高科技產業的重點;國家的GDP增長和全球競爭力,仍將受到軟體產業發展的巨大影響。

  2. 台灣的硬體產業與半導體產業,在全球都已經佔有舉足輕重的地位,唯獨軟體產業仍然嚴重落後於其他已開發國家;如果不加速追趕,連硬體的優勢都將逐漸失去,使得台灣高科技產業面臨被邊緣化的窘境。

  3. 軟體產業的基礎設施就是「腦力」,主要來自人才與教育;人才與資本一樣,流動性越來越高,全球化的趨勢不可避免。唯一可以限制其流動性的,就是「政府政策」這隻隱形的手;但水可載舟亦可覆舟,端看如何運用。

  4. 在AI時代,許多傳統工作會消失,但是軟體開發工作的需求會越來越大。就像英語一樣,在過去是個專業,現在是個必須具備的基本能力;寫程式目前仍然是個專業,但不久的將來之後將會成為基本能力。

  5. 美國軟體產業的求職競爭情況,不必多久之後就會在台灣發生,而且會影響到所有傳統產業;「機會屬於有準備的人」,千萬不要認為我寫的這幾篇文章與現在在台灣的我們無關。

有備無患,不是嗎?