1. 程式人生 > >非好學校科班出身的程式設計師,該如何快速提升自己

非好學校科班出身的程式設計師,該如何快速提升自己

    目前一般的大點的公司,往往會在招聘時(尤其在招聘3年以下工作經驗的程式設計師時)會設定學校的門檻,比如需要211或985相關專業畢業。這裡我無意貶低不在這個範圍的程式設計師,相反在本文裡還將根據我所見和我所聞,為這些同學給出發展的建議。

    首先我用我的切身體會給大家予以足夠的信心:我最近呆的都是一些不小的公司,雖然在招聘時有上述的門檻,但事實上,在3年左右的正式員工裡,大約30%是一般學校,或非科班出身,在外派的員工裡,這個比例會高到70%左右,而且,每個組平均每年有3個左右轉正的名額。所以,出身一般的程式設計師,只要有足夠的勤奮度,而且方法得當,絕非就一定低人一等。 

    恕我直言,在學校和學歷方面稍微欠缺的同學裡,我有見過能力很強的,但平均綜合能力確實不如好學校。(這裡如果我說高於好學校,說出來也沒人信)。 不過對於勤奮的同學來說,並非是能力不行,而是努力的方法和方向不對。對於這批敬業勤奮的同學,我非常敬佩,所以在這篇文章裡,我將專門分享些相關的提升技巧。

1 戰術上要重視,分析為什麼大公司要設定學歷和學校的門檻

     平心而論,為什麼有這樣的設定呢?第一,能進好學校的同學在之前的學習過程中已經證實了自己“綜合能力強“這個特質,第二,好學校畢業的同學,一般基礎能力比較紮實,比如資料結構演算法作業系統編譯原理等,不僅理論經驗,不少還有實訓經驗。

    在前進的過程中,我們必須認清自己,所謂知己知彼百戰不殆,但認識自己絕非是讓我們妄自菲薄,而是明白自己的短板,歸納一下,在招聘時,一般會對這批程式設計師重點考核如下的要點(這其實就是目前普遍存在的短板):

    1 是否有實際的商業專案經驗?

    2 基本功是否能達標?比如是否熟悉連結串列Hash表的基本資料結構,是否熟悉排序等基本的演算法。

    3 學習能力,團隊協作能力以及責任心等是否達標?

    其實歸根到底就一點:如果程式設計師在大學畢業前,有過實際的專案經驗,比如做過兼職,或在學校裡幫老師幹過商業專案經驗,這能一定程度上彌補學歷學校和專業方面的劣勢,而且,如果做專案的時間足夠長(一般1年左右),而且專案裡用到的技術和公司職位需求比較匹配,而且候選人動手能力強,一些規模不大的公司甚至會忽視學校等方面的因素。 

2 如何通過第一份工作,讓自己有個不差的起點

   

    程式設計師在踏上社會後前兩年的發展,會比較重要。這裡給出的建議是,如果你感覺學校和學歷會成為障礙,可以找個規模一般但乾的活和你的職業發展相關的工作,如果萬不得已,不得不幹銷售等之類的工作,但一定得讓自己乾點和程式設計相關的事情。下面給出些我見到過的案例。

     案例1:小A本科畢業後,學校一般,能力屬於中下。不過他找了個外派公司,外派進了一個規模比較大的公司,在其中發展了2年,用專案經驗沖淡了學校的因素,後來就跳槽進了一個大公司,從初級開發做起,平時也經常學些知識,目前在升級到高階開發的路上順風順水。

    案例2:小B學校一般,也大專學歷,但在大三期間已經在軟體公司實習,積累了一些基本的開發能力,畢業後就憑此順利進入到一箇中型公司做開發,至少能在社會上站穩腳跟。

    案例3:小C大專學習,專業是理科,但和軟體關係不大,後來參加一個軟體培訓,積累了些技能,目前至少也能在公司裡做軟體開發的活。

    在這個案例中,我絕非說一定得通過培訓學校,其實在培訓學校是用錢買時間買學習方法買專案經驗,如果你自己毅力足夠,靠自己看視訊執行專案,也能達到類似的效果。

    案例4:我在面試時就看到不少簡歷,候選人學校學歷都一般,3年後,絕對有能力挑戰大公司的職位,而且公司更看重這些同學靠前3年工作積累的專案和技能經驗。

    總結一下,如果學校學歷都一般,那麼該採取哪些措施呢?

    1 最好在畢業前,進入軟體公司實習。這可以靠學校推薦,更得自己去找。學校裡的一些老師,會和外面公司合作,大家就可以找這些老師幹活。或者就到處投簡歷,工資看著要,以積累專案經驗為主。

    2 平時可以適當放鬆娛樂,但就更得自己瞭解專案經驗。比如,通過視訊等方式,自己搭建一個框架,或者用python搭建一個數據分析平臺,這種案例多多益善。

    3 準備簡歷時,一定得增加商業專案的經驗,同時靠刷面試題積累面試經驗。

    這裡也給大家交個底,我在上海,上海軟體公司數量多不勝數,往往一個樓裡就有5,6家,而且,小型或中型的公司,出於節省成本的考慮,往往只會看專案技能和基本功,不怎麼看學校和學歷。其實每個城市都一樣,所以要找工作,或者是不差的工作,絕對沒問題。  

