? 因?yàn)橐恍┩庠诤蛡€(gè)人原因,猶豫大半年后,筆者從58到家離職,從6月10日提出離職到7月10日滾蛋,將近有1個(gè)月時(shí)間在工作、面試、選擇中度過,期間養(yǎng)成了寫博客做筆記的總結(jié)習(xí)慣?,F(xiàn)在新工作定下來,也是時(shí)候?qū)@段時(shí)間面試經(jīng)歷做一次總結(jié)(筆者是做JAVA開發(fā),面試也是JAVA開發(fā)崗位)。
面試的公司:未來汽車(NIO)、老虎證券、京東、滴滴、阿里、WiFi萬能鑰匙、美團(tuán)
筆者工作經(jīng)歷:
2011.07從北京交通大學(xué) 軟件工程畢業(yè)
2011.07-2014.12 NEC:專注中間件ESB JERSEY WSRM等的開發(fā)
2015.01-2017.07 58到家 :負(fù)責(zé)到家商家結(jié)算系統(tǒng)、速運(yùn)交易系統(tǒng)、司機(jī)運(yùn)營體系、速運(yùn)發(fā)券系統(tǒng)
這幾年的經(jīng)歷一直是按部就班,心得:一定要選對方向,跟對人。
還是說下面試的過程吧。
NIO(未來汽車,獵頭介紹):是家做電動(dòng)汽車的創(chuàng)業(yè)公司,去之前已經(jīng)A輪,據(jù)說百度、騰訊、汽車之家創(chuàng)始人李響等投資,估值不小,入職后有8000期權(quán)(個(gè)人覺得期權(quán)太虛了,雞肋)。
面試過程(3輪技術(shù),1輪HR):早上10點(diǎn)到,10點(diǎn)15開始面試第一輪面試(面試官A),A面試官一來就讓自我介紹:“11年校招去了NEC,做中間件...15年開始在到家做資金池,項(xiàng)目使用dubbo做分布式框架,redis做緩存。。?!保屠舶屠?,項(xiàng)目介紹和技術(shù)實(shí)踐描述下來盡量讓面試官了解自己;A面試官接下來問JAVA知識(shí):線程池實(shí)現(xiàn)原理(參看JUC中ThreadPoolExecutor的實(shí)現(xiàn),大佬Doug Lea的杰作)、volatile具體作用(1.可見性,2 禁止指令重排,面試官反感背書,最好舉例子說明下為什么禁止指令重排),?HashMap的實(shí)現(xiàn)原理(也是大神Doug Lea,注意下JDK1.7和1.8的有很大區(qū)別,JDK1.7是數(shù)組+鏈表,JDK1.8是數(shù)組+鏈表+紅黑樹實(shí)現(xiàn))、垃圾回收算法(標(biāo)記-清除,標(biāo)記-整理,復(fù)制三種算法,千萬不要背書);接下來是數(shù)據(jù)庫:4種事務(wù)隔離級別(要理解,最好結(jié)合spring實(shí)踐下);算法:折半查找(從一堆有序數(shù)中確定某個(gè)數(shù)的位置),二叉樹反轉(zhuǎn)。
二輪:B面試官開場也是讓自我介紹,問了垃圾回收器算法,反射( 如何變更一個(gè)沒有set方法的實(shí)例的屬性值,答得不好,知道spring中有一個(gè)?reflectiontestutils.setfield方法可以實(shí)現(xiàn)) ,MQ基本實(shí)現(xiàn)(生產(chǎn)者通過長連接如何和broker之間如何產(chǎn)生關(guān)聯(lián),找到最佳節(jié)點(diǎn),broker集群是如何保證不丟消息,消費(fèi)者以何種方式平均消費(fèi)?);數(shù)據(jù)庫:分庫分表(水平拆分、垂直拆分,框架有阿里的corba,當(dāng)當(dāng)sharding-jdbc)、事務(wù)的隔離級別(unread commit,read commit,repeable,serial);算法:從多個(gè)有序數(shù)組中找出前100大數(shù)字(一開始想到的是merge算法,面試后想想可以用堆排序算法)
三輪:前2輪面了大概2個(gè)半小時(shí),第三輪是boss面 ,主要問了秒殺系統(tǒng)如何實(shí)現(xiàn)(思路:從數(shù)據(jù)一致性(redis.setnx()和樂觀鎖)和限流(使用MQ,nignx,tomcat,程序做好限流))著手;之后,面試官介紹了他們的業(yè)務(wù)。這一過程大概40分鐘,和前面2輪加起來有3個(gè)半小時(shí)的時(shí)間,boss給我感覺溝通能力差(這是我拒絕他們家offer的主要原因)。
小結(jié):這是我面試第一家,問的東西還挺全也很難,幸虧有基礎(chǔ),也準(zhǔn)備充分,最終還是很遺憾拒掉了他們家的offer。
老虎證券:一家小公司,主要是證券交易,據(jù)說美股的交易是在中國做的最好的,在boss直聘上跟我勾搭上,面試 約在下午2點(diǎn),當(dāng)時(shí)天氣潮濕燥熱,加上筆者是個(gè)路癡,?遲到半小時(shí),進(jìn)行了2輪面試。
一輪(A面試官):A面試官來讓說項(xiàng)目經(jīng)歷(感覺自己快成復(fù)讀機(jī)了),問了線程池的實(shí)現(xiàn)原理,數(shù)據(jù)庫的事務(wù)隔離級別,垃圾回收器,算法:證券交易網(wǎng)站上排序(按照漲幅,成交量等順序進(jìn)行排序,個(gè)人給出的方案是先按照漲幅進(jìn)行排序,標(biāo)識(shí)權(quán)重,對相同權(quán)重的項(xiàng)目按照成交量進(jìn)行排序...如此類推。
二輪(B面試官):說項(xiàng)目經(jīng)歷(復(fù)讀機(jī)?。厥盏乃惴?,zookeeper的實(shí)現(xiàn)原理(悲劇啊,面試官你大爺啊,?paxos算法至今也沒看懂)和實(shí)踐(dubbo注冊中心,部署多個(gè)定時(shí)任務(wù)使用zookeeper的分布式鎖防止并發(fā)),redis緩存淘汰使用算法LRU實(shí)現(xiàn)(MD又悲劇了,不知道),證券交易中如何找到最佳的買進(jìn)點(diǎn)和賣出點(diǎn),實(shí)現(xiàn)最優(yōu)的收益(勉強(qiáng)答上來,時(shí)間花了20分鐘)
結(jié)果當(dāng)然是沒有結(jié)果,心得就是面試要端正態(tài)度,面試要認(rèn)真,準(zhǔn)備要充分。
京東:部門是虛擬平臺(tái),主要是做電費(fèi),水費(fèi),沖話費(fèi)等虛擬物品買賣,面試了2輪(第3輪沒去面試,感覺地方太遠(yuǎn),技術(shù)和業(yè)務(wù)不感興趣,拒絕了)
1輪(A面試):介紹項(xiàng)目經(jīng)歷(復(fù)讀機(jī)啊復(fù)讀機(jī))?,也許是臨到飯點(diǎn),我前面的項(xiàng)目介紹花了很多時(shí)間(項(xiàng)目介紹中途被打斷了,汗顏啊),簡單問了多線程有沒有用過,HashMap和HashTable的區(qū)別,是不是使用mysql.然后就沒有然后了,開始二輪面試。
2輪(B面試):面試官自我介紹是京東的架構(gòu)師,問了dubbo的實(shí)現(xiàn)原理,dubbo的優(yōu)缺點(diǎn),數(shù)據(jù)庫的事務(wù)隔離級別,技術(shù)解決方案問了:上游業(yè)務(wù)處理后,可能有上千萬的數(shù)據(jù),每個(gè)數(shù)據(jù)需要進(jìn)行n步處理,平均每次處理耗時(shí)在1s左右,如何設(shè)計(jì)這個(gè)系統(tǒng),回答:定時(shí)任務(wù)掃描數(shù)據(jù)庫( 還可以像從庫一樣讀取binglog),將讀取的數(shù)據(jù)發(fā)送給MQ,多個(gè)系統(tǒng)訂閱MQ進(jìn)行消息處理數(shù)據(jù),MQ的ACK機(jī)制保證處理失敗能再次處理。
2輪后將近12點(diǎn)30半,因?yàn)槭蔷〇|6.18活動(dòng)的結(jié)束后的第四天。3輪面試官在現(xiàn)場處理問題,要下午才有時(shí)間,筆者有其他安排約改天,后面自然沒去。
滴滴:早上面試完京東,下午去面試滴滴,一南一北,橫穿了大半個(gè)北京,午飯也沒吃好,本來約在2點(diǎn)面試,結(jié)果遲到30分鐘。面試的部門是QA(我嚓,看到面試介紹的時(shí)候,其實(shí)我內(nèi)心是拒絕的),主要做全鏈路壓測,模擬線上環(huán)境,鏈路追蹤(如到家的守望者,Google?Dapper),問題追蹤,技術(shù)上還是挺吸引人的。面試了3輪。
1輪(面試官A):簡單的自我介紹,問了JAVA的基礎(chǔ),Java的基本類型有哪些(8種基本類型),String類為什么是final,包裝類型和解包裝類型的比較(Integer a=100,Integer b=100,a==b是什么(結(jié)果當(dāng)然是true);Integer a=new Integer (100),Integer b=new?Integer(100),?a==b是什么(結(jié)果當(dāng)然是false);Integer a=1000,Integer b=1000,a==b是什么(答案是false,因?yàn)镮nteger類使用緩存池,-128-127中數(shù)字使用中會(huì)被緩存起來,超過后需要new對象)),ThreadLocal使用場景(如果回答上來,就會(huì)問如果對外暴露1個(gè)API,API實(shí)現(xiàn)需要調(diào)用很多獨(dú)立服務(wù),然后匯總起來,這些獨(dú)立的服務(wù)使用ThreadLocal存放數(shù)據(jù),主線程和子線程怎么讀取ThreadLocal),算法1.將無序數(shù)據(jù)排列成有序數(shù)組,算法2:提供一個(gè)臨時(shí)變量,怎么將一個(gè)棧反轉(zhuǎn)過來(要求o(n),解題思路遞歸,將復(fù)雜問題簡單化)
2輪(面試官B):簡單自我介紹,volatile的原理,數(shù)據(jù)庫事務(wù)隔離級別,線程池,dubbo的實(shí)現(xiàn)原理,分庫分表的路由規(guī)則 算法:不記得了,記得很難
3輪(面試官):boss面試,項(xiàng)目介紹,問了并發(fā)量大概有幾百兆,設(shè)計(jì)一個(gè)實(shí)時(shí)統(tǒng)計(jì)功能,要求找出最大那個(gè),性能在1毫秒以內(nèi),調(diào)用方并發(fā)在百萬上(主要考察對redis的集群,incr,set的使用),算法:有一個(gè)先升序后降序的數(shù)組,找出最大的數(shù)的位置。(部分面試題不記得了,問的還挺深的)
小結(jié):滴滴的面試注重基礎(chǔ)和算法(時(shí)間久遠(yuǎn),上面的面試中有2個(gè)算法題忘記了,以后記得在補(bǔ)充吧),框架問得少,面試要主動(dòng)多說。
阿里:面試還挺曲折的,杭州的面試官電話面試了6輪(4輪電話+1輪視頻+1輪HR面試,每次至少4分鐘),業(yè)務(wù)主要是做淘寶 天貓的商家業(yè)務(wù),如管理購買商家商品用戶積分,商家刷單管理,商家促銷等等。
簡單說下,按照阿里流程,第一輪通常是電話摸底,主要問:JVM中JMM 垃圾回收,HashMap的實(shí)現(xiàn),volatile的2種作用。
第二輪:dubbo的實(shí)現(xiàn)原理(分層處理,有多少層,負(fù)載算法是如何實(shí)現(xiàn)的),currentHashMap的實(shí)現(xiàn)原理,垃圾回收(阿里很注重JVM,面試必考);數(shù)據(jù)庫的隔離級別,索引原理。
第三輪:不出意外還會(huì)問JVM,不過會(huì)問項(xiàng)目使用什么垃圾回收器,有沒有JVM的調(diào)優(yōu)過;classLoader的原理,JVM中classLoader有幾層,分層的意義是什么,osgi的原理;JMM,鎖的實(shí)現(xiàn)機(jī)制(Syn和可重入鎖的區(qū)別:Syn基于monitorEnter和monitorExit指令,線程在爭奪對象的控制權(quán)限時(shí)若對象monitor的記錄數(shù)是0可爭奪,否則對象monitor計(jì)數(shù)器加1,線程放棄對象monitor控制則記錄數(shù)減一,Syn只能實(shí)現(xiàn)非公平鎖,執(zhí)行中不能主動(dòng)中斷;可重入鎖,基于AQS實(shí)現(xiàn),在執(zhí)行中中斷,可實(shí)現(xiàn)非公平鎖和公平鎖)
第四輪:和前面3輪一樣,問的更細(xì),鎖機(jī)制(偏向鎖,輕量級鎖,鎖),Hash一致性(平衡性,單調(diào)性,分散性,負(fù)載性,實(shí)現(xiàn)是虛擬環(huán)實(shí)現(xiàn)),MQ的實(shí)現(xiàn)原理,分表的規(guī)則;數(shù)據(jù)庫調(diào)優(yōu),數(shù)據(jù)庫中鎖的實(shí)現(xiàn)機(jī)制,大分頁問題;使用過哪些設(shè)計(jì)模式
第五輪:視頻面試,idea上寫出單例模式和2個(gè)線程交替打出1,2,3,4,5,6,7,8....1000(非常注重變量命名,方法的名稱)
第六輪:HR面試,強(qiáng)勢的HR,批的我體無完膚。
小結(jié):阿里的面試,應(yīng)該是距離太遠(yuǎn)沒有具體問算法,也可能面試官覺得沒有必要問,注重JVM和框架的研究以及代碼實(shí)踐能力。
美團(tuán):同時(shí)面試了2個(gè)部門,應(yīng)該是他們招聘系統(tǒng)有問題吧,第二個(gè)部門在技術(shù)3面的時(shí)候要求拒掉第一個(gè)部門的offer(哥們太耿直了,不該說有部門也在面試我)。具體啥業(yè)務(wù)就不說了。流程差不多,問題也差不多。
第一輪:簡單自我介紹,主要考察項(xiàng)目經(jīng)驗(yàn)和系統(tǒng)架構(gòu)能力:要求畫出自己拿得出手的項(xiàng)目的上下游系統(tǒng),時(shí)序圖。數(shù)據(jù)庫:用戶下單的程序存在問題,產(chǎn)生了重復(fù)數(shù)據(jù),要求寫出保留時(shí)間最新的數(shù)據(jù)刪除多余的數(shù)據(jù)的sql。算法:1個(gè)單向鏈表,提供3個(gè)臨時(shí)變量,要求求出鏈表的長度(感覺面試官題目出錯(cuò)了,思路:使用了1個(gè)臨時(shí)變量執(zhí)行鏈表的頭,臨時(shí)變量的next的不為null,計(jì)數(shù)器加1,變量的next賦值給臨時(shí)變量,如此求出鏈表長度)
第2輪:自我介紹,dubbo的實(shí)現(xiàn)原理,估計(jì)美團(tuán)有題庫吧,按著題庫問,然后打分(1.線程池的實(shí)現(xiàn)原理 2.HashMap在多線程情況下會(huì)發(fā)生什么(回答:線程不安全,可能發(fā)生死鎖造成性能低下)3.mysql的引擎有哪些,innodb和myisam有什么區(qū)別 3.分布式事務(wù)中2段提交分別指什么 ,jta了解過嗎?4.Syn和可重入鎖區(qū)別是什么 5.mysql的bingLog原理是什么,主從如何實(shí)現(xiàn)數(shù)據(jù)同步,如何選擇:是多主多從,還是1主多從? ?6.分庫分表有幾種方式 ?7.數(shù)據(jù)庫調(diào)優(yōu)(索引不生效舉例,如何診斷)8.數(shù)據(jù)索引的實(shí)現(xiàn)原理是什么(B+樹,hash) ?9,數(shù)據(jù)庫鎖的實(shí)現(xiàn)機(jī)制是什么 ? 10.redis的存儲(chǔ)結(jié)構(gòu)是什么)。
算法1:1.將數(shù)字轉(zhuǎn)化成漢字(如1001,一千零一), 思路:將對應(yīng)每位的單位存下來("",“十”,“百”,“千”,“萬” ,”十”,“百”,“千”,“萬”...),逐一讀取要數(shù)字,讀取的數(shù)如非0時(shí)找到對應(yīng)的數(shù)字(如2,讀取二),然后找到單位(("",“十”,“百”,“千”,“萬” ,”十”,“百”,“千”,“萬”...),關(guān)鍵點(diǎn)在讀取到0時(shí)要注意零的讀取,如101對應(yīng)一百零一,101001對應(yīng)十萬零一千零一。
算法2:將一個(gè)2維數(shù)組,從外層向里層逐一打印 思路:循環(huán)(橫向打?。ㄏ蛴遥Q向打印(向下),橫向打印(向左),豎向打印(向上),標(biāo)記打印的層數(shù),下次如此打印時(shí)橫向和豎向要比前一個(gè)少打印2個(gè)),直到標(biāo)記的層數(shù)大于或等于數(shù)組的高度時(shí)終止。
算法3:如下圖,可以掃描到圖中柱子的的長度和高度以及坐標(biāo),求出陰影面積。解題思路:找出最大的高度的元素E1,得出面積減去該元素的之前柱子的面積得到面積A1,在該元素后面的數(shù)據(jù)中找到最高的元素E2,求出E1和E2之間的陰影面積A2,。。。如此類推,得到陰影面積A1+A2+A3。。。

3輪:boss面試,怎么合理安排任務(wù),面試中使用開發(fā)方式(瀑布還是敏捷),都使用哪些設(shè)計(jì)模式,如果是負(fù)責(zé)人,你會(huì)關(guān)心哪些點(diǎn)(回答:需求拆分,大概排期,設(shè)計(jì),設(shè)計(jì)評審,詳細(xì)排期,進(jìn)度(晨會(huì)和項(xiàng)目站會(huì),郵件),代碼質(zhì)量(sonar可看出),單元測試,上線后項(xiàng)目質(zhì)量,項(xiàng)目總結(jié))
小結(jié):全方位考察面試者的技術(shù)、溝通、管理能力,個(gè)人感覺美團(tuán)技術(shù)氛圍不錯(cuò)
自己也看了不少書:《深入理解Java虛擬機(jī)》 《Netty權(quán)威指南》 《重構(gòu)與模式》《圖解Http協(xié)議》
《Redis實(shí)踐》《圖解tcp/ip》《整潔代碼之道》《數(shù)據(jù)結(jié)構(gòu)與算法分析》