刷題到底有什麼用?你這麼刷題還真沒用

碼農田小齊發表於2020-11-10

關於刷題,上一篇文章講了 How,今天我們來聊聊 Why —— 為什麼要刷題?

或許很多人沒考慮過這個問題,或者會說因為面試要考啊,沒錯,就是這個原因,就這一個理由足以讓我們去刷題。但今天我們來聊點不一樣的,希望給你新的啟發。

演算法之前,面試考什麼?

我曾在這篇文章《從 LRU Cache 帶你看面試的本質》中提到過部分,美國大廠面試 80% 都是在考演算法,這其實是最近 5-10 年以谷歌、雅虎為首才興起的;國內大廠對於演算法的考察雖然沒有這麼狂熱,但也越來越重視了。

那為什麼會形成這種局面?在考演算法之前它們在考什麼?

你有兩個罐子,容量分別是 5 升和 3 升,還有一池塘的水。在沒有測量工具的輔助下,問能否準確的取出 4 升水來?

煎一個雞蛋需要 15 分鐘,可是你手頭沒有計時器。現在給你兩根繩子,燒完一根繩子需要一個小時;而繩子是粗細不均勻的,有可能半根繩子幾分鐘就燒完了。

填滿一輛校車需要多少個高爾夫球?

這類題被稱為"Brain teaser",不只是十幾年前的科技公司在考,如今的金融公司還在考,比如我在剛畢業面試 Quant,Risk 的職位時都會被問這種問題,為此也專門準備過。

那時候網際網路行業剛剛興起,每天都會面對很多未知的問題,那麼就需要“聰明人”來想辦法解決這些問題,所以面試的核心是選拔最聰明的人。

為什麼考演算法?

後來網際網路大規模的興起,需要大量的工程師去解決問題,那麼面試的核心就變成了如何選拔出能夠解決普通問題、寫出有效程式碼的人。

一個基本功紮實,思維邏輯強,能夠寫出有效程式碼的人就能夠勝任這些職位,因此網際網路公司的面試規則也隨之改變。

網際網路行業的大規模擴張降低了行業的門檻,雖然目前依舊是高薪行業,但對個人的門檻已經大幅降低了,甚至不問背景和專業,每個人都有機會進入頂尖的公司。

大部分網際網路公司認為,演算法是非常有效的篩選出他們想要的工程師的。

演算法,一是能夠考察面試者思考解決問題的能力,二是考察寫程式碼的基本功。

一個能通過演算法面試的人大概率是能夠勝任工程師的職位的,不能勝任那還有 pip 等著呢;一個不能通過演算法面試的人大概率是無法勝任這項工作的。

當然了,可能會漏掉某些優秀的人才,但真相就是,大廠不在乎

面試是能夠最高效的選出需要的人才,最好還能夠流程化、標準化,如果需要員工在面試上投入太多,哪有時間好好工作呢?

所以演算法就像是高考一樣,可以幫助企業快速篩選人才,並且相對其他方法來說價效比更高:成本低、效果好。

但如果你是在某些方面有所特長,或者是某個領域的專家,就不需要經歷這種標準化的面試了。就像高考時也會有特長生、奧賽保送之類的,但實際上,這種方式,更難。

所以以上我所說的更多的是針對初級工程師,也就是剛畢業的同學,沒有實習沒有重量級專案的同學,你說要考察什麼呢?這麼一算,演算法真的是通往大廠的捷徑了。

演算法,僅僅是演算法嗎?

那有些人又說了,學了演算法工作中根本用不到,學它有什麼用?不學我也一樣可以工作。

那我想問,你學了作業系統工作中也沒讓你寫個作業系統啊,學了前端也沒讓你開發瀏覽器,學了資料庫也沒讓你造個資料庫啊,那怎麼學個資料結構你就一定要想著造個資料結構呢?

現在工作中大都是直接用這些工具而不是重新造輪子,這也是網際網路行業能夠大規模發展的原因,就像連鎖店的產生,也不需要每個員工都會去生產核心產品。

但是,一旦需要你去造輪子,比如開發新的產品,一定離不開大量的演算法;那如果你不在這些職位上,自然是用不著的。

那這也解釋了為什麼大廠都喜歡考演算法,而小公司更注重你是否熟悉某一個框架的使用,畢竟小公司是要你直接來幹活的。

那不在這些崗位上,就一點都用不到演算法了嗎?也不是。

對我來說,演算法已經影響了我的方方面面。

比如一個很常見的問題,工作中 debug 時,不是從第一個開始查,而是要用二分查詢的思想,先找到一箇中間位置設定斷點,檢視到這個位置的資訊是否正確,然後再逐漸縮小查詢範圍,最終找到問題所在。這個思想就來源於 Leetcode 上的二分查詢的演算法題原題。

模版,你還在用模版嗎?

說到二分查詢,有同學都有問過我哪個模版好,我都驚呆了,原來還有很多個模版?!

我在上一篇講我的刷題方法中並沒有提到模版,因為我根本不用模版,我認為但凡是用模版的就是你對這個演算法根本沒理解清楚。

關於二分查詢確實有很多變種,有些人總想用一個模版套所有情況,是會有這種模版,但這個模版一定不是所有情況的最優解。

在面試時面試官稍微變化一下條件,多問你幾個這樣行不行,那樣可不可以,你就露餡了。

更重要的是,這樣背模版來做題才是真的沒有用!這樣刷出來的演算法工作中真的用不到,到實際 debug 時你還想套模版嗎?難道在 debug 時,你還先翻翻模版,再確定往哪個方向去查詢 bug?

公司招人是來解決問題的,如果套模版就能解決的問題,何必花高薪招人來解決呢?

所以刷題有沒有用,還要看你怎麼刷,不同的人刷同樣的題,效果可能完全不一樣。就像我們高中時做數學題一樣,做題不是為了高考時碰到原題,而是鍛鍊自己的思維、思考方式,這樣才能在遇到新題時迎刃而解。

當然了,我也不想神話刷題的作用,有些工作就是用不著,沒錯,那就好好工作。

工作幾年之後演算法所佔面試的比例一定會減小,一個工作 5 年的工程師去面試,如果問演算法題,那通過之後會給一個 senior 的職位;而一個剛畢業的學生去面試同樣的演算法題,哪怕答的再好,也只是 entry level,這就是區別,區別在於演算法之外的內容。


好了,想進自習室刷題的可以繼續加我微信,上週沒加上的抓緊時間了。

還不瞭解自習室的小夥伴可以看這個視訊瞭解一下,學習內容不侷限於刷題,英語健身前端後端各種都有打卡,歡迎你的加入。

我是小齊,終身學習者,我們下期見!

相關文章