“?文末附繞過算法考試進(jìn)大廠的方法(沒廣告)” 01 ????????相信很多同學(xué)最討厭的就是考算法題了, 但是,算法卻是大廠面試考察的重點(diǎn)。甚至有一些大廠只考算法,。 ????????印象在我小初中的時代,微軟公司的面試題目往往被我當(dāng)做“科幻小說”來閱讀,畫風(fēng)如下:
????????總體而言,這些問題和算法的關(guān)系不大,說他們是“智力題”或許更合適,。因?yàn)楫?dāng)時計(jì)算機(jī)行業(yè)尚屬新興行業(yè),每天都會面對很多全新的問題,處理這些問題的方式也沒有一定之規(guī)??赡苁窃谶@種情況下,微軟希望選拔出最具有創(chuàng)造性的人才,可以靈活,創(chuàng)新地處理工作中遇到的各種問題,。 ????????隨著時間的推移,計(jì)算機(jī)行業(yè)逐漸成熟,程序員也在呈指數(shù)級上漲。雖然創(chuàng)造力依然很有意義,但并不再是唯一的選拔人才的指標(biāo)了,。一個邏輯思維強(qiáng),基本功扎實(shí)的人,也能夠非常好地勝任程序員的角色,。 ????????至此,互聯(lián)網(wǎng)大廠的面試進(jìn)入了第二階段,以算法問題為主。 ????????實(shí)際上這并不是件壞事,因?yàn)檫@樣以后,普通人通過訓(xùn)練學(xué)習(xí)也可以進(jìn)入大廠,意味著計(jì)算機(jī)行業(yè)門檻降低,。一個行業(yè)門檻的降低,意味著這個行業(yè)可以成規(guī)模的擴(kuò)張,呈現(xiàn)出欣欣向榮的景象。 02 一個公認(rèn)的人才選拔模型,由三部分組成:
????????拋開第2,、3條不談,通用問題思考能力就是把專業(yè)能力拿去,看一個人遇到一個非專業(yè)的問題,水平如何。 ????????這是一個很大的范疇,想象力,創(chuàng)造力,記憶力等等,都能被包括進(jìn)去,。上面的“智力題”很大程度上是在考察通用問題思考能力,。 ????????不幸的是,當(dāng)下大部分互聯(lián)網(wǎng)企業(yè)比較認(rèn)可的結(jié)論是:算法面試可以很好地同時顧及“通用問題思考能力”和“專業(yè)能力”的考察。 ????????說算法問題可以很好地考察【專業(yè)能力】很好理解,。怎么算法就能很好地考察【通用問題思考能力】了? ????????因?yàn)?#xff0c;解決算法問題是一個典型的“學(xué)以致用”的過程,。對于計(jì)算機(jī)專業(yè)的同學(xué)來說,近乎大學(xué)前兩年,就已經(jīng)將基本的算法和數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)完了。數(shù)據(jù)結(jié)構(gòu)大體就那么多,經(jīng)典算法大體就那么多,。但是,面試者能否綜合這些知識,解決一個一個算法問題?大家都懂這其實(shí)并沒有那么簡單,。 ????????我們在工作里也會經(jīng)常面對類似的情況,各類語言就擺在那里,各種 API 文檔上寫得一清二楚,各種開發(fā)工具都唾手可得,github 上各類開源項(xiàng)目應(yīng)有盡有。我們能否合理組合這一切,完成我們想要的功能? ????????解決算法問題,近乎就是這個解決問題模型的小小縮影,。 03 ????????當(dāng)然,還有一類面試問題,可以更好地模擬這種“真實(shí)的問題”,那就是系統(tǒng)設(shè)計(jì)類問題,。比如:
????????但如果僅僅考察系統(tǒng)設(shè)計(jì)問題,最大的缺點(diǎn)是容易流于表象。 ????????比如,面對性能問題,我們可以使用緩存機(jī)制。但是,具體在實(shí)現(xiàn)一個緩存機(jī)制的過程中,可能會出現(xiàn)什么問題,僅僅靠說肯定是不夠的,。 ????????面試的時間是寶貴的,所以面試官不可能讓每一位同學(xué)都真正實(shí)現(xiàn)一個完整的緩存機(jī)制,。因此,對于系統(tǒng)設(shè)計(jì)問題的考察,通常很難觸及到代碼層面。 ????????對于程序員來說,正確地實(shí)現(xiàn)代碼,比知道幾個諸如緩存這樣的名詞重要多了,。很多人說起這樣的概念頭頭是道,但真的寫起代碼來,就原形畢露了,。 ????????算法面試相較而言,雖然問題規(guī)模會更小,問題本身也更有局限性,但能考察出程序員真刀真槍寫代碼的能力。 04 ????????就算是算法問題,相信大家也都有體會,。對于一個問題,描述它的解決思路是容易的,但真要落實(shí)到代碼,就不那么容易了,。 ????????對于一個具體的工程設(shè)計(jì)問題,沒有受過專業(yè)訓(xùn)練的人很容易忽略復(fù)雜的細(xì)節(jié),將問題想簡單。蓋一個房子不過是建四面墻,上面加個屋頂而已,這里面包含了諸多復(fù)雜的工程問題,。所以外行看來很簡單的問題,實(shí)際上是很復(fù)雜的,。 比如: ????????排行榜不就是排個序嗎? ????????但能否達(dá)到性能標(biāo)準(zhǔn)? ????????搜索引擎不就是把互聯(lián)網(wǎng)上相關(guān)的信息展現(xiàn)出來嗎? ????????但是怎么定義“相關(guān)信息”? ????????微信支付不就是掃碼然后付款嗎? ????????但是怎么避免網(wǎng)絡(luò)波動帶來的支付失敗問題? ????????Kruskal 最小生成樹算法,思想非常簡單:對所有邊排序,之后從小到大選邊,只要和已有的邊沒有形成環(huán),就選擇,否則拋棄。 ????????落實(shí)到具體代碼中,怎么判斷“是否和已有的邊形成環(huán)”?
????????所以,程序員的核心價值,是具體用代碼實(shí)現(xiàn)出功能,而不是侃侃而談思想或者概念,。 05 ????????當(dāng)然如果遇到真才實(shí)學(xué)的面試官,面試者隨便吹幾個概念,其實(shí)也不可能蒙混過關(guān)。有經(jīng)驗(yàn)的面試官一定能深入問出面試者的水平,。但這對面試官的要求太高了,。 ????????高水平的程序員,他的主要時間應(yīng)該用來完成工作,而不是去面試。 ????????這樣一來,算法面試的另一個優(yōu)勢自然而然就出來了:面試官好準(zhǔn)備,。 ????????對于系統(tǒng)設(shè)計(jì)問題來說,面試官的水平要遠(yuǎn)遠(yuǎn)高于面試者才能真實(shí)地鑒別出面試者的能力,。算法就不一樣了,即使面試官的算法水平低于面試者,也可以進(jìn)行考核。因?yàn)槊嬖嚬倏梢灾苯涌创鸢?#xff0c;理解清楚解題思路和代碼就行,。 正因?yàn)槿绱瞬艜霈F(xiàn): ????????一個算法面試官問你一個算法問題,你沒做出來問題不大,這并不代表他比你強(qiáng),。因?yàn)槟銈兲幱谛畔⒉粚Φ鹊奈恢谩?/p> 06 當(dāng)然算法面試還有更多優(yōu)點(diǎn)。
但是算法題最大的缺點(diǎn),就是容易漏過人才,。不擅長算法的人不意味著不勝任計(jì)算機(jī)專業(yè)的工作,。 ????????那大廠錯過了人才怎么辦? ????????他們可能并不在乎 ????????反正有簡歷源源不斷地涌進(jìn)來,他們只要招聘到足夠數(shù)量滿足自己需要的人就可以了。 ????????通常來講,擅長算法的人,近乎都能夠很好地勝任軟件工程師的工作,。反之,不擅長算法的人,雖然有可能是人才,但更加可能不是人才,。 07 ????????很多小公司面試不考算法的原因,是因?yàn)樗麄儾恍枰疾?span style="color:#4da8ee;">通用問題解決能力。小公司更注重專業(yè)能力的考察,。能干活最重要,。他們并不會接觸到那么多創(chuàng)造性的問題,。 ????????招聘領(lǐng)域?qū)<視r雖然也有算法,但難度明顯降檔,最典型的就是 Google 在面試 Homebrew 的作者 Max Howell 的時候,給出的算法面試題“翻轉(zhuǎn)二叉樹”。這個問題在 Leetcode 上就是一個 easy ,然而他并沒有寫出來 08 ????????所以就要揭曉我們究竟要怎么樣才能不考算法就進(jìn)入大廠,當(dāng)然就是成為領(lǐng)域?qū)<?/span>,。讓企業(yè)不能把你當(dāng)做是一個普通的求職者,。 ????????之前有一個清華一個學(xué)霸,在自己寫的CPU上運(yùn)行自己寫的操作系統(tǒng),這樣的人才,大廠這不分分鐘給搶了,誰還在乎你算法題寫得好不好啊。 ????????不過話又說回來了,成為領(lǐng)域?qū)<疫€是比掌握那些基本的算法面試問題要難的,。但很多時候我們對現(xiàn)實(shí)不滿,苦苦追求其他捷徑,。 ????????再但是,其他的路其實(shí)是更艱苦的路。而我們總?cè)菀缀雎?span style="color:#fe2c24;">擺在眼前的,其實(shí)已經(jīng)是捷徑了,。 (不說了,我去練習(xí)算法了) 這里是小王,幾段文字,分享生活,。 |
|