1. 程式人生 > 實用技巧 >史上最全的Java高階技術點,全是Java高階進階技術,幾乎包含了Java後端的所有知識點 架構

史上最全的Java高階技術點,全是Java高階進階技術,幾乎包含了Java後端的所有知識點 架構

你可能有所感悟。零散的資料讀了很多,但是很難有提升。到處是乾貨,但是並沒什麼用,簡單來說就是缺乏系統化。另外,噪音太多,雷同的框架一大把,我不至於全都要去學了吧。

這裡,根據基礎、Java基礎、Java進階給分了下類,挑的也都是最常用最重要的工具。

基礎知識

資料結構

基本的資料結構是非常重要的,無論接觸什麼程式語言,這些基本資料結構都是首先要掌握的。具體的實現,就體現在java的集合類中。這些資料結構,就是這些複雜工具的具體原始形態,要爛記於心。

常用演算法

演算法是某些大廠的門檻。毫無疑問,某些參加過ACM的應屆生,能夠秒殺大多數工作多年的碼農。演算法能夠培養邏輯思維能力和動手能力,在剛參加工作的前幾年,是非常大的加分項。但隨著工作年限的增加,它的比重在能力體系中的比重,會慢慢降低。

演算法的學習方式就是通過不斷的練習與重複。不精此道的同學,永遠不要試圖解決一個沒見過的問題。一些問題的最優解,可能耗費了某個博士畢生的精力,你需要的就是理解記憶以及舉一反三。最快的進階途徑就是刷leetcode。

對於普通研發,排序演算法和時間複雜度是必須要掌握的,也是工作和麵試中最常用的。時間充裕,也可涉獵動態規劃、揹包等較高階的演算法知識,就是下圖的左列。

書籍

《演算法導論》
《程式設計之美》
《數學之美》

資料庫基礎 MySQL

MySQL是應用最廣的關係型資料庫。除了瞭解基本的使用和建模,一些稍底層的知識也是必要的。

MySQL有儲存引擎的區別。InnoDB和MyISAM是最常用的,優缺點應該明曉。ACID是關係型資料庫的基本屬性,需要了解背後的事務隔離級別。髒讀、幻讀問題的產生原因也要了解。

為了加快查詢速度,索引是資料庫中非常重要的一個結構,B+樹是最常用的索引結構。因字符集的問題,亂碼問題也是經常被提及的。

專業的DBA通常能幫你解決一些規範和效能問題,但並不總是有DBA,很多事情需要後端自己動手。

書籍

《MySQL技術內幕——InnoDB儲存引擎》
《高效能MySQL》
《高可用MySQL》

網路基礎

網路通訊是網際網路時代最有魅力的一個特點,可以說我們的工作和生活,每時每刻都在和它打交道。

連線的三次握手和四次揮手,至今還有很多人非常模糊。造成的後果就是對網路連線處於的狀態不慎瞭解,程式在效能和健壯性上大打折扣。

HTTP是使用最廣泛的協議,通常都會要求對其有較深入的瞭解。對於Java來說,熟悉Netty開發是入門網路開發的捷徑。

爬蟲是網路開發中另外一個極具魅力的點,但建議使用python而不是java去做。

書籍

《HTTP權威指南》
《TCP/IP詳解 卷一》

作業系統 Linux

科班出身的都學過《計算機組成機構》這門課,這非常重要,但很枯燥。結合Linux理解會直觀的多。鑑於目前大多數伺服器環境都是Linux,提前接觸能夠相輔相成。

需要搞清楚CPU、記憶體、網路、I/O裝置之間的互動和速度差別。對於計算密集型應用,就需要關注程式執行的效率;對於I/O密集型,要關注程序(執行緒)之間的切換以及I/O裝置的優化以及排程。這部分知識是開發一些高效能高可靠中介軟體的前提,無法繞過。

對於Linux,首先應該掌握的就是日常運維,包括常用命令的使用和軟體安裝配置。正則也是必須要掌握的一個知識點。

指令碼程式設計對後端來說是一個非常大的加分項。它不僅能增加開發效率,也能在一些突發問題上使你遊刃有餘。

書籍

《UNIX環境高階程式設計(第3版)》
《鳥哥的Linux私房菜》
《Linux核心設計與實現》
《Linux命令列大全》

相關文章

《Linux上,最常用的一批命令解析(10年精選)》

Java基礎

JVM

