怎樣準備技術面試

工程師幹話
9 min readDec 2, 2019

--

又到了歲末的時間,大家開始心癢癢想要換工作了嗎?大家的 LinkedIn 帳號又開始收到像是 A 什麼公司、或是 M 什麼 P 什麼的公司的詢問嗎?又有人像是癡漢一樣跟你要電話好讓他可以隨時來電騷擾你嗎?好的,這次來聊聊怎樣準備面試!

面試不是測驗

面試不是測驗,雖然面試似乎有一些測驗的成份,中文裡頭「面試」這個詞也讓人興起對測驗的想像,但是面試這個活動更像是推銷,是在勞動市場上想辦法推銷自己的勞動力。比較起來,我比較喜歡撐之為面談。

當你參加一場技術面談,你不用抱著一種「我要來拿一百分」、「我要考第一名」的想法,也不用為了分數緊張。公司的面談並不是像你求學過程中經歷過的那些有課綱、有教材、有考古題的測驗,內容完全因人而異、天馬行空。有些公司甚至搞不清楚自己到底需要找怎樣的人才,設定的條件與面談內容,在人力市場上根本就找不到人。這樣,你要怎樣拿到一百分?

你不用把拿到多少家不同公司的 offer 當做勝利,求職這件事情沒有所謂的勝利,可能更多的是緣份。有些生意做了反而賠本,沒有拿到某份 offer 不代表什麼,有些 offer 拿到了也不見得是好事。

一次買賣不成,也不代表說就不會有下一次,你可能某次面談還欠缺火侯,但對方從來就無法想像你走出會議室之後可以成長到什麼程度。走出這間會議室,你與對方也只剩下一種關係,就是同行而已,既然是同行,有太多場合會再次相遇。

求職、求才就跟求偶一樣 ,都是找人讓你幹,還有找人來幹你。當中,有太多的機運與際遇,有時你夢想的對象,其實不是你所想像的樣子。而雖然說魚幫水水幫魚可以相得益彰,但你也從來就不需要因為什麼外在的因素,讓你放棄持續追求一個更好的自己。

你也不必抱持一種下對上的態度,既然是推銷,不見得都是買方市場,在人才大量外流,還有許多人才默默不動聲色的投入博奕產業的同時,對許多台灣公司來說,開發人力可說是是賣方市場。你其實需要的是自信滿滿的推銷:你是誰,你有什麼值得購買的經驗與才能,你可以帶來什麼。真的,你可以用自己的能力,把買方市場變成賣方市場。

當你丟開想要追求一百分的心理後,你就會發現,在一場面談中,往往有很多有趣的變化。像是,你原本應徵的是某個職位,你在技能樹上的點法,不見得符合這個職位的需求,但是在面談過程發現你非常適合另外一個部門,如果不在那個部門工作,可能是公司的損失,即使那個部門還沒有開缺,也要想辦法把你弄進來。

或是,因為你具備某項獨家技能,讓對方在過程中有了新的想法,甚至為你成立了新的職位。…誰知道呢?

白板題

很多人對程式白板題相當反感,所持的原因是:程式應該是在電腦上寫,不看一個人上機的表現,而是在白板上的表現,無法展現一名工程師實際具備的程式能力。這種想法,其實已經不適用於即將進入二十一世紀第三個十年的今天。

隨著電腦運算能力愈來愈強,人工智慧與文字辨識普及的今天,即時將筆跡辨識成程式碼並且即時編譯,已經不是什麼新鮮事,這幾年支援觸控的大型平面電視也日益普及,而且我們可以注意到像是微軟發展 Surface Hub ,以及 Google 的 Jamboard — 為什麼,都是這種科技大廠推出這樣的產品?

原因是,他們打算將自己在使用的工具推廣到全世界,無論是微軟還是 Google,在內部,長久以來,工程師其實都是在用白板在寫程式,站在巨大的電子白板之前,思緒會變得更加澄澈清明,更能夠掌握巨大的系統架構以及複雜的演算法;所以,在面試的過程中,自然也會要求面試者使用相同的工具。我們在台灣看到的白板題,其實只是因為國人長久以來技術設備落後所造成的變形,來自國外的程式寫作習慣,到了台灣,只能夠用低技術的白板代替。

