如何拿到國內IT巨頭的Offer

        國內IT巨頭按Offer到手難度降序排列,大體分爲以下3個梯隊:
T1:百度,阿里,騰訊,...
T2:網易,迅雷,完美時空,360,金山,...
T3:華爲,中興,聯發科,...
Tx:壟斷類IT國企。如中國移動,...

T1主要是BAT三巨頭。他們對學生的技術能力與綜合素質都要求較高。他們尤爲喜歡尋找牛人。所以你必須有紮實的基礎的同時還要有本身的技術個性和特色,讓他們欣賞你。這些公司不管是實力仍是待遇都是一流的。但要注意這類公司太大,項目組太多,競爭也很激烈,所以要注意認真考慮你想去,並且對你而言有優點的項目組。
T2都是其所在領域的領軍企業。待遇會比T1稍低。他們須要基礎紮實的學生,若是你的項目或者技術方向符合他們所在的領域會頗有優點。(如遊戲領域偏心圖形學,安全領域偏向安全方向)
T3對學生的出生、資質最爲看重(雙211,四六級),甚至對性格有較爲挑剔的考察(華爲的性格測試反而刷掉不少技術較牛可是性格較怪癖的學生),專業考察的很基礎,但考察面較廣。html

Tx之因此給了個x,是由於他們和其餘的企業沒法比較。由於這類企業筆試考行測+專業基礎。面試考察綜合素質、表達能力,尤爲看重你的非技術方面的能力。所以不作本文的重點討論。linux

 

無堅不摧——完整項目

「當他說他是OpenCC的做者的那一刻,哪一個面試官不被秒殺。」
固然你不須要NB到這個程度。若是你能對面試官說:「我讀書期間作的項目有x萬行代碼。Google關鍵字xxx可搜到該項目的演示視頻」,就足夠了。
程序員的全部技術能力都能在一個完整的項目中獲得淋漓盡致的體現,所以賽過千言萬語的自我推銷。所謂的完整項目應該知足如下條件:
一、完整性。具備必定的功能,或者解決了某個問題,具備必定意義。
二、難度。  使用或者研究了一些較新技術,或者有必定價值的技術含量或研究內容。
三、工做量。是一個須要澆築必定心血的產出品。nginx

所以,當你決心把一個項目寫入你的簡歷中,你就必定要能回答出面試官的以下問題:git

一、你負責了哪一塊?
這個問題是想知道這個項目裏究竟有哪些代碼是你寫的,尤爲是多人合做的項目。你必須強調你所作的工做。
問題就出來了。不少時候咱們參與的項目,他的架構、核心技術你並不熟悉,而僅僅是寫了部分邏輯代碼,那怎麼辦呢?
解決辦法是,花時間去了解項目的核心,對項目的總體有清晰的認識,至少要達到可以表述的很清楚的程度(簡單的說就是能吹的頗有說服力。回想你答辯的情形)。
若是你作的那一塊確實微不足道,並且你也沒法表述項目全局,那就放棄說起這個項目吧,不然只能讓面試官越看你越以爲銼。
二、你用到了哪些技術?
這是最好發揮的一個問題。你能夠介紹項目用到的每一個開源庫,也能夠介紹你用到的源代碼管理工具(如SVN、GitHub),調試工具(如WinDbg)甚至項目管理工具(UML工具、VS Project等)。總之,這是一個很好表達你的項目綜合能力的機會。
若是上面的都不出彩,那嘗試從你的項目架構、設計模式、接口設計等方面入手。總之要站在一個較高的角度,空談項目的業務需求和邏輯意義不大(固然,充滿創意的項目除外)
三、你遇到的最大問題是什麼?如何解決的?
這個問題是最重要的,也是最具備回答技巧的問題。你必須說出一個聽起來確實很難解決,但你確實又解決(或者避開)的問題。
若是你實在沒有頭緒,或者你以爲項目確實太簡單,沒發現困難問題,不妨從這些方面思考:
有網絡功能的項目,考慮網絡傳輸效率和網絡同步等問題;
有多線程、多進程的項目,考慮他們之間的同步/互斥、負載、調度問題;
須要處理大數據的項目,考慮數據預處理、數據調度等問題;程序員

若是這個項目出了論文,那麼嘗試描述論文解決的問題;github

你解決問題的渠道,如MSDN、CSDN、開源社區的論壇、國外技術論壇、文檔手冊等。面試

面試官想要聽到的,是你發現問題、分析問題、尋找解決方案、最終解決問題的思路與方法。細節並不重要,由於他也未必能徹底弄懂每一個技術細節。redis

總之,一個完整的項目能讓你充分的表達你的技術能力。在項目這一塊上,你須要下足功夫。算法

若是很不幸你沒有,那麼請往下看。spring

 

深厚內功——堅實基礎

通常第一輪技術面都是來考察你最基本的技術功底。

招聘季節,隨處可見抱着厚厚的《程序員面試寶典》啃的學生。偶爾也能看見《編程之美》《劍指Offer》的神書。這些經驗書確實有用。可是要想全面的掌握筆試面試的基礎考點,仍是須要完整的複習。

其實,筆試面試對計算機基礎的考察是萬變不離其宗的。其考點無非分爲:

