天天看點

【轉載】阿裡面試回來,想和Java程式員談一談

原文連結:http://www.techug.com/post/alibaba-interview-java-programmer.html

其實本來真的沒打算寫這篇文章,主要是我得記憶力不是很好,不像一些記憶力強的人,面試完以後,幾乎能把自己和面試官的對話都給記下來。我自己當初面試完以後,除了記住一些聊過的知識點以外,具體的内容基本上忘得一幹二淨,是以寫這篇文章其實是很有難度的。

但是,最近問我的人實在是太多了,為了避免重複回答,給自己省點力氣,幹脆就在這裡統一回複了。

其實之前我寫過一篇文章,但是那篇文章更多的是在讨論“面試前該不該刷題”這個話題,而這篇文章将會更加聚焦在面試前如何準備,以及工作當中如何學習這個話題上,而且會盡量寫出一些幹貨。

第一個問題:阿裡面試都問什麼?

這個是讓我最頭疼的一個問題,也是群裡的猿友們問的最多的一個問題。

說實話,我隻能隐約想起并發、JVM、分布式、TCP/IP 協定這些個關鍵字,具體的問題真的是幾乎都沒記住。而且就算我記住了,也告訴你了,你也背會了,但我覺得,在面試中,你被問到一模一樣問題的可能性依然很小。

甚至,就算你運氣好被問到了,你也照着背下來了,也不一定就能對你的面試起到正面的作用,因為面試官萬一多問一句,你可能就露餡了,那還不如幹脆點說不會更好。

我參加的是阿裡的社招面試,而社招不同于校招,問題的範圍其實是很随機的。因為能參加一些比較知名的網際網路公司社招的人,70% 以上都會有個3-5 年的經驗。這倒不是說一兩年經驗的同學沒有機會進這些公司,而是因為這種公司,大部分情況下隻招一些比較資深的開發和應屆生,而不招那些處于中間階段的 人。而1-2 年經驗的同學,往往就剛好處于這個尴尬的階段。

對于能有3-5 年經驗的這部分人中,每個人的經曆又都不同,所擅長的點也不一樣,是以這就會導緻每個人的問題和範圍都不太一樣。

很少說有哪個知名的網際網路公司,比如 BAT、京東、360、搜狐、網易等這些公司,其社招面試還有固定的問題和模式,讓你可以像應屆生面試一樣,在面試前靠臨時抱佛腳度過這一關。

大部分公司在社招的時候,不光是阿裡,其它公司也都一樣(因為我在一年多前也參加過很多其它知名網際網路公司的面試,詳情見《記錄 2015 年年初跳槽的經曆!》),基本上都分為兩個階段的提問。

第一個階段是主語言本身以及它的進階特性,第二個階段是講述自己的項目,并在中間穿插着問題。

是以,我不妨就這兩個階段,談談社招面試的準備,而不是去把阿裡面試的過程背一遍。說實話,我也确實記不住,是以不要再問我阿裡面試都會問哪些問題了,你看看上面那個連接配接裡的文章,也會發現,我裡面也基本上沒有寫具體的問題,原因是一樣的,真的記不住啊。(就是因為記憶力的問題,導緻我從小偏科,文科成績一直堪憂,-_-)

社招面試如何準備  

我會分為四個部分來談論這個問題,由于我本身是 Java 出身,是以關于主語言的問題,都是與 Java 相關,其它語言的同學可以選擇性忽略。此外,面試的時候一般面試官的問題都是環環相扣,逐漸深入的,這點在下面大家可以更明顯的感受出來。

1、主語言本身以及它的進階特性。

程式員專屬禮品:程式設計水杯

程式員專屬禮品:程式設計水杯

主語言當然就是你平日裡拿來賺錢的家夥。不要告訴我你沒有主語言,你會N多種語言,或者是你精通N多種語言,你要非這麼說的話,你可以來杭州試試,我保證不打死你,最多打殘。

我的主語言很顯然是 Java,那麼對于 Java 來說,它的語言本身以及它的進階特性,都有哪些比較容易在面試中問到呢?

