1. 程式人生 > >一個Java程式設計師的阿里之路

一個Java程式設計師的阿里之路

前言

最近有些朋友在面試阿里,加上 Java-Interview 專案的原因也有小夥伴和我討論,近期也在負責部門的招牌,這讓我想起年初那段長達三個月的奇葩面試經歷。

本來沒想拿出來說的,畢竟最後也沒成。

但由於那幾個月的經歷讓我瞭解到了大廠的工作方式、對候選同學的考察重點以及面試官的套路等都有了全新的認識。

當然最重要的是這段時間的查漏補缺也讓自己精進不少。

先交代下背景吧:

從去年 12 月到今年三月底,我前前後後面了阿里三個部門。

其中兩個部門通過了技術面試,還有一個跪在了三面。

光看結果還不錯,但整個流程堪稱曲折。

下面我會盡量描述流程以及大致的面試題目大綱,希望對想要跳槽、正在面試的同學帶來點靈感,幫助可能談不上,但啟發還是能有。

以下內容較長,請再次備好瓜子板凳。

A 部門

首先是第一次機會,去年 12 月份有位大佬加我,後來才知道是一個部門的技術 Leader 在網上看到我的部落格,問我想不想來阿里試試。

這時距離上次面阿里也過去一年多了,也想看看現在幾斤幾兩,於是便同意了。

在推薦一週之後收到了杭州打來的電話,說來也巧,那時候我正在機場候機,距離登記還有大概一個小時,心想時間肯定夠了。

那是我時隔一年多第一次面試,還是在機場這樣嘈雜的環境裡。多多少少還是有些緊張。

一面

以下是我印象比較深刻的內容:

面試官:

談談你做過專案中印象較深或自認為做的比較好的地方?

博主:

我覺得我在 XX 做的不錯,用了 XX 需求實現 XX 功能,效能提高了 N 倍。

面試官:

你說使用到了 AOP ,能談談它的實現原理嘛?

博主:

它是依靠動態代理實現的,動態代理又分為 JDK 自身的以及 CGLIB 。。。。

面試官:

嗯,能說說他們的不同及優缺點嘛?

博主:

JDK 是基於介面實現,而 CGLIB 繼承代理類。。。

就是這樣會一直問下去,如果聊的差不多了就開始問一些零散的問題:

JMM 記憶體模型,如何劃分的?分別儲存什麼內容?執行緒安全與否?

類載入機制,談到雙親委派模型後會問到哪些違反了雙親委派模型?為什麼?為什麼要雙親委派?好處是什麼?

平時怎麼使用多執行緒?有哪些好處?執行緒池的幾個核心引數的意義?

執行緒間通訊的方式?

HashMap 的原理?當談到執行緒不安全時自然引申出 ConcurrentHashMap ,它的實現原理?

分庫分表如何設計?垂直拆分、水平拆分?

業務 ID 的生成規則,有哪些方式?

SQL 調優?平時使用資料庫有哪些注意點?

當一個應用啟動緩慢如何優化?

大概是以上這些,當聊到倒數第二個時我已經登機了。最後不得不提前結束通話,結束之前告訴我之後會換一個同事和我溝通,聽到這樣的回覆一面應該是過了, 後面也確實證實了這點。

二面

大概過了一週,二面如期而至。

我聽聲音很熟,就嘗試問下是不是之前一面的面試官,結果真是。

由於二面的面試官臨時有事所以他來替一下。於是我趕緊問他能否把之前答的不好的再說說?的到了肯定的答覆後開始了我的表演。

有了第一次的經驗這一次自然也輕車熟路,原本感覺一切盡在掌握卻被告知需要筆試突然被激醒。

筆試是一個線上平臺,需要在網頁中寫程式碼,會有一個明確的題目:

從一個日誌檔案中根據關鍵字讀取日誌,記錄出現的次數,最後按照次數排序列印。

在這過程中切記要和麵試官多多交流,因為筆試有時間限制,別到最後發現題目理解錯了,這就和高考作文寫完發現方向錯了一樣要命。

而且在溝通過程中體現出你解題的思路,即使最終結果不對,但說不定思考的過程很符合面試官的胃口哦。這也和今年的高考改卷一樣;過程正確得高分,只有結果得低分。

三面