3 只要勤奮了,任何時間點都不算晚:論時間的安排

    在龜兔賽跑裡,最讓人痛心的不是兔子在中途睡覺,而是烏龜自暴自棄。天道酬勤,但如果自己都失去信心或貪圖玩樂,那真就沒人能幫你了。

    在上文裡提到,在學校裡,就該去積累專案經驗,或自己通過執行程式碼熟悉框架技能。不過如果已經不慎錯過學校裡的時間,但現在想迎頭趕上,只要努力了,什麼時候都不晚。

    這裡給出些關於Java方面自學的途徑和時間點。

                                                                                             表 第1個月的學習進度

學習時間

要學的技術

應該達到的水準

第1周

搭建Java環境,熟悉基本語法

安裝好JDK,Eclipse或MyEclipse開發環境。能執行出第一個Java程式。最好還能熟悉int之類的基本資料型別和一些加減乘除等基本運算。瞭解Math等常用的類,瞭解if分支語句,瞭解while,for等迴圈語句,能用開發出諸如計算閏年或累加和之類的小程式。

第2周

基本的面向物件語法

瞭解封裝繼承多型等的語法,知道面向物件的基本概念,但此時不必深入。這部分內容對應本書第2章。

第3周

Java集合部分的內容

知道List,Set和Map等物件的用法,知道泛型的用法,而且知道諸如hashCode等的常用知識帶你。這部分內容對應本書第3章。

第4周

異常處理流程和基本的IO處理流程

知道try…catch…finally的工作流程,知道基本的IO讀寫操作。會結合異常處理流程開發一些讀寫檔案讀寫記憶體等的程式。這部分內容對應本書第4章。

    在第2個月裡,大家可以在掌握上述知識的基礎上深入瞭解Java Core的高階知識點,並可以進入Java Web初級階段的學習,這個時間段的學習進度如下表所示。

表 第2個月的學習進度

學習時間

要學的技術

應該達到的水準

第5周

搭建資料庫環境,熟悉JDBC程式設計

安裝好MySQL等資料庫環境,會通過JDBC編寫諸如讀寫資料庫的操作,而且能掌握批處理和預處理等操作。最好能會和事務相關的操作。這部分內容對應本書第5章。

第6,7周

多執行緒程式設計

能用多執行緒協作完成一件事情,掌握至少一種控制多執行緒併發的技巧(比如Lock),最好能掌握執行緒池。這部分內容對應本書第7章。

第8周

基本的Web技術

能開發並執行基於Jsp+Servlet+JavaBean+DB架構的簡單專案,並瞭解其中的一些重要技術。

    在第3個月裡,大家可以深入瞭解Java Web裡比較資深的框架技術,比如Spring MVC和ORM等,這個階段的學習計劃如下表1.4所示。

表 第3個月的學習進度

學習時間

要學的技術

應該達到的水準

第9周

Spring的諸如IOC和AOP等基本概念

能執行通IOC和AOP部分的程式碼,並能結合程式碼知道諸如AutoWire等的重要知識點。

第10周

Spring MVC框架及其基本流程

能通過一個簡單的Spring MVC程式瞭解它的組成結構,並瞭解其中各部分的開發要點

第11周

ORM技術

瞭解Hibernate或ibatis的基本開發模式,知道如何通過ORM和資料庫互動。

第12周

Spring MVC+ORM框架

