有人說,算法,先於計算機存在於世,比編程語言本身更爲重要,語言只是工具,而算法纔是靈魂。而程序就等於算法加數據結構。足以可見,想要在編程之路上走的更長遠,數據結構與算法就是必須要掌握的基本功。

可是,“真實”的情況是什麼樣的呢?

  • 儘管大學學過這門課程,甚至網上有很多學習資料,依舊對對數據結構和算法一竅不通?
  • 只聽說過數組、鏈表、快排這些最最基本的數據結構和算法,稍微複雜一點的就完全沒概念?
  • 數據結構和算法,跟操作系統、計算機網絡一樣,是脫離實際工作的知識?除了面試,可能這輩子也用不着?
  • 就算不懂這塊知識,只要Java API、開發框架用得熟練,照樣可以把代碼寫得“飛”起來?

事實真的是這樣嗎?

今天我就來詳細聊一聊,爲什麼要學習數據結構和算法。

想要通關大廠面試,千萬別讓數據結構和算法拖了後腿

很多大公司,比如BAT、Google、Facebook,面試的時候都喜歡考算法、讓人現場寫代碼。有些人雖然技術不錯,但每次去面試都會“跪”在算法上,很是可惜。那你有沒有想過,爲什麼這些大公司都喜歡考算法呢?

校招的時候,面試的學生通常沒有實際項目經驗,只能考察基礎知識是否牢固。社招就更不用說了,越是厲害的公司,越是注重考察數據結構與算法這類基礎知識。相比短期能力,他們看中你的長期潛力。

你可能要說了,我不懂數據結構與算法,照樣找到了好工作啊。那我是不是就不用學數據結構和算法呢?當然不是。你別忘了,我們學任何知識都是爲了“用”的,是爲了解決實際工作問題的,學習數據結構和算法自然也並不例外,那麼它實際工作中到底能起到多大的作用呢?

業務開發工程師,你真的願意做一輩子CRUD boy嗎?

如果你是一名業務開發工程師,你可能要說,我整天就是做數據庫CRUD(增刪改查),哪裏用得到數據結構和算法啊?

是的,對於大部分業務開發來說,我們平時可能更多的是利用已經封裝好的現成的接口、類庫來堆砌、翻譯業務邏輯,很少需要自己實現數據結構和算法。但是,不需要自己實現,並不代表什麼都不需要了解。

如果不知道這些類庫背後的原理,不懂得時間、空間複雜度分析,你如何能用好、用對它們?存儲某個業務數據的時候,你如何知道應該用ArrayList,還是LinkedList呢?調用了某個函數之後,你又該如何評估代碼的性能和資源的消耗?

基礎架構研發工程師,寫出達到開源水平的框架纔是你的目標!

現在互聯網上的技術文章、架構分享、開源項目滿天飛,照貓畫虎做一套基礎框架並不難。高手之間的競爭反而在細節。這些細節就包括,你用的算法是不是夠優化,數據存取的效率是不是夠高,內存是不是夠節省等等,這些累積起來,就決定了一個框架是不是優秀。

對編程還有追求?不想被社會淘汰?就不要只是能寫出湊合能用的代碼!

爲什麼說初級程序員才比招式,高級程序員只看內功呢?

何爲編程能力強?是代碼的可讀性好、健壯?還是擴展性好?我覺得沒法列,也列不全。但是,

如果你在一個成熟的公司,或者像BAT這樣的大公司,面對的是千萬級甚至億級的用戶,開發的是TB、PB級別數據的處理系統。性能幾乎是開發過程中時刻都要考慮的問題。

一個簡單的ArrayList、Linked List的選擇問題,就可能會產生成千上萬倍的性能差別。這個時候,數據結構和算法的意義就完全凸顯出來了。一旦掌握數據結構和算法,你就會常常被它的強大威力所折服。之前你可能需要費很大勁來優化的代碼,需要花很多心思設計的架構,現在很容易就可以解決了。


Google工程師:如何看待程序員普遍缺乏數據結構和算法知識


我是誰?

我叫王爭,前Google工程師,從事Google翻譯和知識圖譜相關的開發工作,深入研究算法數十年。現任某金融公司資深系統架構師,核心業務接口平臺負責人,負責公司核心業務的架構設計、開發,以及可用性、高性能等相關技術問題的解決。

我爲什麼要開設這門課程?

自從讀研究生時,一個師兄給了我一本《算法導論》,從此我一頭扎進算法世界,到現在也十多年了。這期間,我研究過數十本數據結構與算法的書籍,並對它們進行了仔細地對比、分析。

我發現,像《算法導論》這些經典書籍,雖然很全面,但是過於缺乏重點。很多人學起來都非常困難。而市面很多在線課程或者線下課程,大多是爲了“應試”,只講一些看似通用,實則脫離真實開發場景的內容。費勁學完感覺根本用不上,過不了幾天就忘了。

鑑於此,我很想做一個能讓工程師真正受用的,能夠不拘泥於編程語言,與實際開發場景聯繫緊密,而又能夠幫你訓練算法思維,真正提升編程內功的數據結構與算法課程。

這個課程適合誰來學習?

看到數據結構和算法裏的“算法”兩個字,很多人就會聯想到“數學”,覺得算法會涉及很多深奧的數學知識,會想我數學基礎不是很好,學起來會不會很喫力啊?

數據結構和算法課程確實會涉及一些數學方面的推理、證明,但是這個你完全不需要擔心,因爲我的專欄不會像《算法導論》那樣涉及很多高深的推理過程。

當然,我希望你最好有些編程基礎或者項目經驗,這樣我給你講數據結構和算法如何提高效率、如何節省存儲空間,你就會有很直觀的感受。因爲,對於每個概念和實現過程,我都會從實際場景出發,不僅教你“是什麼”,還會教你“爲什麼”,並且告訴你遇到同類型問題應該“怎麼做”。

所以,不管你是初入職場的初級工程師,還是工作多年的資深架構師,又或者是想轉大數據、人工智能或者區塊鏈這些熱門領域的程序員,你都可以來學學這門,計算機科學中的基礎、核心課程。或者說,任何對編程與追求的人,都可以來學學這塊被稱作“程序設計的靈魂”的知識。

學完這個專欄你能獲得什麼?

  • 掌握數據結構與算法的核心知識,輕鬆應對BAT等大廠面試

我根據自己研讀數十本算法書籍和多年項目開發的經驗,精選了20個最實用數據結構和算法結合具體的軟件開發實例,由淺入深進行講解背後的設計思想,並適時總結一些實用“寶典”,保證你印象深刻、輕鬆應對中小型公司的面試。

  • 提升算法思維,訓練解決實際開發工作難題的強能力

這部分我會講一些不是那麼常用的數據結構和算法。雖然不常用,但是這些內容你也需要知道。設置這一部分的目的,是爲了讓你開拓視野,強化訓練算法思維、邏輯思維。如果說學完基礎部分可以考80分,那掌握這一部分就能讓你成爲尖子生

  • 學習開源框架、底層系統的設計原理,提升工作實戰技能

最後我會通過實戰部分串講一下前面講到的數據結構和算法並且結合開源項目、框架或者系統設計問題,剖析它們背後的數據結構和算法,幫你提升讀懂源碼的能力(JDK很多源碼,不乏大量的數據結構,例如大家喜聞樂見的面試題HashMap)。

相關文章