記阿里的一次壯烈犧牲

做者:raledong
出處:https://segmentfault.com/a/1190000013329013java

1、前言

今天本是一個陽光明媚,鳥語花香的日子。因而我決定在逛街中感覺春日的陽光~結果晚上七點的時候,螞蟻金服後端大佬來了電話,要進行一輪的技術面試。我一臉黑人問號???如今的面試都流行突襲嗎?
因而個人第一次面試之旅,就此壯烈的展開。面試

2、自我介紹數據庫

首先呢,大佬讓我用兩分鐘自我介紹。我本覺得本身能口若懸河,將對方視做相親對象般全方位介紹本身。結果不到半分鐘,我就介紹完了==。編程

五秒鐘的沉默後,大佬嗯了一聲。segmentfault

感受本身的臉上堆滿了尷尬而不失禮貌的微笑。後端

3、最近的項目經歷

這時大佬問我最近從事了什麼項目,研究生階段都進行了什麼樣的工做。
那必須吹一吹!從Java的起源到Spring的發展再到Jenkins的使用順便提一嘴dva+antd,結果半分鐘一到,又說不下去了==設計模式

大佬頗有耐心的聽我說了一堆語無倫次的話,開始進入正題。安全

4、Spring

大佬:我看你用過這個Spring啊,你來聊聊爲何咱們要使用Spring呢?
我:(由於你們都說好啊)首先呢,Spring是一個龐大的框架,它封裝了不少成熟的功能可以讓咱們無需重複造輪子。其次呢,它使用IOC進行依賴管理,咱們就不用本身初始化實例啦。
大佬:(我就知道你會說IOC啦)那你解釋一下IOC吧
我:IOC就是依賴控制轉化,利用Java的反射機制,將實例的初始化交給Spring。Spring能夠經過配置文件管理實例。
大佬:那咱們能夠直接使用工廠模式呀。工廠模式也能夠管理實例的初始化呀,爲何必定要使用Spring呢?
我:啊........由於.......方便?(彷彿看到大佬凝固的表情,爲了避免那麼尷尬,我決定轉移話題)。並且Spring的IOC是單例模式呢。
大佬:默認的是實現是單例模式嗎?
我:對的。服務器

這裏查了一下爲何不用工廠模式而使用IOC。其實本質上仍是由於IOC是經過反射機制來實現的。當咱們的需求出現變更時,工廠模式會須要進行相應的變化。可是IOC的反射機制容許咱們不從新編譯代碼,由於它的對象都是動態生成的。微信

5、數據庫

大佬:你使用過哪些數據庫呀?
我:MySQL還有SqlLite。(被遺忘的MongoDB在角落裏無聲哭泣)
大佬:那你使用的ORM框架除了Hibernate還有哪些,好比iBatis?
我:我用過MyBatis
大佬:哦,那你能講一下你對兩個框架使用後的感覺嗎?
我:當時使用MyBatis的時候,也有去社區瞭解了一下兩個框架的口碑,發現你們的戰隊都堅決而對立。對Hibernate的不滿一般是由於它在複雜關聯中每每會帶來嚴重的性能問題,也就是N+1的問題。可是它是面向對象支持的最好的框架了。而MyBatis則相對而言比較易於使用,只須要會SQL語句就好了。可是也意味着會破壞一些面向對象的規則。
大佬:(彷佛有點承認)那你瞭解數據庫的事務嗎?能講一下數據庫的事務級別嗎?
我:(忘得一乾二淨)emmm很差意思我記不太清楚了。
大佬:那你還記得數據庫的加鎖嗎?好比樂觀鎖,悲觀鎖?
我:(求您別問了T T)
大佬:(持之以恆)那我如今假設有一張用戶表,你也知道,正常的表只能存放大概一千萬或是兩千萬左右的數據。可是阿里巴巴有上億的用戶?你會怎麼存儲呢?
我:能夠縱向分割與橫向分割。
大佬:那你以爲這裏應該縱向仍是橫向呢?
我:縱向(載入史冊的嘴瓢)
大佬:(頗有耐心)但是這樣個人數據庫仍是放不下啊
我:(彷彿忽然睡醒)應該是橫向分割,把表拆分紅多個表而後分佈式存儲
大佬:那你以爲咱們怎樣分割比較合適呢?
我:(還能再問?)能夠根據地域,可是根據用戶分佈的狀況來講,仍是會有某些地域訪問稠密而有些地域比較稀疏的問題。難道按照用戶等級?
大佬:不,用戶等級會變更,不合適。你這個階段暫時沒有考慮這個問題
我:(謝謝您的臺階啊!)

