Web 前端需不需要刷算法?
大家好,我是堅持刷算法的前端西瓜哥。
最近我一如既往地打開了 Leetcode 官網(wǎng)打算找道算法題做做,然后看到了一個 “關(guān)于 web 前端需不需要刷算法” 的討論,覺得可以說上一說我的看法。
我個人覺得 web 前端是非常有必要刷算法題的。這對我們的職業(yè)發(fā)展和個人成長是非常有幫助的。
個人職業(yè)發(fā)展
算法題能夠提高自己寫出高效率代碼的能力。
大部分的 web 前端開發(fā)不少時間都是在寫業(yè)務(wù)代碼,要用到復(fù)雜算法的機(jī)會并不多,通常就是切切圖還原視覺稿、實(shí)現(xiàn)下交互、和后端對下接口。
但我們不應(yīng)該將自己局限在寫業(yè)務(wù)代碼,有時候我們還是要寫非業(yè)務(wù)代碼的。
或許你會說可以找別人寫好的輪子,但并不是所有輪子都能滿足我們的項(xiàng)目需求,尤其是細(xì)分領(lǐng)域,有些時候還是得自己動手造輪子。
很多算法問題其實(shí)都是脫胎于實(shí)際的場景的,對我們寫出好的非業(yè)務(wù)代碼有不小的借鑒意義。
如果你不想成為一名打雜,刷算法還是非常有必要的。
代碼更健壯
刷算法有一些好處,你會注重代碼的可讀性,使用可讀性更好的變量名,不使用多余的變量,讓代碼盡量簡潔。
在刷題中,你不得不考慮算法的各種邊界情況,以便應(yīng)付一些極端的測試用例。這能提高你寫的代碼的健壯性,寫出 bug 更少的代碼。
此外你也能學(xué)到一些有意思的算法技巧。比如,F(xiàn)lood fill 算法可以處理油漆桶填充圖形的問題,前綴和技巧可以通過緩存快速求一些中間范圍的值。這對我們做方案有一定的幫助。
我們看一些優(yōu)秀源碼時,代碼里面可能針對場景做了特殊的算法優(yōu)化,如果你刷過算法題,就能更好地理解作者這樣寫的意圖。
面試的基本要求
隨著近些年前端開發(fā)從業(yè)人員越來越多,很多公司的產(chǎn)品越發(fā)切進(jìn)細(xì)分市場、復(fù)雜度越來越高,考察算法能力基本上是中大型公司面試的標(biāo)配了。
面試大公司時,你可能在每輪技術(shù)面試都會被要求解答至少一道 medium 難度的算法題,偶爾也會出現(xiàn) hard 難度的題。算法不好被刷的概率會增大,除非你的項(xiàng)目經(jīng)驗(yàn)表現(xiàn)足夠優(yōu)秀。
中小公司則好些,多數(shù)不考算法題,或者出一道很簡單的算法題。
如果想讓你的職業(yè)發(fā)展有更多的機(jī)會的話,建議你刷算法。
面試中能夠做出所有的算法題,面試官不免會高看你一眼,有非常好的初步印象,提高你斬獲 offer 的概率。
場景方案的思考
我們在開發(fā)中完成需求,經(jīng)常會有多個解決方案,認(rèn)真根據(jù)場景權(quán)衡不同方案的利弊,從中選擇最合適的方案,是一名優(yōu)秀的程序員非常重要的能力。
刷算法題,其實(shí)就是鍛煉這個能力的過程。
不少的算法題的解法很多。有的解法空間復(fù)雜度高但時間復(fù)雜度低,有的時間復(fù)雜度高但空間復(fù)雜度低,有的實(shí)現(xiàn)起來很簡單,有的性能更好但實(shí)現(xiàn)復(fù)雜容易寫錯。
雖然在刷算法題中,通常時間最快的算法是正解,但也有不少加了時間復(fù)雜度限制的題目,你需要分析不同的方案,找出對應(yīng)場景最合適的解法。
我們在做題中,對每一個解法的利弊的分析,也是面試中重點(diǎn)考察的內(nèi)容。
“與其刷算法題,還不如多做點(diǎn)項(xiàng)目”
也有人說:“與其刷算法題,還不如多做點(diǎn)項(xiàng)目”。其實(shí)這兩點(diǎn)并不沖突,我們的業(yè)余時間不可能全部用來刷算法題。
刷題應(yīng)該是我們能力提高的一環(huán),而不是全部。我們除了刷算法題,還可以學(xué)習(xí)其他的知識,讀書、學(xué)習(xí)理財知識、做點(diǎn)個人項(xiàng)目、像我這樣寫文章,都是可以的。
并不是說,我們刷了算法題,就沒時間做其他事情了。
我是推薦每周完成 5 道算法題,周一到周五每天一道,哪天沒完成,周六日再補(bǔ)上就好了。
像玩游戲一樣刷算法題
首先我們不要想著算法能夠速成,能夠短時間就能大幅提高,它是一個慢慢積累的過程。
你應(yīng)該像玩游戲一樣,每天打一關(guān),一點(diǎn)點(diǎn)地收獲熟練度并提高難度。應(yīng)該帶著去通關(guān)一個有難度的游戲關(guān)卡去對待它。即使今天完不成,明天我們再嘗試,不行就看攻略。
Leetcode 其實(shí)是一個非常好的提高自己算法能力的平臺,因?yàn)樗懈采w度足夠的測試用例,能讓我們每次提交都能獲得反饋。
相比自己工作中寫出的代碼,不知道部署到線上什么時候會導(dǎo)致事故,Leetcode 的反饋是即時的,對我們快速提高能力有非常大的幫助。
結(jié)尾
無論是什么程序員,我都建議他去刷算法題,因?yàn)樗惴芰κ且幻绦騿T的基本素養(yǎng)。