2017年面試總結

? 因為一些外在和個人原因,猶豫大半年后,筆者從58到家離職,從6月10日提出離職到7月10日滾蛋,將近有1個月時間在工作、面試、選擇中度過,期間養成了寫博客做筆記的總結習慣。現在新工作定下來,也是時候對這段時間面試經歷做一次總結(筆者是做JAVA開發,面試也是JAVA開發崗位)。

面試的公司:未來汽車(NIO)、老虎證券、京東、滴滴、阿里、WiFi萬能鑰匙、美團

筆者工作經歷:

2011.07從北京交通大學 軟件工程畢業

2011.07-2014.12 NEC:專注中間件ESB JERSEY WSRM等的開發

2015.01-2017.07 58到家 :負責到家商家結算系統、速運交易系統、司機運營體系、速運發券系統

這幾年的經歷一直是按部就班,心得:一定要選對方向,跟對人。

還是說下面試的過程吧。

NIO(未來汽車,獵頭介紹):是家做電動汽車的創業公司,去之前已經A輪,據說百度、騰訊、汽車之家創始人李響等投資,估值不小,入職后有8000期權(個人覺得期權太虛了,雞肋)。

面試過程(3輪技術,1輪HR):早上10點到,10點15開始面試第一輪面試(面試官A),A面試官一來就讓自我介紹:“11年校招去了NEC,做中間件...15年開始在到家做資金池,項目使用dubbo做分布式框架,redis做緩存。。。”,巴啦巴拉,項目介紹和技術實踐描述下來盡量讓面試官了解自己;A面試官接下來問JAVA知識:線程池實現原理(參看JUC中ThreadPoolExecutor的實現,大佬Doug Lea的杰作)、volatile具體作用(1.可見性,2 禁止指令重排,面試官反感背書,最好舉例子說明下為什么禁止指令重排),?HashMap的實現原理(也是大神Doug Lea,注意下JDK1.7和1.8的有很大區別,JDK1.7是數組+鏈表,JDK1.8是數組+鏈表+紅黑樹實現)、垃圾回收算法(標記-清除,標記-整理,復制三種算法,千萬不要背書);接下來是數據庫:4種事務隔離級別(要理解,最好結合spring實踐下);算法:折半查找(從一堆有序數中確定某個數的位置),二叉樹反轉。

二輪:B面試官開場也是讓自我介紹,問了垃圾回收器算法,反射( 如何變更一個沒有set方法的實例的屬性值,答得不好,知道spring中有一個?reflectiontestutils.setfield方法可以實現) ,MQ基本實現(生產者通過長連接如何和broker之間如何產生關聯,找到最佳節點,broker集群是如何保證不丟消息,消費者以何種方式平均消費?);數據庫:分庫分表(水平拆分、垂直拆分,框架有阿里的corba,當當sharding-jdbc)、事務的隔離級別(unread commit,read commit,repeable,serial);算法:從多個有序數組中找出前100大數字(一開始想到的是merge算法,面試后想想可以用堆排序算法)

三輪:前2輪面了大概2個半小時,第三輪是boss面 ,主要問了秒殺系統如何實現(思路:從數據一致性(redis.setnx()和樂觀鎖)和限流(使用MQ,nignx,tomcat,程序做好限流))著手;之后,面試官介紹了他們的業務。這一過程大概40分鐘,和前面2輪加起來有3個半小時的時間,boss給我感覺溝通能力差(這是我拒絕他們家offer的主要原因)。

小結:這是我面試第一家,問的東西還挺全也很難,幸虧有基礎,也準備充分,最終還是很遺憾拒掉了他們家的offer。

老虎證券:一家小公司,主要是證券交易,據說美股的交易是在中國做的最好的,在boss直聘上跟我勾搭上,面試 約在下午2點,當時天氣潮濕燥熱,加上筆者是個路癡,?遲到半小時,進行了2輪面試。