又過了差不多一週的時間接到了三面的電話,一般到了三面會是技術 Leader 之類的角色。

這個過程中不會過多強調技術細節,更多的考察軟體能,比如團隊協作、學習能力等。

但我記得也問了以下一些技術問題:

談談你所理解的 HTTP 協議?

對 TCP 的理解?三次握手?滑動視窗?

基本演算法,Base64 等。

Java 記憶體模型,Happen Before 的理解。

一週之後我接到了 HR 助理的電話約了和 HRBP 以及產品技術負責人的視訊面試。

但是我卻沒有面下去,具體原因得往下看。

B 部門

在 A 部門三面完成後,我等了差不多一星期,這期間我卻收到了一封郵件。

大概內容是他在 GitHub 上看到的我,他們的技術總監對我很感興趣(我都不敢相信我的眼鏡),問我想不想來阿里試試。

我對比了 A B 部門的區別發現 B 部門在做的事情上確實更加有誘惑力,之後我表達了有一個面試正在流程中的顧慮;對方表示可以私下和我快速的進行三面,如果一切沒問題再交由我自行選擇。至少對雙方都是一個雙贏嘛。

我想也不虧,並且對方很有誠意,就答應試試;於是便有了下面的面試:

一面

面試官:

對 Java 鎖的理解?

博主:

我談到了 synchronize,Lock 介面的應用。

面試官:

他們兩者的區別以及優缺點呢?

博主:

synchronize 在 JDK1.6 之前稱為重量鎖,是通過進出物件監視器來實現同步的;1.6 之後做了 XX 優化。。。

而 ReentrantLock 是利用了一個巧妙資料結構實現的,並且加鎖解鎖是顯式的。。。

之後又引申到分散式鎖,光這塊就聊了差不多半個小時。

之後又聊到了我的開源專案:

是如何想做這個專案的?

已經有一些關注了後續是如何規劃的?

你今後的學習計劃是什麼?

平時看哪些書?

之後技術聊的不是很多,但對於個人發展卻聊了不少。

關於鎖相關的內容可以參考這裡:ReentrantLock 實現原理 synchronize 關鍵字原理

二面

隔了差不多一天的時間,二面很快就來了。

內容不是很多:

執行緒間通訊的多種方式?

限流演算法?單機限流?分散式限流?

提到了 Guava Cache ,瞭解它的實現原理嘛?

如何定位一個線上問題?

CPU 高負載?OOM 排查等?

聊完之後表示第二天應該會有三面。

三面

三面的面試官應該是之前郵件中提到的那位總監大佬,以前應該也是一線的技術大牛;聊的問題不是很多:

談談對 Netty 的理解?

Netty 的執行緒模型?

寫一個 LRU 快取。

筆試

本以為技術面試完了,結果後面告知所有的面試流程都得有筆試了,於是又參與了一次筆試:

交替列印奇偶數

這個相對比較簡單,基於鎖、等待喚醒機制都是可以的。最後也告知筆試通過。

之後在推薦我的那位大佬的幫助下戲劇般的通過了整個技術輪(真的很感謝他的認可),並且得知這個訊息是在我剛好和 A 部門約好視訊面試時間之後。

也就意味著我必須拒掉一個部門!

沒看錯,是我要拒掉一個。這對我來說確實太難了,我壓根沒想過還有兩個機會擺在我面前。

最後憑著個人的愛好以及 B 部門的熱情我很不好意思的拒掉了 A 部門。。。

HR 面

在面這之前我從來沒有面過這樣大廠的 HR 流程,於是瘋狂搜索,希望能彌補點經驗。

也許這就是樂極生悲吧,我確實猜中了 HR 問的大部分問題,但遺憾的是最終依然沒能通過。

後來我在想如果我沒有拒掉 A ,會不會結局不一樣了?

但現實就是如此,沒有那麼多假設,並且每個人也得為自己的選擇負責!

大概的問題是:

為什麼想來阿里?

個人做的最成功最有挑戰的事情是什麼?

工作中最難忘的經歷?

對加入我們團隊有何期待?

C 部門

HR 這關被 Pass 之後沒多久我居然又收到了第三個部門的邀約。

說實話當時我是拒絕的,之前經歷了將近兩個月的時間卻沒能如願我內心是崩潰的。

