前言
本文主要是寫給那些想從事中間件開發的同學看的 :)
如果你沒有這個打算,那麼本文的學習路線非但不實用,還可能會影響你正常的工作 :)
什麼是中間件開發?
随着國内軟體行業的發展,國内網際網路公司規模越來越大,業務越來越複雜,随之使用大量的中間件來提高背景服務性能。由此産生了中間件開發和維護人員。
誠然,在小公司,中間件,例如緩存,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,那麼請左轉阿裡,或右轉美團。
我假定你是前者。那麼請你尊重你的夢想。
這裡引用一段台詞:
如果你有夢想的話,就要去捍衛它。那些一事無成的人想告訴你你也成不了大器。如果你有理想的話,就要去努力實作。就這樣。
實際上,這句話也是寫給我自己的。與君共勉。
最後,我所說的,都是錯的。