所以,如果你拒絕在面試的時候寫作白板題,你並不能夠證明什麼,而是拒絕了一張原本可以在你手中的入場券,你拒絕了去世界一流大公司面試的機會。而當你精通了怎樣在白板上面寫程式,也只是打開了通往真正精妙的電腦世界的大門而已,下一步要挑戰的,就是用嘴寫程式。

「你有什麼問題想問我們的嗎?」

通常面試進行到一定程度,對方可能會問你「有什麼問題想問我們的嗎」?

很多面試者往往不知道如何處理這一個階段,只準備了如何回答對方的詢問,卻沒有想過自己還想了解對方什麼。但,如果你錯失了這段主動詢問的機會,你也錯失了很多了解重要工作內容的資訊,而讓自己讓面試變成了不對等的狀態。

如果你真的不知道要問對方什麼問題,其實,對方問了什麼,你就可以反問些什麼。比方說,對方應該會問過你為什麼想要來應徵這份工作,你可能會回答為了改善待遇、原本的工作環境出了什麼問題,或是感覺在新環境可以學習到更多新技能…諸如此類,而這時候,你就應該問對方:為什麼會開出這個職缺?像「貴公司上個月還在裁員,這個月就重新開始招募,而且還辦了校園徵才。到底發生了什麼事情」?就是一個很好的起手式。

如果對方說,開出職缺的原因是,公司最近因為剛募到了一筆資金,所以開始大舉徵才,要建立一個新團隊全力打造新產品發展新業務,那你大概就可以預期,這家公司的老闆接下來就得在股東的壓力下創造成長,而且他相信把一堆毫無信任基礎的人一起關進一間有著嶄新裝潢以及油漆臭味的辦公室,就可以創造出股東想要的成長,而不知道這種大舉徵才,通常最容易找到的,就是前一份工作做不下去的人,要不就是在只會做事不會搞辦公室政治被氣走的,要不就是不會做事只會搞辦公室政治被趕走的,這兩群人一定會在新環境當中擦出燦爛的火花,你接下來要與這樣的同事共事,一定精采可期呢!

所以,在面試的時候,你就應該開始計算你大概打算在這邊做多久,並且做好人事鬥爭的準備、搞清楚進入公司之後應該加入哪個派系,跟面試主管問清楚他是總經理還是董事長的人馬,在做事與辦公室政治兩者之間,我們的選擇當然是辦公室政治。而如果對方是國外公司,說看上台灣豐沛的開發能量,因此要在台灣設立開發據點,那你就應該問對方:同樣的工作,在國外,你們開多少?

開出一個職缺背後更常見的動機,就是之前有人離職,那麼,你就該問:那個人為什麼要走?我們當然不能接受什麼因為個人生涯規劃這種狗屁說法,而是要具體的原因,通常,我們會從這個人是不是掏空公司、性騷擾還有商業間諜開始問起,但真正的原因,通常是在面試過程中問不出來的。

所以,就像在面試之前,對方往往會要求我們提供一到兩位主管的 reference,證明我們在之前的工作當中的表現,我們也應該要求對方,提供一到兩位做過這份工作的人的 reference,證明這份工作的實質內容以及讓人想要離職的原因。同時我們也可以知道這個人離職之後到底去了哪家新公司,然後考慮去這家公司投履歷。

有些公司的 HR 也會要求面試者提供存摺影本,證明之前的薪資,確認公司沒有付出過高的薪水;以同樣的標準,我們也應該要了解這家公司的薪資水準,在這個階段,我們就應該要求對方提供主管以及所有部門同仁的存摺以及扣繳憑單影本,確認做同樣的工作,應該要獲得的薪資應該多少,同時,當然也需要 HR 的存摺影本,讓我們知道公司到底得付出多少,才能夠請來這麼專業的 HR。

