本文爲大家詳細分析一下Java程序員月薪2萬需要具備的技術水平,大家可以對號入座,根據自己的現狀不斷學習,向高薪靠近。

一、程序員收入現狀分析

有人回答說這隻能是大企業或者互聯網企業工程師才能拿到。也許是的,小公司或者非互聯網企業拿兩萬的不太可能是碼農了,應該已經轉管理。還有區域問題,這個不在我的考慮範圍內,因爲除了北上廣深杭,其他地方也很難達到。

還有人提到這個水平不止2w,其實工資是跟面試表現有關的,也跟其他綜合水平有關,比如你是985,top10,或者研究生學歷,也或者懂點node,懂點大數據等等,或者表達能力強,擊中面試官痛點都會加分。

如果你達到我說的水準,起薪就是2w,有其他優秀的表現還會在這個基礎上加分。但純JAVA方面待遇是比較吻合的。還有SSH真的不是我要黑,2w水平的面試幾乎很少問SSH的知識,要問也是問架構層次的還有設計模式的。例如mybatis是如何管理session和cache的。spring裏面有哪些你熟悉的設計模式,你怎麼理解和應用的。

做Java月薪2萬需要達到什麼技術水平?

首先兩萬的月薪在BAT實在太普遍了,一般是高級工程師和資深工程師的職位。在阿里是p6~p7左右,在百度是t5左右,騰訊是t2-3左右,京東是t3-1,美團是p6左右,其他的我不瞭解。這種級別是他們主要碼農層級,加班多,能解決大部分問題,但對系統的整體架構能力和深入分析瓶頸的能力還需要培養。

二、月薪2W技能樹主要有三個方面

1、要有紮實基礎

比如對集合類,併發包,IO/NIO,JVM,內存模型,泛型,異常,反射,等有深入瞭解,最好是看過源碼瞭解底層的設計。

比如一般面試都會問ConcurrentHashMap,CopyOnWrite,線程池,CAS,AQS,虛擬機優化等知識點,因爲這些對互聯網的企業是絕對重要的。而且一般人這關都過不了,還發鬧騷說這些沒什麼用,爲什麼要面試。

舉一例子,在使用線程池時,因爲使用了無界隊列,在遠程服務異常情況下導致內層飆升,怎麼去解決?你要是連線程池都不清楚,你怎麼去玩?再舉一例,由於對ThreadLocal理解出錯,使用它做線程安全的控制,導致沒能實現真的線程安全。所以作爲一個拿兩萬的JAVA程序員這點基礎是要有的。

2、你需要有全面的互聯網技術相關知識

從底層說起,你起碼得深入瞭解mysql,redis,mongodb,nginx,tomcat,rpc,jms等方面的知識。你要問需要瞭解到什麼程度,我可以給你說個大慨。首先對於MySQL,你要知道常見的參數設置,存儲引擎怎麼去選擇,還需要了解常見的索引引擎,知道怎麼去選擇。知道怎麼去設計表,怎麼優化sql,怎麼根據執行計劃去調優。高級的你需要去做分庫分表的設計和優化,一般互聯網企業的數據庫都是讀寫分離,還會垂直與水平拆分,所以這個也有經驗的成分在裏面。

然後redis,mongodb都是需要了解原理,需要會調整參數的,而nginx和tomcat幾乎都是JAVA互聯網方面必配,其實很阿里的技術棧選擇有點關係。至於rpc相關的就多的去,必須各種網絡協議,序列化技術,SOA等等,你要有一個深入的理解。現在應用比較廣的rpc框架,在國內就是dubbo了,可以自行搜索。

至於jms相關的起碼得了解原理吧,一般情況下不是專門開發中間件系統和支撐系統的不需要了解太多細節,國內企業常用的主要是activeMQ和kafka。你能對我說的都研究的比較深入,阿里p7都不是太大問題的,當然這個還需要看你的架構能力方面的面試表現了。

3、必備編程能力,編程思想,算法能力,架構能力

首先2W程序員對算法的要求我覺得還是比較低,再高級也最多紅黑樹吧,但是排序和查詢的基本算法得會。編程思想是必須的,問你個AOP和IOC你起碼的清清楚楚,設計模式不說每種都用過,但也能瞭解個幾種吧。

編程能力這個我覺得不好去評價,但是拿一個2000W用戶根據姓名年齡排序這種題目也能信手拈來。最後就是架構能力,這種不是說要你設計個多牛逼多高併發的系統,起碼讓你做一個秒殺系統,防重請求的設計能快速搞定而沒有坑吧。

