本人之前寫了一篇博文,程序員如何獲得高並發的經驗?得到了不少點擊量,所以在這篇博文里再來補充一波,着重講下零高並發項目經驗的人如何通過面試得到實踐機會。
前文也已經說了,要得到高並發經驗,一般得分兩步走,第一通過面試得到實踐機會,第二在項目中提升,其實難點在第一點,在零基礎前提下,准備高並發方面的面試,確實難。而通過面試找到項目實踐機會后,可能會被人鄙視,也會被領導認為很水,但好歹得到了能進一步提升的機會。
這里特別提一句,大廠技術面試官一般眼睛都很毒,高並發項目經驗,或者高並發方面只有理論經驗的候選人,通過寥寥幾個問題就能問出。這點大家不要有僥幸心理,就說我吧,我至今高並發經驗不足3年,沒法和大廠一些大牛面試官相比,但我都能排查出大部分高並發方面只會說不會做的的求職者。
在零基礎前提下,准備高並發方面的面試的難點在哪里呢?
1 高並發的組件大多是運行在linux上,windows很難搭建環境,沒有環境其它就不用說了。
2 大多數零基礎的同學,不知道高並發場景下的分布式組件怎么用,或者只知道如何用簡單的api。由於缺乏項目經驗,所以大多數同學不知道分布式組件在項目里是怎么用的。
3 在學分布式組件解決高並發問題方面,往往只會孤立地使用某個組件,比如孤立使用redis做緩存,孤立使用rabbitmq做消息中間件,但現實場景下,往往是綜合使用多個分布式組件,協同解決高並發問題。
4 由於只會理論,沒有在項目里接觸過高並發開發,所以普遍缺乏分析排查解決高並發方面問題的經驗。在高並發場景下,往往會用到集群,熔斷,限流等。在使用高並發組件的時候,往往也會踩到不少坑,比如mycat方言不對,netty半包,消息中間件重發等。大廠面試官往往是會通過這些經常遇到的問題,來確認求職者的高並發方面的經驗,而一些沒有高並發項目經驗的求職者,在這方面往往是不堪一擊的。
下面就以我考核高並發技能的方式,讓大家體驗一下零項目經驗高並發求職者的難度。
1 不問概念,比如redis數據結構,netty重要組件。因為零項目經驗的高並發求職者一定背過。
2 第一層難度,這塊問題不固定,我先問,你項目里用到哪些分布式組件,然后指着用過的分布式組件,問下Java環境下的基本api和配置。比如用過Redis我就問Jedis的語法,用過Netty就問java層面如何做通訊協議,用過RabbitMQ就問Spring Boot要做哪些配置。
我就問你用過的組件,java里是怎么用的。我發現不少只會背理論的求職者,單純講組件(比如Redis或netty等)很熟悉,但不知道怎么和Java整合,這就說不過去了。
3 第二層難度,有些求職者自己搭建過環境,知道分布式組件的api。對這些求職者,我進一步提問,和我說下你用(Redis,Kafka,Netty,nginx等的)分布式組件的項目場景,比如你說你用Redis,你們項目的數據量是多少?你們項目是用單機版Redis還是Redis集群,如果是單機版Redis,你們怎么確保高可用?
這樣當我結合項目背景問的時候,會發現不少高並發方面的求職者露餡。用他們的話說,nginx都是部署在windows上的,redis只用單機版,而且數據量不高。這也能說明不少求職者沒有高並發分布式組件的使用經驗。
4 其實如果求職者能結合項目背景說分布式組件的用法,至少能說明有高並發的經驗,在一些高並發要求比較低的崗位,這樣的表現,至少在分布式組件這塊,就可以過關了。但如果要面試資深開發或架構,那么還需要問 第三層難度,即在高並發分布式組件方面解決過哪些問題?這樣能證明求職者有一定的高並發項目實踐經驗。
這方面網上有現成的問題,比如Dubbo超時問題,多注冊中心問題,Redis內存溢出問題等。
不過話說回來,零高並發項目經驗的求職者,如果准備方法得當,其實也能通過項目背景和實際解決過的問題,證明自己有高並發項目經驗。本人當時就做到了,而且我目前在輔導不少學員,讓他們在面試中能很好地展示高並發經驗。也就是說,廣大朋友,哪怕你高並發方面缺乏項目經驗,只要好好准備,一樣能通過面試得到實踐機會,大家應當有信心。我甚至還根據我的培訓經驗,出了一本Spring Boot整合分布式組件,實現高並發功能的書。
京東鏈接:https://item.jd.com/10038484613526.html。
我就用這本書里的內容舉例,來說下我是怎么輔導成功我的一個小弟。我小弟用了我的書,聽了我的課,目前也成功找到了一個高並發項目的實踐機會,公司雖然不是大廠,但在業內也算有名。
1 我小弟本書具備Spring Boot+JPA開發經驗,這其實也是高並發經驗的基礎。
2 我這本書里,講了在windows環境下搭建Redis,MyCAT,RabbitMQ,nginx,dubbo+zookeeper,MongoDB等組件運行環境的步驟,請注意是windows環境,而不是linux環境。雖然生產環境中,這些組件都在linux環境下,因為大家平時都用windows,而且這些組件在windows和linux環境下的開發差異不大,所以這本書就在windows下搭環境,這樣大家能很方便地重現開發環境,有了環境后,后面的事情就好辦了。
3 我讓我小弟環境搭建好以后,首先照着書里的步驟,運行一通spring boot整合諸多分布式組件的項目,這樣他好歹知道怎么用,而不會僅僅知道怎么說。然后我就讓他為每個組件,找個業務背景。其實也不用找,書里自然講了背景,比如redis組件是用在庫存環境等。
4 會用+結合業務背景使用高並發分布式組件以后,我再讓我的小弟背些分布式組件方面的常用坑,以及常規的使用經驗,無非是dubbo調用超時,redis超時,redis內存溢出,dubbo整合zookeeper的要點等。這方面不要太深,不用涉及到算法,也不用涉及到底層技能。而且這方面內容我書里大多也提到。最后我讓我小弟通過書里給出的秒殺案例,串起來講多個分布式組件的使用要點。
5 這個是要點,我讓我小弟主准備了不少解決高並發問題的說辭。高並發問題其實也很普遍,無非是redis超時,kakfa由於重發而導致的不冪等,dubbo注冊中西中心失效等。這些方面,我讓我小弟准備哪些點呢?問題是如何發現(無非是通過日志告警或系統卡頓發現),如何排查(到linux看日志,日志中看到哪些具體的關鍵字),如何解決(改文件或改配置)
在聽我講之前,我小弟基本上只會背理論,面試時很快會被打回原形。但看了我的書,聽了我多次講解以后,(我小弟和我公司很近,前后加起來大概聽了我不到2個小時輔導,但他回家后用了很多功夫),我小弟再出去面試,面了4次以后就找到一份高並發的開發工作了。
這是我的公眾號,其中包含了大量面試文章,同時我自己出了多本Python和Java方面的書籍,會定期在公眾號里發書的電子版。請大家關注下我的公眾號,謝謝了。