我來告訴你,一個草根程式設計師如何進入BAT

java填坑路發表於2018-07-08

本文將從心態、學習和素養三個方面手把手的告訴你,LZ作為一個非科班畢業,出身於三流大學的草根,是如何憑藉自己的努力,進入到國內一流網際網路公司的。

心態

看到這個標題,有的同學可能會說,“LZ,你不是要告訴我們如何進入BAT嗎?怎麼一上來就寫心態?”

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

原因很簡單,文章下面即將提到的學習內容,如果你沒有一個好的心態,是不可能進行下去的。所以,先過了心態這一關,再來談別的吧,否則你肯定會死在半路上的。

說起來,很多群裡的新人都愛問LZ,“你是怎麼學習的?為什麼我學不進去呢?為什麼我一看書就困呢?”

以上這種現象,基本上就是兩個原因,第一個原因是心態浮躁,總覺得看書好像沒啥用啊,看了好像還是覺得沒學到什麼,過不了多久就忘了。第二個原因則是目標感不強,不知道自己要達到什麼程度才算可以,所以也就乾脆“一瓶子不滿,半瓶子晃盪”了。

針對第一個原因,說到底就是個心態問題。總想著看書能夠立竿見影,從菜鳥一下子蛻變為大神,如果你老是抱著這樣的心態去看書,你特麼不瞌睡才是邪門了。

而第二個原因,LZ覺得有時候人要適當的激發內心的慾望,無慾無求這種高逼格的事,等你七老八十了再說,現在趁著年輕,心中有點慾望其實並不是什麼壞處,只要你沒被慾望懵逼了雙眼就行。

說起慾望這事兒,LZ覺得有必要給大家看一下LZ當初的慾望,相信從這封郵件裡,你就能感受出LZ當時的慾望。這種慾望,會激勵著你前進,但是你要切記,在前進的途中,調整好自己的心態,戒驕戒躁。

學習

說完心態,我們們來談談學習這事兒,還是老規矩,由於LZ是Java後端出身,所以接下來的內容,會與Java後端息息相關,非Java後端的同學可以適當參考,但切勿照搬。

本篇既然我們們是要談如何進入BAT,那麼我們們就從面試的角度來談學習這件事,LZ會談談一流網際網路公司對於Java後端程式設計師的要求,相應的,也會談談如何達到這樣的要求。

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

一、基本要求

基本要求就是指,你必須要學會的知識,而且這裡面大部分內容,在面試裡出現的概率都是極高的。因此,這部分內容你沒有選擇,只能選擇啃下它,你可以花一年,也可以花十年,或者帶到棺材裡學習也可以。

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修飾的內部類,必須要這麼宣告。

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

因為你沒有使用static修飾InnerClass,所以你必須new出來一個OutterClass的例項,才能在此基礎上new出內部類的例項,因為內部類只能通過外部類的例項才能引用。如果你使用了static修飾,那麼你就可以這樣使用內部類。

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的演算法和策略也要有大概的瞭解。

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這裡就不多做介紹了,關於反射,其實就是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)小結

好了,到此為止,基本要求就差不多介紹完了。沒錯,其實基本要求這部分,差不多就是要求你有紮實的Java基礎。這也是所有一線網際網路公司,基本都會寫在招聘要求地前幾條的要求。

因此,要想進入BAT,那麼這一部分的內容一定要了解,而且這部分的內容對你實際開發也是非常有幫助的,並不僅僅是為了應付面試。

二、可選要求

看到可選要求四個字,或許不少人會認為這部分不太重要。但是LZ可以很負責的告訴你,這部分往往才是決定公司要不要你的重要指標。

因為基本要求達標以後,公司主要挑選人才的標準其實就是可選要求這一部分,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、mybatis框架和資料庫,這基本上是個Java程式設計師都接觸過吧。

其餘四個包括Linux伺服器、訊息服務、快取服務以及負載均衡器,也是一樣的,大家在實際工作當中,應該或多或少都接觸過這幾個東西。

但是真正能對其中一個非常瞭解精通的人,相信並不會太多。也正因為如此,如果你做到了,才可以體現出你的差異性,這或許會是你拿下offer的重要籌碼之一。

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

然而,光知道答案是遠遠不夠的,這並不足以成為你的優勢,你需要對這些問題有著深刻的瞭解,以及有著自己獨特的見解,才足以讓它成為你的優勢。

三、加分要求

最後一個便是加分要求了,加分要求雖然不如基本要求和可選要求重要,但它也與可選要求類似,往往拿下offer的最終原因,正是這些看似不是必要要求的部分。

接下來,LZ就帶大家一起來看一下,都有哪些可以加分的部分,需要強調的是,這些加分要求中,在某些特殊情況下,可能會成為基本要求。

1)資料結構與演算法

這一部分內容不用多說了,大家都懂的。精通資料結構與演算法,絕對會成為你的一大亮點。

因為大部分程式設計師的這一部分基礎都不太好,包括LZ本人,面試的時候如果問到演算法一類的問題,LZ基本上就兩個字:不會。

以前LZ還看過Java集合框架的一些原始碼,對於一些常用的資料結構還有一定的瞭解。但是現在,LZ已經基本上忘光了,就連最基本的氣泡排序,可能LZ都不一定能寫的對。