語言語法(以C/C++爲例)。
指針(數組),函數指針,操做符運算順序,const(常指針與指向常量指針),static四大用法,字符串(字符數組),字節對齊(sizeof),位運算。秒殺書籍:《C++ Primer》
面向對象
構造與析構順序、多態、重載、覆蓋、C++對象模型等。秒殺書籍:《深刻理解C++對象模型》。
數據結構
棧,隊列,鏈表(雙向、循環),樹,堆,哈希表。
基本算法
排序(最重要的是快速排序)、查找、圖算法、貪心算法、動態規劃。秒殺書籍:《算法導論》。
設計模式
考察最多的就是單例模式。只由於他實在是太常見又太簡單了。秒殺書籍:《設計模式》,《重構》。
數據庫
主要是SQL語句與存儲過程。

操做系統

進程與線程、互斥與同步、死鎖、進程間通訊,頁表,虛存等。秒殺書籍:《Windows核心編程》,《Unix核心編程》。

計算機網絡

ISO七層架構,TCP,UDP,IP地址等。

英語

有些公司喜歡出一些用英文描述的問題,或者英文翻譯題。看懂IT領域內的英文並不難,若是你平時使用MSDN、Google、StackOverFlow的話根本不是問題。

 

若是你還有充分的時間,建議認真看上面推薦的秒殺書籍。若是時間不夠,就有針對性的去掌握這些考點。
不得不吐槽的是,不少技術不錯的朋友,有着很好的項目,反而掛在了筆試的基礎知識考察上面。所以不要小看這些考點。該背的仍是要死背的。

筆試或者面試若是讓你在紙上寫程序,會有2種狀況:

一、寫一個函數或算法

不要由於題目簡單就想在最短的時間寫出來。請必定要注意,對全部參數作邊界檢測和有效檢測。這纔是考察的重點!

若是一個算法具體實現你記不清了,就寫僞代碼,在每行代碼後加上詳細註釋。若是是面試,寫完之後跟面試官解釋說具體的代碼你忘了,可是你記得算法思想,所以用了僞代碼。

若是具體思想也忘了,就嘗試用本身的思路解答問題。總之,儘可能別交白卷。

二、設計一個軟件或系統。

這種狀況不要求你寫詳細代碼。你須要在程序結構、框架、設計模式或者系統架構等方面進行設計。

這種框架性的東西最好先打草稿,想好了再從新畫一遍,把每一個模塊的功能,模塊之間的關係、各個模塊的功能接口畫出來,若是是面試,寫完之後給面試官詳細解釋。

這裏強調一點,是否懂得架構設計,是鑑別代碼菜鳥和熟手的重要指標。T級越高的公司,越偏向於考察架構層級的知識。好比百度筆試的最後一題常常是要求設計一個分佈式服務器系統。

 

錦上添花——無限潛力

一般技術一面是面基礎,二面更多的是雙方的進一步瞭解。如技術方向,技術潛力等。
若是二面面試官不問你技術問題,那麼你必定要積極主動的與他溝通,並表達你的意願。嘗試如下幾個方向:
一、表達你的技術潛力與熱情。
面試官可能會問你一些和技術看上去沒有任何關係的問題,好比問你最近在看什麼書,學習之餘喜歡作什麼,常去哪些網站之類的。
若是你說最近在看《誅仙》,平時喜歡玩LOL,你就是在把本身往懸崖上推。實際上面試官但願聽到的回答以下:
「我最近在看《C++ Primer第5版》,由於我在項目中用的C++11的特性愈來愈多了...」 
「我業餘時間喜歡看看TED,上面總有不少讓我激動的新技術出現...」
「前段時間比較閒的時候,和朋友參加了xxx組織的開發者大會...」
「虎嗅和獵雲是我獲取IT信息的常去地方...」

回答如此平凡的問題卻能體現你的閃光點。你是技術人員,請記住,告訴面試官你時刻對技術保持着激情,時刻關心的IT動態,比你告訴他你是學生會某幹部有用的多。(固然非技術人員,或者國企的面試除外!)

可是,必定要如實回答。面試官會針對你的回答進行緊逼追問。若是正好是他熟知的範疇,而你只是接觸過而沒有認真學習,就會陷入很尷尬的境地。

因此在回答這些問題的時候不用過於急着回答,不妨先想想,要有能預測到面試官針對你的回答會問什麼樣的問題的能力。

就像上面的例子,面試官問你最近看的書,你未必要選擇最近看的一本書,而是應該選擇一本你吃的比較透的,最好仍是面試官也會感興趣的書,這樣接下來的交流就能駕輕就熟。

總之,平時的積累纔是王道。

二、表達你的技術愛好。
進入正確公司的錯誤崗位,至關於考上了正確學校的錯誤專業。
因此請必定要記住,你的最終目的不是要進入該公司,而是要進入該公司你最想去的部門乃至項目組。

因此,試探得知面試官來自哪一個項目組也很關鍵,由於面試官可能跟你想去的項目組毫無關係。技術方向的不對口的面試官面試你,對你是不利的。

這個時候你要清楚的表達出你的技術方向,並注意考慮你想去的項目組收你的可能性。若是發現該組招的人少,或者加入難度大,你須要考慮是否表現出來你有一樣的熱情加入其餘項目組。

不服從分配可能致使你一無所得。你以前面試的表現越優秀,在這一步可以選擇的餘地就越大。

三、態度和情商。