一般情況下,主要有以下知識點很容易被問到。(PS:以下所列舉的,都是一些 Java 相對而言比較進階一點的知識點,因為這裡談的是社招,而不是校招)

1)Java 的資料結構相關的類實作原理,比如 LinkedList,ArrayList,HashMap,TreeMap 這一類的。以下簡單模拟一個資料結構的連環炮。

比如,面試官先問你 HashMap 是不是有序的?

你肯定回答說,不是有序的。那面試官就會繼續問你,有沒有有順序的 Map 實作類?

你如果這個時候說不知道的話,那這個問題就到此結束了。如果你說有 TreeMap 和 LinkedHashMap。

那麼面試官接下來就可能會問你,TreeMap 和 LinkedHashMap 是如何保證它的順序的?

如果你回答不上來,那麼到此為止。如果你依然回答上來了,那麼面試官還會繼續問你,你覺得它們兩個哪個的有序實作比較好?

如果你依然可以回答的話,那麼面試官會繼續問你,你覺得還有沒有比它更好或者更高效的實作方式?

如果你還能說出來的話,那麼就你所說的實作方式肯定依然可以問你很多問題。

以上就是一個面試官一步一步提問的例子。是以,如果你了解的不多,千萬不要敷衍,因為可能下一個問題你就暴露了,還不如直接說不會,把這個問題結束掉,趕緊切換到你熟悉的領域。

2)Java 并發包當中的類,它們都有哪些作用,以及它們的實作原理,這些類就是 java.concurrent 包下面的。與上面一樣,咱們也簡單的模拟一個并發包的連環炮。

比如面試官可能會先問你,如果想實作所有的線程一起等待某個事件的發生,當某個事件發生時,所有線程一起開始往下執行的話,有什麼好的辦法嗎?

這個時候你可能會說可以用栅欄(Java 的并發包中的 CyclicBarrier),那麼面試官就會繼續問你,你知道它的實作原理嗎?

如果你繼續回答的話,面試官可能會繼續問你,你還知道其它的實作方式嗎?

如果你還能說出很多種實作方式的話,那麼繼續問你,你覺得這些方式裡哪個方式更好?

如果你說出來某一個方式比較好的話,面試官依然可以繼續問你,那如果讓你來寫的話,你覺得還有比它更好的實作方式嗎?

如果你這個時候依然可以說出來你自己更好的實作方式,那麼面試官肯定還會揪着這個繼續問你。

為什麼說面試的時候要引導面試官,原因就在這了。因為面試官的提問很多時候都是有迹可循的,你如果抓住了他的軌迹,能夠猜到他下面很可能會問什麼,那你在回答的時候就可以往你想要談的方向去說。這樣面試時就會顯得更加從容,更加的遊刃有餘。

3)IO 包和 NIO 包中的内容。這部分裡面 NIO 會是重點,IO 包大部分都會比較熟悉,是以可能會直接略過,直接問你 NIO 的内容。

IO 包和 NIO 包的内容相對來說不是很多,首先 NIO 模型要熟悉,特别是其中的 selector 一定要非常清楚它的職責和實作原理。其實 NIO 的核心是 IO 線程池,一定要記住這個關鍵點。有的時候,面試官可能也會問你 IO 包的設計模式(裝飾器模式),為什麼要這樣設計?

有的面試官還會問你有沒有更好的設計,這個時候如果你不知道請果斷說自己現在的水準有限,想不出來更好的設計,千萬不要信口開河,随意 YY。

4)Java 的虛拟機的内容。這部分主要包括三部分,GC、類加載機制,以及記憶體。

一個 GC 部分簡單的連環炮。

面試官可以先問你什麼時候一個對象會被 GC?

接着繼續問你為什麼要在這種時候對象才會被 GC?

接着繼續問你 GC 政策都有哪些分類?

你如果說出來了,繼續問你這些政策分别都有什麼優劣勢?都适用于什麼場景?

你繼續說出來了以後,給你舉個實際的場景,讓你選擇一個 GC 政策?

你如果選出來了,繼續問你,為什麼要選擇這個政策?

下面是關于類加載機制的簡單連環炮。

