前言
按照一貫的尿性,脫離了劑量談毒性都是耍流氓,年薪這種事,脫離了地域城市談多少錢也是耍流氓。我有個同事,最近去了騰訊,職級為8級,從他那裡獲得的資訊是,在深圳,8級可以拿到將近50W,而在非北上廣深的城市,即使也是在騰訊,8級一般拿到是30W左右,相比在深圳,基本上要打個6、7折。
所以年薪40W在不同的城市,要求的水平就不一樣,在成都、西安、武漢這些新一線城市,年薪40W,到了北上廣深差不多可以拿70W。反過來在北上廣深拿40W,去新一線城市,差不多拿26W左右。
柿子當然是撿軟的捏,我們看看在北上廣深拿40W大概需要什麼樣的技術水平。國內目前以Java技術棧為主的公司有阿里、美團、京東等等,我們從中選擇一家,看看年薪40W的要求是什麼,就能明白要求的技術水平。
按照網上流傳的網際網路公司薪酬表格,年薪40W,相當於阿里的P6,資深工程師的水平。
阿里的P6的要求是什麼?從阿里的社招官網我們可以很容易的查到:
職位詳情 - 阿里巴巴集團招聘
拋開第5和第6條,我們仔細分析下崗位要求中的技術條目。首先要求JAVA基礎紮實,這裡麵包括熟練掌握資料結構、多執行緒程式設計,掌握常用的設計模式;熟悉JVM,包括記憶體模型、類載入機制以及效能最佳化。
資料結構是個老生常談的東西了, 這是程式設計師的基本功,不限於Java程式設計師。只不過為什麼要考察資料結構和演算法,很多人其實並不知道,用知乎上一位大牛的說法:
程式設計師這個群體也是有金字塔結構的。如果連基本的演算法和資料結構都不會,基本上就比較底層,底層就意味著低薪酬。沒有紮實的演算法和資料結構基礎,很難及時發現問題並提出獨到的見解。技術棧日新月異,如何快速適應新技術和新環境?要求程式設計師必須具有以不變應萬變的的計算機思維、演算法思維和邏輯思維能力。對於年薪40W來說,資料結構和演算法僅僅掌握陣列、連結串列、棧、佇列,基本的排序和查詢肯定是不夠的,如何計算演算法的複雜度,圖論,動態規劃等等還是需要掌握的,除此之外必要的刷題和麵試前對常見大廠演算法面試題的突擊,無疑在面試中可以大大的加分。
多執行緒程式設計,也就是我們常說的併發程式設計,只會用執行緒池和JUC下的併發工具類,不能算基礎紮實。 至少應該包括但不限於通曉CAS的原理和問題,閱讀過JUC中諸如AbstractQueuedSynchronizer之類的原始碼,明白Java記憶體模型JMM和相關的併發安全問題,對synchronized和volatile的底層實現有一定的涉獵等等,才夠得上對多執行緒程式設計基礎紮實。
設計模式和JVM,雖然是兩個完全不同的知識,但是對於年薪40W來講,卻有一定的相似性。 什麼相似性?兩者都是僅僅記住概念和理論是遠遠不夠的,一定要有實際的經驗。
例如JVM,崗位上面的要求是“熟悉JVM,包括記憶體模型、類載入機制以及效能最佳化”,類載入機制和相關聯的雙親委派模型的概念半天就記住JVM效能最佳化也無非就是那幾條原則,比如儘可能減少FULLGC的次數,縮短每次GC的時長等等。但是具體在生產環境中應該如何做呢?透過閱讀GC日誌能發現JVM哪些可以調整的地方?專案中記憶體洩漏問題怎麼排查?記憶體佔用過高怎麼解決?再看第二條,精通spring mvc、orm框架(ibatis或hibernate),熟悉前端開發(js、html、css)。在現在前後端分離的大趨勢下,對Java程式設計師來說,前端的知識不會要求特別高,一般來說能看懂就差不多了。 而對各種開源框架,知道或者用過裡面的常用註解,能寫出一個完整的SSM程式就算精通了?我想,在IT職場待過一年以上的人,都會有一個共同的答案,不是!什麼是對開源框架的精通?必然包括閱讀過框架的原始碼,對底層的原理和機制非常熟悉,出了問題,能快速定位到具體的原因和位置; 或者接觸了一個從未用過的公司內部框架後,能夠從已知的開源框架原理和機制裡得到的知識迅速地推斷、掌握這個陌生的框架。
第三條,“熟悉常見的中介軟體、分散式解決方案及其原理:分散式快取、SOA、訊息中介軟體,負載均衡、連線池等;”,雖然只有一句話,包含的資訊量卻很大。
首先,常見的中介軟體包括的東西是很多的,Redis、Zookeeper、Dubbo、以Kafak或RcketMQ為代表的訊息中介軟體、MongoDB、分庫分表相關的資料庫中介軟體、Nginx等等。其次,只知道這些中介軟體的用法,層次顯然不夠拿年薪40W。繼續往高層次前進,僅以Redis為例,它的兩種持久化方式,從原理的角度再結合自己的業務哪種更適合?在分散式架構下常見的可用性,伸縮性問題,在我們使用Redis的過程中怎麼解決?其他的各種中介軟體當然都各有各的原理需要掌握。第四條,“具有一定的專案規劃和決策能力,善於捕捉業務需求、架構設計中存在的問題,並給出有效的解決措施和方法;”,很明顯,指明瞭需要架構設計經驗和解決相關問題的能力,這條和前面的第三條是密切關聯的,沒有第三條作為基礎,架構設計經驗和解決相關問題的能力都是無根之水,無本之木。
比如分庫分表後的唯一性ID,根據業務情況,是Redis自動生成、雪花演算法還是Mysql提前序列表更適合我們?分庫分表後的分散式事務,應該選擇哪種解決方案?柔性事務還是TCC?按照業務的發展趨勢用標準的分散式還是轉向微服務?海量訂單資料如何儲存和檢索?超賣、秒殺等高併發場景怎麼設計?上述的這些,都是在業務和架構設計中都有可能遇到的問題,能不能給出有效的解決措施和方法,這些都是年薪40W甚至更高應該達到的水平。
總的來說,掌握的技術越精通,越全面薪資越高。經過總結和細化,下面的思維導圖中的技能掌握了,年薪40W就問題不大了:
溫馨提示:若圖片不清晰可以透過上面領取方式檢視原圖
相信這份路線圖對於你係統進階以及準備 Java 方向的面試都很有幫助!正如作者說的那樣,這是一份:涵蓋大部分 Java 程式設計師所需要掌握的核心知識的 Java 學習+面試指南!
Java程式設計師所需要掌握的核心知識的 Java 學習+面試指南1. Java基礎知識面試題
2. Dubbo面試題
3. Java異常面試題
4. Java虛擬機器(JVM)面試題
5. Java集合容器面試題
6. Linux面試題
7. MyBatis面試題
8. MySQL資料庫面試題
9. Netty面試題
10. Redis面試題
11. Spring面試題
12. Spring Boot面試題
13. Spring Cloud面試題
14. Spring MVC面試題
15. Tomcat面試題
16. ZooKeeper面試題
17. 併發程式設計面試題
18. 訊息中介軟體MQ與RabbitMQ面試題
面試攻略1. 面試前的準備
2. 面試中的技巧