前言
本文主要是寫給那些想從事中間件開發的同窗看的 :)html
若是你沒有這個打算,那麼本文的學習路線非但不實用,還可能會影響你正常的工做 :)程序員
什麼是中間件開發?
隨着國內軟件行業的發展,國內互聯網公司規模愈來愈大,業務愈來愈複雜,隨之使用大量的中間件來提升後臺服務性能。由此產生了中間件開發和維護人員。面試
誠然,在小公司,中間件,例如緩存,MQ,RPC 等服務,極大多是由業務開發人員本身維護,或者委託第三方雲平臺運維(支付一些費用)。但,若是後臺開發超過 200 人,基本就會組建本身的中間件或者基礎架構團隊,用於維護後臺服務器基礎架構和中間件。docker
更大規模的公司,則因爲各類各樣的緣由(性能,KPI),會本身開發中間件,簡稱自研。這要求中間件團隊須要更多的人員。數據庫
中間件開發人員須要哪些素質?
既然須要中間件開發人員,那麼中間件開發人員通常從哪裏招聘呢?招聘的要求是什麼?編程
一般,一個公司在剛開始組建中間件團隊的時候,都會從公司內部挑選精英人才,或者挑選對中間件感興趣的人才。這時候,可能你沒有相關經驗,但你仍然有機會參與到中間件開發中。反之,若是你沒有中間件開發經驗,想經過招聘的方式進入中間件行業,那麼相對而言,會有些曲折。緩存
那麼,假設,你想從事中間件開發,但,你沒有中間件開發經驗,且,你的公司也沒有組建中間件團隊的打算。性能優化
該怎麼突破?服務器
答: 跳槽。跳槽到別的公司的中間件團隊。網絡
這裏就涉及到了一箇中間件團隊須要哪些技能。由於跳槽確定就要面試,若是你面試的是中間件崗位,那麼天然,就須要準備中間件的相關知識。
另外,還有一點,在這個分工明確的時代,即便是中間件,也有不少種類,我這裏稍微分一下,可能不是很準確。
- 服務治理中間件,例如 RPC 相關中間件,限流熔斷,鏈路追蹤,分佈式配置中心等等。你能夠從 SpringCloud 裏找到相關的產品。固然國內也有不少優秀的產品。
- 存儲中間件,例如緩存,MQ等等,若是存儲涉及到分佈式(一般都會涉及),那麼要求相對較高。
- 各類 Proxy,不管是數據庫,仍是 Cache,仍是各類存儲,一般單機沒法承載海量數據,比較簡單的辦法就是使用 Proxy 進行代理,讓應用透明的使用集羣。出於性能考慮,這裏一般會使用性能較高的產品,例如 goLang,C++ 等。Java 的長處——開發效率,在這個地方權重不大。
- 各類分佈式中間件,例如 ZK 這種,這個我我的認爲難度是較大的。分佈式向來是軟件開發中比較困難的一個點。特別是涉及到存儲和一致性。
- 容器相關,k8s,docker等,容器化已是大勢所趨,其實我也不是很懂😀(聽大佬們說的)。
回到以前的話題: 一箇中間件開發者須要哪些素質?
- 語言基礎。從 Java 程序員的角度,基礎一般就是:集合,併發,JVM,Netty,IO、NIO(mmap,sendfile)
- 計算機基礎,因爲中間件開發人員常常和 OS 打交道,因此計算機基礎也必不可少,例如文件系統(IO/磁盤),進程線程,內存管理。
- 網絡基礎,搞後臺的人員,確定要對網絡熟悉了,熟悉在 Linux 下排查網絡問題,熟悉 Epoll 原理等。
- 分佈式相關知識,互聯網海量數據背景下,分佈式知識必不可少,CAP, Paxos,Raft,zab,2pc,3pc,base等等。最好能根據這些理論寫出實現代碼。
- 熟悉開源實現,即便你是業務開發人員,你也 100% 會接觸開源項目,例如 Spring,那麼,一般你須要對這種經常使用的開源代碼有深入的理解,不只知曉其原理,也領會其設計。從大的角度看,你得看清整個框架的背景,設計和取捨,從小的角度看,你得看清框架的內部實現細節,有哪些有趣的地方(一般這種框架都會進行性能優化)。
- 瞭解行業風向標,中間件行業和業務開發稍有不一樣,每一箇中間件的版本升級都會讓該領域的開發者們側目(相似 iPhone 發佈會),瞭解其特性,進而瞭解行業趨勢,最後成爲行業引領。
如何成爲中間件開發人員?
好,說完了中間件開發人員須要哪些素質,天然,如何成爲中間件開發人員,就不言自明瞭。
說白了,以上 6 個點,都是硬骨頭。
- 對於已經開始工做的人來講,須要平時深入的積累,說的難聽一點,若是你的業務開發任務很重,你很難搞定上門的這些內容。
- 對於還在上學的同窗來講,很爽,你能夠用學校(不只僅指大學,據我所知的大神,一般是初中/小學就開始編程,但這不是必須的)裏大把的時間來學習,一個個的搞定這些知識點,和社招不一樣,若是你的知識達到上面的水平,那麼 SP offer 應該是隨便拿了 :)
我這裏重點和那些平時開發任務不重,想搞中間件的同窗聊聊。
我假設你是一個工做 3 年之內的 Java 開發人員,且你多是培訓生,半路出家,科班生,大專生,初中生,且你不在大廠,一般在一個後臺開發不超過 200 人的創業公司,title 是 「Java 開發工程師」,而且有一個程序員的夢想,不想 get、set,不想 crud,不想 html 填空,不想和產品同窗討論,也不想和測試同窗點點點......(感受這裏會得罪人 =_=||)
你可能想跳槽。
那麼你大概須要作如下準備:
- 鞏固 Java 基礎,集合源碼,併發源碼,JVM 原理,Netty 原理源碼,IO 相關(涉及到零拷貝文件存儲),這些都是 Java 基礎,一般是必須的。
- 分佈式原理,最起碼知曉理論知識,最好能寫一個,哪怕參照開源的也行。
- 源碼,Spring Mybatis Tomcat 等等,這些代碼一般是你最早接觸的,不妨從這裏開始。RPC 中間件相關的,Dubbo,Motan,SOFA,挑一個吧,推薦 SOFA。
- 再熟悉熟悉(熟悉指源碼和設計)分佈式的相關產品,假設你是 Java 開發,推薦 RocketMQ,Apollo 配置中心等等中間件,其實均可以,MQ 相對複雜。
- 操做系統,一般,你在研究上面的內容時,會遇到操做系統的疑問,遇到不要繞過,儘可能弄明白。
- 本身的產品,有就最好了,例如公衆號,博客,教學視頻,GitHub 項目等等,總之,是拿得出手的東西。
- 加大牛好友,瞭解行業風向標。也許你是一個矜持的人,但從事了這個行業,你有必要和行業裏優秀的人學習(看看朋友圈就好)。
結語
一般看完本文,你會有一絲疲憊,甚至帶有那麼一絲難過:太他麼難了!
若是你看完了本文內容,以爲 so easy,那麼請左轉阿里,或右轉美團。
我假定你是前者。那麼請你尊重你的夢想。
這裏引用一段臺詞:
若是你有夢想的話,就要去捍衛它。那些一事無成的人想告訴你你也成不了大器。若是你有理想的話,就要去努力實現。就這樣。
實際上,這句話也是寫給我本身的。與君共勉。
最後,我所說的,都是錯的。