要獲得高並發經驗要去大公司,然后大公司招聘要求高並發經驗,感覺這是個死循環,沒有高並發經驗的人如何才能獲取高並發方面的經驗呢?
先說具體的做法。
1 首先得在自己電腦上鼓搗出Redis,kafka,dubbo,mycat等高並發分布式組件的環境,通過這些環境了解分布式組件的基本api。
2 為這些分布式組件找個項目場景,證明自己用過,並且解決過實際問題。這里需要指出的是,單純背高並發的面試題沒用。
3 修改簡歷,找到高並發面試的機會,然后通過多場面試,不斷調整自己講述高並發項目經驗的水平。這時,如果能直接用高並發的說辭進大廠,那是最好的,如果不能,找個過渡性的能提供高並發實踐的崗位。
4 如果有高並發項目的實踐經驗,那么后面就不用說了,只要多開發,多解決實際問題,高並發技能一定能很快掌握。這時掌握的高並發技能,那就不是單純的理論說辭和簡單的API技能了,而是正宗的高並發項目實踐技能。
可以這樣說,能否找到高並發項目的實踐經驗,決定着程序員能否升級到架構師,不過這不容易。下面就以我自己為例,說下我是怎么從只會吹高並發項目經驗到真正掌握高並發技能的。
1 我在從17年年初的時候,在項目組里只用簡單的Spring + JDBC/ORM做業務,開發是在windows上的,接觸到的高並發組件,估計也就是nginx和mysql集群,沒有linux上部署和調試組件的經驗,沒有高並發組件的使用經驗。相信當下不少程序員朋友和我一樣,只會做windows系統上的增刪改查,沒有任何分布式組件和高並發經驗。
我就想,如果就這樣下去,只會基本的增刪改查,我再干個幾年,等年紀上來了,估計連跳槽的機會都沒,當時就想博一下,爭取能升級到架構師。
2 剛開始的時候,我就去背題,什么redis數據結構,dubbo協議,kafka流程等等,高並發情況下防冪等,netty堆外內存的使用要點,jvm調優等。凡是和高並發有關的,我基本都背了一下。然后就開始修改簡歷,就寫,在xx項目里,並發量是每秒xx,用到了Redis,kafka, dubbo(省略其它分布式組件)等等,然后投簡歷。
3 由於我當時的公司不錯,是家一線的外企,所以投出去的簡歷很快得到回應,也得到了不少大廠的面試機會。剛開始面試時,Java,數據庫等方面,我是秒通過。但是如果問到分布式組件,我基本就說不上來。
因為我背的是脫離項目的理論,比如mysql集群的搭建方法和redis數據結構等,面試官是結合項目問的,比如問,你項目里Redis如何確保高可用,用nginx部署spring boot項目時,配置文件中注意的要點是什么。由於我是單純背理論,所以回答不上。
4 嘗試了幾次,我意識到單純背題一定不行,我就在我電腦上,搭建了諸多高並發組件的開發環境。雖然組件在項目里都運行在linux上,但大多高並發組件都有windows版。
當時我搭建了mysql主從集群,redis主從集群,rabbitmq, dubbo+zookeeper,nginx,mycat等開發環境,了解各組件的基本用法,然后為每個組件找了個項目背景。比如說redis,我就說,我們項目需要緩存員工信息,所以用到了Redis里的xxx API,對應的Java代碼是什么,類似的,我為每個組件都找個了應用背景。
5 這個時候我去面試,在分布式組件方面,就能和面試官有來有去了,甚至還面試成功幾家小公司。但如果面試官問些實踐要點,比如redis如何防穿透,redis cluster的失效轉移等,我就答不上來。所以我估計,當時給面試官的印象是,有分布式組件的使用經驗,也會用分布式組件開發基本的高並發技能,但缺乏系統的用分布式組件實現高並發的能力。
6 這個時候,我就回想起剛開始背題的一些內容,比如netty防堆外內存溢出,netty如何解決半包粘包,redis如何防穿透,mycat如何實現讀寫分離,還有限流和熔斷等機制等。這時我才感到,原來這些題目是要等掌握一定高並發說辭后再用,不是一開始就用的。
明白這些以后就好辦多了,這些技能和開發無關,只需要結合項目背景講下實現要點。比如以限流為例,我先准備一個限流場景,比如公司查詢系統每秒只能放1000個請求,然后說下實踐要點,無非是redis+lua,再說下異常情況下怎么處理,無非就超量情況下拋異常。其它熔斷防穿透都要點都按這樣准備。
7 請注意,到了這個時間點,我的分布式高並發經驗,也僅僅是停留在理論層面,但這個時候我去面試,就能通過用法+實踐要點的說辭,成功把自己包裝成有高並發項目經驗的人了,后面的面試成功率就高很多了。
不過在這個階段,為了挑戰大廠的崗位,我還准備了“項目中解決過的實際問題”。套路說辭基本一樣,首先遇到什么問題,比如redis穿透,或oom異常,或kafka死信堆積過多,然后說表現,表現無非是系統宕機,卡死,或功能異常,再說如何排查,無非是通過看日志,日志中遇到什么異常,發現什么問題,最后再說怎么解決的。網上這種問題一搜一大堆,但網上的說辭大多是純理論的,得為這些問題找個項目背景。比如xx支付系統遇到oom異常,xx優惠券分發系統遇到死信過多,xx支付系統遇到redis穿透等等。
8 也就是說,通過不斷面試,我整理了高並發方面的基本用法+實踐要點+解決過問題等說辭。這樣雖然我還是沒高並發項目經驗,但已經能確保我進大廠了。事實上我就這樣進大廠的。
9 進大廠以后,其實我日子很難過,一方面項目組通過面試,認定我有高並發項目經驗,其實我沒有,但我不這樣說我還只能在原來的公司做基本的增刪改查,另一方面我以高並發零基礎的條件實現高並發的要點也不容易。
這時,我除了自己到處查以外,只能一方面厚着臉皮到處問人,另一方面多加班。由於我的項目用到高並發,所以日常工作中有大量的開發,部署,調試機會,平時也經常解決高並發的問題。所以我苦日子也就過了3個月,后面我不僅能解決高並發的問題,還能參加壓力測試,通過壓力測試提升高並發的性能,做到這個程度,我才算獲得了高並發的項目經驗。
10 掌握高並發經驗的紅利是相當大的。當我掌握高並發經驗后,后面找工作,基本上可以說是我找工作,因為大多數的技術面試我都能過。而且我有認識不少人,掌握了高並發技能,能通過出書出視頻變現,或者如果年紀上來了,也可以憑借高並發技能進個外企養老,或者是找個小公司做技術總監,不至於在35歲被淘汰。
其實我發現,不少人掌握高並發技能的經歷和我的很相似。
1 在公司項目沒有提供高並發實踐機會的前提下,通過背題等,哪怕根據一些所謂的思維導圖,把相關全學了一遍,只要沒有高並發的項目實踐機會,一定無法掌握高並發技能。
2 只有進入到提供高並發實踐機會的項目里,才能得到相關經驗。這是句正確的廢話,但很多人就卡在這塊,無法通過掌握高並發技能,升級到架構師,從而只能以“資深增刪改查工程師”的身份等待年齡瓶頸的到來。
3 可以分兩步走,首先通過背題+提升面試經驗,得到高並發的實踐機會,其次再通過項目真正掌握高並發的技能。
最后做個總結,高並發能力包括哪些,如何該怎么掌握?這無法通過短短的文章來說明,要知道我用3個月的時間在項目組里掌握高並發的基本技能,再用了半年才算全面掌握。如果要把這些經歷經驗和要點寫全,估計得出本書。
但是,你就照着我在上文里給出的步驟,先掌握搭建環境,再掌握分布式組件的基本用法,再了解高並發的實踐要點和解決問題的說辭,你至少能通過面試得到高並發項目的實踐機會。掌握高並發經驗的難點在於得到實踐機會,進了項目組,有了實踐機會,高並發技巧就不用我說了,你自己就能知道如何掌握。
這是我的公眾號,其中包含了大量面試文章,同時我自己出了多本Python和Java方面的書籍,會定期在公眾號里發書的電子版。請大家關注下我的公眾號,謝謝了。