Java程式設計師的最愛和噩夢。以oracle版本為準,各個jvm版本之間有差別。JVM的知識包含兩方面。一個是儲存級別的,一個是執行級別的。

以儲存為例,又分為堆內的和堆外的兩種,各有千秋。垃圾回收器就是針對堆內記憶體設計的,目前最常用的有CMS和G1。JVM有非常豐富的配置引數來控制這個過程。在位元組碼層面,會有鎖升級以及記憶體屏障一類的知識,並通過JIT編譯來增加執行速度。

JVM還有一個記憶體模型JMM,用來協調多執行緒的併發訪問。JVM的spec非常龐大,但面試經常提及。

另外,jdk還提供了一系列工具來窺探這些資訊。包含jstat,jmap,jstack,jvisualvm等,都是最常用的。

書籍

《深入理解Java虛擬機器》

JDK

現在,終於到了java程式設計師的核心了:JDK,一套依據jvm規範實現的一套API。我們平常的工作,就是組合這些API,來控制程式的行為。

jdk的程式碼非常龐大,內容也非常繁雜。最重要的大體包括:集合、多執行緒、NIO、反射、檔案操作、Lambda語法等。這部分內容加上下面的SSM,基本上就是大多數小夥伴玩耍的地方。

假如說資料結構和演算法是理論,這裡就是支撐理論的實現。Java玩的好不好,就是說這裡。

書籍

《Effective Java 中文版》
《資料結構與演算法分析:Java語言描述》

SSM

你可能會用SSM開發專案,覺得程式設計無非就這些東西。設計模式爛記於心,IOC、AOP手到擒來。這裡集中了大部分同行,有些可能到此為止就Ok了,因為有些同學接下來的重點是專案管理,而不是技術。

SSM最擅長的是Web開發。目前的表現形式逐漸多樣化,隨著前後端分離的盛行,Restful這種有著明確語義的模式逐漸流行。

書籍

《Head First 設計模式》
《Spring揭祕》
《SpringBoot揭祕》
《MyBatis技術內幕》
《深入剖析Tomcat》

其實跟著文件走一遍就行了,很多書籍就是翻譯而已。

併發程式設計

現在的伺服器都是多核的了,併發程式設計也來越多。java有多種建立多執行緒的方式,不過目前使用執行緒池的多一些。執行緒池的基礎就是AQS,基於AQS,又有很多的工具類擴充套件。

java同時有很多加鎖和執行緒同步的方式,鎖有樂觀鎖/悲觀鎖之分,又有公平鎖/非公平鎖之分,寫一段死鎖程式碼還是有點難度的。

有兩個問題被考察的頻率非常高,一個是ABA,一個是偽共享。併發程式設計一般和網路程式設計配對,提供對某個問題的一系列解決方案。

這是java中一塊難啃的骨頭。

書籍

《Java核心技術系列:Java多執行緒程式設計核心技術》
《Java效能權威指南》
《Java併發程式設計實戰》

效能優化 & 故障排查

有人認為這應該是SRE的範疇,但通常最熟悉業務的卻是開發,技術並沒有什麼明顯的界限。掌握這些內容,會讓你在芸芸大眾中脫穎而出。

從作業系統的核心優化到資料庫的索引和事務優化,這部分的技能是建立在牢固的基礎之上的。也就是作業系統的基礎。

作業系統的每個元件都有可能出現問題,對於一個java後端來說,要能夠非常容易的定位到這些問題。比如常見的記憶體溢位問題。

書籍

《效能之巔:洞悉系統、企業與雲端計算》
《高效能Linux伺服器構建實戰》

Java進階

下面有些知識點,界限是非常模糊的。它們你中有我,我中有你,可以說是一個整體。

Redis

快取可以說是計算機系統中應用最廣泛的技術了。對於分散式快取來說,最常用的就是Redis了。由於其資料結構豐富,被應用的場景越來越多。

基本的5種資料型別都知道,但你要說出其他幾種,給人的印象就不一樣了。Redis有主從和Cluster兩種叢集模式,高可用配置也不相同。

Redis幾乎能適應除搜尋外的所有網際網路業務,對於其使用來說,一些規範限制是非常有必要的。一般速度越快的系統,越容易被長尾操作給拖死。所以,對於info命令的內容,也應有了解。

有三個點要尤其注意:分散式鎖、限流,以及和源資料的同步問題。

書籍