這以上就是我說得2w水準,如果你運氣好,面試表現好,3w+也有可能哦(?ω?)

三、企業招聘需求解析

來來來,我們上招聘網站實際找幾個月薪超過2w的JD來看下。

1、阿里招聘需求分析

1. “NIO”->老老實實研究一下netty的源碼和原理,保證他問不倒你;“類加載原理”->老生常談了,記得一個delegate,一個classloader如何造成內存泄漏就行;“動態代理、CGLIB”->肯定是問你如何生成proxy類,兩者有啥異同。找幾篇博客來看看就行。

另外,我估計很大程度是需要你結合spring來回答,因此還是看看spring的aop吧;“GC的原理”->這個就厲害了,GC有好多種,到底是哪種的原理啊?

但是以我身爲一名老年程序猿來告訴你,好好看一下CMS GC和G1 GC就行。CMS答好了肯定是OK的,G1純粹是錦上添花,給面試官留個追求技術的印象吧;“JVM內存模型”->JVM怎麼還有內存模型?是Java語言的內存模型吧?沒什麼好說的,看Java語言規範吧;“性能優化手段”->胡侃吧,朝着怎麼改進鎖,怎麼異步,怎麼利用緩存,怎麼選擇合適的GC算法,怎麼調整Hotspot VM的各generation比例,blabla(此處應有嘔吐的表情,這種問題最煩了,你要是底氣足,頂一句“具體問題具體分析”,我敬你是一條漢子)

2. “了懂,感覺是廢話,不管解併發基礎變成最優”->看不。併發這種東西,好好看一下java.util.concurrent包裏的類。

3. “具備開發實戰技能,可以熟練使用Eclipse、Idea、熟悉常見的調試方法及技巧、ant/svn/maven,有疑難雜症的排查經驗”->工作一段時間都會吧?ant和svn完全不夠酷,看得出來要麼阿里的人比較守舊(或者懶),要麼阿里的技術很老土。

4.總結

總結一下,阿里的要求總體比美團低,但是給的工資比美團高(僅限這兩個JD的比較!特地加粗)。那麼問題來了,到底是美團裝逼,高要求招人,低要求做事;還是阿里sb,低要求招人,高標準給工資?當然還有一個可能,就是貼這個JD的hr是sb。總的來說,能拿到美團的offer,肯定能拿到阿里的offer。因此優質騷年應該以美團的標準來要求自己(認真臉)。

2、美團招聘需求分析

1.計算機專業基本功和寫代碼能力是廢話,太主觀。我們先放着,一會再回來review。

2. “熟練掌握 Java及面向對象設計開發”=>工作一年以上;“對部分 Java技術有深入研究”=>熟練IO的各種姿勢,或者研究過Java內存模型,有此二者在手,面試官絕對對你刮目相看;“研究過優秀開源軟件的源碼並有心得”=>去Github找找幾個star多的項目來看吧,推薦netty,不要多,一個就好。

3. “瞭解 SOA架構理念、實現技術;熟悉常見設計模式”=>維基百科歡迎你,看看就行了;“熟練掌握 Spring、myBatis等框架”=>過一遍源碼吧。

4. “熟練掌握 MySQL應用開發、數據庫原理和常用性能優化和擴展技術”=>買本mysql的書來看(認真臉);“NoSQL,Queue的原理、使用場景以及限制”=>好好看看redis就行。

5. “http協議搜索引擎”=>維基百科;“緩存”=>Google Guava cache,memcached,redis;“jvm調優”=>掌握jvm參數(認真臉);“序列化”=>Google protocol buffer;“nio”=>netty;“RPC調用框架”=>dubbo(垃圾)

6. "xxx優先"=>有最好,沒有就算了。

7.美團應該不會2b到考邏輯題或者腦經急轉彎,所以這裏肯定是結合你做過的項目來說。一般都會問,1??項目架構,問什麼選擇這個不選擇那個;2??碰到的最有挑戰/最複雜/最blabla的問題是什麼,怎麼解決的。

8. “高度的創業心和投入度”=>不一定要天天加班,但是碰到問題或者項目緊急的時候要加班,面試的時候要表現出這個態度,哈哈;“技術,業務,blabla”=>不能死關注技術,一定要結合業務來回答面試問題。

