01 | 為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法拳话?
你是不是覺得數(shù)據(jù)結(jié)構(gòu)和算法,跟操作系統(tǒng)种吸、計(jì)算機(jī)網(wǎng)絡(luò)一樣弃衍,是脫離實(shí)際工作的知識(shí)?可能除了面試坚俗,這輩子也用不著镜盯?
盡管計(jì)算機(jī)相關(guān)專業(yè)的同學(xué)在大學(xué)都學(xué)過這門課程,甚至很多培訓(xùn)機(jī)構(gòu)也會(huì)培訓(xùn)這方面的知識(shí)猖败,但是據(jù)我了解速缆,很多程序員對(duì)數(shù)據(jù)結(jié)構(gòu)和算法依舊一竅不通。還有一些人也只聽說過數(shù)組恩闻、鏈表艺糜、快排這些最最基本的數(shù)據(jù)結(jié)構(gòu)和算法,稍微復(fù)雜一點(diǎn)的就完全沒概念。
當(dāng)然破停,也有很多人說翅楼,自己實(shí)際工作中根本用不到數(shù)據(jù)結(jié)構(gòu)和算法。所以真慢,就算不懂這塊知識(shí)毅臊,只要Java
API、開發(fā)框架用得熟練黑界,照樣可以把代碼寫得“飛”起來管嬉。事實(shí)真的是這樣嗎?
今天我們就來詳細(xì)聊一聊园爷,為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法宠蚂。
想要通關(guān)大廠面試,千萬別讓數(shù)據(jù)結(jié)構(gòu)和算法拖了后腿
很多大公司童社,比如BAT、Google著隆、Facebook扰楼,面試的時(shí)候都喜歡考算法、讓人現(xiàn)場(chǎng)寫代碼美浦。有些人雖然技術(shù)不錯(cuò)弦赖,但每次去面試都會(huì)“跪”在算法上,很是可惜浦辨。那你有沒有想過蹬竖,為什么這些大公司都喜歡考算法呢?
校招的時(shí)候流酬,參加面試的學(xué)生通常沒有實(shí)際項(xiàng)目經(jīng)驗(yàn)币厕,公司只能考察他們的基礎(chǔ)知識(shí)是否牢固。社招就更不用說了芽腾,越是厲害的公司旦装,越是注重考察數(shù)據(jù)結(jié)構(gòu)與算法這類基礎(chǔ)知識(shí)。相比短期能力摊滔,他們更看中你的長期潛力阴绢。
你可能要說了,我不懂?dāng)?shù)據(jù)結(jié)構(gòu)與算法艰躺,照樣找到了好工作啊呻袭。那我是不是就不用學(xué)數(shù)據(jù)結(jié)構(gòu)和算法呢?當(dāng)然不是腺兴,你別忘了左电,
我們學(xué)任何知識(shí)都是為了“用”的,是為了解決實(shí)際工作問題的 ,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法自然也不例外券腔。
業(yè)務(wù)開發(fā)工程師伏穆,你真的愿意做一輩子CRUD boy嗎?
如果你是一名業(yè)務(wù)開發(fā)工程師纷纫,你可能要說枕扫,我整天就是做數(shù)據(jù)庫CRUD(增刪改查),哪里用得到數(shù)據(jù)結(jié)構(gòu)和算法叭杩烟瞧?
是的,對(duì)于大部分業(yè)務(wù)開發(fā)來說染簇,我們平時(shí)可能更多的是利用已經(jīng)封裝好的現(xiàn)成的接口参滴、類庫來堆砌、翻譯業(yè)務(wù)邏輯锻弓,很少需要自己實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和算法砾赔。但是,
不需要自己實(shí)現(xiàn)青灼,并不代表什么都不需要了解 暴心。
如果不知道這些類庫背后的原理,不懂得時(shí)間杂拨、空間復(fù)雜度分析专普,你如何能用好、用對(duì)它們弹沽?存儲(chǔ)某個(gè)業(yè)務(wù)數(shù)據(jù)的時(shí)候檀夹,你如何知道應(yīng)該用ArrayList,還是Linked
List呢策橘?調(diào)用了某個(gè)函數(shù)之后炸渡,你又該如何評(píng)估代碼的性能和資源的消耗呢?
作為業(yè)務(wù)開發(fā)役纹,我們會(huì)用到各種框架偶摔、中間件和底層系統(tǒng),比如Spring促脉、RPC框架辰斋、消息中間件、Redis等等瘸味。
在這些基礎(chǔ)框架中宫仗,一般都揉和了很多基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和算法的設(shè)計(jì)思想。
比如旁仿,我們常用的Key-Value數(shù)據(jù)庫Redis中藕夫,里面的有序集合是用什么數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)的呢孽糖?為什么要用跳表來實(shí)現(xiàn)呢?為什么不用二叉樹呢毅贮?
如果你能弄明白這些底層原理办悟,你就能更好地使用它們。即便出現(xiàn)問題滩褥,也很容易就能定位病蛉。因此,
掌握數(shù)據(jù)結(jié)構(gòu)和算法瑰煎,不管對(duì)于閱讀框架源碼铺然,還是理解其背后的設(shè)計(jì)思想,都是非常有用的酒甸。
在平時(shí)的工作中魄健,數(shù)據(jù)結(jié)構(gòu)和算法的應(yīng)用到處可見。我來舉一個(gè)你非常熟悉的例子:如何實(shí)時(shí)地統(tǒng)計(jì)業(yè)務(wù)接口的99%響應(yīng)時(shí)間插勤?
你可能最先想到沽瘦,每次查詢時(shí),從小到大排序所有的響應(yīng)時(shí)間饮六,如果總共有1200個(gè)數(shù)據(jù)其垄,那第1188個(gè)數(shù)據(jù)就是99%的響應(yīng)時(shí)間。很顯然卤橄,每次用這個(gè)方法查詢的話都要排序,效率是非常低的臂外。但是窟扑,如果你知道“堆”這個(gè)數(shù)據(jù)結(jié)構(gòu),用兩個(gè)堆可以非常高效地解決這個(gè)問題漏健。
基礎(chǔ)架構(gòu)研發(fā)工程師嚎货,寫出達(dá)到開源水平的框架才是你的目標(biāo)!
現(xiàn)在互聯(lián)網(wǎng)上的技術(shù)文章蔫浆、架構(gòu)分享殖属、開源項(xiàng)目滿天飛,照貓畫虎做一套基礎(chǔ)框架并不難瓦盛。我就拿RPC框架舉例洗显。
不同的公司、不同的人做出的RPC框架原环,架構(gòu)設(shè)計(jì)思路都差不多挠唆,最后實(shí)現(xiàn)的功能也都差不多。但是有的人做出來的框架嘱吗,Bug很多玄组、性能一般、擴(kuò)展性也不好,只能在自己公司僅有的幾個(gè)項(xiàng)目里面用一下俄讹。而有的人做的框架可以開源到GitHub上給很多人用哆致,甚至被Apache收錄。為什么會(huì)有這么大的差距呢患膛?
我覺得摊阀,高手之間的競(jìng)爭其實(shí)就在細(xì)節(jié)。這些細(xì)節(jié)包括:你用的算法是不是夠優(yōu)化剩瓶,數(shù)據(jù)存取的效率是不是夠高驹溃,內(nèi)存是不是夠節(jié)省等等。這些累積起來延曙,決定了一個(gè)框架是不是優(yōu)秀豌鹤。所以,如果你還不懂?dāng)?shù)據(jù)結(jié)構(gòu)和算法枝缔,沒聽說過大O復(fù)雜度分析布疙,不知道怎么分析代碼的時(shí)間復(fù)雜度和空間復(fù)雜度,那肯定說不過去了愿卸,趕緊來補(bǔ)一補(bǔ)吧灵临!
對(duì)編程還有追求?不想被行業(yè)淘汰趴荸?那就不要只會(huì)寫湊合能用的代碼儒溉!
何為編程能力強(qiáng)?是代碼的可讀性好发钝、健壯顿涣?還是擴(kuò)展性好?我覺得沒法列酝豪,也列不全涛碑。但是,在我看來孵淘,性能好壞起碼是其中一個(gè)非常重要的評(píng)判標(biāo)準(zhǔn)
蒲障。但是,如果你連代碼的時(shí)間復(fù)雜度瘫证、空間復(fù)雜度都不知道怎么分析揉阎,怎么寫出高性能的代碼呢?
你可能會(huì)說痛悯,我在小公司工作余黎,用戶量很少,需要處理的數(shù)據(jù)量也很少载萌,開發(fā)中不需要考慮那么多性能的問題惧财,完成功能就可以巡扇,用什么數(shù)據(jù)結(jié)構(gòu)和算法,差別根本不大垮衷。但是你真的想“十年如一日”地做一樣的工作嗎厅翔?
經(jīng)常有人說,程序員35歲之后很容易陷入瓶頸搀突,被行業(yè)淘汰刀闷,我覺得原因其實(shí)就在此。有的人寫代碼的時(shí)候仰迁,從來都不考慮非功能性的需求甸昏,只是完成功能,湊合能用就好徐许;做事情的時(shí)候施蜜,也從來沒有長遠(yuǎn)規(guī)劃,只把眼前事情做好就滿足了雌隅。
我曾經(jīng)面試過很多大齡候選人翻默,簡歷能寫十幾頁,經(jīng)歷的項(xiàng)目有幾十個(gè)恰起,但是細(xì)看下來修械,每個(gè)項(xiàng)目都是重復(fù)地堆砌業(yè)務(wù)邏輯而已,完全沒有難度遞進(jìn)检盼,看不出有能力提升肯污。久而久之,十年的積累可能跟一年的積累沒有任何區(qū)別吨枉。這樣的人仇箱,怎么不會(huì)被行業(yè)淘汰呢?
如果你在一家成熟的公司东羹,或者BAT這樣的大公司,面對(duì)的是千萬級(jí)甚至億級(jí)的用戶忠烛,開發(fā)的是TB属提、PB級(jí)別數(shù)據(jù)的處理系統(tǒng)。性能幾乎是開發(fā)過程中時(shí)刻都要考慮的問題美尸。一個(gè)簡單的ArrayList冤议、Linked
List的選擇問題,就可能會(huì)產(chǎn)生成千上萬倍的性能差別师坎。這個(gè)時(shí)候恕酸,數(shù)據(jù)結(jié)構(gòu)和算法的意義就完全凸顯出來了。
其實(shí)胯陋,我覺得蕊温,數(shù)據(jù)結(jié)構(gòu)和算法這個(gè)東西袱箱,如果你不去學(xué),可能真的這輩子都用不到义矛,也感受不到它的好发笔。但是一旦掌握,你就會(huì)常常被它的強(qiáng)大威力所折服凉翻。之前你可能需要費(fèi)很大勁兒來優(yōu)化的代碼了讨,需要花很多心思來設(shè)計(jì)的架構(gòu),用了數(shù)據(jù)結(jié)構(gòu)和算法之后制轰,很容易就可以解決了前计。
內(nèi)容小結(jié)
我們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法,并不是為了死記硬背幾個(gè)知識(shí)點(diǎn)垃杖。我們的目的是建立時(shí)間復(fù)雜度男杈、空間復(fù)雜度意識(shí),寫出高質(zhì)量的代碼缩滨,能夠設(shè)計(jì)基礎(chǔ)架構(gòu)势就,提升編程技能,訓(xùn)練邏輯思維脉漏,積攢人生經(jīng)驗(yàn)苞冯,以此獲得工作回報(bào),實(shí)現(xiàn)你的價(jià)值侧巨,完善你的人生舅锄。
所以,不管你是業(yè)務(wù)開發(fā)工程師司忱,還是基礎(chǔ)架構(gòu)工程師皇忿;不管你是初入職場(chǎng)的初級(jí)工程師,還是工作多年的資深架構(gòu)師坦仍,又或者是想轉(zhuǎn)人工智能鳍烁、區(qū)塊鏈這些熱門領(lǐng)域的程序員,數(shù)據(jù)結(jié)構(gòu)與算法作為計(jì)算機(jī)的基礎(chǔ)知識(shí)繁扎、核心知識(shí)幔荒,都是必須要掌握的。
掌握了數(shù)據(jù)結(jié)構(gòu)與算法梳玫,你看待問題的深度爹梁,解決問題的角度就會(huì)完全不一樣
。因?yàn)檫@樣的你提澎,就像是站在巨人的肩膀上姚垃,拿著生存利器行走世界。數(shù)據(jù)結(jié)構(gòu)與算法盼忌,會(huì)為你的編程之路积糯,甚至人生之路打開一扇通往新世界的大門掂墓。
你為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法呢?在過去的軟件開發(fā)中絮宁,數(shù)據(jù)結(jié)構(gòu)和算法在哪些地方幫到了你梆暮?
歡迎留言和我分享,我會(huì)第一時(shí)間給你反饋绍昂。