《Redis實戰 》
《Redis開發與運維》
《Redis設計與實現》

相關文章

《這可能是最中肯的Redis規範了》

Kafka

MQ是分散式系統中非常重要的元件,目前使用最廣泛的就是Kafka。除了用在大資料場景中,Kafka也能夠在業務系統中使用。

Kafka的速度非常快,根據ACK的級別配置,可靠性會增加,但速度會減緩。對於訊息系統來說,監控報警是非常重要的一環,能夠提前預知系統的問題。Kafka的叢集自身就是高可用的,依賴Zookeeper元件,瞭解一些基本概念,包括ISR,能夠更加詳細的瞭解這個過程。

書籍

《Kafka入門與實踐》
《Kafka技術內幕》

相關文章

《Kafka基礎知識索引》

分庫分表 ShardingJDBC

隨著資料的增長,MySQL本身出現了瓶頸。分庫分表是針對關係型資料庫的一套解決方案,把它改造成分散式資料庫。

根據切分層次,最像回事的是在代理層和驅動層進行切入。ShardingJDBC就是在驅動層的一個元件。

元件本身只是一個問題。在真正的切分之前,會有垂直拆分和水平拆分之分。我們的線上業務也要不停機的進行拆分和切換,一個全量和增量同步工具都是需要的。

有條件經歷這個過程的,都是一筆寶貴的財富。它不僅在技術上,而且在流程上都有諸多挑戰。你會體驗到技術、流程、管理,是不分家的。

相關文章

《“分庫分表" ?選型和流程要慎重,否則會失控》

微服務 & 中介軟體

目前最火的微服務架構就是SpringCloud。這對熟悉SSM開發的同學來說, 是非常容易上手的。微服務有註冊中心、RPC、負載均衡、熔斷限流、閘道器等關鍵元件,有些元件有很多不同的替代品。

微服務拆分後又引申出一些列問題,需要一些其他中介軟體支援。比如監控報警、ELKB、配置中心、排程中心、呼叫鏈等。雖然沒有微服務也需要它們,但明顯組合起來,效果會好的多。 各種A/B測試,金絲雀,灰度等,基本是終極目標之一。
微服務是一個複雜的整體,同時融合了技術和流程管理方面的內容。

書籍

《可伸縮服務架構:框架與中介軟體》
《Spring Cloud與Docker微服務架構實戰》
《架構修煉之道》

分散式

當伺服器數量增加,一些服務,包括上面提到的微服務,都需要進行協調和互動。這就是分散式系統。

分散式的理論基礎有CAP、BASE等。針對一致性,有特別多的演算法,其中Raft作為易懂的新貴,使用越來越廣泛。

這部分側重於理論,一旦開始進入實踐,寫出來的都是些大傢伙。這裡有一篇文章,雖然不是很全,聊表心意吧。

相關文章

《也淺談下分散式儲存要點》

書籍

《NoSQL精粹》
《ZooKeeper:分散式過程協同技術詳解》
《從Paxos到Zookeeper分散式一致性原理與實踐》

支撐技術

基本運維

我傾向於基礎架構和運維不分家,因為它們有太多重合和相似的地方。基本運維和架構配合起來,典型的特點就是平臺化+規範化。

這裡是檢驗綜合素質的地方,有廣度也有深度。

相關文章

《這麼多監控元件,總有一款適合你》

書籍

《奔跑吧Ansible》
《Docker——容器與容器雲》
《Kubernetes權威指南》
《Jenkins權威指南》
《深入理解Nginx》

安全

安全無小事,建築工地和系統安全一樣的道理。熟悉一些常用的攻擊和加密解密演算法是必要的。

就像是你給家裡的門上鎖:能夠阻擋大部分心懷不軌的人,但無法阻擋無所顧忌的暴徒。

End

你可能發現並沒有自己關注的元件。這不奇怪,比如個人喜歡的的ES,就找不到一個合適的位置。這裡只是最主要的一點內容,就已顯繁雜,一個大雜燴並不見得好。

值得提醒的是,這些知識,是眾多發展路線上的一個分支。可能有的朋友,目前只在其中的一個點上面奮鬥,缺乏所謂的廣度;也可能有的朋友,有著全棧的標籤,卻做著SSM的工作。不同的公司需要的技術水平不盡相同。一個專注ERP業務的公司,會在專案管理上多些文章;一個專做IM的團隊,可能對網路開發滾瓜爛熟。