記錄一次壯烈犧牲的阿里巴巴面試
前言
今天本是一個陽光明媚,鳥語花香的日子。于是我決定在逛街中感受春日的陽光~結(jié)果晚上七點的時候,螞蟻金服后端大佬來了電話,要進行一輪的技術(shù)面試。我一臉黑人問號???現(xiàn)在的面試都流行突襲嗎?
于是我的第一次面試之旅,就此壯烈的展開。
自我介紹
首先呢,大佬讓我用兩分鐘自我介紹。我本以為自己能滔滔不絕,將對方視作相親對象般全方位介紹自己。結(jié)果不到半分鐘,我就介紹完了==。
五秒鐘的沉默后,大佬嗯了一聲。
感覺自己的臉上堆滿了尷尬而不失禮貌的微笑。
最近的項目經(jīng)歷
這時大佬問我最近從事了什么項目,研究生階段都進行了什么樣的工作。
那必須吹一吹!從JAVA的起源到Spring的發(fā)展再到j(luò)enkin的使用順便提一嘴dva+antd,結(jié)果半分鐘一到,又說不下去了==
大佬很有耐心的聽我說了一堆語無倫次的話,開始進入正題。
Spring
大佬:我看你用過這個Spring啊,你來聊聊為什么我們要使用Spring呢?
我:(因為大家都說好?。┦紫饶?,spring是一個龐大的框架,它封裝了很多成熟的功能能夠讓我們無需重復(fù)造輪子。其次呢,它使用IOC進行依賴管理,我們就不用自己初始化實例啦。
大佬:(我就知道你會說IOC啦)那你解釋一下IOC吧
我:IOC就是依賴控制轉(zhuǎn)化,利用JAVA的反射機制,將實例的初始化交給Spring。Spring可以通過配置文件管理實例。
大佬:那我們可以直接使用工廠模式呀。工廠模式也可以管理實例的初始化呀,為什么一定要使用Spring呢?
我:啊........因為.......方便?(仿佛看到大佬凝固的表情,為了不那么尷尬,我決定轉(zhuǎn)移話題)。而且spring的IOC是單例模式呢。
大佬:默認的是實現(xiàn)是單例模式嗎?
我:對的。
這里查了一下為什么不用工廠模式而使用IOC。其實本質(zhì)上還是因為IOC是通過反射機制來實現(xiàn)的。當(dāng)我們的需求出現(xiàn)變動時,工廠模式會需要進行相應(yīng)的變化。但是IOC的反射機制允許我們不重新編譯代碼,因為它的對象都是動態(tài)生成的。
數(shù)據(jù)庫
大佬:你使用過哪些數(shù)據(jù)庫呀?
我:mysql還有sqlight。(被遺忘的mongodb在角落里無聲哭泣)
大佬:那你使用的ORM框架除了hibernate還有哪些,比如IBatis?
我:我用過MyBatis
大佬:哦,那你能講一下你對兩個框架使用后的感受嗎?
我:當(dāng)時使用Mybaits的時候,也有去社區(qū)了解了一下兩個框架的口碑,發(fā)現(xiàn)大家的戰(zhàn)隊都堅定而對立。對Hibernate的不滿通常是因為它在復(fù)雜關(guān)聯(lián)中往往會帶來嚴重的性能問題,也就是N+1的問題。但是它是面向?qū)ο笾С值淖詈玫目蚣芰恕6鳰ybatis則相對而言比較易于使用,只需要會SQL語句就行了。但是也意味著會破壞一些面向?qū)ο蟮囊?guī)則。
大佬:(似乎有點認可)那你了解數(shù)據(jù)庫的事務(wù)嗎?能講一下數(shù)據(jù)庫的事務(wù)級別嗎?
我:(忘得一干二凈)emmm不好意思我記不太清楚了。
大佬:那你還記得數(shù)據(jù)庫的加鎖嗎?比如樂觀鎖,悲觀鎖?
我:(求您別問了T T)
大佬:(鍥而不舍)那我現(xiàn)在假設(shè)有一張用戶表,你也知道,正常的表只能存放大概一千萬或是兩千萬左右的數(shù)據(jù)。但是阿里巴巴有上億的用戶?你會怎么存儲呢?
我:可以縱向分割與橫向分割。
大佬:那你覺得這里應(yīng)該縱向還是橫向呢?
我:縱向(載入史冊的嘴瓢)
大佬:(很有耐心)可是這樣我的數(shù)據(jù)庫還是放不下啊
我:(仿佛突然睡醒)應(yīng)該是橫向分割,把表拆分成多個表然后分布式存儲
大佬:那你覺得我們怎樣分割比較合適呢?
我:(還能再問?)可以根據(jù)地域,但是根據(jù)用戶分布的情況來說,還是會有某些地域訪問稠密而有些地域比較稀疏的問題。難道按照用戶等級?
大佬:不,用戶等級會變動,不合適。你這個階段暫時沒有考慮這個問題
我:(謝謝您的臺階?。。?/p>
Linux
大佬:你們服務(wù)器用的是什么操作系統(tǒng)啊?
我:(呀,送命題)我們用的是阿里云上的centos系統(tǒng)
大佬:那你對linux熟練嗎?
我:不是很熟悉,僅僅是入門,能夠敲一點指令。
大佬:好,那你知道庫函數(shù)和內(nèi)核調(diào)用嗎?
我:內(nèi)核調(diào)用是指進入內(nèi)核態(tài)然后執(zhí)行指令然后再回到用戶態(tài)嗎?
大佬:對
我:我知道的大概就這么多了,只了解一些概念上的內(nèi)容。(涼涼送給自己)
大佬:那你知道如何查看進程嗎?
我:啊...記不得了,我一般都查一下指令(于是大佬果斷放棄了其它linux問題)。
JVM
大佬:你了解JAVA虛擬機嗎?能解釋一下底層的模塊嗎?
我:(如果你通知我明天面試,我就了解了><)不好意思,這一塊知識我不熟悉,但是我很愿意去了解(趕緊表忠心?。。?/p>
線程
大佬:你知道什么是線程安全嗎?
我:(烏魯烏魯說了一堆)就是比如如果同時有兩個線程訪問同一個變量,那么它們對變量造成的修改所帶來的結(jié)果可能是不確定的。
大佬:那你知道JAVA有什么方法來實現(xiàn)線程安全嗎?
我:(前幾天還翻譯了博客,但是一問起來忘得比啥都快)首先是synchronized修飾詞,然后JAVA還自己實現(xiàn)了一些封裝好的類比如LatchDown,Atomic系列(????????后來一查是CountDownLatch!還有大明湖畔的final關(guān)鍵字呢?還有小明湖畔的Lock呢?還有那些實現(xiàn)線程的collections比如ConcurrentHashMap呢?)
大佬果然開啟了下一個問題。
分布式
大佬:你有寫過分布式的業(yè)務(wù)嗎?
我:我寫過一個基于HDFS分布式存儲的KVStore,上層使用Hadoop的API實現(xiàn)。
大佬:那個是分布式存儲,我想了解一下分布式業(yè)務(wù)?
我:(趕緊糾正)那dubbo算嗎?(于是介紹了一下自己了解的dubbo)
大佬:ok。那你覺得分布式的話會遇到什么問題呢?
我:那就是經(jīng)典的CAP問題了。沒有數(shù)據(jù)庫能夠同時滿足這三個問題
大佬:那你能具體解釋一下CAP代表什么嗎?
我:(緊張到一片空白)Consistency?Atomic?P...Persistency???
大佬:。。。。。。
CAP:是指Consistency一致性,Availability可用性,Partition Tolerance分區(qū)容忍性
設(shè)計模式
大佬:你了解過設(shè)計模式嗎?
我:了解了解
大佬:那你了解過哪些設(shè)計模式呢?
我:blablabla
大佬:那你解釋一下指令模式吧
我:這個有點像函數(shù)式編程的思想。指令模式就是指將各個操作封裝為統(tǒng)一的接口,并且提供各個操作的實現(xiàn)類。這樣我們只需要面向command接口編程,解除了調(diào)用類和指令之間的強耦合。
總結(jié)
最后當(dāng)然和大佬話一話家常,進行最后的掙扎??偨Y(jié)來說,要想成功進行一次阿里巴巴的面試,你需要了解甚至掌握以下內(nèi)容:
- JAVA語言,尤其是線程
- JVM原理
- 數(shù)據(jù)庫(事務(wù),加鎖,ORM)
- Linux
- Spring(重點!)
- 分布式
- 設(shè)計模式
可以說是涉及范圍非常廣了。不過其實要想成為一名優(yōu)秀的后端開發(fā),是需要這些知識面的,只能說自己還是太菜了。要繼續(xù)深入學(xué)習(xí)!