若是你面試次數多了,拿的Offer多了,一般到了最後一面,有多大的但願能拿到Offer,你內心應該有所感受。

若是感受很差,最後一面你須要更努力表達你的優點。最後一面打動面試官的可能每每是你的真誠和熱情。

當面試官問你有多少Offer,不要害怕回答。Offer是企業對你能力的證實。有Offer的學生更容易被青睞。一般若是你有了該公司最大競爭對手的Offer,你能夠嘗試追求更好的崗位和待遇。但切忌用這個來漫天要價,除非你牛到了他們非要你不可的程度。

T3,Tx類的企業可能會問你一些很奇葩的問題。好比A公司問你他的競爭對手B公司怎麼樣。

不少計算機專業的學生思惟過於死板,說了大實話,好比」B公司是最大的xxx企業「,因而死的很完全。
你能夠說」A公司的優點在與xxx,而B公司的優點在於xxx。不過在我看來,我更欣賞A公司的xxx,由於xxx「
這類企業就是這樣。他們的面試和T1,T2企業的面試差異很大,你要學會拈輕怕重,這不是謊話,而是策略。

 

         如何進入BAT?怎麼一上來就寫心態?」

沒錯,LZ第一個要說的,就是心態!

緣由很簡單,文章下面即將提到的學習內容,若是你沒有一個好的心態,是不可能進行下去的。因此,先過了心態這一關,再來談別的吧,不然你確定會死在半路上的。

提及來,不少羣裏的新人都愛問LZ,「你是怎麼學習的?爲何我學不進去呢?爲何我一看書就困呢?」

以上這種現象,基本上就是兩個緣由,第一個緣由是心態浮躁,總以爲看書好像沒啥用啊,看了好像仍是以爲沒學到什麼,過不了多久就忘了。第二個緣由則是目標感不強,不知道本身要達到什麼程度纔算能夠,因此也就乾脆「一瓶子不滿,半瓶子晃盪」了。

針對第一個緣由,說到底就是個心態問題。總想着看書可以立竿見影,從菜鳥一會兒蛻變爲大神,若是你總是抱着這樣的心態去看書,你特麼不瞌睡纔是邪門了。

而第二個緣由,LZ以爲有時候人要適當的激發心裏的慾望,無慾無求這種高逼格的事,等你七老八十了再說,如今趁着年輕,心中有點慾望其實並非什麼壞處,只要你沒被慾望懵逼了雙眼就行。

提及慾望這事兒,LZ以爲有必要給你們看一下LZ當初的慾望,相信從這封郵件裏,你就能感覺出LZ當時的慾望。這種慾望,會激勵着你前進,可是你要切記,在前進的途中,調整好本身的心態,戒驕戒躁。

學習

說完心態,我們來談談學習這事兒,仍是老規矩,因爲LZ是Java後端出身,因此接下來的內容,會與Java後端息息相關,非Java後端的同窗能夠適當參考,但切勿照搬。

本篇文章和《回答阿里社招面試如何準備,順便談談對於Java程序猿學習當中各個階段的建議》不一樣,那篇文章更多的是從學習的角度去談的如何學習,而本篇既然我們是要談如何進入BAT,那麼我們就從面試的角度來談學習這件事,LZ會談談一流互聯網公司對於Java後端程序員的要求,相應的,也會談談如何達到這樣的要求。

爲了簡單起見,LZ將這些要求分爲三個層次,分別爲基本要求、可選要求以及加分要求,接下來,我們就一個一個的來談一談。

1、基本要求

基本要求就是指,你必需要學會的知識,並且這裏面大部份內容,在面試裏出現的機率都是極高的。所以,這部份內容你沒有選擇,只能選擇啃下它,你能夠花一年,也能夠花十年,或者帶到棺材裏學習也能夠。

1)語言的基礎部分:

基本要求的第一個,固然是語言的基礎部分。基礎部分其實就是語法以及一些關鍵字的做用,像一些if/else、for循環這類基礎的語法,以及一些new、class、public這類的基礎關鍵字,大部分狀況下面試問的是比較少的,由於這部份內容,只要你寫過幾年Java,基本上都沒有什麼問題。

那麼基礎部分的重點,其實主要就是static、final、transient、volatile這一類的關鍵字,以及內部類、泛型這一類的高階語法。

說到static,首先要記住的最重要的一點就是,類屬性中被static所引用的變量,會被做爲GC的root根節點。做爲根節點就意味着,這一類變量是基本上不會被回收的。所以,static很容易引入內存泄漏的風險。

若是一個面試官讓你解釋static關鍵字,你告訴他static能夠修飾屬性、方法和內部類,以及修飾以後又有什麼效果的話,那麼面試官基本上不會記住你這個回答,整個印象就是平庸。

可是若是你說完之後,補充一下說道,你曾經遇到過一個內存泄漏的問題,就是由於static修飾的一個Map類型的變量致使的,最後排查了堆棧信息找到了問題的所在,而且解決了這個問題。那麼,面試官這個時候心裏中對你的印象,就會不天然的提高几分。

並且,對於static,更深刻的理解是,static會將所引用的屬性、方法以及內部類,與類直接產生引用關係,而非與類的實例。這就是爲何,你能夠使用類名.屬性、類名.方法以及類名.內部類名,來直接引用一個被static所修飾的屬性、方法或者內部類。

