??????因為各種原因,筆者又踏上了尋找新工作機會的道路,10天左右下來面試了7家單位,順利拿到了4家offer,今天得以有空將面試的過程總結下來,一來給大家分享當中遇到的問題,二來是自我總結。這份面經是針對3-5年工作經驗的朋友們,若不屬于該階段的朋友可以不用去在意。
自我介紹
??????本人不才,不是什么京東阿里大神,就一個想改變世界的普通程序員,高中畢業之后開始進入JAVA培訓學校正式接觸JAVA,19歲參加工作,到目前為止已經工作4年多,因為對技術有著濃厚的興趣,一路下來研究并沉淀了不少技術,在這過程中先后自考了大專和本科,本科目前屬于在讀階段,以后也希望能有機會考研。有和我一樣經歷的朋友建議能盡快去念一個本科,至少在很多公司對學歷的要求是硬性指標,當然你可能說也有很多公司因為能力而適當放寬,那這里我不做過多的描述。
面試過程
- 因為參加工作時間也不短,在以往的工作中也面試過不少新人。所以現在幾乎所有的面試過程中我都比較自信,也聊得特別開,當然也必須有足夠的技術功底才能做到自信,這個就來自于平時的自我總結了,O(∩_∩)O哈哈~個人能力。
- 唯獨在阿里巴巴的復式過程中比較緊張,這種緊張的感覺只有我當初第一次面試的時候才出現過,可能也是提供了一個機會比較看重的原因吧,路上還一直讓我的朋友們替我打氣,讓我放松O(∩_∩)O~~,感謝可愛的人兒們。
問題技術點
??????設計模式、常用數據結構、線程、JAVA7和JAVA8比較、分布式、WebSocket、微服務、nginx單點、TCP/IP、分庫分表、緩存服務器、JVM、內存管理、Linux、Git
詳細過程
??????因為記憶不是很好,總結得不及時,所以有大部分都已經忘了,阿里巴巴是最近的面試,這里我以阿里巴巴的問題為例,因為阿里的流程走得比較慢,面過的朋友應該都知道,從簡歷篩選到一面電話,再到二面,再到交叉等等少說得2周,有的甚至更久,我的簡歷篩選好像也是一周前就發郵件告訴我,所以也是感覺不太好,畢竟多少人擠破頭都想進的地方,我一個全日制都不是的技術人員有這個機會又何嘗不是一次歷練呢,然后一周后打電話過來了。
一面
??????一面是電面,杭州打過來的,電話號碼也是特別6,當時在外面有些事,環境也比較吵,但也是足足聊了一個多小時,接通電話后把我目前工作的所有情況問了一遍,然后讓我再簡單介紹一下后就開始技術題了,自我介紹我覺得大家簡單的說一說就行了,沒有必要那么正式,阿里問的問題大多是連環的,一環接一環,問到你不會為止,如果你都會,那你很6。
請說說ArrayList、LinkedList、HashMap的區別
這里大家一定要把java幾個常用的數據結構給弄懂了,早些年你可以隨便說說他們如何使用的就可以找到工作,但是現在不是說簡單的糊弄幾句就可以過去的,懂的程度表示你技術的深度,這里的話我把回答點說一下
a.描述他們的上級接口父類關系、
b.描述如何擴容,不是說一實例化就會擴容的,大家可以跟進去看看源碼,有同學debug細心也會有所發現
c.他們各自的底層實現
??????這里我拿HashMap做解答:HashMap和HashTable雖然都實現于Map,但他們繼承父類不一樣,HashTable繼承自舊的Dictionary,而HashMap的父類是AbstractMap,HashMap的負載因子為0.75f,初始化和ArrayList一樣容量都是0添加變量的時候才會進行擴容,HashMap當容量實際大小達到0.75*總容量則再次觸發擴容,即達到3/4擴容。掌握這些還不夠,因為你還沒有說到面試官真正想要的,這個時候繼續。因為HashMap是異步的,所以會存在安全問題,至于為什么會有安全問題,不了解的同學可以自己學習下,那要解決安全問題可以采用同步關鍵字,進行線程同步操作,早期也有人這么使用過,但是這樣會存在很大的資源弊端,引發阻塞產生故障,可以采取concurrent包中的ConcurrentHashMap,接著就說到點子上了,面試官就是想要這個東西,ConcurrentHashMap是如何做到同步且提升效率的大家可以自行學習,這里描述不完,還有concurrent這個包也要好好學習,另外再引申一點,1.7中HashMap采用鏈表數組實現,1.8之后改為前一部分使用鏈表數組,但是達到存放閾值后改為紅黑樹實現,主要是解決hash碰撞問題,至于什么是hash碰撞,大家也是必須掌握的。如何保證線程安全
這里我回答的是加鎖,其實我這個回答也是不盡人意的,因為我沒有描述出具體的解決方式。接著又問我怎么加,鎖哪里,當時我就想說“哪里不行鎖哪里”, 說實話工作這幾年,還沒有考慮過高并發需要加鎖的場景,一直都是在網上找資料學習理論,所以這也是我一直薄弱的地方,因為在開發中這樣寫過但沒提供場景真正實驗過,就算知道,說出來也比較虛,言歸正傳,最傳統的做法是使用synchronized 關鍵字解決,可以保證一次只有一個線程通過,這里需要對synchronized描述詳細使用場景,交給大家腦補。第二種做法采用concurrent下的ReentrantLock 加鎖的方式來解決,大家看仔細了,又是concurrent對吧,所以這個包是特別感人,特別6的一個包,ReentrantLock 使用lock的方式大家過后自己學習,由于本題我描述得過少顯得過于尷尬,所以我補充回答了悲觀鎖和樂觀鎖機制。談談你對事物的理解,如何解決分布式事物
首先我簡單描述下什么是事物,事物特性ACID以及隔離級別,因為我看到后面的重點最終是落到分布式上,所以我開始說到spring中集成事物的幾種方式。我先描述了傳統解決事物的方法,使用邏輯進行解決,待A服務執行完畢之后將結果返回,然后去執行B服務,若B失敗,則代碼回滾A,這樣做也不是不行,但是顯然是比較廢的一種方式,另外我還說出了一種學習過但沒有使用過的方式,就是采用MQ發送可靠消息以及數據庫狀態日志解決,至于原理大家可以去網上學習。微服務架構使用過或了解過哪些,有什么區別
微服務作為一個近兩年很火的話題,應用的公司必然不少,幾乎我面試的公司中都有關于微服務的話題,那這里凡是研究過或者了解過的朋友都知道阿里巴巴開源的dubbo,當當網升級版的的dubbox,以及springcloud等,那提到微服務自然就能聯想到MQ,zookepper,redis等等技術,這些都是需要大家花時間進行研究的,網上案例也特別多,對于MQ和zookepper和redis大家可以看看我的其他文章,高可用集群都有進行講解。在最近一份工作中,我們采用的微服務架構是基于數據庫注冊API,采用redis緩存+MQ進行消息傳輸模式,進行服務調用,與dubbo大同小異,所以這個問題我也描述了不少東西,這塊大致是過了。結合項目進行提問
描述一個項目后,抓著一個點深究,是如何解決這個問題的,就例如返傭,是一筆一筆的返還是怎么弄的,如果數據量提升到現在的100萬倍,如何解決,有些問題確實沒答上來。非技術問題
這方面我想面試幾乎都有被問過,問今后的規劃,這塊因人而異吧,只要是積極向上即可。
二面
??????二面是邀約現場面試,因為在一面結束后我提了一個小小的要求,如果說我能通過,因為經濟原因,那邊能不能盡快明天給結果,面試官說我們的流程一般都是一周,我待會再備注下,如果合適的話盡快給結果,所以當晚就有阿里的hr給我打電話安排了第二天的面試,說實話阿里的技術生態體系確實可以,釘釘直接就推過來了,二面的時候是一個看上去40多歲頭頂都禿得發亮的技術人員,我希望我不要這樣子,畢竟生活是很美好,少那么一丟丟很不愉快,閑話不多說,自我介紹忽略,直接上問題(二面掛了)。
支付寶有好幾億用戶,如何使用緩存服務器進行用戶數據的存儲
說到緩存服務器,大家都會想到Redis和Memcached,前者更多的是基于緩存持久化的,支持的數據類型也特別多,后者是基于內存的,這兩個各有各的使用場景,所以說不能說誰好誰不好,關于redis我有文章進行詳細說明,了解基本原理之后接下來就要說應用場景了。筆者不才碰碰磕磕的說了種解決方案,沒有達到面試官的效果。我是這么說的,在業務層,用戶對關鍵信息篩選,畢竟第一層大流量是關鍵信息,次要的放在第二層,采用分布式redis多節點部署,使用hash取模算法進行服務器的分配,這樣可以保證服務器分配均勻,但是后面接著問我,服務器節點擴容或者刪減,算法就改變了,又該如何解決。確實會特別麻煩,然后我實在是想不出來,也就結束了這個問題。500萬的用戶數據,我現在想要通過redis快速的統計90后人群,以及90后男性人群
當時唯一能抓住的就是兩個特征,90后,和90后男性,于是眼前一亮,覺得可以拆分出:70/80/90后,男性/女性,存儲的時候就存這幾個關鍵特征所對應的id集合,然后進行采用“集合并集”方式就可以定位出90男性,不知道是不是面試官想要的結過,但是我覺得這樣應該是可以實現的。這題是一道算法題
算法是我的弱項,自己幾斤幾兩還是有點B數,所以稍微有點緊張,給定一個數列,9 13 17 25 3 5 8,它對應的原數列為遞增數列3 5 8 9 13 17 25 ,我們不知道原數列,只知道給出的現有數列,表達式為f(n),求n。稍微有點數學基礎的同學應該都知道怎么算。我也一眼看出來了,既然原數列是遞增,那肯定有一個位置是遞減的,那這個點就是臨界點,求出前面的長度即可,然后面試官接著問我,你這個復雜度是多少,對于復雜度,不懂的同學可以去網上學習下,因為從左到右每個都要遍歷下我說O(n),于是問我有沒有優化的,我覺得就算我做出了第二次優化,提升到log n,他還會接著問,于是我只能想到二分法了,畢竟這是普遍做法,再接下來的我不會了。其實這道題跟1-100樓扔雞蛋是一個道理,其中有一層是臨界值,意思就是那一層往下雞蛋是不會摔破的,往上是會破的,以最快的方式求出那一層,我也看過那道題,二分法同樣可以算出來,但是最優解不是二分法,所以阿里巴巴的本次面試就到這結束了。
其他公司面試題
??????其他公司雖然不是很接近算法題目,但是也是java里面比較深入的,雖然數據規模比不上阿里巴巴,但是面試題目也是比較重要的,下面我抽取幾道難度稍微高一點的
說說你理解的GC
其實GC在過去我真沒了解過,也是最近一年才接觸JVM,不過學好JAVA,JVM是必須要懂的,就算看不懂也要硬著頭皮去看,這對寫出高質量代碼真的是很有幫助的。
JVM體系分哪幾個區,類加載過程是哪些,雙親委派模型是什么,如何自己實現一個類加載器,對象的4種引用,minor GC和full GC,對象如何被回收,如何對GC進行調優,你用過的內存調試工具有哪些說說你對TCP/IP的理解
這個自己說吧,3次握手,4次揮手,SOCKET通信,能了解得越多越好BIO、NIO、AIO有什么區別,各自的原理
其實這個東西了解了原理大家就知道是什么了,阻塞IO,非阻塞IO,異步IO,netty實現就是基于非阻塞IO,采用非阻塞IO的工具或是服務器也特別多,大家自己了解啦分庫分表,讀寫分離
分庫分表看情況,可以水平也可垂直,但是水平和垂直都必須滿足他們各自的基礎條件,另外解決數據落地的平衡即可。MySQL Proxy可實現多節點讀寫分離,但是其實也就一個代理,存在單點問題,筆者也是對這塊沒進行過深入研究,所以給不出更多的結論了。如何對業務進行拆分和擴展
這道題屬于業務層的,不好說太多,在模塊劃分時確實要經過嚴格的思考,否則帶來的開發問題會很多,看個人經驗吧。說說CI和CD的區別
因為我在項目中有接觸過持續集成和持續交付的,也有研究過持續集成例如jenkins和hudson工具,所以說問了我這個問題,持續集成多用于互聯網公司的項目快速構建,功能模塊的快速完成,交付至測試,但是CI和CD的真正核心還不是在于自動化,自動化是一方面,更重要的是代碼交付質量,在這一層花的功夫確實要比較多。
總結
??????技術更新很快,在剛入行的時候,隨便說個list set,寫個sql的group或者jdbc連接就能找到工作,現在呢?所以說做為一個技術人員,對技術的探索自然是不能停,對工作也要富有責任心。遇到問題不要放棄,沒有過不去的坎,對技術而言總結幾點如下:
- 不要抵觸,要敢于接納新事物,新需求。(重要)
- 對技術產生濃厚的興趣(非必須),但至少保證不是拒絕,否則很難持久(很重要)
- 在學習路上出現問題要找合適資料,那些破資料枯燥到能讓你放棄,多尋求google而非度娘。(你懂的)
- 技術在于沉淀,請堅持學習,記住,堅持過后必有收獲。(真的很重要)
- 做技術更多的是要參與業務分析再落實到功能實現,業務轉化不了技術說明你寫不出代碼或是只能寫出不能用的代碼
差不多就說這么多吧,以上都是個人見解,也正在學習路上,有不對的地方希望朋友們指出,希望更多的是能幫助到大家