在這個IT系統(tǒng)動輒就是上億流量的時代,Java作為大數(shù)據(jù)時代應(yīng)用最廣泛的語言潮针,誕生了一批又一批的新技術(shù)术荤,包括HBase、Hadoop每篷、MQ瓣戚、Netty、SpringCloud等等 焦读。
一些獨角獸公司以及騰訊子库、阿里、百度矗晃、網(wǎng)易等知名大廠對Java人才的需求量連年升級刚照,有2年工作經(jīng)驗的優(yōu)秀程序員能輕松達(dá)到30w+的水平,但與此同時對人才的要求也越來越高喧兄。
比如无畔,大廠的面試官經(jīng)常會以如下句式來詢問:
- 聊一聊你對JVM的原理,如何減少Full GC的情況吠冤?
- 針對高并發(fā)場景浑彰,如何優(yōu)化,都采用了什么技術(shù)拯辙?
- 相比關(guān)系型數(shù)據(jù)庫郭变,NoSQL的優(yōu)勢在哪里颜价,你們在什么場景下會用到?
可以看到诉濒,對于社招同學(xué)而言(特別是有2~5年工作經(jīng)驗的同學(xué))周伦,不僅僅會問一些編程語言、設(shè)計模式等基礎(chǔ)問題未荒,還要對一些項目有深入的實戰(zhàn)經(jīng)驗专挪。
但現(xiàn)實卻是,很多同學(xué)在技術(shù)生涯最初幾年都會沉浸在業(yè)務(wù)開發(fā)中片排,忽視了對系統(tǒng)知識的梳理和技術(shù)視野的擴(kuò)展寨腔。日復(fù)一日,導(dǎo)致很多同學(xué)就以為這就是技術(shù)的全部率寡,同時在重復(fù)的體力勞動中也喪失了對技術(shù)細(xì)節(jié)的深入探討迫卢。
每個程序員都追求“成就感”,而獲得成就感最好的方式就是自己在技術(shù)上的突破冶共。
技術(shù)的突破需要依賴業(yè)務(wù)場景的需求和自身刻意的規(guī)劃學(xué)習(xí)乾蛤,二者缺一不可,但前者是機(jī)會捅僵,往往不是自己能完全把控的家卖,如果在自己工作中沒有實踐場景,最好的辦法就是系統(tǒng)的學(xué)習(xí)與梳理命咐,為自己制定一個不同時間段的發(fā)展道路,待機(jī)會來臨時就能一展身手谐岁。
以工作前5年的規(guī)劃為例醋奠,至少需要突破三個層次:
對代碼精益求精
最開始工作的時候,我們會抱怨業(yè)務(wù)需求對技術(shù)沒挑戰(zhàn)伊佃,覺得在學(xué)校學(xué)到的這么多知識卻沒有用武之地窜司。
實質(zhì)上這是忽略了技術(shù)開發(fā)的本質(zhì),技術(shù)開發(fā)是一個工程項目航揉,而工程項目的落地最重要的就是細(xì)節(jié)控制塞祈,也就是代碼的品質(zhì),比如:
- 代碼是否遵循了規(guī)約帅涂?接口設(shè)計的是否隨意议薪?測試用例是否都通過?
- 滿屏的if-else是否可以用合理的設(shè)計模式來替代媳友?有沒有遵循SOLID原則斯议,KISS原則?
- 有沒有考慮用更合理的數(shù)據(jù)結(jié)構(gòu)和算法改變代碼的復(fù)雜性醇锚,提升運行的性能哼御?
- 代碼出bug的概率有多大坯临,能否降低?
這是程序員的立足之本恋昼,基本是工作1年左右要達(dá)到的看靠。在這一階段看書是比較好的提升方式,比如:《Java編程思想》液肌、《effective java》等挟炬。但要注意的是,在看書的過程中一定要思考能否運用書中的經(jīng)驗來改善自己寫的代碼矩屁,運用到實處辟宗,比如看到final和static,想想自己代碼中用的是否合理吝秕。
此外泊脐,還可以看些常用的開源框架,如果你用的是Spring框架等烁峭,那么下面一個很好的知識結(jié)構(gòu):?
跳出來容客,主動了解技術(shù)全貌
在將基礎(chǔ)打牢之后,需要主動突破舒適區(qū)约郁,不斷的去擴(kuò)大自己的技術(shù)視野缩挑,做到有廣度。
這一步比較難鬓梅,因為很多同學(xué)會被公司的技術(shù)和業(yè)務(wù)牽著走供置,比如公司當(dāng)前的業(yè)務(wù)規(guī)模決定了技術(shù)上不需要分布式技術(shù),那么很多同學(xué)就不會去思考如果規(guī)模大了之后绽快,如何利用分布式技術(shù)解決該問題芥丧。
如何解決這個問題?除了尋找更大規(guī)模的業(yè)務(wù)外坊罢,要時刻保持時刻跳出當(dāng)前層級和環(huán)境來思考的習(xí)慣续担。比如,你只用了關(guān)系型數(shù)據(jù)庫活孩,那么有沒有想過數(shù)據(jù)一直產(chǎn)生物遇,到達(dá)TB級別的時候該如何快速檢索與保存呢?
此外憾儒,技術(shù)的全貌還包括各種技術(shù)之間的關(guān)系询兴,你用了Dubbo,那么Duboo和Netty是什么關(guān)系起趾,為什么會用到Zookeeper呢蕉朵,和Spring Cloud又是什么關(guān)系?如果能在學(xué)習(xí)新技術(shù)的時候阳掐,將繁雜的技術(shù)關(guān)系理順始衅,會有一覽眾山小的感覺冷蚂。
在工作的2~3年時間內(nèi)達(dá)到這個水平,30w的年薪就離你不遠(yuǎn)了汛闸。如果你對JVM和性能調(diào)優(yōu)技術(shù)感興趣蝙茶,那么下面一幅圖會有幫助:
?
不去造輪子,
前提是得知道輪子的內(nèi)部結(jié)構(gòu)
如果說诸老,第二步是增加你的知識廣度隆夯,那么造輪子就是增加你的技術(shù)深度,通過造輪子别伏,才能真正把握技術(shù)的來龍去脈蹄衷。
很多人信奉“不去造輪子”,看似性價比很高的一句話厘肮,卻不知道這句話是有前提的愧口,那就是“你得知道輪子的內(nèi)部結(jié)構(gòu)”,否則就是自我麻痹类茂。接下來需要選擇某一個或幾個方面深入研究下去耍属,構(gòu)建自己的核心競爭力。
比如巩检,消息隊列在高并發(fā)分布式系統(tǒng)中一個及其重要的組件厚骗,起到削峰填谷、系統(tǒng)解耦的作用兢哭。我們以消費端如何快速獲取數(shù)據(jù)來看思維是如何一步步深入的:
- 首先消費端要想及時獲取數(shù)據(jù)领舰,是否需要建立一個長連接?長連接的實現(xiàn)方式如何迟螺?
- 數(shù)據(jù)是通過push還是pull方式給到消費端冲秽,各自有什么弊端?
- 如果消費失敗煮仇,可能是哪些原因引起劳跃?如果是因為網(wǎng)絡(luò)原因引起谎仲,該如何解決浙垫?
這些問題都會在你自己造輪子的過程中暴露出來,從而加深你的理解和技術(shù)深度郑诺,一個有技術(shù)深度的程序員才是有靈魂的夹姥。而大廠也是愿意為有趣的靈魂買單的,這個時候看的就不僅僅是工資水平辙诞,更多的是在于晉升和發(fā)展前景的廣闊性辙售。
在Java語言上有所建樹的開發(fā)者,都經(jīng)歷過以上3個層次飞涂。但可惜的是旦部,囿于外界環(huán)境和自身設(shè)限祈搜,大部分的Java開發(fā)者卻只停留在了第一個層次中,在日復(fù)一日的體力勞動中喪失了對技術(shù)細(xì)節(jié)的深入探討士八,也喪失了晉升和薪資談判中的籌碼容燕。
如何過渡到第二、三個層次婚度?除了上文談到的內(nèi)容蘸秘,這里我還想給你2個切身的建議:
- 擴(kuò)寬自己的眼界,學(xué)著從全局看待問題蝗茁,并且勇于挑戰(zhàn)別人眼中的難題
- 持續(xù)提升你的學(xué)習(xí)能力醋虏,雖然有很多人以「在公司學(xué)不到東西」為理由離職,但你要知道:公司的目的是盈利哮翘。盈利的前提下颈嚼,公司會盡力培養(yǎng)你,但是更多的時候能力成長還是得靠自己忍坷。學(xué)習(xí)能力弱的人粘舟,在哪里都沒用。
如果你依然覺得有些茫然佩研,不如跟有多年Java開發(fā)經(jīng)驗的資深工程師聊一聊柑肴。
讀者分享
覺得不錯的朋友可以點點小贊一下,如果你對以上知識點能掌握到一定程度那么進(jìn)入BAT不是什么大問題旬薯,離走向架構(gòu)師也近了一步晰骑!
{附}個人總結(jié)收集到的一些面試資料圖以及針對Java技術(shù)錄制的精講進(jìn)階架構(gòu)視頻資料
想獲取資料學(xué)習(xí)提升自己的可以加Q群:277763288 免費獲取0硇颉K队摺!
點擊鏈接加入群聊【Java高并發(fā)交流群】:https://jq.qq.com/?_wv=1027&k=56mDyFs
?