面試過程
最近去阿里的菜鳥國際做了一次面試交流,發現大公司對於面試者的知識結構考核非常嚴謹,可以作為我們日常工作學習的指導。雖然很多人說面試問到的東西在實際工作中很少用到,甚至有「面試造火箭,工作擰螺絲」的說法。
但從面試中,其實可以看得出來現在的公司對於面試者的知識體系要求。如果我們能在工作中就按著這樣的要求去不斷提升,那麼在面試的時候必然也能遊刃有餘。
一般來說,阿里的面試會有兩輪的技術電面,分別交叉檢驗你的技術基礎。後面還有兩輪的現場技術面試,主要檢驗你的項目經驗。但從知識體系的角度來看,阿里面試對於知識的考核可以分為三個層次:對於基礎知識的考核、對於項目經驗的考核、對於項目深度的考核。
一、基礎知識考核
在這個層次上,主要考核你對 Java 語言本身原理的理解以及各種框架的原理理解。對於 Java 開發崗位上來說,這些知識點包括但不限於:
- 集合 HashMap 的原理,與 Hashtable、ConcurrentHashMap 的區別?
- Java 線程池的核心屬性以及處理流程
- Java 併發包原理、Synchronized關鍵字、鎖
- 線程的生命週期
- JVM類加載機制
- JVM內存模型
- JVM分代以及垃圾回收機制
- Spring Bean 容器生命週期
- Spring AOP 原理
- Dubbo 請求流程以及原理
- 數據庫 SQL 優化、數據庫索引、索引原理
- ……
看到這麼多的知識點,我一下子就懵逼了,這麼多得看到什麼時候才看得完啊?但後面我想明白了,其實你不需要全部都懂,但需要了解大部分知識點,並且在這大部分知識點中,還需要有部分是瞭解得非常深入的。如果達到這個水平,基本上都能通過考核。
對於基礎知識的考核多出現在阿里的前兩輪電話面試上。對於這塊,你事前把常見的面試題目看一遍,多面試幾次基本上都沒有問題。
二、項目經驗的考核
當你成功通過基礎知識的考核之後,你會進入下一關的考驗:項目的理解程度。
面試官首先會讓你選擇一個你最拿手的項目,畫出架構圖,之後的一切問題都從這個架構圖觸發。當你畫出架構圖之後,你肯定需要解釋清楚每個模塊的作用,每個框架的原理以及與其他框架的區別。
例如我就用我做過的一個搜索項目作為經典項目,與面試官探討。
項目中用到了 Kafka 這個框架,那麼面試官就會問 Kafka 和 RocketMQ 之間的區別是什麼,它們兩個有什麼不同?
項目中還用到了 Canal 這個阿里巴巴開源的框架,那麼面試官自然會問這個東西是幹嘛的,原理是怎樣的?
項目中還用到了 Zookeeper 作為協調者,那麼 Zookeeper 在這個項目中的作用是什麼,扮演了什麼角色?
對於「項目理解程度」的考核會發生在技術面試的三四輪。在這個層次上,你必須要有一個拿得出手的項目,並且對其中的所有框架以及原理都瞭如指掌,否則你會被虐慘。
三、項目深度的考核
通過上一輪對於「項目理解程度」的考核後,基本上你對整個項目都會有一個全面的認識,應用層面上的問題基本上不會難倒你了。但在「項目思考深度」的考核上,就不僅僅只是考核應用層面上的問題了。
還是用我做過的一個搜索項目作為例子,其中 Canal 這個開源框架暫時是沒有實現集群這個功能的,那麼面試官就問了:
你如何去改造這個項目,從而實現 Canal 的集群功能?
這個時候,你會發現你懵逼了,因為你從來沒有去思考過這個問題。你所有的工作內容都是在想如何使用開源框架,而沒有進一步思考這些開源框架好不好,有什麼可以改進的地方。
所以,在這一個層次上考核的是你對開源框架的思考深度,這些框架到底好不好,好在哪裡,不好在哪裡,有什麼可以改進的地方。
對於「項目思考深度」的考核同樣發生在技術面試的三四輪。在這個層次上,你不僅要對項目本身理解足夠深刻,還要跳出項目本身,去思考開源框架本身的問題。
四、總結
當我們回過頭來總結,你會發現這三個層次都是層層遞進的,而且逐步深入。雖然這是面試中總結出來的經驗,但是這卻是一個很好的學習指引。讀者可以自己自查,看看自己現在是處於哪個層次,這樣在工作中也可以不斷地向更高層次邁進。
對於我來說,我缺乏的是對於項目的思考深度,很多時候都是業界覺得好,那我就用了。但是作為一個高級開發,甚至是一個即將成為架構師的高級開發來說,你必須知道為什麼要用這些框架?它有什麼問題,我們能不能做得更好?只有這樣,我們才能有所成長。
阿里面試真題:
一面(主要是jvm,併發,鎖,數據結構等基礎)
- 自我介紹(說說自己的擅長及拿手的技術)
- 說說treemap和HashMap的區別?HashMap和ConcurrentHashMap的區別?
- HashMap底層如何實現(JDK1.8有所改動)?
- 說說Hash的一致算法?
- 你知道的GC算法和回收策略有哪些?GC的機制是什麼?
- 垃圾回收器的基本原理?是否可以立即回收內存?怎麼樣主動的通知JVM進行垃圾回收?
- 雙親委派模型機制線程池創建的幾個核心構造參數是什麼?
- 樂觀鎖和悲觀鎖?可重入鎖和Synchronized?他們都是可重入鎖嗎?哪個效率更高?
- CountDownLaunch和Cylicbarrior的區別以及分別是在哪樣場景下使用的?
- Http和Https的區別以及Https加密的方式?
- 以後的職業規劃和想法
二面(主要是數據庫,協議 , Spring等 )
- 自我介紹,聊下自己認為做得很好的項目!
- InnoDB支持的四種事務隔離級別名稱是什麼?之間的區別是什麼? MySQL隔離級別是什麼?
- 說說事務的特性?講講對慢查詢的分析?
- 你理解的BTree機制?
- 有哪些MySQL常用的優化方法?6. Http請求過程, DNS解析的過程?7.三次握手和四次握手的過程?
- B+樹索引和Hash索引之間的區別?
- Spring IOC如何管理Bean之間的依賴關係,怎麼樣避免循環依賴?
- SpringBean創建過程中的設計模式?11.說說AOP的實現原理?
- Tomcat的基本架構是什麼?
三面(主要是緩存,併發,分佈式)
- 自己項目中的總結的併發經驗
- 說說MySQL的鎖併發?加鎖的機制是什麼?
- 高併發場景下如何防止死鎖,保證數據的一致性?
- 集群和負載均衡的算法與實現?
- 說說分庫與分表設計?
- 分庫分錶帶來的分佈式困境與對應之策有哪些?
- Redis和Setnx命令使如何實現分佈式鎖的?
- 使用Redis怎麼進行異步隊列?會有什麼缺點?
- 緩存擊穿的概念和解決方案?
- Redis的數據結構?線程模型? Redis的數據淘汰機制?
- Redis的數據一致性問題12. MQ底層原理的實現?
- 阻塞隊列不用Java提供的該怎麼實現?
- 講講負載均衡的原理?
- 如何實現高併發環境下的削峰、限流?
- 手寫ArrayList
- 手寫進制轉換算法,求出一個數的二進制數1的個數
- JAVA基礎 equals和==
- 多線程方式、threadlocal,各種鎖,synchronized和lock
- 設計模式、spring類加載方式、實例保存在哪、aop ioc、反射機制
- 類加載器,雙親委派模型,熱部署
- jvm內存模型,內存結構、堆的分代算法、堆的分區、gc算法、gc過程。
- tcp ip 七層模型 rest接口規範 get和post區別,長度,安全。
- tcp ip的arp協議,兩個同一網絡的主機如何獲得對方的mac地址。
- 負載均衡、高併發、高可用的架構
- mysql的引擎區別
- redis緩存,redis的集群部署,熱備份,主從備份,主從數據庫,hash映射找到知道指定節點。
- 瞭解雲計算麼,瞭解雲容器docker麼,容器和虛擬機的區別
- 自我介紹 項目中負責哪些 做了哪些
- 項目中的數據庫備份,主從數據庫、集群
- 數據庫的索引原理,b+樹原理,trie樹引申,二叉查找樹的原理
- 海量數據中查找一個單詞,分佈式計算map reduce ,或者用hsah映射篩選部分結果
- java的抽象類和接口區別、java的hashmap,java的內存模型,分區,分代垃圾回收算法。實例、常量放在哪裡。
- int 4個字節,double 8個字節。
- 多線程中的wait和sleep區別,notify的作用
- 設計模式瞭解哪些,寫一個觀察者模式。實現兩個接口,一個是主題一個是觀察者,並寫出對應方法。
- 寫一個生產者消費者隊列的方法,分別寫兩個類代表生產者和消費者,並且用隊列模擬其生產消費。用while循環和waitnotify可以實現,但我忘記在隊列上加synchronize關鍵字,於是讓我再寫一題。寫的是:輸入一個字符串,輸入第一個只出現一次的字符,寫出來了。
- tcp ip的四次揮手 子網掩碼的作用, 子網掩碼(subnet mask)又叫 網絡掩碼 、 地址掩碼 、子網絡遮罩,它是一種用來指明一個IP地址 的哪些位標識的是 主機所在的子網,以及哪些位標識的是主機的位掩碼。子網掩碼不能單獨存在,它必須結合IP地址一起使用。子網掩碼只有一個作用,就是將某個IP地址劃分成 網絡地址 和主機地址 兩部分。
- 瞭解linux麼,說一下linux的內核鎖?沒接觸過。
- 有沒有用過sed 使用shell腳本寫一個將文本中的字符替換掉的腳本,大概說了一下用grep || 替換。沒再問linux的
- 自我介紹
- 負責模塊,哪些模塊,項目一的架構,我說太久了忘了,說最近的項目。
- 數據庫連接池用的是什麼,配置文件呢,數據庫驅動怎麼下載的,持久層框架呢。
- 為什麼要用數據庫連接池,有什麼好處。
- java的內存模型,變量和實例存在哪。java棧的作用,java的堆存什麼,方法區存什麼。
- java的分代回收。
- 項目如何部署到雲主機上,有什麼速度提升,為什麼有提升,答主要是設備性能和帶寬。
- tomcat的配置,堆得初始大小是多少,達不知道。
- 問遇到過什麼難題。
- 問在遇到問題時候的辦法。
- 抗壓能力
- 優缺點
- 接受加班。
- 遇到工作問題,同事不配合怎麼辦。
- 快速上手工作的辦法。
- 平時學習的方法,舉幾點。
- 職業規劃
最後
感謝各位程序員同仁閱讀。
感謝支持,我會更加努力分享,喜歡的朋友可以關注下,祝大家面試通過拿到心儀offer。
需要獲取面試核心資料的可以私信我【面試】獲取資料領取方式!(助你面試無憂)
重要的事情說三遍:轉發+轉發+轉發!
更多筆記分享
最全最新面試文檔分享,先一步瞭解大型互聯網面試題及答案,對面試文檔總結感興趣的
轉發+轉發+轉發,關注我後臺私信關鍵字【面試】免費獲取資料領取方式!(助你面試無憂)
閱讀更多 愛喝王老吉的劉某人 的文章