能執行通一個簡單的Spring MVC+ORM框架的案例,並大致瞭解這種框架裡各部分的開發要點。

    本人一直在上海上一個為期3個月的政府補貼的Java培訓班(具體名字就不說了,有打廣告嫌疑),就按上述時間點要求學生(不少還是零基礎的),經實踐下來,不少同學上完後至少能出去面試初級程式設計師了。

    換句話說,只要你肯了,大概也就3個月的時間(基礎稍微差的同學最多5個月,如果上心點的,估計也就2個月),即能達到初級開發的水平。

    我之前聽過一種說法,說Java培訓學校量產初級開發,根據我所見所聞,不無道理,而且量產物件,學歷甚至可以是高中,讀過計算機大專的,也寥寥無幾。相比之下,學校一般的同學基礎要好得多,更應該有能力和信心快速提升自己。 

4 看下程式設計師的基本功,其實自己也能在工作後彌補

    這個大家可能有個認識誤區,好學校高學歷的畢生生在工作後有優勢,並不是他們多學了幾門課多會了幾個知識點,而是在這些學校裡,專案實踐的機會比較多,實習機會也好找。換句話說,基本功比較強。

    什麼叫基本功(俗稱內功)?分兩塊,第一是知識類的。 大學裡學的課不少,但實際對5年內程式設計師工作有幫助的,可能也就以下的內容。

    1 資料結構知識,而且僅限於陣列,連結串列,堆疊,佇列,Hash表和樹等知識,圖的知識不怎麼用得到。

    2 演算法,用得最多的也就是排序,遍歷(樹連結串列等)。

    3 編譯原理中的狀態機思想。

    4 網路通訊裡的網路協議知識點和通訊包的傳送流程。

    5 作業系統裡的一些知識點和演算法。

    6 Java等程式語言,學校裡一般會更多地偏重知識點,而實際公司裡,要求更多的是動手開發能力。

    大家可以看下,這些其實不怎麼難學,這也是為什麼非軟體專業的同學能轉行,以及培訓學校能量產程式設計師的原因。至於說,基礎理論知識阻礙了程式設計師升級,比如某程式設計師由於不熟悉Hash表資料結構從而導致缺乏優化能力,這不是程式設計師沒經過大學裡基礎課的培訓,而是在工作後,沒有主動彌補這方面的知識點。

    基本功另外一類是關於技能的,分為如下幾個層次。

    1 除錯程式碼的能力,比如邊上沒有人,你能自己通過debug把程式碼調通。

    2 能山寨別人程式碼的能力,比如你要實現一個JDBC連資料庫的功能,自己不熟悉JDBC的操作,但你可以從網上找段相似的然後改改實現。

    3 學習的能力,比你是做後端的,但需要實現一些基本的前端功能,這你要能通過看資料快速上手。

    4 搭建環境和框架的能力,小而言之,在linux上搭建mysql等zookeeper,大而言之,搭建一個nginx+zookeeper+dubbo叢集的能力。

    5 能通過看日誌排查問題的能力,比如日誌在linux上, 你能通過grep, less等命令快速定位問題。

    6 這個可能比較難點,叫解決問題的能力,比如目前系統性能一般,你得能通過壓測,看日誌等手段看出問題點,然後動手解決。

    從上述描述裡,大家可以看到,這些技能上的基本功,在大學裡能得到鍛鍊的很少,很多都是在工作後慢慢積累的,也就說,哪怕學校一般,學歷一般,在工作中絕對是有機會迎頭趕上的。

5 如何自己彌補基本功

    那麼初級程式設計師該如何提升自己的基本功?實踐是最重要的,重要程度沒有之一,具體來講,怎麼做呢?

    1 入門階段,先買本書,建議是紙質書,這樣閱讀效率更高,下載程式碼,邊執行程式碼邊看書裡的解釋。

       剛開始不知道買哪類書怎麼辦?一般能通過出版社稽核的書都不會差。比如就拿Java後端方向,買本Java Core的,一本Web書(含SSM框架),資料庫的書也可以買一本。由於邊執行邊看,所以最長3個月能把程式碼執行通。

    2 在這三個月的過程中,也可以看些視訊,視訊裡一般會含程式碼也程式碼的配置步驟。

    3 理論略過,著重看程式碼執行。執行程式碼時一定別先自己動手,因為剛開始能力弱,自己動手一定會遇到很快坑,這樣多遇到幾次調不通,信心就沒了,就會不了了之了,記得,剛開始時最多可以在執行通的前提下改別人的程式碼,以驗證各模組和各引數的效果。

    4 在看的時候,初級程式設計師往往會多看些平時用不到的知識點,所以在這個階段,可以去看下別人培訓班的課程體系,或者看些面試方面的書,這樣就知道哪些知識點不怎麼用到,這樣能節省學習時間。

    這樣看書看視訊執行程式碼持續3個月後,就具備動手除錯程式碼和搭建環境的能力了,然後就有進軟體公司幹活的能力了。在這個時間點上,再瞭解上文提到的演算法,如果可以,再通過Java等語言,按資料結構書裡的程式碼執行一下,瞭解下基本的資料結構和排序等演算法,這樣能力甚至會高於一般學校軟體行業的畢業生了。  

