入職優秀科技公司,競爭性編程是必須的嗎?
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)
我一直對身邊科技所能做到的事情充滿敬畏,直到后來遇到基礎編程,我才開始得以管中窺豹。讀大學之后,我逐漸意識到,在亞馬遜、微軟、谷歌和臉書這種每天都能在科技領域取得突破性進展的公司里,想成為一名軟件開發人員必須付出艱苦努力。
大學生涯中,我印象最深的事情就是人們對競爭性編程的狂熱。第一年參加代碼俱樂部培訓時,有人告訴我,如果想進入像谷歌這樣的公司,就必須在競爭性編程領域表現出色。于是后來我做了競爭性編程,主要是線上編程平臺Codechef的每月定期挑戰,持續了大約6個月。
現在我的大學生活快結束了,也成功入職谷歌成為一名軟件工程師。我想談談我對競爭性編程的看法,準備面試時應該關注什么,以及競爭性編程是否真的是入職FAANG頂級科技公司的關鍵。
本文并非阻攔大家做競爭性編程,相反,我鼓勵那些不喜歡競爭性編程但希望提高自己解決問題能力的人申請大公司軟件開發人員職位。
什么是競爭性編程?
維基百科是這樣解釋的:競爭性編程是一種常通過互聯網或本地網絡進行的智力運動,參與者按照既定的規范編寫程序。
有很多求職心切的程序員為了面試而參加競爭性編程。作為大一學生,最初我和大多數朋友所聽說的競爭性編程都是這樣的:“進入谷歌或臉書這樣的公司的秘訣”。這聽起來太有吸引力了。
然而,直到我親身準備過這些公司的面試之后,才認識到這些想法中的謬誤。我會告訴你它為什么不是實際的解決方案。但首先,讓我們深入研究一下競爭性編程對大家有什么好處。
為什么競爭性編程這么有魅力!
在我短暫的競爭性編程旅程中,有一點是無法否認的,沒有什么能取代那種你的解決方案被采納的感覺。無論是曠日持久的Codechef比賽,還是Codeforces的回合賽,這種感覺都是不可替代的。
我剛上大學便開始做競爭性編程,幾乎立刻就上癮了。各種各樣的問題,棘手的優化以及隨之而來的腎上腺素激增,足以讓我六個月完全對它全情投入。
競爭性編程真正幫助到我的,是理解不同的數據結構和算法的細微差別,以及基于不同語言的優化如何讓自己走得遠。還有最重要的,明白耐心對解決問題的關鍵意義。如果有人一起做競爭性編程你會收獲更多,因為你們可以互相學習,讓這個過程更快速、更有趣。
此外,對于像臉書黑客杯(Facebook Hackercup )和谷歌全球編程挑戰賽(Google’s Code Jam)這樣的競賽,熟悉競爭性編程是一大優勢。然而,除此之外也無太多實際作用了。畢竟,競爭性編程歸根結底是一項旨在更快解決更棘手問題的運動。
到底有什么問題?
在Codechef推出了自己的分工體系后幾個月,我暫別了競爭性編程。雖然分工體系本身并不是我退出的根本原因,但它確實是一個導火索。
對于一個剛開始編程的人來說,競爭性編程能帶來的學習經驗絕對是驚人的。然而,初學者所能學到的特質并不是競爭性編程所獨有的,而是在這個過程中廣泛地練習數據結構和算法所帶來的。
我最終意識到了這點,也意識到整項運動會轉向以數學為重。到了一定難度后,這項運動終會轉向數學密集型領域,需要我們深入鉆研數論和幾何學,門檻很高。
此時,這些題目不僅對我的面試準備或軟件開發經驗沒有幫助,而且作為一個競爭性編程程序員,僅僅為了保持我的等級和表現分數而去付出額外的努力,會給我帶來損失。雖然競爭性編程本身很有趣,但它非常耗時,并且收益嚴重遞減。
那我如何備戰谷歌面試的呢?
“你必須通過Codechef來搞定谷歌和臉書的面試”,這樣的想法已經影響了很多人。我認識的一些人,盡管他們解決問題的能力很優秀,但因為不是競爭性編程的忠實擁躉,所以他們甚至都不會試著申請這些公司。
作為一個很早以前就放棄競爭性編程但成功通過了面試的人,相信我,即便你不深入競爭性編程的牢籠也能通過面試,很多真實成功的例子都能證明這一點。
如上文所述,競爭性編程真正幫助到我的,是我對數據結構和算法的基礎理解與親身實踐。然而,競爭性編程的目的并不集中于此。
像HackerRank和Leetcode這樣的資源擁有大量有價值的練習題,題目根據難度適當排序,也根據概念進行了標記,方便大家了解并練習所需的主題。我就是主要用這些資源來準備谷歌編碼面試的。
Hackerrank為代碼零基礎的人提供了一個特殊的30天編碼軌道,使其可以獲得適當的熟悉度。此外,由于這些網站的數據結構和算法更多是為了幫你在面試中表現更好,因此你不需要特地花更多時間去搜尋以往面試中的例題就能達到熟悉題目的需求。
Leetcode和Hackerrank這樣的平臺雖然與競爭性編程網站有共同之處,比如在用戶界面、提高解決問題能力方面,以及需要使用數據結構和算法優化時間復雜度和空間復雜性的問題等,但相似點也就僅止于此了。
我記得我讀過Quora網站上的一個答案,它的比喻非常妙:
“你的想法好比通過騎自行車來訓練跑步。誠然,這比躺在床上看電視要好得多,而且很多跑步也需要用到的器官系統也參與其中。如果你在沒有運動背景的情況下開始訓練,你或許會看到跑步有很大進步。但同時,其實這不是‘正確’的訓練方式,職業運動員不會這么做的。”
同樣,雖然競爭性編程囊括了一些面試準備基礎,并且LeetCode在某些方面與Codechef和Codeforces等競爭性編程網站相似,但它們本質上是兩個完全不同的東西,關注的是兩個完全不同的用戶體驗目標。
但是LeetCode是不是足夠?
雖然Leetcode并不能實際解決面試問題,但它能幫你積累面試經驗。同樣地,把時間投入到YouTube上的可用資源中,用Back toBack SWE和Nick White這樣的頻道也可以更好領悟如何解決問題,提高解決問題的能力。
不必為了競爭性編程而沉浸在復雜的數論和幾何概念里,你可以在實際的軟件開發項目上更好地利用時間。如果想進入網絡和/或應用程序開發領域,就更得親力親為——這些技能不僅能幫你獲得更好的實習機會,也可以獲得實踐經驗,二者都將有助于打造出一份有吸引力的簡歷以申請FAANG和其他大公司。
申請簡歷上不需要競爭性編程經驗!
關于競爭性編程的另一大誤區是:若在Codechef和Codeforces上加上你的評級,你就會成為公司招聘的首選。
雖然良好的評分證明了你在解決問題方面有豐富的經驗,但它并不能掩蓋住你在進行編碼面試筆試時互動的不足。真實面試中的問題更主流,相對來說也比競爭性編程更簡單。但面試中的主要挑戰在于與面試官互動,并在面試中解釋你的思維過程。
另外,面試中的問題通常是開放式的,可供被面試者提出恰當的問題以獲取更多信息,這也是一項你需要自己學習的技能。
單就申請而言,雖然競爭性編程等級有其優勢,但實習經歷、自己的項目,以及在像Hackathon大賽中獲得的榮譽,同樣也能豐富簡歷,也一樣會受到面試公司的高度重視。
你可以通過領英(LinkedIn)與招聘人員和內部員工聯系,尋求推薦,你的領英檔案情況通常反應出你的技能。很多人也傾向于通過公司的人才招聘網站直接申請。就我而言,我認為我在三星的實習經歷是谷歌首先考慮面試我的原因。
還應該做什么準備?
準備面試的一個主要部分就是要多多進行模擬面試。谷歌只有一次面試機會,在Pramp等服務器上進行模擬面試,或在YouTube上觀看比如interviewing.io頻道的面試直播,可以讓你做好充分準備,在實際面試中不緊張。
谷歌在YouTube上有一個完整的播放列表,專門讓求職者熟悉他們的招聘流程(https://www.youtube.com/playlist?list=PLllx_3tLoo4c_aR8RKOOnizL5LiUH02YF),其他大型科技公司通常也會借助博客、YouTube和領英使求職者更輕松方便。盡量利用互聯網上所有可用的資源,這些公司的現任和前任員工也會在GeeksForGeeks和LeetCode Discuss等論壇上發布面試經驗。
所以,是時候糾正這個思想誤區了。想在科技公司當軟件工程師,競爭性編程并不是必經之路。曾經因此繞道而行的求職者,該給彼此一個機會了!