前面提到,面試也是一個結交同行,認識朋友的過程。所以,在這個階段,你也可以禮貌地向對方要求:「請問你們團隊裡技術能力頭最強的是誰?叫出來認識一下。」一般來說,對方可能會覺得這個問題很唐突,不知所措,這時候我們就應該進一步表達友誼以及善意,可以再加上一句:「切磋切磋而已,不傷和氣。」

或是,你也可以問一個巧妙的問題:「趁著這個機會,能不能請主管推薦一些給面試者的技術讀物?」這個問題進可攻、退可守,一方面表現出自己的謙遜氣質,另一方面考驗對方的技術主管多有料,同時可以透露出主管的特色:一般的主管大概會推薦你看《Design Pattern》或是《Clean Code》、歷經風霜的主管會推薦《Working Effect with Legacy Code》,值得景仰的主管會推薦你《Modern C》或是《Effective C++》。

但是,真正飽含睿智、洞燭世情,了解人生智慧的主管,會推薦你的,一定是下筆藻思綺合、文思清麗千眠的 — 《工程師幹話》。

實戰演練

所以,一場征服面試主管的完整面試,會是怎樣的呢:

「根據履歷,你說你有多年的軟體開發經驗,你大概什麼時候開始寫程式的呢?」

「第一次…是在高中的時候,喜歡的老師教我怎麼寫程式的。」

「第一次是跟…老師嗎?」

「嗯。因為當時的氣氛很好,老師又是很溫柔的人,所以就很自然地發生了那種事。畢竟在青春洋溢的校園氣氛中,跟老師學習 JavaScript,再自然不過了。後來,等到我察覺到的時候,我已經變成如果一天不寫程式,就活不下去的工程師了。」

「開始寫程式之後,你有什麼感覺呢?」

「看到好的程式碼,會讓我很舒服。」

「咦?很舒服嗎?」

「只要看到 Kira Kira 的程式,我就會會有一種 Doki Doki,臉紅心跳的感覺呢!我啊,一開始寫程式的時候,也是什麼都不懂,尤其是 JavaScript 裡頭的加法…空物件加上空陣列會變成零,簡直就像人跟企鵝做過之後可能會生出怎樣的小孩一樣難懂。…但,老師在教導怎麼寫程式的時候非常溫柔,我也就慢慢越來越有感覺。尤其是學到了單向資料流的概念,在這個架構當中,所有的資料,都是從同一個地方流出來呢,感覺非常舒服呢!」

「除了單向的資料流,你還有什麼 Design Pattern 方面的經驗呢?你喜歡 Design Pattern嗎?」

「嘛,我最喜歡的 Pattern,是 Adapter。Adapter 啊,就是一個雙插頭,就像一個國外的插頭,沒辦法接到國內的插座的時候,只要中間加上一個轉接用的雙插頭,原本沒有辦法使用的插座,也都變成可以插入了呢!」

「那,你有遇過 Adapter 不能解決的問題嗎?」

「如果一個 Adapter 不夠,你可以用兩個。」

「那麼,我們可以直接在白板上試試看嗎?」

「唔…要在…要在白板上直接來嗎?好害羞喔!」

「在 JavaScript 裡頭,0 == null,會回傳什麼呢?」

「會是 false。」

「那如果是 0 > null,會回傳什麼呢?」

「還是 false。」

「那…如果是 0 >= null 呢?」

「啊啊啊!不可以…這樣會被玩壞掉…程式…。」

「從你在白板上的表現看起來,你真的是一個熱愛程式的工程師呢! — 你對今後的工作有什麼抱負嗎?」

「我啊,雖然才剛出道,缺乏經驗,還有很多事情都不懂,也沒有什麼才能,但是我真心希望所有的用戶,都能夠喜愛我的作品。我也想要嘗試不同類型的開發經驗,像是跟三個人以上、還有更大型的團隊一起合作開發。希望大家今後多多指教!」

--

--

工程師幹話

老闆有交代:你要寫這種東西,好歹用個匿名帳號~