因此可以預見的是,資料結構與演算法絕對是非常加分的一項。而且,在你面試一些與演算法相關的職位時,這個加分要求還可能會成為基本要求。

2)計算機作業系統

計算機作業系統原理,是非常底層的內容。

這部分內容比較難,裡面講的都是一些最基本的底層原理,例如記憶體、指令、系統IO等等。

如果你可以將作業系統研究透徹的話,那麼在面試的時候,你完全可以以此作為突破點,展示你的亮點。

3)計算機網路

其實網路這一部分,對於程式設計師來說還是比較重要的。

LZ最近正在做的事情,就經常會碰到一些網路上的問題,雖然很多時候,這些問題其實可以找專門的網路人員去解決,但如果你自己對此不夠了解的話,對於你的工作還是會造成很大的障礙。

而且,要想精通TCP/IP協議,如果對計算機網路不瞭解的話,還是很難真正理解的。

因此,計算機網路部分如果你可以精通的話,這也絕對會成為你的一個加分項。

4)熟練使用一種指令碼語言

指令碼語言在很多時候是很方便的,而且也非常實用。

LZ最近就被迫正在使用Python做很多事情,其實用了以後你會發現,雖然Java也可以實現同樣的目的,但確實選擇合適的語言,會幫你節省大量的精力。

因此,如果你可以熟練使用一種指令碼語言,比如Python、shell等等,這也必定會成為你的加分項。

5)你的github和部落格

這點相信大部分人也都知道,如果你擁有自己的github和部落格,並且裡面有不少有價值的內容的話,那麼一定會為你加不少分。而且,說起github和部落格這件事,LZ還有一個關於自己真實的故事,在文章的最後給大家分享,這裡就暫時不提了。

此外,就不說面試這回事,平時在github寫寫程式碼,在部落格裡寫寫文章,總結總結自己的技術和職場,也是非常有好處的。相信不少猿友都已經體會到了這其中的益處,LZ也就不再多說了。

畢竟說多了也無益,最主要的還是自己要真真實實的去做,如果你希望可以在這方面加分,那就從當前做起,並且堅持下去。

6)小結

到這裡,加分的要求就說的差不多了。

其實能夠加分的內容還有很多,LZ只不過列出了比較常見的幾種而已,比如你有其它一線網際網路公司的背景,這也是可以加分的。只不過這種加分項比較難達到,而且,這裡更多說的是草根程式設計師,因此LZ這裡就沒多說。

總的來說,加分要求和可選要求一樣,都是你致勝的關鍵部分,因此如果可能,還是要在加分要求上下一些功夫的。

學習小結

關於學習這部分,到這裡就說的差不多了。

其實大部分一線網際網路公司,對於招人的技術要求就兩個,紮實的Java基礎和一個一技之長。

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

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

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

說來說去,知識是擺在那裡的,不會跑也不會動,就看你學或不學,以及什麼時候學。

有的人畢業後一兩年就達到了,有的人用了三五年才達到,而有的人,則是一輩子都沒有達到。要做什麼樣的程式設計師,就全看你自己了。

素養

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

一、程式碼風格

說到程式設計師的素養,第一個就是程式碼風格。

雖然程式碼風格並沒有絕對正確的風格,但是在滿足基本的Java程式碼風格的前提下,你應該逐漸形成自己的程式碼習慣,而且必須是一個好習慣。

說個最簡單的例子,不管你多麼厲害,如果你的變數命名是用拼音來命名的話,那麼別人對你的印象一定是,這是個非常low的程式設計師。

其實程式設計師有時候和藝術家很像,一個專注於繪畫的藝術家,一般都會有自己的風格。說得誇張一點,可能他的畫只要拿出去,就有人能認出來,這其實就是一種風格。

作為一個程式設計師,你也應該有你自己的程式碼風格,雖然在工作中,為了大家更好的通過程式碼溝通,你或多或少的需要做一些妥協,和大家保持一致的風格。

但是你自己的開源專案,它應該是你的藝術品,你在雕琢它的同時,其實也是在形成你獨特的程式碼風格。

而且,有的時候,你的開源專案,可能可以直接或間接的幫助你,獲得一份不錯的offer。

二、寫作能力

看到這個或許有的人會很意外,但是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想告訴大家,程式設計師這個職業很公平,相信不少人當初踏上這條路的時候,也是覺得程式設計師這個職業充滿著奮鬥的氣息,可以依靠自己的努力改變自己的命運,而不像某些職業一樣需要拼爹。

在程式設計師這條路上,努力,你就有很大希望成就自己的目標和夢想。不努力,那你就基本上原地踏步下去,直到被後浪拍死在沙灘上。

如何抉擇,其實完全看你自己,只要你不後悔你的決定。所以,少點抱怨,多點行動。

如果你能接受平庸下去,那就平庸下去,幸福的過完你的一生,也沒什麼不好。否則,你就堅持努力下去,直到達到你一個又一個目標。

最怕的情況就是,心中充滿了慾望,不甘於平庸,卻又不願意努力的人,這樣的人,如果做了程式設計師,真的是一種悲哀。

歡迎工作一到五年的Java工程師朋友們加入Java架構開發:744677563

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導


相關文章