天天看點

成長為軟體教練的三千大道之一

摘要:本文主要介紹的是沿Java,分布式微服務架構,大資料與流計算,Linux OS與中間件,AI,這樣一套功法,來讨論從一個剛畢業的理科生,如何修煉到軟體教練這個層次。以及對更高層境界的暢想。

師傅領進門,修行在個人。我在本文中隻指出道路,相當于一次将全套功法給你。但修行的路還請自己努力。不明白的地方,Google是個金手指。我會看大家對具體哪裡更感興趣,後續将其展開講一下,作為一個系列。大家可以留言給我。

首先第一階段,對應煉氣期。你要掌握:

1、 Java:俗稱JAVASE。不僅僅指Java文法,還包括JDK的使用。這塊知識非常沉重也非常重要。沉下心花幾年時間學好它。推薦學習方式:

a) 《Effective Java》。讓你感受下Java裡面的彎彎繞繞,并不是文法表現的那樣傻白甜。

b) SCJP考試。現在可能改名為OCJP了也說不定。全方位讓你了解Java及裡面的細節。非常重要。

c) 《并發程式設計實踐》。必讀刊物。多核CPU自帶L2 cache卻共享記憶體和線程,複雜的鎖,一行Java代碼被編譯為多行機器指令而CPU在任意機器指令間都可切換線程。面對這麼複雜的硬體環境,Java是如何設計保證程式正确的。

2、靈活開發:靈活開發不是靠書學的(雖然也有書),而是靠實踐來感悟的。就像賣油翁,不去倒油光靠看老翁寫的心得,永遠不會倒油。

3、算法與資料結構:

a) Leetcode刷題。雖然隻有極少的開發會用到算法,但這是能力的展現。不要以為就是個連結清單反轉,至少要把動态規劃級别的算法搞懂。

b) 《算法導論》。讀讀就行了。希望你能讀懂。

4、測試:要了解測試同學如何寫測試用例,如何保障code coverage,如何做自動化。

當上面了解的七七八八後,你自然而然就會産生心靈上的感悟進而進階至築基期。你要掌握:

1、設計模式:《設計模式》,Gang Of Four。四杆老槍的設計模式,教會你面對各種經典場景如何構造類群。

2、JVM原理:《深入了解Java虛拟機》。我剛工作時,大概06年,如果那時候有人說對JVM原理很懂,那就屬于國内頂尖的技術人才了。現在知識的擷取方式越來越友善了,比如閱讀本文。你需要了解JVM如何使用記憶體,如何GC,如何調整啟動參數,如何檢視各種dump檔案等等。

3、網絡程式設計:書籍暫時沒有推薦。反正就是要搞懂HTTP/WebSocket與TCPIP與Socket的關系等知識。

4、分布式系統中各種中間件:

a) Dubbo。國内最知名開源項目。無中心化分布式架構的核心。取代了IBM的SOA産品(中心化架構造成性能瓶頸)。

b) ZooKeeper。Zookeeper小紅書。分布式系統資料一緻性協調工具。單機程序,代碼執行被認為是完全可靠的,要麼執行成功要麼執行失敗。而到分布式系統,網絡調用偏多出來一個逾時。分布式系統之是以比單程序複雜那麼那麼多,都是這獨獨一個逾時鬧的。了解CAP,了解分布式系統資料一緻性,是分布式系統不出錯的保障。你從來沒看見銀行轉賬時給你少轉過一分錢吧?

c) Kafka。《Kafka權威指南》。要了解其為什麼那麼快又那麼可靠又那麼存儲空間大。同時也是了解幂等性最友善的系統。

d) Redis。《Redis設計與實作》。了解了前述的知識,Redis就是個菜。無非多了個流言協定,一緻性哈希環,跳躍表,哨兵,持久化方式而已。

e) MySQL(假裝其也是中間件好了)。《MySQL高性能》,《MySQL技術内幕:InnoDB存儲引擎》。要了解紅黑樹和索引的實作方式,了解innodb存儲引擎的工作原理,你才能更好的了解explain sql後出來的各種回顯結果,幫助你更好調優sql。MyISAM被廢棄了,你可以少看一本書了,偷着樂吧,少年。

f) Nginx。之是以能有多個幂等節點存在,就全靠它了。學一下它的單線程技術。明明是單線程卻能做到高性能。“我就是看不上你多線程,咋啦?”唯有真正了解計算機原理才能返璞歸真。

