Java程序員---技能樹

計算機基礎:java

好比網絡相關的知識。git

        其中就包含了 TCP 協議,它和 UDP 的差別。須要理解 TCP 三次握手的含義,拆、粘包等問題。 程序員

        固然上層最多見的 HTTP 也須要了解,甚至是熟悉。github

        這塊推薦《圖解 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 等。
  • 最好能作一個實踐如:秒殺架構實踐

以前有開源一個分佈式相關解決組件:

github.com/crossoverJi…

同時推薦一本入門科普《大型網站技術架構》,出版時間有點早,從中能夠學習一些思路。

懂點架構

相信你們都有一個架構師的夢想。

架構師給人的感受就是畫畫圖紙,搭好架子,下面的人員來添磚加瓦最終產出。

但其實須要的內功也要很是深厚,就上面列舉的樣樣須要掌握,底層到操做系統、算法;上層到應用、框架都須要很是精通。(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 上,感興趣的朋友能夠自行查閱:

如何成爲一位「不那麼差」的程序員

 

相關文章
相關標籤/搜索