若是你沒有用static修飾,那麼你就必須使用實例才能引用這些方法、屬性或者是內部類,最典型的就是內部類。相信不少同窗都好奇過,爲何一個沒有被static修飾的內部類,必需要這麼聲明。

 

1

OutterClass.InnerClass innerClass = new OutterClass().new InnerClass();

由於你沒有使用static修飾InnerClass,因此你必須new出來一個OutterClass的實例,才能在此基礎上new出內部類的實例,由於內部類只能經過外部類的實例才能引用。若是你使用了static修飾,那麼你就能夠這樣使用內部類。

 

1

OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass();

這兩種方式最大的區別就是,第一種方式,若是你想要得到InnerClass的實例,你必須有一個OutterClass的實例,全部其實這種方式你建立了兩個實例,因此有兩個new關鍵字。而第二種方式就好理解一些,靜態內部類不依賴於外部類的實例存在,所以只須要直接建立內部類的實例就能夠了,因此只有一個new關鍵字。

static說的有點多了,不過LZ其實不光說了static關鍵字,也一塊兒連同內部類的語法也大體都說了下。那麼接下來,基礎部分還有一個比較考驗人的東西,就是volatile關鍵字。

這個關鍵字的重點就三個字,就是可見性。可是面試的時候,你說出可見性三個字,基本上滿分100的話,最多隻能獲得20分。剩下的那80分,就要靠你用硬功夫去得到了。

所謂的硬功夫,其實就是要整明白,在併發當中,可見性究竟是什麼意思。那麼,爲了弄明白可見性什麼意思,就須要你瞭解什麼叫主存和工做內存。

只有把這些概念都搞明白了,你纔會知道volatile的真正做用究竟是什麼。不過有一點要提醒你的是,volatile並不保證同步,這一點必定要記住。不光是應付面試官,在真正使用volatile的時候,也要注意這一點,不然很容易出現問題。

好了,基礎部分就說這麼多吧,LZ挑了一些有表明性的說了下,歸根結底,這一部分就是要你很是清晰的瞭解Java當中的關鍵字和語法,這裏所謂的瞭解,是清晰的瞭解其實現原理,而非簡單的會用而已。

2)Java運行時環境

Java運行時環境就是JRE的中文翻譯,本質上其實就是指JVM。

首先對於JVM必需要知道的是,JVM與Hotspot的關係。JVM更多的是指JVM規範,而Hotspot是JVM的一種實現,也是咱們最經常使用的JVM實現。你能夠把JVM規範當作接口,Hotspot當作實現類,這樣去理解會比較簡單一些。

此外,JVM最重要的三個部分必需要很是清楚,內存劃分、class加載機制以及GC策略。搞清楚這三部分不只僅是爲了面試,也是爲了讓你對於Java有更深入的理解,這對於你的Java生涯很是有幫助。

並且,關於內存劃分,還有一點要注意,我們常說的劃分方式,實際上是指的Hotspot的劃分方式,而非JVM規範所規定的。

Hotspot的內存劃分簡單說分爲三個部分,Young Generation(年輕代)、Old Generation(年老代)以及Perm Generation(永久代)。其中的Young Generation(年輕代),又分爲Eden、From和To,其中From和To又統稱爲Survivor Spaces(倖存區)。

正常狀況下,一個對象從建立到銷燬,應該是從Eden,而後到Survivor Spaces(倖存區),再到Old Generation(年老代),最後在某次GC下消失。

固然,一個對象也可能直接在Eden裏死掉,也可能一直在Old Generation(年老代)存活,這些都是有可能的。

關於內存劃分,能夠本身沒事用內存分析工具看看,好比jmap、jvisualvm等等,觀察一下各個區域的內存變化,結合實際去了解一下。

關於classloader機制的學習,能夠結合tomcat去學習,瞭解清楚tomcat的classloader機制,看tomcat是如何保證各個APP之間的類隔離的。若是可能的話,看一下tomcat中classloader的源碼,或者看一下LZ的一個開源項目niubi-job,當中也包含了與tomcat類加載機制類似的部分。

至於GC,須要清楚GC Roots都有哪些,以及如何判斷一個對象能夠被回收。此外,GC的算法和策略也要有大概的瞭解,具體的能夠參見LZ關於這一系列的文章,地址爲http://www.cnblogs.com/zuoxiaolong/category/508918.html

3)併發知識與concurrent包

要想進入一線互聯網公司,這部份內容必需要會,不然的話,你始終都只能停留在比較low的段位。

關於併發知識,最重要的兩個概念必定要搞清楚,那就是可見性和原子性。其中可見性與前面提到的volatile關鍵字是息息相關的,可見性只是併發領域裏的一個概念,而volatile則是Java語言中,實實在在保證變量可見性的關鍵字。

前面說了,要弄清楚可見性,就須要搞清楚主存和工做內存。關於主存和工做內存,其實又屬於JVM的知識範疇。因此從這裏就能夠看出來,知識都是有關聯性的。

原子性其實相對於可見性來講,反倒更好理解一些,相信那個萬年不變的銀行匯款的關於事務的例子,就足以大部分人理解原子性這個概念了,它其實就是一個或多個操做,被視做一個總體的意思。

有了併發的基礎知識之後,你就須要研究一下concurrent包了。這裏面的東西實際上是一個寶藏,一旦你須要寫併發相關的功能,你會發現這裏面的東西很是實用。