6 在做專案時,有意識地積累些值錢的知識點

    通過上述方法積累些理論方面的經驗之後,就得通過做專案來積累實戰經驗了。很多時候,在做完2到3個專案後,非科班出身的程式設計師和好學校科班出身的程式設計師動手技能實際上就差不多了,這個時候就得注意積累些“值錢”的技能點了。

    第一,尤其得注意除錯問題的能力,比如一個模組程式碼開發好了,怎麼通過dubug或單元測試的手段,驗證模組沒問題,或者出現問題了能知道怎麼解決。

    第二,能通過SQL語句看資料庫,以及通過看日誌等手段,瞭解程式的執行流程,看下是否缺少功能點,或者出了問題能據此解決。

    第三,架構方面,這可能剛開始有些難,但可以採用MVC的思路,比如看下前端的請求怎麼通過控制器,控制器如何把請求傳送到後端,後端做好以後怎麼返回。在此基礎上,可以看下分散式部署的實現方式,比如反向代理,分庫分表等方式。

     第四,一定得掌握些調優的手段,主要包括SQL語句調優(看執行計劃)和JVM效能調優(通過Jconsole,Dump等手段)。

     如果有機會,再瞭解些大資料分析, AI等當前比較值錢的知識點。 

    不過,很多程式設計師會僅僅停留在“程式碼“ 層面,在此之外,大家可以更開闊思路,掌握些專案管理部署和釋出方面的技能。

    1 專案管理方面,比如可以用敏捷開發的模式,大家可以瞭解下敏捷開發的流程。

    2 比如專案用Maven管理jar包,在此基礎上用jenkins打包部署,這個流程細節,大家可以掌握下。

    3 java專案開發後,一般會打成jar包或war包,部署到tomcat伺服器上,在此基礎上還可以做些負載均衡等方式,這塊配置步驟,或者tomcat等的細節,大家可以掌握下。

    總之,不論是哪類程式設計師,掌握了上述技能,並能在簡歷和麵試中充分證明這點,

7 有實踐性的進階路線

    工作2年後,如果注意積累,好學校和一般學校的程式設計師差別一般就不大了,可能這時候僅僅剩下“學校名“的差別了,不過話說回來,工作2年後,還得靠學校名來證明自己,這未免也有些可悲。

     這時候,思考的出發點就應該從“如何站穩”轉變為“如何更好的發展自己”。這時,視野就應該從一般公司升級到大廠了。

     如果你想積累技能經驗,可以剛開始選擇個網際網路公司,在其中體驗下這類公司的開發氛圍後,就再想辦法進BAT。現在,外企的吸引力未必有前幾年那麼強,不過也是個好的選項。或者,也可以選擇個國內大點規模的公司發展,比如證券金融類公司。

     如果你能直接進,那最好,或者還可以通過外派的方式進大公司,這樣幹個兩年,或者有機會轉成正式員工,或者這個時候就有資歷直接進大廠了。

8 總結,版權說明和求推薦

    原本打算在週一時就發表本文,但本週公司事情太多,又在整理另一本書,所以延遲到週五。不過在這段時間裡,我天天回顧文字,也加了些內容,所以“延遲”總算也有些價值。

    總結下,如果要迎頭趕上,第一得靠信心,不妄自菲薄,第二得靠勤奮,笨鳥先飛,第三得靠方法,所謂事半功倍。

    本文裡提到的方法和技能,如果能對大家有所幫助,請大家幫忙轉發,或者點選下面的按鈕來“推薦本文”,或者通過評論來參與討論。

    再次感謝大家讀完本文。