首先肯定是先問你 Java 的類加載器都有哪些?

回答了這些以後,可能會問你每個類加載器都加載哪些類?

說完以後,可能會問你這些類加載之間的父子關系是怎樣的?

你在回答的時候可能會提到雙親委派模型,那麼可以繼續問你什麼是雙親委派模型?

你解釋完了以後,可能會繼續問你,為什麼 Java 的類加載器要使用雙親委派模型?

你回答完以後,可能會繼續問你如何自定義自己的類加載器,自己的類加載器和 Java 自帶的類加載器關系如何處理?

再來一個關于記憶體的連環炮。

首先肯定就是問你記憶體分為哪幾部分,這些部分分别都存儲哪些資料?

然後繼續問你一個對象從建立到銷毀都是怎麼在這些部分裡存活和轉移的?

接着可能會問你,記憶體的哪些部分會參與 GC 的回收?

完事以後,可能還會問你 Java 的記憶體模型是怎麼設計的?

你回答了以後,還會繼續問你為什麼要這麼設計?

問完以後,還可能會讓你結合記憶體模型的設計談談 volatile 關鍵字的作用?

你在談的時候,肯定會提到可見性,那麼接着可見性這三個字,還可以繼續問你并發的内容。

基本上 Java 語言本身以及語言稍微進階點的内容就是以上部分,如果你能把以上四部分了解的非常透徹,那基本上 Java 這部分就沒啥問題了,因為光以上的内容就夠你跟面試官聊很久了。你聊這些聊得久了,自然問你其它問題的時間就會短點。

你從我寫這些問題的過程也應該能感受出來,很多時候,面試官都是順着一條線一路問下去的,如果你覺得這條線你不熟悉的話,就要及時拐彎,引導面試官去問其它方面的問題。千萬不要一直往下深入,直到自己跳不出來為止,那就尴了個尬了。

2、講述自己的項目,并在中間穿插着問題

這一部分是面試過程中必問,也是聊得最久的一個階段。除非你前面的語言部分非常紮實,紮實到面試官問了一兩個小時,依舊沒有探出你對語言本身的了解到底有多深。否則的話,你一定逃不過自己的項目這一關,而且一般情況下聊得時間不會太短。

這一部分内容,一般的模式就是你自己去講你做過的項目,然後面試官會冷不丁的讓你去解釋其中某一部分,比如讓你解釋當時為什麼要這麼做,或者問 你現在覺得有沒有更好的辦法。而這些穿插的問題,大部分與你的項目所用到的技術有關。而你需要做的,就是充分、再充分的去總結自己做過的項目(尤其是最近 的一兩個項目),挖掘出一個甚至N個亮點,以備于到時候可以讓面試官産生眼前一亮的感覺。如果你能達到這種效果的話,基本上離你成功就不遠了。

這部分内容由于和每個人自己的經曆息息相關,是以這裡也沒法列舉可能問到的問題。這篇文章《程式員面經:面試前到底該不該刷題以及面試前該如何準備》是我之前寫的,裡面大概讨論了下如何在面試前總結,有興趣的可以去了解一下。

3、額外的加分項

上面兩個階段基本上是必問的,還有一些加分項。這些加分項中,有些内容面試官也會問你(比如 TCP/IP 協定、算法),但更多的是會先問你了解不了解,你了解的話再繼續聊,不了解的話就直接略過了,不至于因為這種問題而直接把你打入地獄。

下面我列舉一下這些加分項,如果可以的話,這些加分項還是要争取一下的。

1、計算機系統原理。

2、網絡通信協定(TCP/IP,HTTP 等)。

3、資料結構與算法。

4、著名開源項目的源碼。

5、你自己有很棒的開源項目。

6、你的個人部落格。

7、待評論區補充。

這幾項當中,對于前1-3 項,如果你之前就比較了解,隻是由于時間問題忘記了的話,還是可以臨時抱佛腳一下的。至于後面4-6 項,就需要你日常的積累了,不是一時半會兒能做到的。如果你平日裡沒有積累,那麼後面這三個加分項隻能抛棄了。

4、與你職位相關的内容