其中ConcurrentHashMap是面試最容易被問到的一個類,幾乎全部的面試都會問你,ConcurrentHashMap和普通的同步HashMap有什麼區別。

這個問題其實須要你知道兩個知識就能夠了,一個是HashMap的數據結構,一個是鎖分段的技術,具體的LZ這裏就不解釋了,你們本身下去找相關資料看吧。

此外,concurrent包裏有一個很是重要的類,叫作AbstractQueuedSynchronizer,幾乎全部的concurrent包內的併發工具類,都是基於這個抽象類擴展出來的。所以,把AbstractQueuedSynchronizer這個類研究透徹,很是有助於你理解concurrent包。

最後一點,面試的時候還常常會被問到的一個問題,就是ReentrantLock和synchronized關鍵字有什麼區別。

記得LZ以前組織過的YY面試活動裏,LZ問過不少次這個問題,但幾乎全部人都答不出來。這隻能說明一個問題,那就是大部分人在用synchronized和ReentrantLock的時候,並不會考慮這二者到底用哪一個好一些。

其實它們的區別很簡單,簡單的說,就是synchronized因爲是底層JVM實現的互斥,所以效率會高一些。而ReentrantLock的功能則比synchronized更多,好比定時獲取某個鎖,多個等待條件等。

併發這一部分是一個程序員進階的重要部分,但願全部Java程序員均可以重視這一部分。

4)設計模式和反射

設計模式和反射這部份內容,LZ我的以爲是一個高階程序員必須精通的部分。

用好了這部分知識,可讓你在實際開發中少寫N多代碼,並且還能夠使得程序的結構更加良好。

關於設計模式LZ這裏就很少作介紹了,具體的能夠看LZ的設計模式系列文章,地址是http://www.cnblogs.com/zuoxiaolong/category/509144.html

關於反射,其實就是reflect包裏的內容,這個包裏的類其實並不難,主要是得多用,多看。好比Java領域裏最經常使用的spring框架,裏面其實大量充斥着設計模式和反射的真實使用場景,沒事多研究一下,絕對讓你受益不淺。

5)文件IO、NIO、網絡IO以及網絡協議

文件IO、NIO以及網絡IO這一部分也是工做當中要常常用到的部分,所以也必需要掌握。

其中NIO更多的是瞭解其原理,此外,tomcat中有多種協議的實現,其中包括了BIO、NIO和APR,這三者必定很是清楚它們的區別,這個能夠在connector的protocol屬性配置。

至於網絡IO部分,其實就是net包裏的內容。這裏面的內容是很是經常使用的東西,好比你調用HTTP-API,那麼就須要使用這裏面的類。在這個restful-API氾濫的時代,你少不了要使用HTTP協議調用API。

此外,在瞭解這部分的時候,網絡協議也要適當的瞭解一下,最典型的TCP和HTTP協議是必定要了解的。

在LZ參加的面試中,基本上TCP協議是必定會問的,雖然這可能和LZ的簡歷寫了TCP協議有關,但好比TCP協議的重試機制,三次握手的過程,TCP與UDP的區別這一類的知識,仍是要了解一下的。

至於HTTP協議,相對來講就簡單不少了,應用層的協議主要是知道其協議格式便可,好比都支持哪些header、每一個header都是什麼含義等等。

6)小結

好了,到此爲止,基本要求就差很少介紹完了。細心的猿友可能會注意到,這些內容其實和LZ上一篇文章《萬能的林蕭說:一篇文章教會你,如何作到招聘要求中的「要有紮實的Java基礎」》,有很多的相通之處。

沒錯,其實基本要求這部分,差很少就是要求你有紮實的Java基礎。這也是全部一線互聯網公司,基本都會寫在招聘要求地前幾條的要求。

所以,要想進入BAT,那麼這一部分的內容必定要了解,並且這部分的內容對你實際開發也是很是有幫助的,並不只僅是爲了應付面試。

2、可選要求

看到可選要求四個字,或許很多人會認爲這部分不過重要。可是LZ能夠很負責的告訴你,這部分每每纔是決定公司要不要你的重要指標。

由於基本要求達標之後,公司主要挑選人才的標準其實就是可選要求這一部分,在以前《回答阿里社招面試如何準備,順便談談對於Java程序猿學習當中各個階段的建議》這篇文章中,LZ曾經提過差別性這個詞,其實這一部分就是差別性的體現。

接下來,LZ就帶你們看看,到底都有哪些可選的要求。此外,LZ要提早說明的是,這些可選要求,沒有必須會和必須不會的內容,儘量多的瞭解,老是不會錯的。

1)Spring、Mybatis框架

框架這部分其實不用多說了,spring和mybatis框架的原理和源碼,若是你能夠很是精通的話,那麼這必定能成爲你巨大的優點。

若是你是專門作WEB開發的Java後端猿,那麼spring和mybatis框架基本上你是確定要用的。精通Spring和mybatis框架不只爲了面試,對於你平常開發也有巨大的幫助,你能夠作不少架構上的優化,爲你的戰友省去不少重複性的工做。

關於Spring框架,最核心的固然是IOC,其次即是AOP、MVC這兩部分了。好好研究這三部分的源碼,會讓你從大部分程序員當中,脫穎而出。至於mybatis框架,主要仍是關注它如何實現動態SQL。

