「除了大廠面試,工作中幾乎用不到算法,還有必要學嗎?」
這個靈魂拷問,估計每個程式設計師或多或少都懷疑過。畢竟工作中寫業務代碼,用著別人封裝實現好的函數、類、庫、中間件,程序只是搭積木而已,「日常增刪改查、API BOY」的形容,是不好聽,但卻是很多程式設計師的真實寫照,寫代碼更像是體力活。
還有人戲稱「面試造火箭、入職螺絲刀」,但實際上,大廠面試卡算法,高薪資的背後,是通過算法,來篩選有思考能力、解決問題能力的人才。算法的價值,不僅止於面試,更在於入職後,真正解決工程實戰中存在的問題。
畢竟算法在工作中無處不在,你可能經常會碰到:
要根據你的業務排序需求來選擇是用穩定排序還是非穩定排序;
要根據插入和刪除數據的頻率來選擇使用 array 還是 linked list;
對上億數據排序除了外排序是不是也能用 bitmap;
在不同的 workload 下應該選擇行存還是列存的資料庫,選擇基於 lsm-tree 的索引還是b+ tree 的索引;
.
還有每天都在使用的 JDK、STL 等基礎庫中的算法等等。只有搞懂什麼場景下、該選用什麼算法和數據結構,並且深入了解程序在物理機上到底是如何運行的,面對特定問題,才能用較優的時空複雜度求解,儘可能避免性能瓶頸,真正寫出高效運行的程序。
所以那些背了很多「八股文」、學了很多概念的人,在真正臨上陣時卻不會用。比如都知道 Redis 實現有序集合底層採用的是跳表,但跳表的實現細節、跳表和紅黑樹相比有什麼優勢,就很少有人真正理解了。
算法,不僅僅是應對技術面試的工具,還是編程的靈魂。如果你想吃 IT 技術這碗飯,算法會制約一個人的上限,等到技術更高深,經驗越豐富,算法的重要性就越來越明顯。
如何在實際工作中用好算法?
武功套路容易學,扎馬步基本功難練,學算法也是一樣。你沒辦法討巧,你要像郭靖學習降龍十八掌那樣,一掌一掌劈下去才行。
網上資料不少,大多講的理論,不結合實際問題,不考慮工作場景,還是學不會。最近看到極客時間上了個《算法實戰高手課》專欄,還是讓我眼前一亮的,點題就是「實戰」,我第一時間就訂閱了,看了更新的幾篇,可以說是從實際工程問題的視角,真真切切的為大家呈現了一堂實用的算法課,分享一張專欄中「核心算法應用圖」。
這個專欄是從算法的工程實踐開始,著重講算法是如何運行在真實的物理機器上的,如何解決實際業務系統中的問題的,如何在各個穩定運行的中間件、分布式系統、基礎庫中實現的。再加上源碼剖析,手寫實現,深入細節,帶你掌握 35 類算法實戰應用場景、6 大領域常用算法知識體系,真正提升你解決問題的能力。
剛上線,最是優惠,還有隱藏口令,到手 ¥89。
再說說作者「黃清昊」
黃清昊(網名微擾理論),前阿里雲、字節跳動、騰訊工程師,畢業於上海交通大學。本身經歷也非同一般,非科班畢業,但因為對算法的興趣,在 LeetCode 上刷了 800 多道題目(800多道,什麼概念!),貢獻了200 餘篇優秀題解,對算法理解頗深,也成功從前端轉型成基礎軟體研發,現任 EMQ X 存儲工程師,對函數式編程和分布式系統有豐富的實戰經驗。
正因如此,專欄不是枯燥的理論,而是基於實踐、結合作者自己很有故事性的經歷,真正講透那些被忽略的有趣算法們,杜絕紙上談兵的理論知識,可讀性很強,很難不追更。
市面上算法教程很多,我為什麼要推薦這個專欄:
相對於市面上從基礎開始講的算法教程,內容更進階。如果說小爭哥的《數據結構與算法之美》是從基礎到思維帶你攻破算法學習、算法刷題、算法面試三大難關,那麼黃清昊的《算法實戰高手課》就是從算法實踐開始,真正提升你的問題解決能力。
專欄主題是真實世界的算法、工程中的算法。主要分為基礎和實戰兩部分,共 6 個篇章:
學習工程中常用的基礎數據結構和算法思想,比如雙向鍊表、動態數組、哈希表、紅黑樹、二分搜索、深度優先搜索等,由淺入深,推演算法的來歷和特點,分析源碼實現思路,不止是了解算法知識,更要理解工業級的算法實現是如何運行在真實的物理機上的。
學習兩門非常重要的計算機基礎課——作業系統和計算機網絡中會用到的基礎算法,比如 LRU 內存置換算法、最短路算法,同樣會結合真實的網絡庫、作業系統的源碼進行講解,互相串聯,融會貫通,才能真正深入理解。
學習高流量、高並發、高可用的現代網際網路應用中各種算法的應用,解析 Redis、MySQL 或者MapReduce 等系統或者論文的經典源碼。深入理解各場景如何拆解問題、應用算法,升級編程思維,幫助你排查真實業務開發中的各種問題,做出良好的架構設計。
最後想跟大家說,其實糾結面試的算法值不值得學,是本末倒置了。
有句話說得好「程式設計師兩條腿,一條是算法,一條是英文,想跑的更遠,這兩條腿都不能弱」。英文,暫且不談,算法搞懂、學會、用得上,你才能走得遠。
就像左耳朵耗子說的「你得知道,技術不是用來寫 CRUD」的。