其實這最後一項是對前面三項的補充,你應該盡量去主攻和你面試的職位相關的内容。比如你面試一個實時計算的職位,那麼你的算法最好要厲害,對于著名的實時計算開源項目要熟悉,最好閱讀過源碼,而且還要對分布式系統有一定的見解。

是以,這個第 4 部分沒有具體的内容,隻是提醒你,如果你很明确自己的面試職位,最好在面試前準備的時候,盡量朝職位的需求方向靠攏,這樣成功的可能性更大。

對于 Java 程式猿學習的建議

這一部分其實也算是今天的重點,這一部分用來回答很多群裡的朋友所問過的問題,那就是我你是如何學習 Java 的,能不能給點建議?

今天我是打算來點幹貨,是以咱們就不說一些學習方法和技巧了,直接來談每個階段要學習的内容甚至是一些書籍。這一部分的内容,同樣适用于一些希望轉行到 Java 的同學。

在大家看之前,我要先聲明兩點。

1、由于我本人是 Java 後端開發出身,是以所推薦的學習内容是 Java Web 和 Java 後端開發的路線,非 Java Web 和 Java 後端開發的同學請适當參考其學習思想即可,切勿照搬。

2、下面對于【第一部分】的推薦内容,目的是讓你盡快成為一個可以參加工作的 Java 開發者,更适用于處于待業狀态,準備轉行 Java 的同學。如果你是在校學生,務必要在學好基礎(比如計算機系統、算法、編譯原理等等)的前提下,再考慮去進行下面的學習。

第一部分:對于尚未做過 Java 工作的同學,包括一些在校生以及剛準備轉行 Java 的同學。

一、Java 基礎

首先去找一個 Java 的基礎教程學一下,這裡可以推薦一個位址,或者你也可以參照這個位址上去找相應的視訊,位址為 http://www.runoob.com/java/java-tutorial.html。

學習 Java 基礎的時候,應該盡量多動手,很多時候,你想當然的事情,等你寫出來運作一下,你就會發現不是這麼回事兒,不信你就試試。

學完以上内容以後,你應該對 Java 有一個基本的了解了,你可以用 Java 語言寫出一些簡單的程式,并且你用的是最簡單的編輯器,比如記事本。

這個時候,不要急于進入下一部分,留下幾天好好寫一些程式,盡可能熟悉這些基礎内容。

二、Web 開發

等你寫上幾天程式以後,你往往會比較迷茫,因為你寫的東西似乎看起來毫無用處,比如實作一個簡單的電腦,讀取一個檔案等。這個時候你就應該去學着寫一些讓你覺得有意思的東西了,是以你應該學習更多的知識。

這些内容主要是 Web 開發相關的内容,包括 HTML/CSS/JS(前端頁面)、Servlet/JSP(J2EE)以及 Mysql(資料庫)相關的知識。

它們的學習順序應該是從前到後,是以最先學習的應該是 HTML/CSS/JS(前端頁面),這部分内容你可以去上面的那個 runoob 網站上找。你可以試着自己寫一些頁面,當然,你可以盡你最大的努力讓它變得最漂亮。這部分内容對于後端 Java 來說,理論上不是特别重要,但至少要達到可以自己寫出一些簡單頁面的水準。

接下來,你需要學習的是 Servlet/JSP(J2EE)部分,這部分是 Java 後端開發必須非常精通的部分,是以這部分是這三部分中最需要花精力的,而且這個時候,你要學會使用開發工具,而不能再使用記事本了,可以選擇 eclipse。

當你下載下傳安裝好 eclipse 以後,請視訊中的教程一步一步去學習,一定要多動手。關于 Servlet/Jsp 部分視訊的選擇,業界比較認可馬士兵的視訊,是以推薦給大家。當然了,我本人并沒有看過他的視訊,是以不好說的太絕對,如果大家自己有更好的選擇,可以堅持自己的,不要被我幹擾。

原本我也是打算出教學視訊的,但是由于時間問題,還是決定放棄了。但是如果你看視訊的過程中遇到了問題,歡迎來我的交流群提問,或者去鬥魚觀看我的直播提出你的問題,直播位址和群号都在我的個人部落格左側。