並且,待你研究透徹之後,你徹底能夠本身嘗試去造輪子,說不定能獲得意想不到的收穫。

2)Linux服務器

這一部分其實本來是運維應該精通的部分,可是做爲一個Java後端猿,若是你能夠精通linux服務器,那麼對你排查線上問題,是有很大的幫助的。

大部分程序員都只知道一些經常使用的Linux命令,對於Linux系統自己的文件系統、網絡以及IO等等,是徹底不瞭解的,這其實也包括LZ本身。可是,LZ見過身邊有一些程序員,對於Linux玩的很是熟練,這不光光體如今多會幾個命令,而是對整個Linux系統的瞭解。

能夠預見的是,這些人在排查問題的時候,每每會更容易找到問題的根本。由於程序問題每每並非最難解決的,異常這東西見多了就都知道怎麼回事了,大不了看看源碼也總能找到緣由。最難解決的是環境問題,而環境問題無非就是操做系統層面的問題。

而顯然大部分狀況下,Java運行的操做系統都是Linux。

3)數據庫優化

說完Linux,緊接着LZ要說的就是數據庫了,這本來應該是DBA應該精通的部分,但做爲一個Java後端猿,數據庫基本上也是最常常打交道的了。

並且你們都知道,一個應用的性能瓶頸,每每都出如今數據庫這一端,所以,一個Java後端猿若是能夠精通數據庫的話,那麼對於你工做的實際幫助,也是很是大的。

相信很多人都碰到過SQL過慢的狀況,這個時候,如何經過加索引、SQL分析和優化的手段,將SQL的執行時間優化到一個可接受的範圍內,其實仍是比較考驗人的。

反正,這玩意兒LZ是半斤八兩的水平,基本的優化是沒有問題的,但稍微複雜一些的就不行了。

因此,這一部分足夠成爲你的優點,體現出你的差別性。

4)消息服務

除了Linux和數據庫之外,消息服務也是當今互聯網公司裏,必不可少的一個組件。

常見的消息組件好比rabbitMQ、activeMq,包括一些其它的開源消息組件,好比rocketMq。這裏面任何一個,若是你能夠精通其原理的話,也會成爲你有力的競爭條件。

其實消息服務的重點,無非就是如何保證最終一致性、消息的順序,包括消息事務等等這一類的問題。

雖然LZ本人對此不是很瞭解,但LZ很肯定,這一部分若是你能夠有本身獨到的看法的話,必定會大大增長你的成功率。

5)緩存服務

說了消息服務之後,相信緩存服務你們也必定不陌生了。

常見的緩存好比memcached、redis這兩個,若是你能搞清楚其中一個的話,也會給你加分許多。畢竟如今的互聯網應用,緩存也是必不可少的了,所以若是你能徹底hold住緩存這一部分,那麼你的差別性也就有了。

在緩存服務當中,有幾個問題也是比較常見的,好比緩存滿了怎麼辦,緩存的實時性如何處理,內存結構如何規劃,分佈式的狀況下如何處理增刪節點時緩存的命中問題等等。

6)負載均衡器

負載均衡器,這是最後一個可選要求了。

常見的負載均衡器就兩種,一種是軟負載均衡,好比nginx、Apache、lvs這一類的。另一種則是硬件負載均衡,常見的主要就是F5。

這兩種方式各有優劣,其中硬件負載均衡如要用於簡單應用、大訪問量的場景,而軟件複雜均衡則主要用於複雜應用,較小訪問量的場景。固然了,二者還有一個不得不考慮的區別是,硬件複雜均衡通常都是很是貴的,而軟負載均衡則基本上沒有任何成本。

在負載均衡器方面,也有一些問題是比較常見的。好比如何保持會話,如何作流量控制,負載均衡策略都有哪幾種,如何檢查後端服務器的健康狀態等等。

7)小結

好了,到這裏,可選要求就說的差很少了。

細心的猿友會發現,這6個要求其實對應的就是Java後端開發中,最常接觸到的一些東西。好比spring框架和數據庫,這二者基本上是個Java程序員都接觸過吧。

其他四個包括Linux服務器、消息服務、緩存服務以及負載均衡器,也是同樣的,你們在實際工做當中,應該或多或少都接觸過這幾個東西。

可是真正能對其中一個很是瞭解精通的人,相信並不會太多。也正由於如此,若是你作到了,才能夠體現出你的差別性,這或許會是你拿下offer的重要籌碼之一。

可是,LZ這裏必需要再強調一下的是,這幾樣東西大多數人或多或少都會有一些瞭解,包括上面LZ提到的問題,很多人也都知道答案。

然而,光知道答案是遠遠不夠的,這並不足以成爲你的優點,你須要對這些問題有着深入的瞭解,以及有着本身獨特的看法,才足以讓它成爲你的優點。

3、加分要求

最後一個即是加分要求了,加分要求雖然不如基本要求和可選要求重要,但它也與可選要求相似,每每拿下offer的最終緣由,正是這些看似不是必要要求的部分。

接下來,LZ就帶你們一塊兒來看一下,都有哪些能夠加分的部分,這一部分其實在以前那篇文章《回答阿里社招面試如何準備,順便談談對於Java程序猿學習當中各個階段的建議》中已經提到過,這裏就再詳細說一下。