7、Linux

大佬:大家服務器用的是什麼操做系統啊?
我:(呀,送命題)咱們用的是阿里雲上的Cent OS系統
大佬:那你對Linux熟練嗎?
我:不是很熟悉,僅僅是入門,可以敲一點指令。
大佬:好,那你知道庫函數和內核調用嗎?
我:內核調用是指進入內核態而後執行指令而後再回到用戶態嗎?
大佬:對
我:我知道的大概就這麼多了,只瞭解一些概念上的內容。(涼涼送給本身)
大佬:那你知道如何查看進程嗎?
我:啊...記不得了,我通常都查一下指令
(因而大佬果斷放棄了其它Linux問題)

8、JVM

大佬:你瞭解JAVA虛擬機嗎?能解釋一下底層的模塊嗎?
我:(若是你通知我明天面試,我就瞭解了><)很差意思,這一塊知識我不熟悉,可是我很願意去了解(趕忙表忠心啊!)

9、線程

大佬:你知道什麼是線程安全嗎?
我:(烏魯烏魯說了一堆)就是好比若是同時有兩個線程訪問同一個變量,那麼它們對變量形成的修改所帶來的結果多是不肯定的。
大佬:那你知道JAVA有什麼方法來實現線程安全嗎?
我:(前幾天還翻譯了博客,可是一問起來忘得比啥都快)首先是synchronized修飾詞,而後JAVA還本身實現了一些封裝好的類好比LatchDown,Atomic系列(????????後來一查是CountDownLatch!還有大明湖畔的final關鍵字呢?還有小明湖畔的Lock呢?還有那些實現線程的Collections好比ConcurrentHashMap呢?)
(大佬果真開啓了下一個問題)

10、分佈式

大佬:你有寫過度布式的業務嗎?
我:我寫過一個基於HDFS分佈式存儲的KVStore,上層使用Hadoop的API實現。
大佬:那個是分佈式存儲,我想了解一下分佈式業務?
我:(趕忙糾正)那Dubbo算嗎?(因而介紹了一下本身瞭解的Dubbo)
大佬:ok。那你以爲分佈式的話會遇到什麼問題呢?
我:那就是經典的CAP問題了。沒有數據庫可以同時知足這三個問題
大佬:那你能具體解釋一下CAP表明什麼嗎?
我:(緊張到一片空白)Consistency?Atomic?P...Persistency???
大佬:.......

CAP: 是指Consistency一致性,Availability可用性,Partition Tolerance分區容忍性

11、設計模式

大佬:你瞭解過設計模式嗎?
我:瞭解瞭解
大佬:那你瞭解過哪些設計模式呢?
我:blablabla
大佬:那你解釋一下指令模式吧
我:這個有點像函數式編程的思想。指令模式就是指將各個操做封裝爲統一的接口,而且提供各個操做的實現類。這樣咱們只須要面向command接口編程,解除了調用類和指令之間的強耦合。

12、總結

最後固然和大佬話一話家常,進行最後的掙扎。總結來講,要想成功進行一次阿里巴巴的面試,你須要瞭解甚至掌握如下內容:

  • JAVA語言,尤爲是線程

  • JVM原理

  • 數據庫(事務,加鎖,ORM)

  • Linux

  • Spring(重點!)

  • 分佈式

  • 設計模式

能夠說是涉及範圍很是廣了。不過其實要想成爲一名優秀的後端開發,是須要這些知識面的,只能說本身仍是太菜了。要繼續深刻學習!

文章有不當之處,歡迎指正,你也能夠關注個人微信公衆號:好好學java,獲取優質視頻教程資源。

相關文章
相關標籤/搜索