最近不少讀者加我探討了一些算法,Java 或如何看書等學習方面的困惑,我覺得這些都挺有共性的,所以就想着結合自己的經歷來談談有關學習的一些話題,希望能給讀者一些啟發。
提升自己的起點
先簡單介紹我自己,我大學是雙非普通一本,非科班出身,目前在某獨角獸公司擔任技術專家職位,相信大多數人的出身和我一樣,普通院線畢業,想渴望着能一步步走上技術專家乃至更高級別的職位,那既然是普通院校畢業,與那些 985 院校科班出身的同學相比本身就有天然的劣勢,所以我們就更要提升自己的起點了。
何謂提升自己的起點,比如對於技術人員來說搜索資料就應該用 Google, 而不是百度,查不到就去 Stackoverflow 提問,大部分資料用英文都能搜到,日積月累,你的英文水平就算再蹩腳也能完成華麗蛻變,為什么要強調英文水平呢,現在移動互聯網時代,各大主流平台 iOS, Android,甚至一些領先的框架如 Flutter 等全是國外出的,第一手資料全是英文的,所以如何用英文查資料,無壓力讀取英文官方文檔這是技術人的基本素質,再者就算是翻譯難免也有瑕疵,所以一定要持續提升自己的英文水平,堅決用 Google!
再比如大多數人學習可能主要通過各種博客來學,這樣確實可以學到不少東西,但是博客的問題是各種知識點比較散,而且多數是作者對知識的提煉和總結總結,總結的過程中可能省略了很多知識點,也漏掉了書中的一些精華,所以如果要提升自己,系統地構建自己的知識體系,一定要看書!看書確實是一件很費力地事,但長期來看,對你知識體系的構建大有裨益!看書一定要看好書,怎么去找好書呢,推薦大家看看圖靈社區(https://www.ituring.com.cn/),很多書都很經典,也可以去豆瓣上搜搜那些高分書籍,看看底下的評論到底好在哪,買東西我們都會貨比三家,更何況一本好書對你的成長大有裨益,所以值得你多花點心思來挑本好書!另外值得一提的是一開始很多人入門可能摸不着門道,這時候看視頻快速入門是沒問題的,但后期一定要回歸到書本的學習中來!看書是實現知識技能充分必要條件!
再舉個我自己的例子吧,目前我一直在運營着公號,堅持原創!一周至少發一篇精品文章,其實我也可以多多轉載下別人的文章多吸點粉,但我沒有這樣做,轉載只需要五分鍾,確實方便,但對我個人寫作能力地提升沒有任何幫助!所以我一直堅持着原創,努力地寫文章,這樣雖然很苦,但對自己寫作能力的提升,邏輯思維的構建長遠來看幫助很大!這就叫提升自己的起點。
提升自己的起點會帶來什么效果,這里給大家介紹一下復利曲線
前期的增長勢頭非常慢,但日積月累,到達某個拐點之后,增長就如火箭上升一般,勢不可擋,就像我另一個做公號的朋友 cxuan 一樣,前面幾十篇文章無人問津,最近寫得幾篇文章帶來的粉絲量突然爆發,其實也是因為之前的幾十篇文章給他帶來了足夠強的寫作能力,奠定了強大的寫作基礎,所以現在就像上面的后期的復利曲線一樣,勢不可擋。所以堅持提升自己的起點長期來看一定能給自己帶來足夠強的復利!
底層能力很重要
什么是底層能力,算法,數據結構,操作系統這些就屬於底層能力,這些為什么重要,這些是上層語言,工具的根基!這些屬於心法,內功,學好之后對你后期勢能的爆發大有裨益!內功很重要,工具不重要!不少人誤把工具用得熟練程序當作自己資本,甚至在 V 站上看到一個人對剛入職的同事不會用 git 而大加吐嘈,這是大錯特錯的,工具為什么不重要,想想楊過在武功大成后用玄鐵重劍和木劍對他來說差別大嗎,對於一個內功深厚的人來說,工具的掌握只要稍微看下文檔,Google 一下即可掌握,信手拈來!內功決定程序員的上限,而工具的掌握甚至連下限都不算,內功最重要。
再舉一個和大家工作息息相關的例子,曾經一個人來我司面試,我面了之后覺得不錯,但上司面試之后覺得人不夠聰明,所謂不夠聰明指的是給出一道相關設計題,在多方引導下仍然沒有思路,所以最后沒拿到 offer,所以大廠為什么喜歡考慮算法,我在之前的文章里也說過了,其實就是考你的構建模型,修改模型的能力,這樣是判斷一個人是否聰明的重要標准,所以掌握算法這些底層能力十分重要,算法的學習很枯燥。學習算法最好先掌握理論,掌握之后再去 leetcode 上多刷下題,學習算法理論建議大家可以學學極客時間上王爭老師的「數據結構與算法」教程,對每個點講得都很透徹!再結合吳師兄的動畫題解與自己的多加練習,相信大家掌握算法不成問題。
多讀源碼
要掌握好一個框架,學習它的底層原理,讀源碼是必不可少的,這樣才能在面對多個框架的選型時根據框架的優劣性做出取舍,同時多讀框架的源碼你還會對它底層的思想有更深刻的理解,能夠做到知其然,更能知其所以然,舉個簡單地例子,在 Java 中有一個 Arrays.sort 的方法可以對數組進行排序,一開始我以為是個簡單地快排,讀它的源碼之后才發現它雖然是用的快排,不過它用的是 dual-pivot 快排,這就讓我產生了深厚的興趣, 后來了解到這個 dual-pivot 快排比經典快排節省了 12% 的元素掃描,掃描元素的個數這種新的算法把內存的流量的因素考慮進去,比較適應新時代。看到一種框架可以不斷地引出新的知識點,深挖這些新知識點,這樣框架的優劣性也就吃透了。
曾經做 iOS 的時候國內優酷就有一個大神 ibireme 通讀各類框架源碼然后設計了 YYKit 等框架,引起轟動!甚至引來 Facebook 挖角,所以通讀框架源碼對於提升自己的能力非常有效!那怎么讀一個框架源碼呢,這又是一個大的話題,后面我會結合 HttpClient 的源碼閱讀來談談我的一些心得體會
以教為學
學完了某些知識點,怎么確定自己就掌握它了呢,可以試着把這些知識點寫成博客,在寫博客的過程中要反復思考這些知識點怎么讓小白也看得懂,如果寫出來之后小白也看懂了,那么基本可以肯定這些知識點可以算掌握了,同時在寫博客的過程中,如果有問題,讀者說不定也會幫你指出來,這樣對自己知識的盲點是個很好的補充,寫博客最好的時間是十年前,其次是現在!強烈建議讀者現在都開始寫博客,一方面是對自己知識體系的一個梳理,另一方面也能與讀者探討,一舉兩得!
談談 Java 學習
由於我的主業是 Java ,所以也有不少人來和我交流 Java 的學習,這里推薦幾本書吧
新手必備
1、《Java 核心技術:卷 1 基礎知識》
對於新手來說非常友好的一本技術書,也是 Sun 公司的官方用書,對 Java 的基礎有深入剖析,初學者必讀!
2、《Head first Java》
Head first 公司出品的書都非常耐讀, 這本書對 Java 的各種基本概念的講解非常到位,清晰易懂!推薦閱讀英文版哦,如果你英文不好,更要閱讀這本書了,還記得我們上文提得:請提升自己的起點嗎,剛好可以通過讀取這本書要慢慢地養成讀取英文書的習慣,技術書籍其實英文並不是很難,要多讀讀,養成讀取英文版書籍的習慣
進階
1、《深入理解 Java 虛擬機》
要進階一定要對垃圾回收原理, JVM 調優,字節碼,Java 線程模型有較清晰地認識,這本書可以說是這些補齊這些知識點的不二之選!精典書籍,誰看誰知道!
2、《Effective Java》
這樣書對如何寫好 Java 總結了很多有用的知識點,也是精典書籍了,必看
3、 《Java編程思想》
這本書可以說是 Java 編程的聖經了,要學好 Java 就繞不開本書,豆瓣評分 9.1 分,也是必看書籍,不過不推薦小白一開始就看這本書,建議還是先看完上述所說的新手必備書籍后並且閱讀一些框架的源碼或工作過一段時間后再看,對里面的知識點體會會更深
暫時就推薦這么多吧,其還有一些像《Java並發編程實戰》,netty 等書籍等進階到一定階段后其實也可以看看,不過這些都是后話了,大家啃完上面的幾本書對於再去學其他書問題不大。
身為 Java 后端開發,只了解 Java 就夠了嗎, 至少你要對網絡知識,MySql 這些也要做一定的了解吧,所以 《TCP/IP 詳解》《高性能 Mysql》也是你進階的不二書籍,至少要對 TCP 的慢啟動,擁塞機制有所了解,要知道索引到底是個東西,如何優化 Mysql 性能有一定的了解吧。可以先對后端工程師應該具備哪些能力畫出一個技能樹(如下圖),然后再對這個技能樹上的每個點再各個擊破!
再談學習
前面說了多次看書的好處,這里也推薦大家學習一下極客時間的教程,我基本上每出一個教程必買,有人會說,你看得過來嗎,其實我們都陷入了一個誤區,買這些教程一定要看完嗎,其實只要它的的某個知識點能幫助到你,你就賺了!能完整地看完當然更好,但如果暫時沒時間,可以利用碎片化時間選擇對自己有幫助的點先學習啊!很多面不都是由這些點一個個組成的嗎,將這些點串聯起來,這樣就能逐步構建自己的知識體系和學習框架。
最后
前面談了很多學習方面的一些個人體會,這只是我個人的一些學習感悟,希望對大家有幫助,最后歡迎關注公眾號「碼海」一起交流哦
