前言
已經記不清有多少讀者問過:
博主,你是怎麼學習的?像我這樣的情況有啥好的建議嘛?
也不知道啥時候我居然成人生導師了。當然我不排斥這些問題,和大家交流都是學習的過程。
因此也許諾會準備一篇關於學習方面的文章;所以本文其實準備了很久,篇幅較長,大家耐心看完希望能有收穫。
以下內容僅代表我從業以來所積累的相關經驗,我會從硬技能、軟實力這些方面儘量闡述我所認為的
“不那麼差的程式設計師”
應當做到哪些技能。
技能樹
作為一名碼程式碼的技術工人,怎麼說乾的還是技術活。
既然是技術活那專業實力就得過硬,下面我會按照相關類別談談我們應該掌握哪些。
計算機基礎
一名和電腦打交道的工種,計算機是我們賴以生存的工具。所以一些基礎技能是我們應該和必須掌握的。
比如網路相關的知識。
其中就包含了 TCP 協議,它和 UDP 的差異。需要理解 TCP 三次握手的含義,拆、粘包等問題。
當然上層最常見的 HTTP 也需要了解,甚至是熟悉。
這塊推薦《圖解 HTTP》一書。
接著是作業系統相關知識。
由於工作後你寫的大部分程式碼都是執行在 Linux 伺服器上,所以對於這個看它臉色行事主你也得熟悉才行。
比如程式、執行緒、記憶體等概念;伺服器常見的命令使用,這個沒啥竅門就是得平時多敲敲多總結。
我也是之前兼職了半年運維才算是對這一塊比較熟悉。
Linux 這個自然是推薦業界非常出名的《鳥哥的 Linux 私房菜》。
當作為一個初學者學習這些東西時肯定會覺得枯燥乏味,大學一般在講專業課之前都會有這些基礎學科。我相信大部分同學應該都沒怎麼仔細聽講,因為確實這些東西就算是學會了記熟了也沒有太多直接的激勵。
但當你工作幾年之後會發現,只要你還在做計算機相關的工作,這些都是繞不開的,當哪天這些知識不經意的幫助到你時你會慶幸當初正確的選擇。
資料結構與演算法
接下來會談到另一門枯燥的課程:資料結構。
這塊當初在大學時也是最不受待見的一門課程,也是我唯一掛過的科目。
記得當時每次上課老師就讓大家用 C 語言練習書上的習題,看著一個個拆開都認識的字母組合在一起就六親不認我果斷選擇了放棄。
這也造成現在的我每隔一段時間就要看二叉樹、紅黑樹、棧、佇列等知識,加深印象。
演算法這個東西我確實沒有啥發言權,之前堅持刷了部分 LeetCode 的題目也大多停留在初中級。
但像基本的查詢、排序演算法我覺得還是要會的,不一定要手寫出來但要理解其思路。
所以強烈建議還在大學同學們積極參與一些 ACM 比賽,絕對是今後的加分利器。
這一塊內容可能會在應屆生校招時發揮較大作用,在工作中如果你的本職工作是 Java Web
開發的話,這一塊涉獵的機率還是比較低。
不過一旦你接觸到了模型設計、中介軟體、高效儲存、查詢等內容這些也是繞不過的坎。
這塊內容和上面的計算機基礎差不多,對於我們 Java 開發來說我覺得平時除了多刷刷 LeetCode 加深印象之外,在日常開發中每選擇一個容器存放資料時想想為什麼選它?有沒有更好的儲存方式?寫入、查詢效率如何?
同樣的堅持下去,今後肯定收貨頗豐。
同時推薦《演算法(第4版)》
Java 基礎
這裡大部分的讀者都是 Java 相關,所以這個強相關的技能非常重要。
Java 基礎則是走向 Java 高階的必經之路。
這裡拋開基本語法不談,重點討論實際工作中高頻次的東西。
- 基本容器,如:HashMap、ArrayList、HashSet、LinkedList 等,不但要會用還得了解其中的原理。這樣才能在不同的場景選擇最優的設計。
- IO、NIO 也是需要掌握。日常開發中大部分是在和磁碟、網路(寫日誌、資料庫、Redis)打交道,這些都是 IO 的過程。
- 常見的設計模式如:代理、工廠、回撥、構建者模式,這對開發靈活、擴充套件性強的應用有很大幫助。
- Java 多執行緒是非常重要的特性,日常開發很多。能理解執行緒模型、多執行緒優缺點、以及如何避免。
- 良好的單測習慣,很多人覺得寫單測浪費時間沒有意義。但正是有了單測可以提前暴露出許多問題,減少測試返工機率,提高程式碼質量。
- 良好的程式設計規範,這個可以參考《阿里巴巴 Java 開發手冊》以及在它基礎上優化的《唯品會 Java 手冊》
《Java核心技術·卷 I》值得推薦。
多執行緒應用
有了紮實的基礎之後來談談多執行緒、併發相關的內容。
想讓自己的 title 里加上“高階”兩字肯定得經過併發的洗禮。
這裡談論的併發主要是指單應用裡的場景,多應用的可以看後文的分散式內容。
多執行緒的出現主要是為了提高 CPU 的利用率、任務的執行效率。但並不是用了多執行緒就一定能達到這樣的效果,因為它同時也帶來了一些問題:
- 上下文切換
- 共享資源
- 可見性、原子性、有序性等。
一旦使用了多執行緒那肯定會比單執行緒的程式要變得複雜和不可控,甚至使用不當還會比單執行緒慢。所以要考慮清楚是否真的需要多執行緒。
會用了之後也要考慮為啥多執行緒會出現那樣的問題,這時就需要理解記憶體模型、可見性之類的知識點。
同樣的解決方式又有哪些?各自的優缺點也需要掌握。
談到多執行緒就不得不提併發包下面的內容 java.util.concurrent
。
最常用及需要掌握的有:
- 原子類:用於併發場景的原子操作。
- 佇列。常用於解耦,需要了解其實現原理。
- 併發工具,如 ConcurrentHashMap、CountDownLatch 之類的工具使用以及原理。
- 執行緒池使用,以及相關原理。
- 鎖相關內容:synchronized、ReentrantLock 的使用及原理。
這一塊的內容可以然我們知道寫 JDK 大牛處理併發的思路,對我們自己編寫高質量的多執行緒程式也有很多幫助。
推薦《Java 併發程式設計的藝術》很好的併發入門書籍。
JVM 虛擬機器
想要深入 Java ,JVM 是不可或缺的。對於大部分工作 1~3 年的開發者來說直接接觸這一些內容是比較少的。
到了 3~5 年這個階段就必須得了解了,以下內容我覺得是必須要掌握的:
- JVM 記憶體劃分,知道哪塊記憶體存放哪些內容;執行緒安全與否;記憶體不夠怎麼處理等。
- 不同情況的記憶體溢位、棧溢位,以及定位解決方案。
- 分代的垃圾回收策略。
- 線上問題定位及相關解決方案。
- 一個類的載入、建立物件、垃圾回收、類解除安裝的整個過程。
掌握這些內容真的對實際分析問題起到巨大幫助。
對此強力推薦《深入理解Java虛擬機器》,這本書反反覆覆看過好幾遍,每個階段閱讀都有不同的收穫。
資料庫
做 WEB 應用開發的同學肯定要和資料庫打不少交道,而且通常來說一個系統最先出現瓶頸往往都是資料庫,說資料庫是壓到系統的最後一根稻草一點也不為過。
所以對資料庫的掌握也是非常有必要。拿網際網路用的較多的 MySQL 資料庫為例,一些必須掌握的知識點:
- 索引的資料結構及原理、哪些欄位應當建立索引。
- 針對於一個慢 SQL 的優化思路。
- 資料庫水平垂直拆分的方案,需要了解業界常用的 MyCAT、sharding-sphere 等中介軟體。
常規使用可以參考《阿里巴巴 Java 開發手冊》中的資料庫章節,想要深入瞭解 MySQL 那肯定得推薦經典的《高效能 MySQL》一書了。
分散式技術
隨著網際網路的發展,傳統的單體應用越來越不適合現有場景。
因此分散式技術出現了,這塊涵蓋的內容太多了,經驗有限只能列舉我日常使用到的一些內容:
- 首先是一些基礎理論如:CAP 定理,知道分散式系統會帶來的一些問題以及各個應用權衡的方式。
- 瞭解近些年大熱的微服務相關定義、來源以及對比,有條件的可以閱讀
martin fowler
的原文 Microservices,或者也可以搜尋相關的國內翻譯。 - 對 Dubbo、SpringCloud 等分散式框架的使用,最好是要了解原理。
- 接著要對分散式帶來的問題提出解決方案。如分散式鎖、分散式限流、分散式事務、分散式快取、分散式 ID、訊息中介軟體等。
- 也要了解一些分散式中的負載演算法:權重、Hash、一致性 Hash、故障轉移、LRU 等。
- 最好能做一個實踐如:秒殺架構實踐
之前有開源一個分散式相關解決元件:
同時推薦一本入門科普《大型網站技術架構》,出版時間有點早,從中可以學習一些思路。
懂點架構
相信大家都有一個架構師的夢想。
架構師給人的感覺就是畫畫圖紙,搭好架子,下面的人員來添磚加瓦最終產出。
但其實需要的內功也要非常深厚,就上面列舉的樣樣需要掌握,底層到作業系統、演算法;上層到應用、框架都需要非常精通。(PPT 架構師除外)
我自身參與架構經驗也不多,所以只能提供有限的建議。
首先分散式肯定得掌握,畢竟現在大部分的架構都是基於分散式的。
這其中就得根據 CAP 理論結合專案情況來選擇一致性還是可用性,同時如何做好適合現有團隊的技術選型。
這裡推薦下開濤老師的《億級流量網站架構核心技術》,列舉了很多架構例項,不過網上褒貶不一,但對於剛入門架構的能科普不少知識。
如何學習
談完了技能樹,現在來聊聊如何學習,這也是被問的最多的一個話題。
而關於學習討論的最多的也是看視訊還是看書?
視訊
不得不承認視訊是獲取知識最便捷的來源,畢竟包含了圖、文、聲。
大學幾年時間其實我也沒好好上專業課,我記得真正入門 Java 還是一個暑假花了兩個月的時間天天在家裡看 ”馬士兵“ 老師的視訊教程,當時的資源也很老了,記得好像是 07 年出的視訊(用的還是 Google )。
那段時間早起晚睡,每天學到東西之後馬上實踐,心裡也很有成就感。後來開學之後一度成為同學們眼中的”學霸“人物。
現在開啟我 12 年的電腦,硬碟裡還躺著好幾十 G 的教學視訊。
看書
工作後時間真的很寶貴,完全沒有了學生生涯的想學就學的自由。所以現在我主要知識來源還是書籍。
這些是我最近看的書:
看書又會涉及到電子書和紙質書的區別,我個人比較喜歡紙質書。畢竟我可以方便的記筆記以及可以隨時切換章節。最主要的還是從小養成的聞書香的習慣。
知識付費
近幾年知識付費越來越流行,許多大佬也加入了這個行列,人們也逐漸在習慣為知識去付費。
說實話寫一好篇文章出一份視訊都非常不容易,能有正向的激勵,作者才能持續輸出更好的內容。
這塊我覺得國內做的比較好我也為之付費的有極客時間、大佬的知識星球等。
這三點沒有絕對的好壞之分,其實可以看出我剛入門的時候看視訊,工作之後看書及知識付費內容。
視訊的好處是可以跟著裡面老師的思路一步一步往下走,比較有音視訊代入感強,就像學校老師講課一樣。
但由於內容較長使讀者沒法知曉其中的重點,甚至都不敢快進生怕錯過了哪個重要知識,現在由於 IT 越來越火,網上的視訊也很多導致質量參差不齊也不成體系。
而看書可以選擇性的瀏覽自己感興趣的章節,費解的內容也方便反覆閱讀
所以建議剛入門的同學可以看看視訊跟著學,參與工作一段時間後可以嘗試多看看書。
當然這不是絕對的,找到適合自己的學習方式就好。但不管是視訊還是看書都要多做多實踐。
打造個人品牌
個人品牌看似很程式設計師這個職業不怎麼沾邊,但在現今的網際網路時代對於每個人來說都很重要。
以往我們在寫簡歷或是評估他人簡歷的時候往往不會想到去網路搜尋他的個人資訊,但在這個資訊爆炸的時代你在網上留下的一點印記都能被發現。
部落格
因此我們需要維護好自己的名片,比如先搭建自己的個人部落格。
部落格的好處我也談過幾次了,前期關注人少沒關係,重要的是堅持,當你寫到 50、100篇文章後你會發現自己在這過程中一定是的到了提高。
GitHub
第二點就和技術人比較相關了:參與維護好自己的 GitHub。
由於 GitHub 的特殊屬性,維護好後可以更好的打造個人品牌。
Talk is cheap. Show me the code
可不是隨便說說的。
想要維護好可以從幾個方面著手:
- 參與他人的專案,不管是程式碼庫還是知識庫都可以,先融入進社群。
- 發起自己的開源專案,不管是平時開發過程中的小痛點,還是精心整理的知識點都可以。
但這過程中有幾點還是要注意:
- 我們需要遵守 GitHub 的社交禮儀。能用英文儘量就用英文,特別是在國外廠庫中。
- 儘量少 push 一些與程式碼工作無關的內容,我認為這並不能提高自己的品牌。
別去刷 star
。這也是近期才流行起來,不知道為什麼總有一些人會鑽這種空子,刷起來的熱度對自己並沒有任何提高。
這裡有一篇國外大佬寫的 How to build your personal brand as a new developer
:
medium.freecodecamp.org/building-yo…
English 挺重要
再來談談英語的重要性,我記得剛上大學時老師以及一些培訓機構都會說:
別怕自己英語差就學不了程式設計,真正常用的就那些詞語。
這句話雖沒錯,但英語在對 IT 這行來說還是有著極大的加分能力。
拿常見的 JDK 裡的原始碼註釋也是純英文的,如果英語還不錯的話,一些 Spring 的東西完全可以自學,直接去 Spring 官網就可以檢視,甚至後面出的 SpringCloud,官方資料就是最好的教程。
再有就是平時查資料時,有條件的可以嘗試用 Google + 英文
搜尋,你會發現新的世界。
不然也不會有面向 Google/Stack Overflow
程式設計。
對於英語好的同學自然不怕,那不怎麼好的咋辦呢?
比如我,但我在堅持以下幾點:
- 所有的手機、電腦系統統統換成英語語言,養成習慣(不過也有尷尬的連選單都找不到的情況)。
- 訂閱一些英語週刊,比如 ”灣區日報“。
- 定期去類似於 medium.com/ 這樣具有影響力的國外社群閱讀文章。
雖然現在我也談不上多好,但目前我也在努力,希望大家也一起堅持。
推薦一本近期在看的書《程式設計師的英語》。
保持競爭力
技術這個行業發展迅速、變化太快,每年也都有無數相關行業畢業生加入競爭,稍不留神就會被趕上甚至超越。
所以我們無時無刻都得保持競爭力。
多的談不上,我只能談下目前我在做的事情:
- 打好基礎。不是學了之後就忘了,需要不停的去看,鞏固,基礎是萬變不離其宗的。
- 多看原始碼,瞭解原理,不要停留在調參俠的境界。
- 關注行業發展、新技術、新動態至少不能落伍了。
- 爭取每週產出一篇技術相關文章。
- 積極參與開源專案。
思維導圖
結合上文產出了一個思維導圖更直觀些。
總結
本文結合了自身的一些經驗列舉了一些方法,不一定對每位都有效需要自行判斷。
也反反覆覆寫了差不多一週的時間,希望對在這條路上和正在路上的朋友們起到一些作用。
大部分都只是談了個思路,其實每一項單聊都能寫很多。每個點都有推薦一本書籍,有更好建議歡迎留言討論。
上文大部分的知識點都有維護在 GitHub 上,感興趣的朋友可以自行查閱:
你的點贊與轉發是最大的支援。