最後一步,你需要學會使用資料庫,mysql 是個不錯的入門選擇,而且 Java 領域裡主流的關系型資料庫就是 mysql。這部分一般在你學習 Servlet/Jsp 的時候,就會接觸到的,其中的 JDBC 部分就是資料庫相關的部分。你不僅要學會使用 JDBC 操作資料庫,還要學會使用資料庫用戶端工具,比如 navicat,sqlyog,二選一即可。

三、開發架構

當你學會以上内容以後,這個時候你還不足以參加工作,你還需要繼續深造。公司裡為了提高開發的效率,會使用一些 Java Web 架構,是以你還需要學習一些開發架構。

目前比較主流的是 SSM 架構,即 spring、springmvc、mybatis。你需要學會這三個架構的搭建,并用它們做出一個簡單的增删改查的 Web 項目。你可以不了解那些配置都是什麼含義,以及為什麼要這麼做,這些留着後面你去了解。但你一定要可以快速的利用它們三個搭建出一個 Web 架構,你可以記錄下你第一次搭建的過程,相信我,你一定會用到的。

還要提一句的是,你在搭建 SSM 的過程中,可能會經常接觸到一個叫 maven 的工具。這個工具也是你以後工作當中幾乎是必須要使用的工具,是以你在搭建 SSM 的過程中,也可以順便了解一下 maven 的知識。在你目前這個階段,你隻需要在網絡上了解一下 maven 基本的使用方法即可,一些高端的用法随着你工作經驗的增加,會逐漸接觸到的。

關于學習 SSM 架構的位址給大家推薦一個,這裡面有視訊,大家可以去觀看,位址是 http://edu.51cto.com/lesson/id-76468.html。

四、找工作

當你完成開發架構的學習以後,你就該找工作了,在校的找實習,畢業的找全職。與此同時,在找工作的同時,你不應該停下你的學習,準确的說,是你在以後都不能停下學習。

上面這些内容你隻是囫囵吞棗的學會了使用,你可以逐漸嘗試着去了解更多的東西,網絡是你最重要的老師。

第二部分:對于參加工作一年以内的同學。

恭喜你,這個時候,你已經擁有了一份 Java 的工作。這個階段是你成長極快的階段,而且你可能會經常加班。

但是加班不代表你就可以松懈了,永遠記得我說的那句話,從你入行那一刻起,你就要不停的學習。在這一年裡,你至少需要看完《Java 程式設計思想》這本書。這本書的内容是幫助你對于 Java 有一個更加深入的了解,是 Java 基礎的更新版。

這本書很厚,當初看這本書,我花了整整三個月。正常速度的話,應該可以在半年左右看完。我這裡不要求過高,隻要你在一年以内把這本書看完即可。當然了,我所說的看完,是充分吸收,而不是讀一遍就完事了,是以有些内容你可能會看不止一遍。

總而言之,這個階段的核心學習思想就是,在工作中實踐,并且更加深入的了解 Java 基礎。

第二部分:對于參加工作 1 年到 2 年的同學。

這部分時間段的同學,已經對 Java 有了一個更加深入的了解。但是對于面向對象的體會可能還不夠深刻,程式設計的時候還停留在完成功能的層次,很少會去考慮設計的問題。

于是這個時候,設計模式就來了。我當時看的是《大話設計模式》這本書,并且寫了完整版的設計模式部落格。是以,我要求大家,最多在你工作一年的時候,必須開始寫部落格,而設計模式就是你部落格的開端。

請記住,我所提的基本都是最低要求,是以不要有任何松懈的心理,否則五年後,你不要去羨慕别人高于你的工資,也不要去羨慕别人進入了某公司。

這一年,你必須對于設計模式了如指掌,《大話設計模式》可以作為你的開端。當然了,你也可以去看我的個人部落格去學習,位址是 http://www.cnblogs.com/zuoxiaolong/p/pattern26.html。

此外,設計模式并不是你這一年唯一的任務,你還需要看一些關于代碼編寫優化的書。比如《重構改善既有代碼的設計》,《effective java》。

