作者:莫那一魯道
連結:https://www.jianshu.com/p/ed7a263a436c
前言
本文主要是寫給那些想從事中間件開發的同學看的 :)
如果你沒有這個打算,那麼本文的學習路線非但不實用,還可能會影響你正常的工作 :)
什麼是中間件開發?
隨著國內軟體行業的發展,國內網際網路公司規模越來越大,業務越來越複雜,隨之使用大量的中間件來提高後台服務性能。由此產生了中間件開發和維護人員。
誠然,在小公司,中間件,例如緩存,MQ,RPC 等服務,極大可能是由業務開發人員自己維護,或者委託第三方雲平台運維(支付一些費用)。但,如果後台開發超過 200 人,基本就會組建自己的中間件或者基礎架構團隊,用於維護後台伺服器基礎架構和中間件。
更大規模的公司,則由於各種各樣的原因(性能,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,那麼請左轉阿里,或右轉美團。
我假定你是前者。那麼請你尊重你的夢想。
這裡引用一段台詞:
如果你有夢想的話,就要去捍衛它。那些一事無成的人想告訴你你也成不了大器。如果你有理想的話,就要去努力實現。就這樣。
實際上,這句話也是寫給我自己的。與君共勉。
最後,我所說的,都是錯的。