此外,LZ要強調的是,這些加分要求中,在某些特殊狀況下,可能會成爲基本要求。

1)數據結構與算法

這一部份內容不用多說了,你們都懂的。精通數據結構與算法,絕對會成爲你的一大亮點。

由於大部分程序員的這一部分基礎都不太好,包括LZ本人,面試的時候若是問到算法一類的問題,LZ基本上就兩個字:不會。

之前LZ還看過Java集合框架的一些源碼,對於一些經常使用的數據結構還有必定的瞭解。可是如今,LZ已經基本上忘光了,就連最基本的冒泡排序,可能LZ都不必定能寫的對。

所以能夠預見的是,數據結構與算法絕對是很是加分的一項。並且,在你面試一些與算法相關的職位時,這個加分要求還可能會成爲基本要求。

2)計算機操做系統

計算機操做系統原理,是很是底層的內容。

這部份內容比較難,裏面講的都是一些最基本的底層原理,例如內存、指令、系統IO等等。LZ以前也研讀過一本關於操做系統的書,也寫了一系列文章,地址是http://www.cnblogs.com/zuoxiaolong/category/518480.html

不過LZ看的仍是不夠全面和深刻,若是你能夠將操做系統研究透徹的話,那麼在面試的時候,你徹底能夠以此做爲突破點,展現你的亮點。

3)計算機網絡

其實網絡這一部分,對於程序員來講仍是比較重要的。

LZ最近正在作的事情,就常常會碰到一些網絡上的問題,雖然不少時候,這些問題其實能夠找專門的網絡人員去解決,但若是你本身對此不夠了解的話,對於你的工做仍是會形成很大的障礙。

並且,要想精通TCP/IP協議,若是對計算機網絡不瞭解的話,仍是很難真正理解的。

所以,計算機網絡部分若是你能夠精通的話,這也絕對會成爲你的一個加分項。

4)熟練使用一種腳本語言

腳本語言在不少時候是很方便的,並且也很是實用。

LZ最近就被迫正在使用Python作不少事情,其實用了之後你會發現,雖然Java也能夠實現一樣的目的,但確實選擇合適的語言,會幫你節省大量的精力。

所以,若是你能夠熟練使用一種腳本語言,好比Python、shell等等,這也一定會成爲你的加分項。

5)你的github和博客

這點相信大部分人也都知道,若是你擁有本身的github和博客,而且裏面有很多有價值的內容的話,那麼必定會爲你加很多分。並且,提及github和博客這件事,LZ還有一個關於本身真實的故事,在文章的最後給你們分享,這裏就暫時不提了。

此外,就不說面試這回事,平時在github寫寫代碼,在博客裏寫寫文章,總結總結本身的技術和職場,也是很是有好處的。相信很多猿友都已經體會到了這其中的益處,LZ也就再也不多說了。

畢竟說多了也無益,最主要的仍是本身要真真實實的去作,若是你但願能夠在這方面加分,那就從當前作起,而且堅持下去。

6)小結

到這裏,加分的要求就說的差很少了。

其實可以加分的內容還有不少,LZ只不過列出了比較常見的幾種而已,好比你有其它一線互聯網公司的背景,這也是能夠加分的。只不過這種加分項比較難達到,並且,這裏更多說的是草根程序員,所以LZ這裏就沒多說。

總的來講,加分要求和可選要求同樣,都是你致勝的關鍵部分,所以若是可能,仍是要在加分要求上下一些功夫的。

學習小結

關於學習這部分,到這裏就說的差很少了。

就像上一篇《萬能的林蕭說:一篇文章教會你,如何作到招聘要求中的「要有紮實的Java基礎」。》文章裏說道的同樣,其實大部分一線互聯網公司,對於招人的技術要求就兩個,紮實的Java基礎和一個一技之長。

紮實的Java基礎,其實就是本文中基本要求的部分,而一技之長,其實就是可選要求和加分要求中任意挑選一個就能夠了。

固然了,不能否認的是,可選要求和加分要求中,你會的越多,成功率就越高,這點是毋庸置疑的。可是若是你一點優點都沒有的話,就算你Java基礎再紮實,其實也很難進去,由於你這樣的人太多了,沒法在衆多面試者中脫穎而出。

雖然不排除你運氣特別好,當時公司正好急缺人,並且沒有其餘更好的面試者,致使你很幸運的拿到了offer,但畢竟這種機率實在是過小了一些。

說來講去,知識是擺在那裏的,不會跑也不會動,就看你學或不學,以及何時學。

有的人畢業後一兩年就達到了,有的人用了三五年才達到,而有的人,則是一生都沒有達到。要作什麼樣的程序員,就全看你本身了。

素養

說完了心態和學習,我們來談談一個程序員應該有的素養。這部分雖然看似對面試沒什麼幫助,但其實LZ有時候以爲,這比技術更重要,由於它們可能會影響到你程序員生涯的發展。

1、代碼風格

說到程序員的素養,第一個就是代碼風格。

雖然代碼風格並無絕對正確的風格,可是在知足基本的Java代碼風格的前提下,你應該逐漸造成本身的代碼習慣,並且必須是一個好習慣。

說個最簡單的例子,無論你多麼厲害,若是你的變量命名是用拼音來命名的話,那麼別人對你的印象必定是,這是個很是low的程序員。