我向聯絡我的大佬表達了我的想法,他倒覺得我最後被 pass 的原因是個小問題,再嘗試的話會有很大的機率通過。

我把這事給朋友說了之後也支援我再試試,反正也沒啥損失嘛,而且面試的狀態還在。

所以我又被打了雞血,才有了下面的面試經過:

一面

面試官:

服務化框架的選型和差異?

博主:

一起探討了 SpringCloud、Dubbo、Thrift 的差異,優缺點等。

面試官:

一致性 Hash 演算法的原理?

博主:

將資料 Hash 之後落到一個 0 ~ 2^32-1 構成的一個環上。。。。

面試官:

談談你理解的 Zookeeper?

博主:

作為一個分散式協調器。。。

面試官:

如何處理 MQ 重複消費?

博主:

業務冪等處理。。。。

面試官:

客戶端負載演算法?

博主:

輪詢、隨機、一致性 Hash、故障轉移、LRU 等。。

面試官:

long 型別的賦值是否是原子的?

博主:

不是。。。

面試官:

volatile 關鍵字的原理及作用?happen Before?

博主:

可見性、一致性。。

二面

一面之後大概一週的時間接到了二面的電話:

原以為會像之前一樣直接進入筆試,這次上來先簡單聊了下:

談談對微服務的理解,好處以及弊端?

分散式快取的設計?熱點快取?

之後才正式進入筆試流程:

這次主要考察設計能力,其實就是對設計模式的理解?能否應對後續的擴充套件性。

筆試完了之後也和麵試官交流,原以為會是演算法之類的測試,後來得知他能看到前幾輪的筆試情況,特地挑的沒有做過的方向。

所以大家也不用刻意去押題,總有你想不到的,平時多積累才是硬道理。

三面

又過了兩週左右,得到 HR 通知;希望能過去杭州參加現場面試。並且阿里包了來回的機票酒店等。

可見阿里對人才渴望還是捨得下成本的。

既然都這樣了,就當成一次旅遊所以去了一趟杭州。

現場面的時候有別於其他面試,是由兩個面試官同時參與:

給一個場景,談談你的架構方式。

這就對平時的積累要求較高了。

還有一個印象較深的是:

在網頁上點選一個按鈕到伺服器的整個流程,儘量完整。

其實之前看過,好像是 Google 的一個面試題。

完了之後讓我回去等通知,沒有見到 HR 我就知道涼了,果不其然。

總結

看到這裡的朋友應該都是老鐵了,我也把上文提到的大多數面試題需要掌握的一些技術知識點分享給大家

原始碼分析

程式設計師每天都和程式碼打交道。經過數年的基礎教育和職業培訓,大部分程式設計師都會「寫」程式碼,或者至少會抄程式碼和改程式碼。但是,會讀程式碼的並不在多數,會讀程式碼又真正讀懂一些大專案的原始碼的,少之又少。這也造成了很多錯誤看原始碼的方式。

那要如何正確的分析原始碼呢?

我們的目標應該放在最常用的框架上面,下面就介紹兩個:一個是Spring,另一個是大家用來覺得一直不怎麼出問題的Mybatis。

△spring原始碼

 

一個Java程式設計師的阿里之路

 

 

△mybatis原始碼

 

一個Java程式設計師的阿里之路

 

微服務架構

微服務架構是一項在雲中部署應用和服務的新技術

微服務不需要像普通服務那樣成為一種獨立的功能或者獨立的資源

微服務作為一項在雲中部署應用和服務的新技術已成為當下最新的熱門話題

微服務的基本思想在於考慮圍繞著業務領域元件來建立應用,這些應用可獨立地進行開發、管理和加速。在分散的元件中使用微服務雲架構和平臺,使部署、管理和服務功能交付變得更加簡單。

使用微服務構建現代化應用程式是很有意義的,因為它讓你既利用了擴充套件橫向擴充套件架構,也利用縱向擴充套件架構;還額外得到API的組合,且在整個業務中可重複利用。可能,每一分鐘構都在交付新服務,這樣你就必須擁有一個敏捷的且響應的應用程式平臺,這一平臺一直在不斷改進中。

 

一個Java程式設計師的阿里之路

 