一輪(A面試官):A面試官來讓說項目經歷(感覺自己快成復讀機了),問了線程池的實現原理,數據庫的事務隔離級別,垃圾回收器,算法:證券交易網站上排序(按照漲幅,成交量等順序進行排序,個人給出的方案是先按照漲幅進行排序,標識權重,對相同權重的項目按照成交量進行排序...如此類推。

二輪(B面試官):說項目經歷(復讀機啊),垃圾回收的算法,zookeeper的實現原理(悲劇啊,面試官你大爺啊,?paxos算法至今也沒看懂)和實踐(dubbo注冊中心,部署多個定時任務使用zookeeper的分布式鎖防止并發),redis緩存淘汰使用算法LRU實現(MD又悲劇了,不知道),證券交易中如何找到最佳的買進點和賣出點,實現最優的收益(勉強答上來,時間花了20分鐘)

結果當然是沒有結果,心得就是面試要端正態度,面試要認真,準備要充分。

京東:部門是虛擬平臺,主要是做電費,水費,沖話費等虛擬物品買賣,面試了2輪(第3輪沒去面試,感覺地方太遠,技術和業務不感興趣,拒絕了)

1輪(A面試):介紹項目經歷(復讀機啊復讀機)?,也許是臨到飯點,我前面的項目介紹花了很多時間(項目介紹中途被打斷了,汗顏啊),簡單問了多線程有沒有用過,HashMap和HashTable的區別,是不是使用mysql.然后就沒有然后了,開始二輪面試。

2輪(B面試):面試官自我介紹是京東的架構師,問了dubbo的實現原理,dubbo的優缺點,數據庫的事務隔離級別,技術解決方案問了:上游業務處理后,可能有上千萬的數據,每個數據需要進行n步處理,平均每次處理耗時在1s左右,如何設計這個系統,回答:定時任務掃描數據庫( 還可以像從庫一樣讀取binglog),將讀取的數據發送給MQ,多個系統訂閱MQ進行消息處理數據,MQ的ACK機制保證處理失敗能再次處理。

2輪后將近12點30半,因為是京東6.18活動的結束后的第四天。3輪面試官在現場處理問題,要下午才有時間,筆者有其他安排約改天,后面自然沒去。

滴滴:早上面試完京東,下午去面試滴滴,一南一北,橫穿了大半個北京,午飯也沒吃好,本來約在2點面試,結果遲到30分鐘。面試的部門是QA(我嚓,看到面試介紹的時候,其實我內心是拒絕的),主要做全鏈路壓測,模擬線上環境,鏈路追蹤(如到家的守望者,Google?Dapper),問題追蹤,技術上還是挺吸引人的。面試了3輪。

1輪(面試官A):簡單的自我介紹,問了JAVA的基礎,Java的基本類型有哪些(8種基本類型),String類為什么是final,包裝類型和解包裝類型的比較(Integer a=100,Integer b=100,a==b是什么(結果當然是true);Integer a=new Integer (100),Integer b=new?Integer(100),?a==b是什么(結果當然是false);Integer a=1000,Integer b=1000,a==b是什么(答案是false,因為Integer類使用緩存池,-128-127中數字使用中會被緩存起來,超過后需要new對象)),ThreadLocal使用場景(如果回答上來,就會問如果對外暴露1個API,API實現需要調用很多獨立服務,然后匯總起來,這些獨立的服務使用ThreadLocal存放數據,主線程和子線程怎么讀取ThreadLocal),算法1.將無序數據排列成有序數組,算法2:提供一個臨時變量,怎么將一個棧反轉過來(要求o(n),解題思路遞歸,將復雜問題簡單化)

2輪(面試官B):簡單自我介紹,volatile的原理,數據庫事務隔離級別,線程池,dubbo的實現原理,分庫分表的路由規則 算法:不記得了,記得很難

3輪(面試官):boss面試,項目介紹,問了并發量大概有幾百兆,設計一個實時統計功能,要求找出最大那個,性能在1毫秒以內,調用方并發在百萬上(主要考察對redis的集群,incr,set的使用),算法:有一個先升序后降序的數組,找出最大的數的位置。(部分面試題不記得了,問的還挺深的)

小結:滴滴的面試注重基礎和算法(時間久遠,上面的面試中有2個算法題忘記了,以后記得在補充吧),框架問得少,面試要主動多說。

阿里:面試還挺曲折的,杭州的面試官電話面試了6輪(4輪電話+1輪視頻+1輪HR面試,每次至少4分鐘),業務主要是做淘寶 天貓的商家業務,如管理購買商家商品用戶積分,商家刷單管理,商家促銷等等。

簡單說下,按照阿里流程,第一輪通常是電話摸底,主要問:JVM中JMM 垃圾回收,HashMap的實現,volatile的2種作用。

第二輪:dubbo的實現原理(分層處理,有多少層,負載算法是如何實現的),currentHashMap的實現原理,垃圾回收(阿里很注重JVM,面試必考);數據庫的隔離級別,索引原理。

第三輪:不出意外還會問JVM,不過會問項目使用什么垃圾回收器,有沒有JVM的調優過;classLoader的原理,JVM中classLoader有幾層,分層的意義是什么,osgi的原理;JMM,鎖的實現機制(Syn和可重入鎖的區別:Syn基于monitorEnter和monitorExit指令,線程在爭奪對象的控制權限時若對象monitor的記錄數是0可爭奪,否則對象monitor計數器加1,線程放棄對象monitor控制則記錄數減一,Syn只能實現非公平鎖,執行中不能主動中斷;可重入鎖,基于AQS實現,在執行中中斷,可實現非公平鎖和公平鎖)

第四輪:和前面3輪一樣,問的更細,鎖機制(偏向鎖,輕量級鎖,鎖),Hash一致性(平衡性,單調性,分散性,負載性,實現是虛擬環實現),MQ的實現原理,分表的規則;數據庫調優,數據庫中鎖的實現機制,大分頁問題;使用過哪些設計模式

第五輪:視頻面試,idea上寫出單例模式和2個線程交替打出1,2,3,4,5,6,7,8....1000(非常注重變量命名,方法的名稱)

第六輪:HR面試,強勢的HR,批的我體無完膚。

小結:阿里的面試,應該是距離太遠沒有具體問算法,也可能面試官覺得沒有必要問,注重JVM和框架的研究以及代碼實踐能力。

美團:同時面試了2個部門,應該是他們招聘系統有問題吧,第二個部門在技術3面的時候要求拒掉第一個部門的offer(哥們太耿直了,不該說有部門也在面試我)。具體啥業務就不說了。流程差不多,問題也差不多。

第一輪:簡單自我介紹,主要考察項目經驗和系統架構能力:要求畫出自己拿得出手的項目的上下游系統,時序圖。數據庫:用戶下單的程序存在問題,產生了重復數據,要求寫出保留時間最新的數據刪除多余的數據的sql。算法:1個單向鏈表,提供3個臨時變量,要求求出鏈表的長度(感覺面試官題目出錯了,思路:使用了1個臨時變量執行鏈表的頭,臨時變量的next的不為null,計數器加1,變量的next賦值給臨時變量,如此求出鏈表長度)

第2輪:自我介紹,dubbo的實現原理,估計美團有題庫吧,按著題庫問,然后打分(1.線程池的實現原理 2.HashMap在多線程情況下會發生什么(回答:線程不安全,可能發生死鎖造成性能低下)3.mysql的引擎有哪些,innodb和myisam有什么區別 3.分布式事務中2段提交分別指什么 ,jta了解過嗎?4.Syn和可重入鎖區別是什么 5.mysql的bingLog原理是什么,主從如何實現數據同步,如何選擇:是多主多從,還是1主多從? ?6.分庫分表有幾種方式 ?7.數據庫調優(索引不生效舉例,如何診斷)8.數據索引的實現原理是什么(B+樹,hash) ?9,數據庫鎖的實現機制是什么 ? 10.redis的存儲結構是什么)。

算法1:1.將數字轉化成漢字(如1001,一千零一), 思路:將對應每位的單位存下來("",“十”,“百”,“千”,“萬” ,”十”,“百”,“千”,“萬”...),逐一讀取要數字,讀取的數如非0時找到對應的數字(如2,讀取二),然后找到單位(("",“十”,“百”,“千”,“萬” ,”十”,“百”,“千”,“萬”...),關鍵點在讀取到0時要注意零的讀取,如101對應一百零一,101001對應十萬零一千零一。

算法2:將一個2維數組,從外層向里層逐一打印 思路:循環(橫向打印(向右),豎向打印(向下),橫向打印(向左),豎向打印(向上),標記打印的層數,下次如此打印時橫向和豎向要比前一個少打印2個),直到標記的層數大于或等于數組的高度時終止。

算法3:如下圖,可以掃描到圖中柱子的的長度和高度以及坐標,求出陰影面積。解題思路:找出最大的高度的元素E1,得出面積減去該元素的之前柱子的面積得到面積A1,在該元素后面的數據中找到最高的元素E2,求出E1和E2之間的陰影面積A2,。。。如此類推,得到陰影面積A1+A2+A3。。。

3輪:boss面試,怎么合理安排任務,面試中使用開發方式(瀑布還是敏捷),都使用哪些設計模式,如果是負責人,你會關心哪些點(回答:需求拆分,大概排期,設計,設計評審,詳細排期,進度(晨會和項目站會,郵件),代碼質量(sonar可看出),單元測試,上線后項目質量,項目總結)

小結:全方位考察面試者的技術、溝通、管理能力,個人感覺美團技術氛圍不錯


自己也看了不少書:《深入理解Java虛擬機》 《Netty權威指南》 《重構與模式》《圖解Http協議》

《Redis實踐》《圖解tcp/ip》《整潔代碼之道》《數據結構與算法分析》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 好久沒寫博客,這一陣又去面試了幾家公司,所以聊一聊這大半年的面試經歷,面了幾家公司發現一個規律,越是出名,技術牛逼...
    王小寶wy閱讀 2,335評論 0 19
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,098評論 25 708
  • I 卷積神經網絡簡述 <卷積神經網絡>傅里葉變換(即一個波形),可以有不同的正弦函數和余弦函數進行疊加完成。卷積神...
    嗯我是一個胖子閱讀 847評論 0 0
  • 大家好,我是大家的知心大哥哥大E君。 我見過很多剛從校門里走出來的應屆生,也比較喜歡應屆生,原因是可塑性強。 如果...
    運營獅訓練營閱讀 1,321評論 1 2
  • 可能你把我的任性小心眼當作野蠻不講理 可能你看著我亂沖你發火會感覺我胡攪蠻纏精神病 可能你不能接受我挑剔太多東西 ...
    哀慕熙榮閱讀 178評論 0 1