劉金翰
我本科是學(xué)數(shù)學(xué)的,考研時班里大概分為兩個方向,一部分是繼續(xù)考本專業(yè)的研究生,另一部分則是跨專業(yè)考金融、計算機之類的研究生。我當時并不想一直從事基礎(chǔ)數(shù)學(xué)的研究,又覺得跨考計算機難度大,無法將自己數(shù)學(xué)專業(yè)的優(yōu)勢發(fā)揮出來,所以最終選擇了統(tǒng)計方向。一是因為感興趣,二是因為統(tǒng)計方向?qū)I(yè)課和數(shù)學(xué)的相關(guān)性很大。考研期間,我并沒有透徹了解應(yīng)用統(tǒng)計專業(yè)的就業(yè)范圍。
研究生入學(xué)后,師兄師姐介紹說,統(tǒng)計專業(yè)的就業(yè)崗位大部分都是公務(wù)員、教師、讀博等,讀此專業(yè)的女生比較多,找的工作大多偏穩(wěn)定一些。當然,最對口的崗位還是數(shù)據(jù)分析師和算法工程師。師兄師姐補充說,比較優(yōu)秀的同學(xué)可以去嘗試一下算法行業(yè),薪資待遇特別高而且發(fā)展前景好。就是在這個時候,我才第一次知道算法工程師崗位。
讀研期間,上了討論班后,我開始真正接觸到一些基礎(chǔ)的算法。學(xué)習一種新算法的流程大致是:了解算法理論,然后用嚴謹?shù)臄?shù)學(xué)公式進行推導(dǎo),之后需要代碼化,把算法通過程序展現(xiàn)出來,那時候我們是用R語言和Matlab語言實現(xiàn)。最后,要通過數(shù)據(jù)來訓(xùn)練我們的模型,用合適的指標來檢驗?zāi)P偷男ЧI鲜鐾瓿珊?,反過來再去總結(jié)這個算法的優(yōu)劣、可延展性及與其他同類算法對比。
我逐漸對算法有了大概認知,算法有嚴謹?shù)臄?shù)學(xué)理論,可以用程序?qū)崿F(xiàn)復(fù)雜模型,訓(xùn)練好的模型可以很好地解決業(yè)務(wù)問題,且每年在頂級期刊都有此領(lǐng)域的前沿論文發(fā)表,學(xué)習資源相當豐富。我開始對算法產(chǎn)生了濃厚興趣。
研一時,由于師兄師姐幾乎沒有從事算法崗的,我對算法崗所需要的必備技能,都是通過招聘信息了解到的,相對比較局限。當時,我比較確定的是,扎實的算法理論和一門編程語言,這二者是必備的。
整個研一,除了專業(yè)課和準備討論班學(xué)習外,我都在努力學(xué)習算法理論和編程語言。編程語言方面,我選擇了當時主流的一些機器學(xué)習框架所用的Python語言。對于算法的初學(xué)者而言,最大的困惑就是,我該學(xué)什么,該從哪里學(xué)?由于機器學(xué)習當時已經(jīng)火一段時間了,所以面對眾多的書籍、教學(xué)視頻,選擇變成了接下來學(xué)習的關(guān)鍵。
書籍方面,機器學(xué)習部分,我選擇了李航老師的《統(tǒng)計機器學(xué)習》和周志華老師的《機器學(xué)習》。深度學(xué)習部分,我選擇了入門級的《Neural?Networks?and?Deep?Learning》和人盡皆知的《Deep?Learning》。
教學(xué)視頻方面,我選擇了吳恩達老師的系列入門視頻,還有臺灣林軒田和李宏毅老師的視頻。為了補充CV和NLP理論,我還學(xué)習了斯坦福大學(xué)的公開課CS231n和CS224n。
Python學(xué)習方面,我推薦《Python簡明教程》,這本書很基礎(chǔ),適合任何沒有編程背景的人去學(xué)習。另外還有一本《機器學(xué)習實戰(zhàn)》,用Python實現(xiàn)了許多機器學(xué)習算法,既能學(xué)習Python,還能鞏固理論。
當然,我看的書遠不止這些,上述提及的只是一些入門書籍。除此之外,還要多關(guān)注前沿技術(shù),多讀論文,對于不懂的地方,要刨根問底。當初學(xué)習SVM時,我不明白KKT條件從何而來,為此專門去學(xué)習了中國科學(xué)技術(shù)大學(xué)的公開課《凸優(yōu)化理論》,此課程詳細講解了凸優(yōu)化中的KKT條件的推導(dǎo)過程。
我還有一個習慣就是記筆記,由于算法學(xué)習的理論部分很繁雜,所以我并沒有將每一個機器學(xué)習或者深度學(xué)習算法都完整記錄下來,而是將一些我認為很重要的部分或者一些容易遺忘的疑難點記下來。比如LSTM、Transformer的結(jié)構(gòu)細節(jié),F(xiàn)M、FFM、DeepFM系列算法等。記筆記很費時間,但是的確為我當時查漏補缺和復(fù)習帶來了極大的幫助。研一結(jié)束前,我按部就班完成了自己規(guī)劃的全部內(nèi)容。
研二時,我有了出去實習的念頭,因為我知道實習對于秋招的重要性,得開始準備簡歷了。剛開始我一頭霧水,沒人指導(dǎo),只能自己一點一點地去搜尋信息。這期間我上了很多招聘類網(wǎng)站,社群交流里有很多人的面試經(jīng)歷以及背景描述,對我的幫助很大。
我總結(jié)出,一份出彩的簡歷里一般要具有四項內(nèi)容:好的學(xué)校、頂級會議論文、大廠實習經(jīng)歷、競賽Top名次。這四項中至少得有兩項,才有較大機會進入面試。而且,面試還會考代碼題,就是現(xiàn)場讓你寫代碼,考官出題。因為之前我都不知道有此環(huán)節(jié),所以壓根沒有準備過。面對算法崗位的高門檻,我是有想過放棄的,打算轉(zhuǎn)數(shù)據(jù)分析崗位面試,數(shù)據(jù)分析是不用考這些的。最終,我還是選擇了迎難而上。
此時,擺在我面前的兩大難題,一是如何豐富自己的經(jīng)歷,讓簡歷達到能夠進入面試的標準,二是怎么準備寫代碼的面試環(huán)節(jié)。
針對第一點,我很快就做出了計劃,首先就是大廠實習,還有就是發(fā)論文和競賽。但我感覺我很難做到論文、比賽兩手抓,在只能選一個的情況下,我選擇了參加算法比賽這條路。
算法競賽我主要參加了Kaggle和阿里天池這兩個平臺的,后期也參加過一些小平臺的。比賽初期,我連題目都看不明白,通過練手Kaggle上一些已經(jīng)開源的比賽(即已經(jīng)結(jié)束且公開了部分解決方案的比賽),逐漸找到了感覺,同時也掌握了常規(guī)機器學(xué)習框架和深度學(xué)習框架的使用。我花費大量的時間在比賽上,閱讀別人的代碼,完成一個又一個已經(jīng)開源的比賽。我逐漸開啟了自己的競賽之路,從2020年10月開始,直到2021年3月,我天天都在比賽,取得了一些不錯的成績,在Kaggle上拿過1%和2%,在阿里天池也進過Top10,還有其他算法平臺的Top5。競賽給我?guī)淼?,不僅是簡歷的豐富,還有能力的提升。每一次競賽,從拿到問題到給出模型,加上后期指標優(yōu)化,這一系列的流程讓我更加熟悉如何用算法去解決實際問題。
對于第二點——寫代碼,讓當時的我很頭疼。我只有淺薄的C語言基礎(chǔ),早已忘記二叉樹、鏈表、堆棧之類的數(shù)據(jù)結(jié)構(gòu),也從未了解過遞歸、DFS、BFS、動態(tài)規(guī)劃之類的解題方法。這導(dǎo)致當時的我啥都要學(xué),啥都沒學(xué)明白,在LeetCode上做一道題得花半天時間,對于計算機類專業(yè)的科班生來說,這些都是基礎(chǔ),復(fù)習下就行了。于我一個此專業(yè)的學(xué)生而言,只能一點一點地去啃下這塊硬骨頭。
我總結(jié)出,一份出彩的簡歷里一般要具有四項內(nèi)容:好的學(xué)校、頂級會議論文、大廠實習經(jīng)歷、競賽T o p名次。這四項中至少得有兩項,才有較大機會進入面試。
當時,我看了很多關(guān)于數(shù)據(jù)結(jié)構(gòu)的書,對著書把各種數(shù)據(jù)結(jié)構(gòu)的代碼都寫了一遍,看完算是剛剛?cè)腴T了,但這還遠遠不夠,因為還是做不出來題??紤]時間成本,后來我選擇了直接通過刷題來提高自己。因為每一道題,都有大量題解,可能你死磕一下午的一道題,會在看到某個優(yōu)秀題解的一瞬間恍然大悟,這樣既節(jié)省了時間,又快速學(xué)習到了最優(yōu)解法。不過,這種方法建議在學(xué)習初期用,因為見效快,可以建立自信,等到后期自己能力上來了,就可以不看題解去解代碼題了,這樣就形成了能力提升的一種正向循環(huán)。
2021年3月初,我邊投實習簡歷,邊刷LeetCode和《劍指Offer》,重復(fù)做了很多遍高頻面試題。當時想的是,盡量在出到原題或者類似題時,能夠快速解出來。
很快我迎來了我的第一個面試——字節(jié)跳動,從投遞簡歷到面試,時間間隔很短,我匆匆復(fù)習了理論知識,又復(fù)盤了下比賽,就上“戰(zhàn)場”了,結(jié)果可想而知,落敗了。這是我人生中的第一次面試,太過緊張,表現(xiàn)很差,感覺自己話都沒說明白,兩道算法題只答對了一道。
我投遞了所有大廠的提前批,大部分大廠的算法崗,我都通過了簡歷篩選,得到了面試機會。
之后,我不再立馬投簡歷了,而是拿出機器學(xué)習理論筆記,把每一個算法的每一處細節(jié)都搞懂,并且用自己的語言表達出來,簡歷上的比賽又梳理了一遍。與此同時,也沒有把刷題落下。等自己感覺準備好了的時候,我開始投第二波簡歷,簡歷的投遞也更有針對性,主要投遞機器學(xué)習數(shù)據(jù)挖掘和搜索推薦算法。
我拿到的第一個offer是滴滴的,當時面試的難度并不低,所以通過面試給了我很大的信心,接下來的面試我都順利通過,先后拿到了網(wǎng)易、騰訊、華為的算法offer。
拿到實習offer后,我4月就去實習了。從校園初入職場,我體會到了互聯(lián)網(wǎng)工作的高強度,再加上算法崗的具體工作和自己想象中有很大差距,這些讓我有很強的不適應(yīng)感,但好在最后堅持下來了。
當時,我面臨一個所有實習生都會面臨的問題,如果努力工作,可能會獲得轉(zhuǎn)正機會,這樣就可以在秋招中提前收獲offer,這應(yīng)該是每一個在大廠實習的同學(xué)的期許,哪怕最后不選擇這個offer,也想有個保底。但轉(zhuǎn)正一般和秋招是同步進行的,而且不可能等到秋招來臨再準備復(fù)習吧,所以,如果既要保證高質(zhì)量的工作產(chǎn)出,又要抽出時間來復(fù)習,這可能會導(dǎo)致兩頭空。
我最終選擇了放棄轉(zhuǎn)正,全力以赴準備秋招。秋招前,我保持著高強度的刷題,對于理論和項目部分,因為面試實習時已經(jīng)準備過了,所以很快就拾起來了。當時我的簡歷上已經(jīng)有算法競賽的Top名次、大廠實習經(jīng)歷、985研究生學(xué)歷。
我投遞了所有大廠的提前批,大部分大廠的算法崗,我都通過了簡歷篩選,得到了面試機會。很多同學(xué)都說秋招面試會比實習面試更難,但我感覺,相較實習面試,自己秋招面試時更加從容?;旧厦恳淮蚊嬖?,我都可以對答如流,跟面試官形成一種交流的狀態(tài),而不是你問我答。面試的大廠里,除了有個別面試因為算法題沒寫出來而敗了,其余的基本都給我發(fā)了offer,且offer的等級都是special?offer及以上的,有些公司還給了北京戶口指標。
我在9月之前結(jié)束了我的秋招之旅,總結(jié)下來,我認為秋招中,有幾點比較重要:
第一,搞定代碼題,這是重中之重。面試算法崗,如果算法題沒有寫對或者沒有最優(yōu)解,那么基本上就敗了。這需要根據(jù)自身情況制定具體計劃。
第二,在掌握機器學(xué)習和深度學(xué)習理論基礎(chǔ)之上,賦予自己的理解,這可以在面試中加不少分。比如,一個算法可以從數(shù)學(xué)統(tǒng)計角度去解釋,或者一個算法的優(yōu)化可以從業(yè)務(wù)需要的角度去解釋等。只要你能說出跟別的面試者不一樣的答案,且能引起面試官的共鳴,那么面試官就會覺得你理解得更深更好,而不是像其他面試者只是在重復(fù)網(wǎng)上的答案。
第三,溝通表達能力是一項重要的考核標準。我在面試中有個小技巧,就是把復(fù)雜的項目簡單化,雖然聽上去會讓人覺得這個項目的技術(shù)性沒那么強,但是這更利于我表達和闡述,至少讓面試官聽懂你在做的項目到底是什么。當然,這些都是可以隨機應(yīng)變的,根據(jù)面試官的反應(yīng)來決定你項目的闡述方式,如果面試官很快就領(lǐng)會了你的項目背景和技術(shù),那么你可以把復(fù)雜化的部分加進去,反之則不加。面試期間要保持清晰且有效的溝通。
第四,態(tài)度不容忽視,要讓面試官感受到你的誠意,在許多同水平候選者橫向比較時,更愿意把offer給你。
責任編輯:丁莉莎