總而言之,這個階段,你的核心任務就是提高你的代碼能力,要能寫出一手優雅的代碼。

第三部分:對于參加工作 2 年到 3 年的同學

有的同學在這個時候覺得自己已經很牛逼了,于是忍不住開始慢慢松懈。請記住,你還嫩的多。

這個階段,有一本書是你必須看的,它叫做《深入了解 Java 虛拟機》。這本書絕對是 Java 開發者最重要的書,沒有之一。在我眼裡,這本書的重要性還要高于《Java 程式設計思想》。

這本書的内容是幫助你全面的了解 Java 虛拟機,在這個階段,你一定已經知道 Java 是運作在 JVM 之上的。是以,對于 JVM,你沒有任何理由不了解它。我之前有寫過 JVM 系列的知識,可以去看一下,位址是 http://www.cnblogs.com/zuoxiaolong/category/508918.html。

另外,在過去 2 年的工作當中,你肯定或多或少接觸過并發。這個時候,你應該去更加深入的了解并發相關的知識,而這部分内容,我比較推薦《Java 并發程式設計實戰》這本書。隻要你把這本書啃下來了,并發的部分基本已經了解了十之六七。

與此同時,這個階段你要做的事情還遠不止如此。這個時候,你應該對于你所使用的架構應該有了更深入的了解,對于 Java 的類庫也有了更深入的了解。是以,你需要去看一些 JDK 中的類的源碼,也包括你所使用的架構的源碼。

這些源碼能看懂的前提是,你必須對設計模式非常了解。否則的話,你看源碼的過程中,永遠會有這樣那樣的疑問,這段代碼為什麼要這麼寫?為什麼要定義這個接口,它看起來好像很多餘?

由此也可以看出,這些學習的過程是環環相扣的,如果你任何一個階段拉下來了,那麼你就真的跟不上了,或者說是一步慢步步慢。而且我很負責的告訴你,我在這個階段的時候,所學習的東西遠多于這裡所羅列出來的。是以千萬不要覺得你已經學的很多了,我所說的這些都隻是最低要求,不光是 我,很多人在這個時間段所學習的内容都遠超本文的範圍。

如果你不能跟上節奏的話,若幹年後,如果不是程式猿市場還不錯的話,你很可能不僅僅是工資比别人低,公司沒别人好,而是根本就找不到工作。

總而言之,這個階段,你需要做的是深入了解 Java 底層和 Java 類庫(比如并發那本書就是 Java 并發包 java.concurrent 的内容),也就是 JVM 和 JDK 的相關内容。而且還要更深入的去了解你所使用的架構,方式比較推薦看源碼或者看官方文檔。

另外,還有一種學習的方式,在 2 年這個階段,也應該啟用了,那就是造輪子。

不要聽信那套“不要重複造輪子”的論調,那是公司為了節省時間成本編造出來的。重複造輪子或許對别人沒有價值,因為你造的輪子可能早就有了,而且一般情況下你造出來的輪子還沒有現存的好。但是對别人沒有價值,不代表對你自己沒有價值。

一個造輪子的過程,是一個從無到有的過程。這個過程可以對你進行系統的鍛煉,它不僅考察你的編碼能力,還考察你的架構設計能力,你需要讓你的輪子擁有足夠好的擴充性、健壯性。

而且在造輪子的過程中,你會遇到各種各樣的難題,這些難題往往又是你學習的契機。當你把輪子造好的時候,你一定會發現,其實你自己收獲了很多。

是以,這個階段,除了上面提到的了解 JVM、JDK 和架構源碼以外,也請你根據别人優秀的源碼,去造一個任何你能夠想象出來的輪子。

第四部分:參加工作 3 年到 4 年的同學

這個階段的同學,提升已經是很難了,而且這個階段的學習往往會比較多樣化。

因為在前 3 年的過程中,你肯定或多或少接觸過一些其它的技術,比如大資料、分布式緩存、分布式消息服務、分布式計算、軟負載均衡等等。這些技術,你能精通任何一項, 都将是你未來面試時巨大的優勢,是以如果你對某一項技術感興趣的話,這個時候可以深入去研究一下。這項技術不一定是你工作所用到的,但一定是相關的。