好了,再回到第一條,“計算機專業基本功和寫代碼能力”,我們可以綜合一下,美團要求的可以是一個:(注意“可以”,你這麼做了“可以”獲得美團面試官的肯定,假如面試官真的是根據這份JD來要求你的話)

1.對Java語言本身,我們掌握一下內存模型,看一點併發相關的東西(java.util.concurrent包裏的類都看一遍),找幾篇博客看下weak/soft/phantom reference是什麼意思就行啦;

2.對於JVM,看看書,理解一下Hotspot的常見結構啊名詞啊啥的,記幾個重要的參數,足以應付面試官了;

3.熟讀netty源碼;

4.略讀Spring源碼,重點理解關鍵概念(AOP面試官很愛問的哦);

5.在維基百科上過一過JD裏提到的一些名詞;

6.買本mysql的書看看,高性能mysql那本書就很好;

7. redis或memcached哪個用的多就多看看相關博客。都沒用過?建議你看redis。

8.好好包裝一下你做過的最nb的項目,準備幾個技術難點和解決方法,記住一定要結合業務哦。(什麼?沒有?沒有不會編嗎?怎麼編?往分佈式和高併發方向編會嗎?不會?那你不適合互聯網。)

9.多工作幾年!

你看,也不是很難嘛。如果上面的幾點你都做到了,還拿不到2w的美團高級JAVA開發工程師的offer,那美團肯定是凍結了headcount。我認識的好多遠遠達不到上面需求的人都在美團呢。

PS:面試官問你算法的話,一定要裝作特別自信的說:“啊(第二聲),算法?一般工作當中不需要自己手寫算法吧?一方面是常用的算法,比如排序,查詢,都有現成的代碼來用;另一方面真需要手寫算法的問題一般都是面向特定需求的問題,或者要求效率特別高的地方。這些地方可以結合真正的需求來做。”當然常見的算法的僞代碼還是要會寫的哦。如果面試官問你紅黑樹,哈哈,那趕緊跑路。不是谷歌臉書也不是面試算法程序猿的公司問你紅黑樹,這公司一定是在裝逼。

四、能否實現月薪2萬的決定因素

月薪2萬的Java程序員屬於中級程序員。就是技術稍好一點,還做不到架構師級別的。一般來說我給人開2萬的薪水主要取決於以下幾個方面。

1.能否獨立完成項目,以及完成過哪些項目,至少是6+項目。

項目經驗多了,對於需求的理解能力也會好很多。

2.對於自己所做項目用的技術框架,是否足夠清楚,能否回答出來是如何選型的。

並不要求現在能夠去做架構的選型,但是一定要了解自己原有項目的架構體系。

3.是否對行業技術的現狀有足夠多的瞭解,是否有主動學習的表現。

這是看一個人的視野開闊程度,15K的程序員我不要求這些。20K的程序員必須要讀一些主流的體系,哪怕說出來幾個名詞都可以。

4.處理過的最大的數據量是多少,有沒有超過千萬級的流水。處理過的最大的併發數是多少,TPS能到達多少。

5.是否瞭解分佈式和緩存,RPC框架用過哪些,緩存的失效策略怎麼處理。

6.是否能夠快速的解決線上的故障,是否熟悉Bug和線上Bug的緊急修復流程。

7.是否熟悉項目工具,如Jenkins,Nexus,Confluence,wiki,git,svn等項目中常用的東西。

8.是否對性能調優有了解,GC的算法瞭解到多少。

其實應該是反過來說,就是候選人值多少錢?

補充一句,並沒有說都滿足。而是說至少要有幾項是滿足的。符合的條件越多,可以給出的薪水範圍就越高。

五、總結

總結起來,要達到月薪2萬,需要掌握如下技能:

1.有紮實的Java編程基礎,熟悉各種設計模式,有良好的程序設計能力。

2.熟悉整個軟件開發流程及規範。

3.熟練掌握Spring/Struts/Ibatis以及主流開發框架。

4.熟悉數據庫,比如Mysql、oracle等,並對數據庫事物有深刻理解。

5.擅長使用開源框架,解讀過源碼,掌握實現原理。

6.1-5年開發經驗。

7.學歷能力強,善於總結、思考。

以上的只是月薪20k Java開發崗位的基本技能,針對不同的業務還需要其他技能,比如搜索業務,還需要掌握Lucene、ElasticSearch等技術。

大家加油。

相关文章