聊聊算法在面試中的地位
前段時(shí)間,有一位好友找到我,向我打聽阿里社招筆試是否看重算法題的考察,我給予了肯定的答復(fù)。他表現(xiàn)的有些沮喪,表示自己工程底子很扎實(shí),框架源碼也研究地很透徹,唯獨(dú)算法能力不行,leetcode 上的簡(jiǎn)單題做起來(lái)都有點(diǎn)吃力。以至于面試一些公司時(shí),基本都是前幾面和面試官聊工程,相聊甚歡,一到筆試就 GG。鑒于我個(gè)人在學(xué)生時(shí)代有過(guò) ACM 經(jīng)歷,對(duì)算法還是相當(dāng)感冒的,個(gè)人算法能力不算出眾,也不算弱,最好成績(jī)是省賽金牌,區(qū)域賽銅牌(主要還是抱得隊(duì)友的大腿),后來(lái)實(shí)在是寫不動(dòng) C++ 了,中途轉(zhuǎn)了 Java,借這個(gè)機(jī)會(huì)跟大家聊一聊,分享下個(gè)人對(duì)算法的一些認(rèn)識(shí)。
我發(fā)現(xiàn)很多人有的一個(gè)觀念是刷算法并不能很好地幫助他工作,他們中有些人是有了很多學(xué)?;蛘吖镜捻?xiàng)目經(jīng)驗(yàn),有些則是在數(shù)據(jù)庫(kù)、RPC、大數(shù)據(jù)等某個(gè)垂直領(lǐng)域有了比較長(zhǎng)時(shí)間的沉淀,他們會(huì)覺得刻意地刷算法題比較偏門,沒有太大的價(jià)值。一方面有些人會(huì)比較自信,不認(rèn)為需要靠算法來(lái)證明自己的價(jià)值,另一方面,有些人會(huì)認(rèn)為刷算法題是應(yīng)屆生面試才需要考察的技能,對(duì)于社招來(lái)說(shuō),公司應(yīng)該更注重考察項(xiàng)目經(jīng)驗(yàn)和系統(tǒng)設(shè)計(jì)層面的技能。以我個(gè)人經(jīng)驗(yàn)來(lái)看,面試互聯(lián)網(wǎng)公司時(shí),算法題幾乎都是必考的一個(gè)環(huán)節(jié),從公司的考察點(diǎn)出發(fā),就可以佐證出,算法不重要這個(gè)觀點(diǎn)的確是有待商榷的。還有一些人輕視算法,是覺得只有大廠才看重算法,一些小公司的面試根本不 care 算法,而且特別是像我文章開頭提到那個(gè)朋友一樣的人,有著比較強(qiáng)的工程能力,我相信在面試中一定可以憑借著這個(gè)優(yōu)勢(shì),贏得面試官的好感,那我不妨再反問(wèn)一句,為什么要讓算法成為你的軟肋呢?
我已經(jīng)表露了我對(duì)面試中算法重要程度的態(tài)度,而且我也認(rèn)為面試中考察算法能力是非常重要的一環(huán)。在公司里做項(xiàng)目,我們往往需要花費(fèi)數(shù)個(gè)月去落地,而面試中完成算法題最多只限制在半小時(shí)內(nèi),雖然時(shí)間區(qū)間不同,但本質(zhì)上都是在考察一個(gè)人在一個(gè)固定的時(shí)間內(nèi)完成某個(gè)任務(wù)的能力。讀題考察了候選人的理解能力,期間我會(huì)與候選人溝通,以確保他正確理解的題意,并且在碼字之前,我會(huì)要求對(duì)方先講解題思路,這考察了溝通能力,有的候選人可能沒有經(jīng)歷過(guò)刷題訓(xùn)練,缺少一些常見的算法思維,但經(jīng)過(guò)提示后,如果能快速地完成 coding,在筆試中或許也能夠通過(guò)。所以你看,其實(shí)考察算法題其實(shí)和也是借此考驗(yàn)了你的工作能力,它要求你在短短的半個(gè)小時(shí)之內(nèi)做到 Bug Free,一定程度上這比做工程更難,因?yàn)闆]有人為你測(cè)試,而你要想通過(guò)這一環(huán)節(jié),是需要額外花費(fèi)精力去訓(xùn)練的。
雖然我認(rèn)為面試中算法很重要,推薦大家準(zhǔn)備面試時(shí)多去刷刷題,但我也確實(shí)抵制一些偏題、怪題。以我的刷題經(jīng)驗(yàn)和工作經(jīng)驗(yàn)結(jié)合來(lái)看,推薦的難度為 leetcode 簡(jiǎn)單、中等題,ACM 銅牌、銀牌題,僅供參考。記得有一次瞄了一眼阿里的校招在線筆試題,具體是哪個(gè)部門不清楚,那個(gè)難度估計(jì)得是地獄難度了,這類情況僅僅是小概率會(huì)發(fā)生,至少在我們大部門不會(huì)出現(xiàn)特別難的算法題。
很多人說(shuō)面試造火箭,入職擰螺絲,以此來(lái)諷刺面試中算法面是不必要的,我是不贊同的。拋開面試,算法能力也的確是工作中幫助了我。簡(jiǎn)單舉幾個(gè)例子吧,我通過(guò)算法題接觸到了歐拉函數(shù)、GCD 等數(shù)論知識(shí),讓我可以非常好地理解 RSA 加密的原理和實(shí)現(xiàn)過(guò)程,而 RSA 加密是很有可能在工程中被使用到的一種非對(duì)稱加密方式;通過(guò)解決常見的數(shù)據(jù)結(jié)構(gòu)類算法題,我了解到了跳表的實(shí)現(xiàn),這方便了我去理解 Redis 的 Set 結(jié)構(gòu);熟練地解決貪心和 DP 等問(wèn)題,也潛移默化地影響著我在工程項(xiàng)目中的代碼邏輯。
字節(jié)跳動(dòng)可以說(shuō)是業(yè)內(nèi)有名的看重算法面的公司了,但鑒于本人并不了解實(shí)際的情況,只能跟大家聊聊阿里的算法面試。分成兩部分:實(shí)習(xí)生面試和社招面試。我這里的經(jīng)驗(yàn)主要都是基于我所了解的情況,在阿里其他部門(非阿里云)可能情況就不一樣了。先說(shuō)實(shí)習(xí)生面試吧,算法主要考察的是簡(jiǎn)單題,主要以貪心、數(shù)據(jù)結(jié)構(gòu)、模擬為主,可以說(shuō)非常友好了,主要考驗(yàn)學(xué)生對(duì)于基礎(chǔ)知識(shí)的掌握程度,但也要求候選人能夠在較短時(shí)間內(nèi)完成,否則很難在整體面試中獲得 A 評(píng)價(jià)。而社招,算法面試的地位肯定是要低于工程能力的考核的,但是對(duì)于能不能發(fā) offer 又起著決定性的作用,等于說(shuō),即使你的工作履歷很 match 崗位,工程經(jīng)驗(yàn)也很豐富,但算法面一塌糊涂,往往用人部門只能忍痛割愛了。
如果你正在準(zhǔn)備面試,我是建議準(zhǔn)備下算法,刷一些題目找下手感,leetcode 和各種在線 OJ 都是不錯(cuò)的選擇,B 站也有很多視頻,具體的刷題列表,我這兒沒準(zhǔn)備,相信你可以在網(wǎng)上找到很多的。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!