在這個IT系統動輒就是上億流量的時代,Java做爲大數據時代應用最普遍的語言,誕生了一批又一批的新技術,包括HBase、Hadoop、MQ、Netty、SpringCloud等等 。java
一些獨角獸公司以及騰訊、阿里、百度、網易等知名大廠對Java人才的需求量連年升級,有2年工做經驗的優秀程序員能輕鬆達到30w+的水平,但與此同時對人才的要求也愈來愈高。程序員
好比,大廠的面試官常常會以以下句式來詢問:面試
聊一聊你對JVM的原理,如何減小Full GC的狀況?算法
針對高併發場景,如何優化,都採用了什麼技術?sql
相比關係型數據庫,NoSQL的優點在哪裏,大家在什麼場景下會用到?數據庫
能夠看到,對於社招同窗而言(特別是有2~5年工做經驗的同窗),不只僅會問一些編程語言、設計模式等基礎問題,還要對一些項目有深刻的實戰經驗。編程
但現實倒是,不少同窗在技術生涯最初幾年都會沉浸在業務開發中,忽視了對系統知識的梳理和技術視野的擴展。日復一日,致使不少同窗就覺得這就是技術的所有,同時在重複的體力勞動中也喪失了對技術細節的深刻探討。設計模式
每一個程序員都追求「成就感」,而得到成就感最好的方式就是本身在技術上的突破。網絡
技術的突破須要依賴業務場景的需求和自身刻意的規劃學習,兩者缺一不可,但前者是機會,每每不是本身能徹底把控的,若是在本身工做中沒有實踐場景,最好的辦法就是系統的學習與梳理,爲本身制定一個不一樣時間段的發展道路,待機會來臨時就能一展身手。數據結構
以工做前5年的規劃爲例,至少須要突破三個層次:
對代碼精益求精
最開始工做的時候,咱們會抱怨業務需求對技術沒挑戰,以爲在學校學到的這麼多知識卻沒有用武之地。
實質上這是忽略了技術開發的本質,技術開發是一個工程項目,而工程項目的落地最重要的就是細節控制,也就是代碼的品質,好比:
代碼是否遵循了規約?接口設計的是否隨意?測試用例是否都經過?
滿屏的if-else是否能夠用合理的設計模式來替代?有沒有遵循SOLID原則,KISS原則?
有沒有考慮用更合理的數據結構和算法改變代碼的複雜性,提高運行的性能?
代碼出bug的機率有多大,可否下降?
這是程序員的立足之本,基本是工做1年左右要達到的。在這一階段看書是比較好的提高方式,好比:《Java編程思想》、《effective java》等。但要注意的是,在看書的過程當中必定要思考可否運用書中的經驗來改善本身寫的代碼,運用到實處,好比看到final和static,想一想本身代碼中用的是否合理。
此外,還能夠看些經常使用的開源框架,若是你用的是Spring框架等,那麼下面一個很好的知識結構:
跳出來,主動了解技術全貌
在將基礎打牢以後,須要主動突破溫馨區,不斷的去擴大本身的技術視野,作到有廣度。
這一步比較難,由於不少同窗會被公司的技術和業務牽着走,好比公司當前的業務規模決定了技術上不須要分佈式技術,那麼不少同窗就不會去思考若是規模大了以後,如何利用分佈式技術解決該問題。
如何解決這個問題?除了尋找更大規模的業務外,要時刻保持時刻跳出當前層級和環境來思考的習慣。好比,你只用了關係型數據庫,那麼有沒有想過數據一直產生,到達TB級別的時候該如何快速檢索與保存呢?
此外,技術的全貌還包括各類技術之間的關係,你用了Dubbo,那麼Duboo和Netty是什麼關係,爲何會用到Zookeeper呢,和Spring Cloud又是什麼關係?若是能在學習新技術的時候,將繁雜的技術關係理順,會有一覽衆山小的感受。
在工做的2~3年時間內達到這個水平,30w的年薪就離你不遠了。若是你對高併發和分佈式技術感興趣,那麼下面一幅圖會有幫助:
不去造輪子,
前提是得知道輪子的內部結構
若是說,第二步是增長你的知識廣度,那麼造輪子就是增長你的技術深度,經過造輪子,才能真正把握技術的前因後果。
不少人信奉「不去造輪子」,看似性價比很高的一句話,殊不知道這句話是有前提的,那就是「你得知道輪子的內部結構」,不然就是自我麻痹。接下來須要選擇某一個或幾個方面深刻研究下去,構建本身的核心競爭力。
好比,消息隊列在高併發分佈式系統中一個及其重要的組件,起到削峯填谷、系統解耦的做用。咱們以消費端如何快速獲取數據來看思惟是如何一步步深刻的:
首先消費端要想及時獲取數據,是否須要創建一個長鏈接?長鏈接的實現方式如何?
數據是經過push仍是pull方式給到消費端,各自有什麼弊端?
若是消費失敗,多是哪些緣由引發?若是是由於網絡緣由引發,該如何解決?
這些問題都會在你本身造輪子的過程當中暴露出來,從而加深你的理解和技術深度,一個有技術深度的程序員纔是有靈魂的。而大廠也是願意爲有趣的靈魂買單的,這個時候看的就不只僅是工資水平,更多的是在於晉升和發展前景的廣闊性。
在Java語言上有所建樹的開發者,都經歷過以上3個層次。但惋惜的是,囿於外界環境和自身設限,大部分的Java開發者卻只停留在了第一個層次中,在日復一日的體力勞動中喪失了對技術細節的深刻探討,也喪失了晉升和薪資談判中的籌碼。
如何過渡到第2、三個層次?除了上文談到的內容,這裏我還想給你2個切身的建議:
一、擴寬本身的眼界,學着從全局看待問題,而且敢於挑戰別人眼中的難題
二、持續提高你的學習能力,雖然有不少人以「在公司學不到東西」爲理由離職,但你要知道:公司的目的是盈利。盈利的前提下,公司會盡力培養你,可是更多的時候能力成長仍是得靠本身。學習能力弱的人,在哪裏都沒用。
掌握精通如下技術知識點年薪50W不是小kiss?
項目實戰
高性能架構
架構師築基
開源框架
設計模式
團隊開發
微服務架構
若是你依然以爲有些茫然,不如跟有十餘年Java開發經驗的資深工程師聊一聊。
架構資料
架構資料
歡迎工做一到五年的Java工程師朋友們加入架構華山論劍【836442475點擊進入】(大牛彙集地)一塊兒交流學習探討!
羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!