其實程序員有時候和藝術家很像,一個專一於繪畫的藝術家,通常都會有本身的風格。說得誇張一點,可能他的畫只要拿出去,就有人能認出來,這其實就是一種風格。

做爲一個程序員,你也應該有你本身的代碼風格,雖然在工做中,爲了你們更好的經過代碼溝通,你或多或少的須要作一些妥協,和你們保持一致的風格。

可是你本身的開源項目,它應該是你的藝術品,你在雕琢它的同時,其實也是在造成你獨特的代碼風格。

並且,有的時候,你的開源項目,可能能夠直接或間接的幫助你,得到一份不錯的offer。

2、寫做能力

看到這個或許有的人會很意外,可是LZ我的以爲,寫做能力是一個程序員應該有的素養。

代碼風格只是你寫代碼的素養,你還須要有寫文字的能力和素養。一個程序員是否專業,文檔和註釋也是一個很重要的衡量標準。

由於無論你的技術多麼厲害,別人看到的,除了你的代碼之外,就是你的文檔和註釋。這部分可否寫好,在不少時候,直接決定了別人對你的印象。

所以,寫做能力其實也是一個程序員應該有的素養,至少LZ一直是這麼認爲的。由於無論這我的的技術多麼厲害,若是他的文檔和註釋寫的一團糟,絲毫體現不出專業二字,那麼他的形象必定會在LZ心中大打折扣。

結尾

本文從心態、學習和素養三個方面簡單談了談如何進入BAT,但其實這也是一個程序員學習和提升本身的過程。

在提到github和博客時,LZ說了要在文章的最後,給你們講一個關於LZ本身的真實故事,其實這個故事就是LZ來杭州的真實經歷。

LZ之因此能進入如今的公司,其實很大一部分就是由於LZ有一個常常更新的博客,和一個造了幾個輪子的github。提及來,LZ真的是運氣很是好,或者說是平時的努力,給LZ帶來了好運氣。

兩年多之前,LZ特別想進入中間件團隊,可是發簡歷總是沒有迴音,因而LZ就給中間件團隊的leader,寫了一封求職郵件,代表本身很是想進入中間件團隊,作服務於技術人員的工做,但願可以獲得面試機會。

惋惜的是,當時這個中間件的前輩並無回覆LZ的郵件,本來LZ覺得是本身的簡歷沒有打動對方。不過LZ後來才知道,實際上是由於當時這個前輩已經離開了中間件。

不過,兩年之後,也就是2016年過完年之後,LZ的博客裏無心間收到了一封短信,正是中間件團隊的成員發給LZ的邀請。

能夠看到,這封短信正是今年過完年LZ收到的。剛開始的時候,LZ還沒注意到有這麼一封短信。直到過完年上了十來天班之後,差很少快三月份了,LZ才注意到短信箱裏的這個短信。

LZ清晰記得,當時看到的時候是週四,LZ看到的時候很意外。

雖然當時LZ並無跳槽的打算,那段時間也從未投過一封簡歷,不過出於不聊白不聊的原則,LZ仍是當天就把簡歷發給了這位前輩。

出乎意料的是,週四和週五僅僅兩天,LZ接連不斷的通過了四輪電話面試,就從前輩這裏得知,LZ很是順利的經過了面試,就等着拿offer就能夠了。

當時聽到這個消息的時候,說實話,LZ真的以爲和作夢差很少。

本來一兩天前,LZ還處於剛過完年假的不適應期,同時還在糾結手裏的需求怎麼實現。忽然之間就要奔赴杭州,進入本身期待已久的公司,期待已久的部門,展開另一番職業生涯了。

LZ當時真心以爲,這世間的事情,實在是太特麼神奇了。當時LZ腦子裏不自覺地冒出來的一句話就是,功夫不負有心人啊!

LZ日積月累的寫了這麼多文章,終於沒有白寫,給LZ換來了一個機會。

之前LZ以爲,像什麼「功夫不負有心人」這一類的話,都是給別人灌雞湯打雞血的話而已。但真正本身遇到的時候,纔會真切的體會到,有的時候道理就是這麼簡單,區別就在於你作仍是沒作。

就像這篇文章裏LZ寫的同樣,今天你看到了,你作了,那或許將來的某一天,你會感謝今天努力的你。但若是你看到了,沒有作,或許你依舊仍是那個,成天抱怨工做沒勁,加班太累的人,而後在碌碌無爲和怨天尤人中度過。

LZ也不想給你們灌什麼雞湯,打什麼雞血,可是LZ想告訴你們,程序員這個職業很公平,相信很多人當初踏上這條路的時候,也是以爲程序員這個職業充滿着奮鬥的氣息,能夠依靠本身的努力改變本身的命運,而不像某些職業同樣須要拼爹。

在程序員這條路上,努力,你就有很大但願成就本身的目標和夢想。不努力,那你就基本上原地踏步下去,直到被後浪拍死在沙灘上。

如何抉擇,其實徹底看你本身,只要你不後悔你的決定。因此,少點抱怨,多點行動。

若是你能接受平庸下去,那就平庸下去,幸福的過完你的一輩子,也沒什麼很差。不然,你就堅持努力下去,直到達到你一個又一個目標。

最怕的狀況就是,心中充滿了慾望,不甘於平庸,卻又不肯意努力的人,這樣的人,若是作了程序員,真的是一種悲哀。

相關文章
相關標籤/搜索