面試 100 多位軟件工程師後的建議

本文最初發表在 Medium 博客上,經原作者 Hugo Rocha 授權,InfoQ 中文站翻譯並分享。

這種尷尬和緊張的關係,一方面是在完成赫拉克勒斯(Hercules,希臘神話最偉大的半神英雄,男性的傑出典範,偉大的赫拉克勒斯後裔祖先)的 12 項“不可能完成的”任務後成爲英雄,另一方面是在馬戲團訓練過的動物毫無意義地連續跳呼啦圈,我們輕描談寫地稱之爲求職面試。我們都討厭面試,然而,面試卻是我們職業生活中無法迴避的事實。

當我第一次天真地、冒險地進入軟件工程面試這一令人不舒服的、不友好的世界時,沒過多久,我就覺得我在 2~3 個小時內判斷軟件工程師的能力就像法醫一樣精準。

然而,我總是想知道坐在另一邊的人是什麼樣的人,需要什麼才能知道一個工程師是否適合這個角色。在過去的幾年裏,我進行了 100 多次軟件工程技術面試,儘管每家公司都有自己獨特的面試流程,但還是有一些人們容易犯的常見錯誤。下面是我關於如何避免犯下這些錯誤的忠告。

優秀的軟件工程師

成功之路和失敗之路幾乎一樣。(The road to success and the road to failure are almost exactly the same.

——科林・雷克斯・戴維斯(Colin R. Davis,英國指揮家)

對於優秀的軟件工程師,並沒有唯一的定義。它關係到公司對角色的需要以及公司的多樣性和成熟度。一家剛剛起步的初創公司無疑需要很短的上市時間,而如果一家成熟的公司已經擁有龐大的客戶羣,那麼有可能會面臨規模和架構方面帶來的挑戰。在理解對業務有何意義的同時,構建產品與解決複雜的技術難題是不同的。細緻的完美主義工程師不同於快速迭代的工程師。你需要了解公司想要的是什麼,然後將你的行爲和言論框定在這種思維中。不要去寫一份適合所有人的簡歷,而是要根據實際情況改寫簡歷。如果你不得不推銷自我(以某種方式,你總是要以正式的或其他方式進行推銷),你要用一種你將如何成爲特定公司的資產的方式進行推銷。你應該理解這個角色所要滿足的需求,並捫心自問,這個角色是否能夠激勵你,如果確實如此,那麼就接受它吧。你應該弄清楚“優秀”的定義在公司的背景下是什麼樣子的,並表明你的知識、經驗和態度是如何符合這個定義的。

做足作業

沒有準備的人,就是在準備失敗。(By failing to prepare, you are preparing to fail.

——本傑明·富蘭克林(Benjamin Franklin,美國政治家及科學家)

在對公司一無所知的情況下參加面試,就像約會只談論自己一樣,這並不意味着不會有第二次約會,但也不會給人留下好印象。要努力去了解企業,它的目標、它的使命、戰略和成果。我絕不會因爲一個人對此一無所知而讓他失望,但這也暗示了他的動機。同時,這也是 HR 傾向於評估的標準。除了企業目標之外,如果他們有技術博客的話,一定要查看他們的博客,並瞭解他們的技術棧。應聘者通常不會對公司表現出應有的興趣,但一旦他們表現出來,這就是脫穎而出的絕佳方式。

要有批判性的意識

受教育的標誌是你可以不接受一種觀點,但你能夠容納它。(It is the mark of an educated mind to be able to entertain a thought without accepting it.

——亞里士多德(Aristotle,古希臘大哲學家及科學家、柏拉圖的學生、亞歷山大大帝的老師)

在我的職業生涯中,我遇見過很多傑出的技術專家,他們都是各種各樣的人。儘管如此,他們至少都有一個共同點:都是那些挑戰現狀,使流程和技術都得到改進的人。很多求職者在被問到是否有問題提問時,卻沒有什麼可補充的。迴避提問就是在浪費機會,要抓住這個機會,詢問公司的技術決策和他們面臨的挑戰,並討論每種技術的利弊。

例如:

  • 他們是否正在考慮遷移到 HTTP/3?
  • 他們是否正在轉向事件驅動的微服務架構?
  • 他們使用什麼類型的消息代理?爲什麼不用 Kafka 來代替 RabbitMQ?
  • 他們使用什麼樣的數據庫技術?用例是什麼?在這個用例中,ElasticSearch 是 SQL 很好的替代方案嗎?

諸如此類。對技術決策的質疑將會表明,你不僅瞭解這些技術,並且可以爭論何時應該使用它們,而且你還可以進行批判性的思考,並最終關心如何改進你所使用的任何應用程序。

技術挑戰

理論的正確永遠無法用足夠的驗證性實驗來證明,然而理論的錯誤僅僅需要一個證僞性實驗就夠了。(No amount of experimentation can ever prove me right; a single experiment can prove me wrong.

——阿爾伯特·愛因斯坦(Albert Einstein,猶太裔理論物理學家,創立了現代物理學的兩大支柱之一的相對論。)

當前技術面試狀態的忘恩負義和直截了當的不公平現象令人震驚。大多數過程都涉及到解決與計算機科學基礎相關的某種問題,比如圖搜索或排序算法。我發現一件軼事,求職者必須用最少的資源佔用實現一個樹遍歷算法,這樣當他得到這份工作時,首先要做的調試是一個十年前的龐然大物。作爲一名應聘者和麪試官,我覺得這種自命不凡的企圖美化我們工作的複雜性令人沮喪。這些類型的挑戰很可能會讓那些頭腦中沒有這些新概念的高級開發人員不屑一顧,即使他們在這個角色中可能有非常豐富的經驗。

我同意這些類型的練習並非完全無用;快速解決小問題的能力與解決複雜問題的能力有關,這些複雜問題需要幾天的時間才能解決,但它們從根本上是不同的。面試過程應該儘可能地反映日常工作的實際情況。一些過程包括在真實應用程序上尋找和修補 Bug、結對編程,或者實現自動化測試,我覺得這些都比深奧的算法問題要充分得多。對於這種類型的情況,一定要適應公司的語言選擇,不要害怕提問,這樣你才能瞭解挑戰的全貌。

不過,對大多數過程來說,你都會面臨某種算法或數據結構的問題,除非你具備良好的計算機科學基礎知識,否則無法繞過這些問題。像《程序員面試金典》(Cracking the coding interview)這本書、Leetcode 網站、Pramp 網站等這樣的資源都是很好的參考資料。

不管怎樣,一定要大聲解釋你的理由。通常,問題是相互疊加的,如果你在其中一個問題失敗了,也沒有關係,只要你能解決其餘的問題。如果你陷入困境,面試官會幫助你的,關鍵是要看到應聘者能不能從一個不太爲人所知的問題中恢復過來,並在其他方面做得很好,這纔是至關重要的。另外,當你遇到困難時,經驗豐富的面試官可能會從提問轉變爲教學,所以不要將這種轉變解讀爲失敗;環境的變化有助於疏通大多數人的障礙。

記住,面試官既是來幫助你的,也是來評價你的,而不是評判你。你要把面試官看成一個在問題上指導你的老同事。一定要跟他討論各種解決方案和折衷方案;這將顯示出你對這一問題的瞭解程度。

不要灰心喪氣

成功就是你比失敗多爬起來一次。(Success consists of getting up just one more time than you fall.

——奧立佛・高德史密斯(Oliver Goldsmith,愛爾蘭詩人、作家與醫生。)

我曾經遇到過一名這樣的求職者,他在面試中表現得特別不自信,沒有把握的樣子。儘管他缺乏安全感,也很懷疑自己,但由於他做得很好,所以他還是被錄用了。但是,在安頓下來後,在日常工作中,他信心十足,能夠領導討論,並在技術課題上指導團隊。後來有一次,我問他爲什麼在面試的時候他看上去如此不自信。他跟我解釋說,在那次面試之前,他經歷了一連串慘敗的面試,當時他還不能很好地應對面試被拒絕的情況。遭到拒絕是求職過程的一部分,你不能讓它影響到你。

要在幾個小時內評估與軟件工程師相關的每一項能力是不可能的。每個過程都會爲公司選擇相關的流程,並儘可能以最好的方式對其進行評估。這些可以是你所擅長的,也可以不是。糟糕的招聘對公司來說很難,特別是在士氣方面來說,他們加入的團隊更是如此。他們也付出了巨大的代價。再加上許多公司沒有一個標準化的流程(重點是比較候選人,因此每個面試官都應該處理相同的問題,而且應該有一個明確的流程,對每個面試官都是一樣的),這樣你就會留下相當比例的錯誤否定。在面試中表現糟糕並意味着你就是糟糕的人。而意味着你所表現出來的能力在那個特定時間裏並不是那個過程中最好的。

我知道,當我失敗了,看到或聽到類似這樣的東西時,我總覺得那都是胡說八道。我一生都在努力成爲一名鬥士。然而,有時候我也會輸掉太多的戰鬥。總是輸的鬥士只不過是一個出氣筒。但是有時候,你必須找到內心的力量,才能將自己從屈服的殘骸中拉出來。站起來,舉起你的手,再戰鬥一次,不要讓失敗影響到你。

這一切都與激情有關

你的工作將會佔據你人生中的一大部分,同時能夠讓你真正滿意的只有做你認爲是好的工作,而且要想做偉大的工作只有你喜歡你所做的工作。如果你還沒有找到,繼續尋找。不要安定下來。事實上,當你找到你心中就會知道。並且,就像任何好的關係也會隨着一年一年地過去而變得越來越好。所以要一直尋找直到你找到。不要安定下來。(Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle. As with all matters of the heart, you’ll know when you find it.

——史蒂夫·喬布斯(Steve Jobs,美國企業家、營銷家和發明家,蘋果公司的聯合創始人之一)

當我們在日常生活中的困惑和混亂中前行時,我們渴望那些清晰的時刻,當我們在挑戰或任務中迷失自己時,時間會彎曲,現實會消失。在那些超越的時刻,你的一生都會在你不經意間流逝。這就是編程對於我和我們中的許多人來說的意義。那就是刻在我們內心深處的永恆而堅定的激情。而同樣的激情也是成功的祕訣。

我看到應聘者在我們的面試過程中表現出色,但他們在應聘職位上表現一般。他們並不差,才華橫溢,知識淵博,但他們只是表現平平。有時候,你擅長那些你並不真正關心的事情,但正是這種激情會驅使你走向成功。要評價一名軟件工程師的熱情並不容易。但是,如果我問你有什麼副業項目,或者你曾經做過的最好的項目是什麼,你可能會在整個下午熱切地討論幾個項目。不管它是一個坐擁數百萬用戶的平臺,還是一個幾乎不起作用的副業項目,都無關緊要。一個充滿激情的程序員會滿懷熱情地描述他應用的每一種模式、他征服的每一個挑戰,甚至每一次破解和失敗。這樣,任何面試官都會知道,坐在他桌子對面的那個傢伙跟他一樣,也是一個對編碼充滿無限熱情的程序員同事。

這是一個非常真實的反應,你幾乎可以從他們的眼神和肢體語言中看出。要麼你對它充滿熱情,要麼你對它一點熱情都沒有。如果你有激情的話,一定要談論那些能打動你的項目,這可能是一次普通面試和一次優秀面試之間的區別。

結語

我一直覺得,作爲一名應聘者,壓力最大的部分是知道我需要得到這份工作,並證明自己是足夠優秀的。而面試官的角色也並非完全沒有壓力,他們需要確保有充分的理由批准或否決某人,這樣做出來的結果經得起審查,就我的情況而言,總是如此,尤其是憑良心。

大多數面試官都會不得不在某些時候接受面試,所以他們很有可能是有同情心的。我希望我這篇文章能夠幫助你從另一個角度看待問題,我真誠希望,我的建議能夠幫你謀得你真正想要的工作。

作者簡介:

Hugo Rocha,Farfetch 工程主管。

原文鏈接:

https://medium.com/swlh/my-advice-after-interviewing-100-software-engineers-e34bc3cbc669

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章