無論是想轉行還是大學生,怎麼學java很重要,不然浪費金錢和時間這對你來說都是你非常寶貴的,尤其是時間,看看行業大牛的建議吧,少走彎路本身你就已經贏了一半了,這是我的java學習裙:732308174,裙裡有不錯的學習教程,互幫互助。人脈資源和圈子很重要,看看現在的企業需求方向是什麼吧! 
 

分散式架構

什麼是分散式架構

分散式系統(distributed system) 是建立在網路之上的軟體系統。

內聚性:是指每一個數據庫分佈節點高度自治,有本地的資料庫管理系統。

透明性:是指每一個數據庫分佈節點對使用者的應用來說都是透明的,看不出是本地還是遠端。

一個Java程式設計師的阿里之路

 

分散式架構的應用

1、分散式檔案系統

例如:出名的有 Hadoop 的 HDFS, 還有 google的 GFS , 淘寶的 TFS 等

2、分散式快取系統

例如:memcache , hbase, mongdb 等

3、分散式資料庫

例如:mysql, mariadb, postgreSql 等

4、分散式webService

5、分散式計算

一個Java程式設計師的阿里之路

 

效能調優

我們不僅僅對專案要運籌帷幄,還要能解決一切效能問題。只有深入學習JVM底層原理,Mysql底層優化以及Tomcat調優,才能達到知其然,知其所以然的效果。除了效能優化之外,也能提供通用的常見思路以及方案選型的考慮點,幫助大家培養在方案選型時的意識、思維以及做各種權衡的能力。

一個Java程式設計師的阿里之路

開發工具工程化

通過一小段描述資訊來管理專案的構建,報告和文件的軟體專案管理工具。程式設計師的戰鬥,往往不是一個人的戰鬥,我們如何在一個平臺下高效的去重,進行程式碼review,對功能進行調整,debug,做到在統一的規劃下步步為營,混亂的堆程式碼的過程中找到自己的記錄。這一切都依賴於有效的工具。

一個Java程式設計師的阿里之路

 

專案實戰

要想立足於網際網路公司,且能在網際網路浪潮中不被淹沒,對於專案的開發實戰演練是不必可少的技能,也是對自身能力的一個衡量,有多少的量對等於獲得多少的回報。看似簡單的一個專案需求圖譜,其中的底層原理,實現原理又能知道多少?你搭建一個完整的B2C專案平臺到底需要多少知識?這一切都是需要我們考量的。

一個Java程式設計師的阿里之路

 

首先,你需要有深度的Java基礎知識:你會開始看《Java程式設計思想》、《Effective Java》。這兩本書絕非普通的基礎,而是至少擁有1~2年卓越的java開發者才有可能學完,而且這兩本書一般要讀完需要1年左右的時間。

其次,你需要看一些開源框架的原始碼,如果單單使用框架是實現業務而不去深入框架核心,架構思想,過幾年有可能會發現你脫離了框架什麼活也幹不成。

以上就是一些進階架構必須要掌握的一些知識點,當你掌握了這些知識點以後,難道還會擔心面試什麼的過不了嗎,不不,不存在的

最後總結下這將近四個月的面試心得:

  • 一定要積極的學習必要的技術知識點,像在 A 部門的三面時,由於基礎答得不是很好;所以最後我表達了自己的態度,對工作、技術的積極性。讓面試官看到你的潛力值得一個 HC 名額。
  • 面試過程中遇到自己的不會的可以主動提出,切不可不懂裝懂,這一問就露餡。可以將面試官引導到自己擅長的領域。比如當時我正好研究了鎖,所以和麵試官一聊就是半小時這就是加分項。
  • 平時要主動積累知識。寫部落格和參與開源專案就是很好的方式。
  • 部落格可以記錄自己踩過的坑,加深印象,而且在寫的過程中可以查漏補缺,最後把整個知識體系鞏固的比較牢固,良好的內容還可以得到意想不到的收穫,比如我第一次面試的機會。
  • GitHub 是開發者的一張名片,積極參與開源專案可以和全球大佬頭腦風暴,並且在面試過程中絕對是一個加分利器。
  • 面試官一般最後都會問你有什麼要問我的?千萬不要問一些公司福利待遇之類的問題。可以問下本次面試的表現?還有哪些需要完善的?從而知道自己答得如何也能補全自己。

還有一點:不要在某次面試失利後否定自己,有時真的不是自己能力不行。這個也講緣分。

塞翁失馬焉知非福