Web 前端需不需要刷算法?

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


