而且在研究一門新技術時,切忌朝三暮四。有的同學今天去整整大資料,搞搞 Hadoop、hbase 一類的東西。過不了一段時間,就覺得沒意思,又去研究分布式緩存,比如 redis。然後又過不了一段時間,又去研究分布式計算,比如整整 Mapreduce 或者 storm。

結果到最後,搞得自己好像什麼都會一樣,在履歷上大言不慚的寫上大資料、分布式緩存、分布式計算都了解,其實任何一個都隻是浮于表面。到時候面試官随便一問,就把你給識破了。

一定要記住,作為一個程式猿,平日裡所接觸的技術可能會很多,但是想要讓一門技術成為你的優勢,那麼一定是你對這門技術的了解強過絕大多數人才行。

是以在這個階段,你就不能再簡單的去學習前 3 年的内容了,雖然前面的學習如果還不夠深入的話依舊要繼續,但這個時候你應該更多的考慮建立你的優勢,也可以稱為差異性。

差異性相信不難了解,就是讓你自己變得與衆不同。你前面三年的學習足夠你成為一名基本合格的 Java 開發者,但你離成為一名優秀的 Java 開發者還有很大的距離。

所謂優秀,即能别人所不能。而你前三年所學習的内容,是很多做過幾年的 Java 開發都能夠掌握的。那麼為了讓自己有差異性,你就需要另辟蹊徑,找一個方向深入研究下去,以期在将來,你能夠成為這個領域的專家,比如分布式計算領域的專 家,大資料領域的專家,并發領域的專家等等。

此外,你除了建立你的差異性之外,還要去彌補你基礎上的不足,直到現在,我都沒有提及基礎知識。原因是基礎是很枯燥無味的,學的太早不僅容易懵逼,而且懵逼的同時還容易産生心理陰影,以至于以後再不想去研究這些基礎。但基礎又是 你深入研究一些領域時所必須掌握的,比如你去研究分布式計算,你不懂算法你玩個毛毛?比如你去做分布式緩存,你對計算機系統的記憶體不了解,你如何去做緩 存?

如果你的基礎本來就非常強,那麼恭喜你,相信你在之前的工作中已經充分體會到了這些基礎對你的幫助。但我相信大部分人的基礎都很薄弱,哪怕是科班畢業的人,很多人也不敢說自己當初的基礎學的多麼強大,比如算法、計算機系統原理、編譯原理這些。

但是每個人時間都是有限的,而且這些基礎的書籍每一本讀下來,沒個一年半載的,還真拿不下來,是以還是要有所抉擇的。雖然藝多不壓身,但問題是藝多是有代價的,是需要你付出時間和精力的,而我個人更贊成在同等代價的情況下擷取最大的收獲。

首先,我比較推崇的基礎書籍有三本,分别是《深入了解計算機系統》,《tcp/ip 詳解卷一、二、三》,《資料結構與算法》。其中 TCP/IP 有三本書,但我們這裡把這三本看成是一本大書。

這三本分别适合三種人,《深入了解計算機系統》比較适合一直從事 Java Web 開發和 APP 後端開發工作的人群。《tcp/ip 詳解卷一、二、三》比較适合做網絡程式設計的人群,比如你使用 netty 去開發的話,那麼就要對 TCP/IP 有更深入的了解。而《資料結構與算法》這本書,則比較适合做計算研究工作的人,比如剛才提到的分布式計算。

另外,我要強調的是,這裡所說的适合,并不是其它兩本對你就沒有用。比如你做 Java Web 和 APP 後端開發,《tcp/ip 詳解卷一、二、三》這本書對你的作用也是很大的。這裡隻是分出個主次關系而已,你要是時間足夠的話,能把三本都精讀那當然最好不過了。但如果時間有限的 話,那麼就先挑對你幫助最大的書去讀。

理論上來講,這一年你能把這三本其中一本精讀下來,就已經非常厲害了。有了基礎,有了前面的工作經驗,你就可以去開拓屬于你的領域了。

