前言
最近有些朋友在面試阿里称诗,加上 Java-Interview 項(xiàng)目的原因也有小伙伴和我討論,近期也在負(fù)責(zé)部門的招牌铛绰,這讓我想起年初那段長達(dá)三個(gè)月的奇葩面試經(jīng)歷舞吭。
本來沒想拿出來說的,畢竟最后也沒成旨怠。
但由于那幾個(gè)月的經(jīng)歷讓我了解到了大廠的工作方式渠驼、對候選同學(xué)的考察重點(diǎn)以及面試官的套路等都有了全新的認(rèn)識(shí)。
當(dāng)然最重要的是這段時(shí)間的查漏補(bǔ)缺也讓自己精進(jìn)不少鉴腻。
先交代下背景吧:
從去年 12 月到今年三月底迷扇,我前前后后面了阿里三個(gè)部門。
其中兩個(gè)部門通過了技術(shù)面試爽哎,還有一個(gè)跪在了三面蜓席。
光看結(jié)果還不錯(cuò),但整個(gè)流程堪稱曲折课锌。
下面我會(huì)盡量描述流程以及大致的面試題目大綱厨内,希望對想要跳槽、正在面試的同學(xué)帶來點(diǎn)靈感渺贤,幫助可能談不上雏胃,但啟發(fā)還是能有。
以下內(nèi)容較長癣亚,請?jiān)俅蝹浜霉献影宓省?/p>
A 部門
首先是第一次機(jī)會(huì)丑掺,去年 12 月份有位大佬加我,后來才知道是一個(gè)部門的技術(shù) Leader 在網(wǎng)上看到我的博客述雾,問我想不想來阿里試試街州。
這時(shí)距離上次面阿里也過去一年多了,也想看看現(xiàn)在幾斤幾兩玻孟,于是便同意了唆缴。
在推薦一周之后收到了杭州打來的電話,說來也巧黍翎,那時(shí)候我正在機(jī)場候機(jī)面徽,距離登記還有大概一個(gè)小時(shí),心想時(shí)間肯定夠了。
那是我時(shí)隔一年多第一次面試趟紊,還是在機(jī)場這樣嘈雜的環(huán)境里氮双。多多少少還是有些緊張。
一面
二面
大概過了一周霎匈,二面如期而至戴差。
我聽聲音很熟,就嘗試問下是不是之前一面的面試官铛嘱,結(jié)果真是暖释。
由于二面的面試官臨時(shí)有事所以他來替一下。于是我趕緊問他能否把之前答的不好的再說說墨吓?的到了肯定的答復(fù)后開始了我的表演球匕。
有了第一次的經(jīng)驗(yàn)這一次自然也輕車熟路,原本感覺一切盡在掌握卻被告知需要筆試突然被激醒帖烘。
筆試是一個(gè)在線平臺(tái)亮曹,需要在網(wǎng)頁中寫代碼,會(huì)有一個(gè)明確的題目:
從一個(gè)日志文件中根據(jù)關(guān)鍵字讀取日志蚓让,記錄出現(xiàn)的次數(shù)乾忱,最后按照次數(shù)排序打印。
在這過程中切記要和面試官多多交流历极,因?yàn)楣P試有時(shí)間限制,別到最后發(fā)現(xiàn)題目理解錯(cuò)了衷佃,這就和高考作文寫完發(fā)現(xiàn)方向錯(cuò)了一樣要命趟卸。
而且在溝通過程中體現(xiàn)出你解題的思路,即使最終結(jié)果不對氏义,但說不定思考的過程很符合面試官的胃口哦锄列。這也和今年的高考改卷一樣;過程正確得高分惯悠,只有結(jié)果得低分邻邮。
三面
又過了差不多一周的時(shí)間接到了三面的電話,一般到了三面會(huì)是技術(shù) Leader 之類的角色克婶。
這個(gè)過程中不會(huì)過多強(qiáng)調(diào)技術(shù)細(xì)節(jié)筒严,更多的考察軟件能,比如團(tuán)隊(duì)協(xié)作情萤、學(xué)習(xí)能力等鸭蛙。
但我記得也問了以下一些技術(shù)問題:
談?wù)勀闼斫獾?HTTP 協(xié)議?
對 TCP 的理解筋岛?三次握手娶视?滑動(dòng)窗口?
基本算法,Base64 等肪获。
Java 內(nèi)存模型寝凌,Happen Before 的理解。
一周之后我接到了 HR 助理的電話約了和 HRBP 以及產(chǎn)品技術(shù)負(fù)責(zé)人的視頻面試孝赫。
但是我卻沒有面下去硫兰,具體原因得往下看。
B 部門
在 A 部門三面完成后寒锚,我等了差不多一星期劫映,這期間我卻收到了一封郵件。
大概內(nèi)容是他在 GitHub 上看到的我刹前,他們的技術(shù)總監(jiān)對我很感興趣(我都不敢相信我的眼鏡)泳赋,問我想不想來阿里試試。
我對比了 A B 部門的區(qū)別發(fā)現(xiàn) B 部門在做的事情上確實(shí)更加有誘惑力喇喉,之后我表達(dá)了有一個(gè)面試正在流程中的顧慮祖今;對方表示可以私下和我快速的進(jìn)行三面,如果一切沒問題再交由我自行選擇拣技。至少對雙方都是一個(gè)雙贏嘛千诬。
我想也不虧,并且對方很有誠意膏斤,就答應(yīng)試試徐绑;于是便有了下面的面試:
一面
面試官:
對 Java 鎖的理解?
博主:
我談到了 synchronize莫辨,Lock 接口的應(yīng)用傲茄。
面試官:
他們兩者的區(qū)別以及優(yōu)缺點(diǎn)呢?
博主:
synchronize 在 JDK1.6 之前稱為重量鎖沮榜,是通過進(jìn)出對象監(jiān)視器來實(shí)現(xiàn)同步的盘榨;1.6 之后做了 XX 優(yōu)化。蟆融。草巡。
而 ReentrantLock 是利用了一個(gè)巧妙數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,并且加鎖解鎖是顯式的型酥。山憨。。
之后又引申到分布式鎖冕末,光這塊就聊了差不多半個(gè)小時(shí)加酵。
之后又聊到了我的開源項(xiàng)目:
是如何想做這個(gè)項(xiàng)目的凰棉?
已經(jīng)有一些關(guān)注了后續(xù)是如何規(guī)劃的啃沪?
你今后的學(xué)習(xí)計(jì)劃是什么蝶防?
平時(shí)看哪些書?
之后技術(shù)聊的不是很多,但對于個(gè)人發(fā)展卻聊了不少蔑舞。
關(guān)于鎖相關(guān)的內(nèi)容可以參考這里:ReentrantLock 實(shí)現(xiàn)原理 synchronize 關(guān)鍵字原理
二面
隔了差不多一天的時(shí)間拒担,二面很快就來了。
內(nèi)容不是很多:
線程間通信的多種方式攻询?
限流算法从撼?單機(jī)限流?分布式限流钧栖?
提到了 Guava Cache ,了解它的實(shí)現(xiàn)原理嘛低零?
如何定位一個(gè)線上問題?
CPU 高負(fù)載拯杠?OOM 排查等掏婶?
聊完之后表示第二天應(yīng)該會(huì)有三面。
三面
三面的面試官應(yīng)該是之前郵件中提到的那位總監(jiān)大佬潭陪,以前應(yīng)該也是一線的技術(shù)大牛雄妥;聊的問題不是很多:
談?wù)剬?Netty 的理解?
Netty 的線程模型依溯?
寫一個(gè) LRU 緩存老厌。
筆試
本以為技術(shù)面試完了,結(jié)果后面告知所有的面試流程都得有筆試了黎炉,于是又參與了一次筆試:
交替打印奇偶數(shù)
這個(gè)相對比較簡單枝秤,基于鎖、等待喚醒機(jī)制都是可以的拜隧。最后也告知筆試通過宿百。
之后在推薦我的那位大佬的幫助下戲劇般的通過了整個(gè)技術(shù)輪(真的很感謝他的認(rèn)可),并且得知這個(gè)消息是在我剛好和 A 部門約好視頻面試時(shí)間之后洪添。
也就意味著我必須拒掉一個(gè)部門!
沒看錯(cuò)雀费,是我要拒掉一個(gè)干奢。這對我來說確實(shí)太難了,我壓根沒想過還有兩個(gè)機(jī)會(huì)擺在我面前盏袄。
最后憑著個(gè)人的愛好以及 B 部門的熱情我很不好意思的拒掉了 A 部門忿峻。。辕羽。
HR 面
在面這之前我從來沒有面過這樣大廠的 HR 流程逛尚,于是瘋狂搜索,希望能彌補(bǔ)點(diǎn)經(jīng)驗(yàn)刁愿。
也許這就是樂極生悲吧绰寞,我確實(shí)猜中了 HR 問的大部分問題,但遺憾的是最終依然沒能通過。
后來我在想如果我沒有拒掉 A 滤钱,會(huì)不會(huì)結(jié)局不一樣了觉壶?
但現(xiàn)實(shí)就是如此,沒有那么多假設(shè)件缸,并且每個(gè)人也得為自己的選擇負(fù)責(zé)铜靶!
大概的問題是:
為什么想來阿里?
個(gè)人做的最成功最有挑戰(zhàn)的事情是什么他炊?
工作中最難忘的經(jīng)歷争剿?
對加入我們團(tuán)隊(duì)有何期待?
C 部門
HR 這關(guān)被 Pass 之后沒多久我居然又收到了第三個(gè)部門的邀約痊末。
說實(shí)話當(dāng)時(shí)我是拒絕的蚕苇,之前經(jīng)歷了將近兩個(gè)月的時(shí)間卻沒能如愿我內(nèi)心是崩潰的。
我向聯(lián)系我的大佬表達(dá)了我的想法舌胶,他倒覺得我最后被 pass 的原因是個(gè)小問題捆蜀,再嘗試的話會(huì)有很大的幾率通過。
我把這事給朋友說了之后也支持我再試試幔嫂,反正也沒啥損失嘛辆它,而且面試的狀態(tài)還在。
所以我又被打了雞血履恩,才有了下面的面試經(jīng)過:
一面
面試官:
服務(wù)化框架的選型和差異锰茉?
博主:
一起探討了 SpringCloud、Dubbo切心、Thrift 的差異飒筑,優(yōu)缺點(diǎn)等。
面試官:
一致性 Hash 算法的原理绽昏?
博主:
將數(shù)據(jù) Hash 之后落到一個(gè) 0 ~ 2^32-1 構(gòu)成的一個(gè)環(huán)上协屡。。全谤。肤晓。
面試官:
談?wù)勀憷斫獾?Zookeeper?
博主:
作為一個(gè)分布式協(xié)調(diào)器认然。补憾。。
面試官:
如何處理 MQ 重復(fù)消費(fèi)卷员?
博主:
業(yè)務(wù)冪等處理盈匾。。毕骡。削饵。
面試官:
客戶端負(fù)載算法岩瘦?
博主:
輪詢、隨機(jī)葵孤、一致性 Hash担钮、故障轉(zhuǎn)移、LRU 等尤仍。箫津。
面試官:
long 類型的賦值是否是原子的?
博主:
不是宰啦。苏遥。。
面試官:
volatile 關(guān)鍵字的原理及作用赡模?happen Before田炭?
博主:
可見性、一致性漓柑。教硫。
二面
一面之后大概一周的時(shí)間接到了二面的電話:
原以為會(huì)像之前一樣直接進(jìn)入筆試,這次上來先簡單聊了下:
談?wù)剬ξ⒎?wù)的理解辆布,好處以及弊端瞬矩?
分布式緩存的設(shè)計(jì)?熱點(diǎn)緩存锋玲?
之后才正式進(jìn)入筆試流程:
這次主要考察設(shè)計(jì)能力景用,其實(shí)就是對設(shè)計(jì)模式的理解?能否應(yīng)對后續(xù)的擴(kuò)展性惭蹂。
筆試完了之后也和面試官交流伞插,原以為會(huì)是算法之類的測試,后來得知他能看到前幾輪的筆試情況盾碗,特地挑的沒有做過的方向媚污。
所以大家也不用刻意去押題,總有你想不到的廷雅,平時(shí)多積累才是硬道理杠步。
三面
又過了兩周左右,得到 HR 通知榜轿;希望能過去杭州參加現(xiàn)場面試。并且阿里包了來回的機(jī)票酒店等朵锣。
可見阿里對人才渴望還是舍得下成本的谬盐。
既然都這樣了,就當(dāng)成一次旅游所以去了一趟杭州诚些。
現(xiàn)場面的時(shí)候有別于其他面試飞傀,是由兩個(gè)面試官同時(shí)參與:
給一個(gè)場景皇型,談?wù)勀愕募軜?gòu)方式。
這就對平時(shí)的積累要求較高了砸烦。
還有一個(gè)印象較深的是:
在網(wǎng)頁上點(diǎn)擊一個(gè)按鈕到服務(wù)器的整個(gè)流程弃鸦,盡量完整。
其實(shí)之前看過幢痘,好像是 Google 的一個(gè)面試題唬格。
完了之后讓我回去等通知,沒有見到 HR 我就知道涼了颜说,果不其然购岗。
總結(jié)
看到這里的朋友應(yīng)該都是老鐵了,我也把上文提到的大多數(shù)面試題需要掌握的一些技術(shù)知識(shí)點(diǎn)分享給大家
源碼分析
程序員每天都和代碼打交道门粪。經(jīng)過數(shù)年的基礎(chǔ)教育和職業(yè)培訓(xùn)喊积,大部分程序員都會(huì)「寫」代碼,或者至少會(huì)抄代碼和改代碼玄妈。但是乾吻,會(huì)讀代碼的并不在多數(shù),會(huì)讀代碼又真正讀懂一些大項(xiàng)目的源碼的拟蜻,少之又少绎签。這也造成了很多錯(cuò)誤看源碼的方式。
那要如何正確的分析源碼呢瞭郑?
我們的目標(biāo)應(yīng)該放在最常用的框架上面辜御,下面就介紹兩個(gè):一個(gè)是Spring,另一個(gè)是大家用來覺得一直不怎么出問題的Mybatis屈张。
△spring源碼
△mybatis源碼
微服務(wù)架構(gòu)
微服務(wù)架構(gòu)是一項(xiàng)在云中部署應(yīng)用和服務(wù)的新技術(shù)
微服務(wù)不需要像普通服務(wù)那樣成為一種獨(dú)立的功能或者獨(dú)立的資源
微服務(wù)作為一項(xiàng)在云中部署應(yīng)用和服務(wù)的新技術(shù)已成為當(dāng)下最新的熱門話題
微服務(wù)的基本思想在于考慮圍繞著業(yè)務(wù)領(lǐng)域組件來創(chuàng)建應(yīng)用擒权,這些應(yīng)用可獨(dú)立地進(jìn)行開發(fā)、管理和加速阁谆。在分散的組件中使用微服務(wù)云架構(gòu)和平臺(tái)碳抄,使部署、管理和服務(wù)功能交付變得更加簡單场绿。
使用微服務(wù)構(gòu)建現(xiàn)代化應(yīng)用程序是很有意義的剖效,因?yàn)樗屇慵壤昧藬U(kuò)展橫向擴(kuò)展架構(gòu),也利用縱向擴(kuò)展架構(gòu)焰盗;還額外得到API的組合璧尸,且在整個(gè)業(yè)務(wù)中可重復(fù)利用“揪埽可能爷光,每一分鐘構(gòu)都在交付新服務(wù),這樣你就必須擁有一個(gè)敏捷的且響應(yīng)的應(yīng)用程序平臺(tái)澎粟,這一平臺(tái)一直在不斷改進(jìn)中蛀序。
無論是想轉(zhuǎn)行還是大學(xué)生欢瞪,怎么學(xué)java很重要,不然浪費(fèi)金錢和時(shí)間這對你來說都是你非常寶貴的徐裸,尤其是時(shí)間遣鼓,看看行業(yè)大牛的建議吧,少走彎路本身你就已經(jīng)贏了一半了重贺,這是我的java學(xué)習(xí)裙:732308174骑祟,裙里有不錯(cuò)的學(xué)習(xí)教程,互幫互助檬姥。人脈資源和圈子很重要曾我,看看現(xiàn)在的企業(yè)需求方向是什么吧!?
分布式架構(gòu)
什么是分布式架構(gòu)
分布式系統(tǒng)(distributed system) 是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)健民。
內(nèi)聚性:是指每一個(gè)數(shù)據(jù)庫分布節(jié)點(diǎn)高度自治抒巢,有本地的數(shù)據(jù)庫管理系統(tǒng)。
透明性:是指每一個(gè)數(shù)據(jù)庫分布節(jié)點(diǎn)對用戶的應(yīng)用來說都是透明的秉犹,看不出是本地還是遠(yuǎn)程蛉谜。
分布式架構(gòu)的應(yīng)用
1、分布式文件系統(tǒng)
例如:出名的有 Hadoop 的 HDFS, 還有 google的 GFS , 淘寶的 TFS 等
2崇堵、分布式緩存系統(tǒng)
例如:memcache , hbase, mongdb 等
3型诚、分布式數(shù)據(jù)庫
例如:mysql, mariadb, postgreSql 等
4、分布式webService
5鸳劳、分布式計(jì)算
性能調(diào)優(yōu)
我們不僅僅對項(xiàng)目要運(yùn)籌帷幄狰贯,還要能解決一切性能問題。只有深入學(xué)習(xí)JVM底層原理赏廓,Mysql底層優(yōu)化以及Tomcat調(diào)優(yōu)涵紊,才能達(dá)到知其然,知其所以然的效果幔摸。除了性能優(yōu)化之外摸柄,也能提供通用的常見思路以及方案選型的考慮點(diǎn),幫助大家培養(yǎng)在方案選型時(shí)的意識(shí)既忆、思維以及做各種權(quán)衡的能力驱负。
開發(fā)工具工程化
通過一小段描述信息來管理項(xiàng)目的構(gòu)建,報(bào)告和文檔的軟件項(xiàng)目管理工具患雇。程序員的戰(zhàn)斗跃脊,往往不是一個(gè)人的戰(zhàn)斗,我們?nèi)绾卧谝粋€(gè)平臺(tái)下高效的去重苛吱,進(jìn)行代碼review匾乓,對功能進(jìn)行調(diào)整,debug又谋,做到在統(tǒng)一的規(guī)劃下步步為營拼缝,混亂的堆代碼的過程中找到自己的記錄。這一切都依賴于有效的工具彰亥。
項(xiàng)目實(shí)戰(zhàn)
要想立足于互聯(lián)網(wǎng)公司咧七,且能在互聯(lián)網(wǎng)浪潮中不被淹沒,對于項(xiàng)目的開發(fā)實(shí)戰(zhàn)演練是不必可少的技能任斋,也是對自身能力的一個(gè)衡量继阻,有多少的量對等于獲得多少的回報(bào)》峡幔看似簡單的一個(gè)項(xiàng)目需求圖譜瘟檩,其中的底層原理,實(shí)現(xiàn)原理又能知道多少澈蟆?你搭建一個(gè)完整的B2C項(xiàng)目平臺(tái)到底需要多少知識(shí)墨辛?這一切都是需要我們考量的。
首先趴俘,你需要有深度的Java基礎(chǔ)知識(shí):你會(huì)開始看《Java編程思想》睹簇、《Effective Java》。這兩本書絕非普通的基礎(chǔ)寥闪,而是至少擁有1~2年卓越的java開發(fā)者才有可能學(xué)完太惠,而且這兩本書一般要讀完需要1年左右的時(shí)間。
其次疲憋,你需要看一些開源框架的源碼凿渊,如果單單使用框架是實(shí)現(xiàn)業(yè)務(wù)而不去深入框架核心,架構(gòu)思想,過幾年有可能會(huì)發(fā)現(xiàn)你脫離了框架什么活也干不成。
以上就是一些進(jìn)階架構(gòu)必須要掌握的一些知識(shí)點(diǎn)缚柳,當(dāng)你掌握了這些知識(shí)點(diǎn)以后埃脏,難道還會(huì)擔(dān)心面試什么的過不了嗎,不不喂击,不存在的
最后總結(jié)下這將近四個(gè)月的面試心得:
一定要積極的學(xué)習(xí)必要的技術(shù)知識(shí)點(diǎn)剂癌,像在 A 部門的三面時(shí),由于基礎(chǔ)答得不是很好翰绊;所以最后我表達(dá)了自己的態(tài)度佩谷,對工作、技術(shù)的積極性监嗜。讓面試官看到你的潛力值得一個(gè) HC 名額谐檀。
面試過程中遇到自己的不會(huì)的可以主動(dòng)提出,切不可不懂裝懂裁奇,這一問就露餡桐猬。可以將面試官引導(dǎo)到自己擅長的領(lǐng)域刽肠。比如當(dāng)時(shí)我正好研究了鎖溃肪,所以和面試官一聊就是半小時(shí)這就是加分項(xiàng)免胃。
平時(shí)要主動(dòng)積累知識(shí)。寫博客和參與開源項(xiàng)目就是很好的方式惫撰。
博客可以記錄自己踩過的坑羔沙,加深印象,而且在寫的過程中可以查漏補(bǔ)缺厨钻,最后把整個(gè)知識(shí)體系鞏固的比較牢固扼雏,良好的內(nèi)容還可以得到意想不到的收獲,比如我第一次面試的機(jī)會(huì)夯膀。
GitHub 是開發(fā)者的一張名片诗充,積極參與開源項(xiàng)目可以和全球大佬頭腦風(fēng)暴,并且在面試過程中絕對是一個(gè)加分利器诱建。
面試官一般最后都會(huì)問你有什么要問我的蝴蜓?千萬不要問一些公司福利待遇之類的問題⊥康瑁可以問下本次面試的表現(xiàn)励翼?還有哪些需要完善的?從而知道自己答得如何也能補(bǔ)全自己辜荠。
還有一點(diǎn):不要在某次面試失利后否定自己汽抚,有時(shí)真的不是自己能力不行。這個(gè)也講緣分伯病。
塞翁失馬焉知非福