g) Netty。《Netty權威指南》。你有沒有感覺到在2002年後的某一年,就在短短一兩年内,計算機網絡突然提速了?02年JDK1.4,04年Netty。本來計算機網絡性能被阻塞在IO上。但NIO大幅度提升了IO效率。Go語言為什麼曾那麼火?它的MPG模型還是找的IO阻塞的茬,使得多線程并發會更快。學一下Linux IO模型,零拷貝技術。了解計算機原理才能做到真正性能優化。我猜測,在JDK支援了NIO之後,Tomcat等web容器很快就進行了IO子產品的更新,之後各大網站的Tomcat跟着更新,于是在全世界硬體資源沒變的情況下,網絡站點伺服器的并發響應能力大幅提升。順便說一句為什麼Java語言會長盛不衰。因為任何新語言的特性,比如Go的MPG模型,Reactive模式等,很快就會被Java抄過來。Java已有AKKA并成功用于Flink等知名項目了。而Go想抄Java的好處,短時間很難達成。

h) Flume。一個日志收集傳輸系統。

i) ProtoBuf。序列化也是性能中需要重要關注的地方。

j) Tomcat。太有名了。學學其classloader的設計。

5、JAVAEE依然有用的知識:比如servlet,JMX等。哎,一個時代的落幕。

6、編譯原理與作業系統:我假設你上大學時候就學過了。沒有的話,至少作業系統要讀一下。就讀清華大學的大學教材吧。

7、分布式資料庫體系架構:第4條講的是記憶體網絡的分布式架構。這條要講持久化存儲的分布式架構。分庫分表,異構索引,資料庫主備等。《資料密集型系統設計》,這本書很贊,堪稱存儲設計的通史。

8、Spirng and Mybatis:怎麼說呢,你能讀懂源代碼當然更好。

9、前端與CDN:至少要了解一下。

10、UML模組化:教會你如何認識世界并轉到計算機系統裡來。《UML使用者指南》。

上個境界,是最難晉升的了。多少開發們被阻在這步一輩子不得前進了。因為既要承擔繁重的開發任務,又要學習那麼多的知識,還要處理個人的生活,太難了。這些知識對你的提升又隻是相加,不是相乘的關系。熬過去後海闊天空。好了你現在是金丹期了,你的很多要繼續學的知識,都是靠前面給你打基礎的,你會發現你的提升曲線斜率越來越抖了。你要掌握:

1、架構設計方法論:做事要有章法。《軟體架構設計》。

2、領域驅動設計:軟體是真實世界在計算機中的虛拟映射。如何讓軟體更貼近真實世界,讀一下Eric Evans的《領域驅動設計》。很晦澀,不太容易懂。

3、中台:中台這個詞現在這麼火,怎能不提一下。平台是啥也許你還不清楚,那就先了解一下中台。

4、高性能調優:還是那句話,真正了解計算機及runtime的本質,才能做到性能調優或Hacker。《性能之巅》。

5、穩定性建設:湊合看《逆流而上》。但是穩定性和上述的性能調優,是真正展現水準的地方。還有Google的《Google SRE》。

6、兩地三中心容災系統建設:這個目前我還不清楚有什麼書。如果确實沒有的話,可以趁機出一本搶占市場。

7、全鍊路壓測:又是測試。但又不僅僅是測試。對系統的性能瓶頸節點的探查,對系統QPS的掌控。單單一個起壓機就不容易設計。

8、大資料:首先,你需要跨多個領域開始了解更多的知識。其次,你會發現我對技術的介紹粒度開始越來越粗了。因為你之前打的基礎 - 粗粒度之下用來支撐的細粒度知識,已經生效了。再然後就是我會減少推薦書籍。到了這裡你應該形成自己的知識體系了,也就會找書了。離線海量資料存儲與計算的Hadoop。将Hadoop變的更易用些的HIVE。線上海量資料存儲的HBase。批計算的Spark。流計算的Flink。自成一套ELK,尤其大名鼎鼎彈性搜尋。時序資料庫Druid。

9、資料倉庫:大資料都學了,順便也就把數倉學了呗。順手的事而已。

10、IC:HCIE,這個我就不班門弄斧了。

11、網絡安全:我也不懂。汗。

12、Linux OS。可不僅僅是使用指令作業系統而已。當然,即使是這樣也不容易了。

當你還要再繼續晉升,就涉及到我也不完全了解的境界了。

1、中間件的實作細節:作為業務側的技術架構師,通常會把存儲和網絡的需求下壓給中間件團隊。但是他們是怎麼實作的呢?細節重要的點是什麼?

2、使用Master Slave模式,Spark等是如何實作分布式任務分解并確定計算正确的?

3、Docker虛拟化技術。

4、Yarn的資源配置設定技術。

5、計算機網絡等。

6、再擴充一下技術領域,觸角伸到AI領域。那麼數學基礎,各種論文與算法實作。又或者使用算法來賦能某個具體的業務領域比如AI賦能新零售。

7、也可以往IOT方向發展。随着5G的發展,這個應該也很火。持續看好。

本文分享自華為雲社群《成長為軟體教練的三千大道之一》,作者:華為雲小月老師

點選關注,第一時間了解華為雲新鮮技術~