在這一年裡,一定要規劃好自己的領域,建立好自己的優勢,制造出差異性。如果你對自己的領域不夠清晰的話,随着你工作的時間日益增多,你接觸的技術會越來越多,這個時候,你很容易被淹死在技術的海洋裡,看似接觸的技術越來越多,會用的也越來越多,但你毫無優勢。

有的同學可能會問,“我,我也不知道我的領域是什麼啊?怎麼辦呢?”

對于這種人,我隻想說,“卧槽,這還問我?要不幹脆我替你學習得了,好不好?”

第五部分:參加工作 4 年到 5 年的同學

經過前面一年的曆練,相信你在自己所鑽研的領域已經有了自己一定的見解,這個時候,技術上你應該已經遇到瓶頸了。

這個時候不要着急提高自己的技術,已經是時候提高你的影響力了,你可以嘗試去一些知名的公司去提高你的背景,你可以發表一些文章去影響更多的 人。當然,你也可以去 Github 建立一個屬于你的開源項目,去打造自己的産品。這次的開源項目不同于之前的造輪子,你這個時候是真的要去盡量嘗試造出來真正對别人有價值的輪子。

技術學到這個階段,很容易遇到瓶頸,而且往往達到一定程度後,你再深入下去的收效就真的微乎其微了,除非你是專門搞學術研究的。然而很可惜,大部分程式猿做不到這一步,那是科學家做的事情。

這個時候提高影響力不僅僅是因為技術上容易遇到瓶頸,更多的是影響力可以給你創造更多的機會。程式猿在某種程度上和明星很像,一個好的電視劇和電影就可以成就一批明星,程式猿有的時候也是,一個好的項目就可以成就一群程式猿。

比如國内幾個脍炙人口的項目,像淘寶、支付寶、QQ、百度、微信等等。這每一個項目,都成就了一批程式猿。我敢說,這裡面任何一個項目,如果你是它的核心開發,光是這樣一個 Title,就已經是你非常大的優勢。更何況還不止如此,Title 說到底也是個名頭,更重要的是,這種項目在做的時候,對你的曆練一定也是非常給力的。

而你如果想要參與這樣的項目,除了靠運氣之外,影響力也是很重要的一個手段。比如你在分布式計算領域有一定的影響力,那麼如果有什麼好的關于分 布式計算的項目,對方就很可能會邀請你。就算人家不邀請你,你自己主動去面試的時候,對方如果知道你在這個領域的影響力,也肯定會起到很大的作用,而這個 作用,甚至可能會超過你現在的技術能力。

是以,在這個階段,你最大的任務是提高自己的影響力,為自己未來的十年工作生涯那一天做準備。如果你能夠靠你的影響力和以前積累的技術,參與到一個偉大的項目當中,那麼你後面的五年也就有着落了。

當然了,我現在滿打滿算,做程式猿也就 4 年半不到,是以關于 4 年到 5 年這一部分,我的見解不一定是對的,就算是對的,也不一定是适合任何人的。是以,希望大家自己有的判斷力,去決定到底該如何度過這一年。

結語

本文到此就基本結束了,整篇文章很長,但其實主要就說了兩部分内容,一個是社招面試的準備,一個是 Java 生涯的學習。

關于這兩部分,我已經給出了自己的見解,但是還是那句話,每個人吸收知識的時候,都要有抽取精華,去除糟粕的能力。我所說的,可能有些是對的,有些是錯的,有些是适合你的,有些是不太适合你的,你要自己能夠判斷。

其實你在生活和工作當中也是一樣的,你身邊的人形形色色,有的人你喜歡,有的人你很讨厭。但其實你喜歡的人也有缺點,你讨厭的人也有優點。你要學會從你讨厭的人身上學會他的優點,千萬不要一棒子打死,這隻會讓你失去很多學習成長的機會。

好了,說了這麼多了,就到此為止吧,希望本文可以幫助到作為程式猿或即将成為程式猿的你。

最後,如果你對阿裡巴巴技術感興趣,希望到阿裡巴巴平台上從事技術相關的崗位,可以試試這裡:招聘帖