本來想分享畢業生和初級程序員如何進大公司的經驗,但后來一想,人各有志,有程序員或許想進成長型或創業型公司或其它類型的公司,所以就干脆來分享些提升技能和通過面試的技巧,技巧我講,公司你選,兩廂便利。
畢業生和初級程序員(一般是工作經驗3年以下)大多處於事業的青黃不接的階段,在找工作時往往會遇到缺乏實際項目經驗的瓶頸,作為技術面試官,我也經常在面試過程中感受到這些候選人缺乏實際經驗的缺陷。不過本人之前做過java兼職培訓老師,也總結了些這批人群提升實際技能和面試技能的技巧,最近也老有人來問我這個,所以我就干脆把這寫成博客文章。
1 在校大學生最好積累些商業項目的經驗,這樣就能形成代差優勢
公司一般會錄用哪類人?我們把各種答案歸納成一句:需要技術匹配而且有相關項目經驗的人,再簡化一下,做過相關經驗(一般是指商業項目經驗,說再直白點就能掙錢的項目),那么用到的技術大多和公司要求匹配,也就是說,如果你有相關經驗,那么和那些光有理論經驗的候選人相比,就有代差優勢,所以我在面試候選人時,經常會見到二本甚至三本大學生逆襲的場景。
如何積累商業項目經驗?盡快開始實習,如果可以,大二暑假就可以找個軟件公司打工了,如果你有老師在外有項目,那最好也一起做,如果學校安排實習,那更得去。如果實在找不到實習公司,或者也可以去一些網站接些商業項目的兼職活。
這里請注意,一般畢業設計的分量沒商業項目的分量重,那如果你就只有畢業設計的經驗,那只能和同樣沒商業項目的這群人一起競爭了。
代差優勢能給你帶來什么樣的好處?
1 在校招時,大多數人沒商業項目經驗,但你有,你的簡歷通過初審的可能性就非常大,而且在實際面試時,哪怕你算法基礎知識等問題沒回答好,但只要讓面試官確信你做過商業項目,通過面試的可能性也比無商業項目的人群要高很多。
2 在通過網站等形式投簡歷時,很多公司實際上是要有商業項目經驗的,如果你沒,甚至連面試的機會都沒有,但如果你有實習等的商業項目經驗,那至少你通過初選的可能性就大大提升了。
2 走上社會后,在初級階段,選定一個目標,這樣項目經驗就有積累
我在面試畢業生乃至初級程序員時,感覺有過實際項目經驗的人非常少,(這就更驗證了有經驗的人相當有利),而且,這批人通過面試的可能性比3年左右的程序員要小很多。下面我來分析下這群人的普遍問題。
問題1,商業項目經驗很少,所以簡歷甚至無法通過篩選,這樣根本得不到面試的機會。
問題2,即使有些項目組因為着急要人,從而讓一些初級程序員得到面試機會,但在面試過程中,這些人往往無法證明自己真的在項目中用過相關技巧,這些僅有理論經驗的人通過面試的可能性非常小。
問題3:大多數初級程序員往往能通過准備,能知道算法、邏輯題和一些簡單的說辭,無法證明自己掌握一些工作中必要的技能點,從而無法證明自己勝任這份工作。
上述問題的結果就是:在我手上通過面試的程序員,八成以上具有3年之上經驗的,其實面試要求不難,能干活就行,但大多數的初級程序員就是沒法證明這點。
針對上述問題,給出的建議是:學習和積累。
1 給自己制定一個明確的目標,工作后3年內盡量少換,否則就得從頭開始積累。
2 比如目標方向是Java后端開發,那么在工作中,別得過且過,多跟組里的前輩學,多掌握些知識點。
3 一定得圍繞“性能優化”這個主題,比如內存性能優化,數據庫優化,多掌握些項目中能用到的優化技能點。
4 哪怕你最近不准備面試,但也得邊工作邊看面試題,最好定期出去面試下。畢竟每個人在學習過程中都會走彎路,用句比較流行的話來講就是試錯,通過不斷的面試,能不斷修正自己的學習方向。
3 來點干貨,在Java Core,java Web和數據庫方面,一般公司的最近標准是什么
這些也是能找到工作的最低標准,Java Core的標准如下。
方面 |
合格程序員的標准 |
集合 |
1 對於各線性表類對象(比如Array, LinketList, ArrayList, Stack, Set等)和鍵值對類對象(比如HashMap等),會基本的遍歷和增刪改操作 2 會使用Iterator,泛型,比較器等常用對象 |
異常處理 |
1會用try…catch…finally框架 2 了解各種異常的類型,比如運行期異常,數據庫或者IO等異常。 |
IO |
能完成基本的IO操作,比如讀寫文件,讀寫內存,讀寫壓縮包等 |
JDBC |
會基本的連接,增刪改查預處理批處理操作 |
多線程 |
1會創建多線程,而且能通過notify, wait,sleep等的關鍵字,讓多線程協調地完成項目里的任務。 2 會用synchronized等常用關鍵字,在多線程讀寫情況下不會產生沖突問題。 3 最好會用線程池。 |
面向對象和設計模式 |
能知道基本的概念和諸如繼承,抽象類和接口等的語法 |
垃圾回收和內存性能管理 |
知道基本的概念,知道基本的System.gc等的語法,知道通過java –xms等基本的配置內存的操作。 |
Java Web方面的要求點大致如下:
方面 |
合格程序員的標准 |
JSP+Servlet +JavaBean (簡單的MVC框架) |
1 會用JSP+Servlet+JavaBean這套框架編程,知道基本的MVC流程。 2 最好了解些簡單的JS,DIV,CSS等前端技術。 3 知道怎么把Web程序發布到服務器上。 |
Struts方面 |
可以不用了解,因為用得比較少 |
Spring方面 |
1知道IOC和AOP的概念,知道如何使用這些技術。 2 知道Spring MVC的開發流程,能在項目經理帶領下開發基於Spring的Web項目。 3 最好能了解下Spring MVC方面的一些組件。 |
Hibernate (或者ORM) |
1 可以只掌握一種ORM技術。 2能用Hibernate干些基本的增刪改查等操作。 2 熟悉一些基本組件,比如SesionFactory,Criteria和Session等的用法。 3 知道一對一,一對多,多對多的基本用法。 4 知道緩存概念,最好了解下性能優化等技能。 |
Spring和Hibernate整合 |
這點上合格和高級程序員的差別不大,要求是,能整合,能配置連接池。 |
而在數據庫方面,最低的要求體現在如下三方面的需求。
第一,針對一類數據庫(比如MYSQL,Oracle,SQL Server等),會基本的增刪改查操作,會用一些基本的函數,會編寫存儲過程觸發器索引等工具。
第二,知道一些基本的對項目開發有幫助的概念,比如范式,索引,分區等。
第三,能編寫一些相對復雜的SQL語句,比如帶連接,帶子查詢,嵌套查詢等。
在java web輕量級開發面試教程這本書里,我對此做了詳細的說明。
我知道,其實大多數的初級程序員都知道上述知識點,但無法有效地在項目中證明這點,而且,我之前也說了,上述僅僅是最低要求,接下來給出的要點將大大提升各位的面試成率。
4 通過簡歷證明自己在項目中用過相關知識點,面試時盡量找機會說出來
這里給出些准備簡歷時的注意要點。
1 針對每份工作微調簡歷,在發給目標公司的簡歷中,多寫些在該公司職位介紹時出現的關鍵字。
2 少寫不相干的工作經驗,任何經驗都往目標公司的職位要求上靠,比如目標公司的職位是java后端開發,你寫一些linux上項目維護的經驗或數據庫DBA的相關經驗尚屬搭邊,但如果寫上測試或實施等經驗,就屬於不相干了。
3 少寫關於項目業務介紹的內容,因為目標公司不關心。
4 這個是關鍵,一定得結合業務實際,寫上自己有過相關技能的經驗。
比如目標公司要求有數據庫優化的經驗,那你就可以寫,在xx項目里,對sql的執行時間有要求,所以在訂單管理模塊里,我用到了xx技術,實現了sql優化效果。
類似的文字要多,涉及到的項目年限也請盡可能地長。這樣當篩選簡歷的人和面試官看到你的簡歷時,不由得不信你第一有實踐項目經驗,第二在實踐經驗中用過相關技術。
而在面試時,技術面試官一定會問到職位要求里的相關技能,你事先得准備。如果你能在面試過程中有條理地說出你是如何在項目里用到相關技術的,那么這樣的說服力要比你單純說“你知道“要強很多,甚至有些面試官聽到你的這些敘述后,會少問或不問相關問題。
5 多准備些“你優於別人”的證據
這些證據可以出現在簡歷中,當然你更應該在面試中說出來。
我在面試中,往往會不得不從10個人符合要求的人里挑選出3人。(按我說10個人全要算了,但不行,預算不夠)。這樣如果某個候選人表現出優於別人的技能,那么這個人就一定是在同等條件里優先考慮的。
如下是Java Core方面可以准備的亮點。
技術方面 |
可以說的亮點 |
Java集合對象 |
1 能根據項目的需求選用合適的集合對象,比如知道ArrayList和LinkedList的差異,並能合理選用。 2 能在合適的場合選用WeakHashMap。 3 可以適當講一些集合的JDK底層實現代碼。 |
異常處理方面 |
能在finally從句里寫釋放資源的代碼 |
JDBC方面 |
1 能通過PreparedStatement的預處理方法來防止SQL注入。 2 能通過批處理來提升操作性能。 3 能通過實例講述事務隔離級別的含義 |
多線程方面 |
1 會使用線程池 2 能通過鎖或信號量等手段正確地處理多線程並發時的數據一致性。 |
在下表里,我們列了些在數據庫方面可以准備的亮點。
技術方面 |
可以說的亮點 |
建表 |
建表時需要根據項目的數據情況,考慮是采用三范式或是反范式。 |
SQL調優 |
1 可以通過查看日志等方式看哪些SQL需要調優。 2 可以通過執行計划查看SQL的所消耗的代價,並據此調優。 3 可以通過建索引,建分區等手段來優化SQL性能。 |
事務 |
1 可以說下JDBC或Spring里是如何管理事務的。 2 可以說下Spring里的聲明式事務的做法和優點。 3 可以舉例說明事務隔離級別和事務傳播機制的用法。 |
分布式數據庫 |
1 可以通過水平或豎直等方式的方式來拆分數據庫,從而減輕對單表訪問所需要的代價。 2 可以通過集群等方式來承擔對數據庫的過量的訪問請求。 |
NoSQL和Hadoop |
這兩個本身就是個亮點,如果大家用過,可以結合項目來說明。 |
下面里列了Java Web方面可以准備的亮點
技術方面 |
可以說的亮點 |
Spring MVC架構 |
1 可以說下Spring的IOC和AOP是如何優化項目結構的。 2 可以說下攔截器等Spring組件對項目的幫助。 |
ORM,比如Hibernte或Mybatis |
使用這種ORM技術時,如何優化訪問和操作數據庫的性能。 |
Spring和Mybatis等的整合 |
可以講下整合框架的細節,並可以舉例說明整合后的框架能很好地適應需求的變更。 |
此外,大家還可以在Linux使用技能以及項目管理軟件的使用經驗方面展示自己的亮點。這里請注意,一定找合適的機會“順帶”地說,如果沒機會寧可別說,更不能仗着有所准備就直接自說自話地說。否則的話,反倒可能會得到“表達能力不清晰”或“敘述條理混亂”等的不良評價。
6 總結
本文涉及到的點有些廣,這里來總結下本文中提到的觀點。
1 在校生盡可能早地積累些商業項目的經驗。
2 工作后找准發展方向,然后通過不斷的面試來調整自己的學習路線。
3 簡歷中的項目描述應該盡量與目標公司的需求一致,在面試中也應當盡量證明這點。
4 多積累些優於別人的優勢。