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