註:ACM 競賽全稱為 ACM 國際大學生程序設計競賽,英文全稱:ACM International Collegiate Programming Contest,簡稱 ACM-ICPC 或 ICPC )。因為大家習慣簡稱為 ACM,文章中出現的 ACM 若無額外備註,皆指 ACM-ICPC。
這是方清經歷過的最難受的面試,臨近畢業的他沒有任何實習經驗,和面試官的前期交手讓他有些慌張,面對一些從來沒有接觸過的項目問題,方清都老老實實地以「不知道」終結了他和面試官的對話。
正當方清以為自己這次面試將以大失敗告終時,面試官給方清出了兩道算法題。作為某理工科學校 ACM-ICPC World Finals 的選手,方清展現出了應有的基本水平。交完兩道算法題的答卷,方清斬獲了他心心念念的網易遊戲的 offer。
是時候展現真正的技術,大概就是方清遇到這個場面時應該配上的畫外音了。
在 ACMer 這個群體中,方清還是一個剛畢業不久的小兵,ACM-ICPC 競賽歷史上那些獲取好名次的選手在「三十而立」之後,取得了讓人十分豔羨的成績:唐文斌是曠視科技的創始人之一,戴文淵創辦了 GEEK 範兒十足的第四範式,樓天城則是 pony.ai 的創始人,林晨曦創辦依圖科技…
這些頂著 ACM 光環的人即使在精英頻出的網際網路也有著實打實的先發優勢。在 100offer 平臺上,超過一半的擁有 ACM 競賽背景的候選人,第一份工作加入了 BAT 級別及以上的國內網際網路公司。
如果說有什麼標籤能在你求職研發工作時實打實地加分,ACM 無疑是其中最有含金量的幾個標籤之一。 ACM 究竟有什麼魔力,能夠成為大家求職的 Pass 卡呢?這事兒得從 ACM 比賽到底比什麼說起。
ACM:世界頂尖程序設計大賽
ACM 作為計算領域的頂尖程序設計大賽,每年上半年舉行。不同於其他競賽的個人戰,ACM 為「小組戰」,由 3 名在校大學生組成小分隊參加比賽。在比賽過程中,3 人組成的小組共用一臺電腦,編寫程序解決 8-10 個問題。因為是時間緊、任務重的團隊賽,ACM 比賽更加緊張激烈。
和世界盃的選拔方式類似,ACM 的選拔方式也是首先通過區域賽進行隊伍的選拔,每所學校在區域賽時可以派出多支隊伍參賽。拿到區域賽冠軍的隊伍所屬學校即可選派團隊參加 World Finals,屆時一個學校有且只能選派一支團隊參賽。
國內大學第一次在這場國際頂尖賽事中捧冠而歸,是在 2002 年夏威夷的 ACM-ICPC World Finals,由林晨曦、陸靖和周健組成的上海交大隊摘得第一名。隨著 ACM 競賽在國內的發展,部分學校為了更好地培養校內的 ACM 競賽團隊,專門成立了相關的班級,希望能夠通過定製化的方式來培養頂尖的 ACM 選手,其中最為有名的就是上海交大的 ACM 班和清華大學的姚班。
但無論是通過學校的體制訓練出來的 ACM 隊員還是自主走上競賽之路的「野戰軍」,在備戰 ACM 上都吸取了豐富的知識和技能,最後幫他們在職場上飛速成長打下基石。
賽場:為了打好一場比賽,他們付出了哪些?
ACM 官宣的比賽宗旨道出了想要拔得頭籌的參賽者的必備品質:「展示大學生創新能力、團隊精神和在壓力下編寫程序、分析和解決問題能力」。
在養成、打磨這些品質的過程中,ACMer 們都經歷了什麼?
1. 遠超於常人的時間付出
「從高考之後,我就沒有過過暑假。」正在交大 ACM 班讀大二的花襲用一句話為我們揭開了 ACM 參賽選手訓練備賽的冰山一隅。
花襲從高中開始參加計算機競賽,在高二 NOI(全國青少年信息奧林匹克競賽) 中摘銀的她很快就被交大 ACM 班的教練「盯」上了。高考一結束,交大就向花襲伸出了橄欖枝,問她是否願意在大學延續計算機競賽,成為校隊的一員,在大學裡參加 ACM 競賽。曾在高中取得不錯成績的花襲接受了這一邀請,加入了交大校隊。 當她的小夥伴們還在享受高考後解放的暑假時,花襲已經抵達位於上海遠郊的交大閔行校區,開啟日復一日的訓練生涯。
曾經的 World Finals 選手方清並沒有像花襲這樣的高中先發優勢,大一才開始接觸 ACM 的他為了備賽,大學一年級每周需要花約 80+ 小時進行刷題。
ACM 比賽現場有個保留環節:每當有隊伍答對一道題,會場內就會升起一隻氣球。大部分人只看到了氣球五彩斑斕的熱鬧場面,卻不曾設想,這些 ACM 競賽選手在場外默默付出的時間和努力。
2. 時間積累出的代碼能力
對於參加 ACM 的選手而言,代碼能力成為他們是否能夠生存在團隊中的基礎關卡。如前文提到,ACM 比賽中答題時間非常寶貴,並且如果你提交的答案中出現錯誤,會有扣時的懲罰。因此雖然 ACM 競賽中每一道題目的代碼量並不大,但卻對準確性提出了十分高的要求。
準確性要求的直觀感受就是切題的手速要快、準、毒。為了能夠達成這個目標,花襲從高中開始就接觸了相對系統的數據結構、算法的訓練,進入大學之後又接受了學校更為變態的計算機體系架構等方向的訓練。
「有一次我遇到一道題目,想法思路都沒問題,但就是顯示錯誤。研究了好久,最後發現問題出在我定義的變量名稱和 C 語言中的一個庫函數重名導致的。」花襲就是在這樣不斷反覆的練習中點滿了自己工程代碼上的知識點。
見多了這些經常出現的 bug,大部分 ACMer 在思考一個問題、碼代碼的時候都會想的十分周全,注重代碼的邊界條件。
除了代碼寫的十分優秀之外,ACMer 們定位問題的能力也是通過備賽訓練反覆打磨出來的。ACM 選手在訓練刷題時通常會碰到一個程序跑在自己的小數據集上沒有問題,但是在 OJ(ACM 在線答題平臺)上答題時,系統就會告訴你錯了,但它不會告訴你到底是哪裡有問題,這就需要答題者去想辦法定位問題了。
就是這樣一次次「耐操」的訓練,慢慢鍛鍊出了每個 ACMer 對於寫簡潔代碼的習慣和追求。這個習慣最後也成為他們後續在工作中要求自己項目的標準。
3. 時間沉澱出的思維蛻變
除了代碼工程能力之外,更大的改變體現在對選手結局問題思維的影響上。
「我覺得 ACM 更是一個鍛鍊大家解決問題的思路的比賽,這就像官方宣傳中說的一樣」。這是我們採訪的絕大多數 ACMer 得出的反饋。
這些通過最開始訓練不斷積累起來的代碼感覺延續到實踐中就體現在了面對問題時的思考角度的變化上。「我認為 ACM 對我的顯著提升是在 sense 上,比如對時間複雜度和空間複雜度的考慮。」前 ACM 選手 SimonS 總結了打比賽對自己工作習慣的影響。
其次,ACMer 們都養成了不斷追尋最優解決方案的習慣。當你面對一個問題,腦子裡同時會出現好幾種解決方案,這個時候這些 ACMer 就會不自覺地開始對比每個方案的優缺點,最後選出最適合當下場景的解決方案。
除了這些基本的解題思路的習慣養成外,大部分的 ACMer 還養成了自己動手豐衣足食的「好習慣」。「沒有什麼問題是解決不了的,如果現在解決不了就多想幾天」前 ACM 選手 Echo 在回顧自己備戰 ACM 比賽中遇到的問題時總結出了這樣的「江湖經驗」。
這背後其實就是對一個問題深度思考的能力,當大部分人在面對一個難題時選擇「5 分鐘從看題到放棄」,多數 ACMer 願意花上幾天甚至幾周的時間來思考。
不積跬步無以至千裡,這樣的積累最後也成為 ACMer 在職場發展上快人一步的關鍵因素。
職場:ACMer如何把競賽力轉化為工作力?
在 100offer 平臺和 offer 君接觸的 ACMer 中,他們的職業發展可謂是「一帆風順」。
在 ACM 語境下,這些競賽選手似乎總推翻傷仲永式的天才走向平庸的「悲劇模式」,就像善於通過反覆的訓練來獲取競賽中的好名次一樣,他們也善於用競賽中養成的好習慣來提高在職場中的競爭力。
1. 找工作硬實力:行走的做題器和聰明的氣質
簡歷上要是出現了 ACM-ICPC 省級以上名次的關鍵詞,這份簡歷就很難被遺漏,拿到面試基本上是板上釘釘的事情。
用人單位喜歡 ACM 背景出身的候選人也不無道理。面試官也會擔心被候選人的「牛皮」欺騙,當他無法全面了解你過去所做的事情時,一個客觀公正的比賽結果,往往比講不清楚說不明白的項目經歷來的可靠。
對於 ACMer 而言,無論是筆試還是面試中出現的題目都不會「超綱」。前 World Finals 選手 Echo 回溯他職業發展中接觸的幾家公司時,題目出的最難的就屬 Google 上海。「Google 上海的題目基本和 ICPC 的水平看齊」,當他面試 Google 上海時,給了我們這樣的反饋。「這個時候真的會覺得大學時候多少個刷題的日日夜夜都還挺值得的。」Echo 最終憑藉著自己出色的面試表現社招加入了 Google 上海。
「可能是因為我在面試時展現出了聰明的氣質」方清回顧他在剛畢業沒有任何實習經歷還能淨收大廠 offer 時給了我們一個「自戀」的回答。其實所謂的聰明氣質,無非就是備賽訓練出來的思維敏捷、思路清晰、底層知識紮實、善於尋找最優解決方案等。
這樣的候選人,沒有哪個面試官能夠拒絕。
2. 職場軟實力:把備賽的標準遷移到工作中
如果說通過面試都是吃的備賽的「老本」,那麼進入工作場景,他們又做到了轉化自己從 ACM 競賽中積累的的優勢、克服自己的劣勢。
現在方清和 SimonS 都是團隊中為數不多的 90 後 P7。然而,在這之前,初入職場的他們卻也經歷過一段代碼習慣修正的陣痛期。
「我們工作後,也並不是一直那麼順利的」,方清發現自己和工作脫節的第一個表現就是他們的代碼寫得太「毒」了,沒有封裝、函數的概念。他們習慣於 ACM 競賽中寫出的一個又一個小程序,而沒有大型規範的代碼訓練。
過了這個陣痛期之後,在工作中的不同表現隨著大家對於任務要求的不同逐漸顯露出來。
對於大部分研發而言,他們的工作中其實大部分都在復現最新的 paper 或者別人的一些項目,把他們進行二次開發,最後應用在自己的項目上。「這個時候,你就會發現其實大家對工作的要求逐漸發生了區別」。當你去復現別人的東西的時候,方清這樣的前 ACM 選手對於效率、性能都有著更高的要求。比如說別的團隊覺得一秒訓練一個 benchmark 就夠了,但是方清能夠做到一秒訓練 100 個 benchmark。
「所有需要對外發布,給別人用的東西,我們都不能接受它效率太低」SimonS 也認同了方清的觀點。「特別是你進入網際網路大廠,裡面涉及的數據量那麼大,你要是不考慮中間的時間空間複雜度,那真的要完。」
這時,參加 ACM 比賽中訓練出來的尋找最優解,永遠不拿臨時解決問題的方法來搪塞問題的原則和思路,成為這些在大廠中不斷晉升的 ACM 拿項目的優勢。
致更多的普通人:錯過 ACM,來者尚可追
寫到這裡,可能會有很多讀者說,這些 ACMer 的經歷根本沒有可複製性,他們從本科就開始為之奮鬥,我們現在僅處理業務緊急問題都已經焦頭爛額了,哪能像他們這樣再花大量的時間來進行訓練。
我們無意去宣揚大家應該花大量的時間來進行刷題上,這個並不適用於大部分處在工作狀態中的人。而是希望大家能夠在疲憊的開發過程中,建立一個「不斷追求更高、更快、更強」的習慣,形成不斷尋找最優解決方案的解題方式。
縱觀 ACM 選手的職業發展,他們幸運地在於僅在大學階段就積累了足夠多的「見識」,通過一個比賽,他們鍛鍊出了豐富的技能維度,最後幫助他們一步一步走的越來越穩,越來越快。當你了解了這部分人如何慢慢把自己鍛鍊成「讓人羨慕」的樣子時,其實你應該思考的是如何把他們成熟的、總結好的經驗遷移到自己的職業生涯中。
即使你比 ACMer 可能晚起跑了一個本科,但這不過是你未來生命中很小的一部分而已。
100offer說
「人在做自己喜歡的事情的時候,眼神裡有光」,大概說的就是這些被 ACM 虐了千百遍卻依然熱愛,並且付出的選手。
當我們問及他們和那些在 World Finals 上拿勇奪金牌的大神差距在哪時,「比我聰明」成為頻率出現最高的回答。雖然「比我聰明的人比我還努力」是一句很喪的話,但是他們卻從來沒有用喪來結束自己所熱愛的競賽、工作、項目。
Echo 在 Google 上海和 ACM 冠軍大神討論問題時,經常感受到自己的智商被碾壓,「感覺我和他的差別就是人和狗的差別」。但這些智商上的差距從來沒有成為他們在現有的功勳章上打瞌睡的理由。
自驅力、行動力和高標準貫穿他們整個學生到職場的生涯,他們只是得到了他們應有的回報。
(為保護候選人隱私,文章中出現的姓名皆為化名)