在這個IT系統(tǒng)動輒就是上億流量的時代嗤堰,Java作為大數(shù)據(jù)時代應用最廣泛的語言戴质,誕生了一批又一批的新技術(shù),包括HBase踢匣、Hadoop告匠、MQ、Netty离唬、SpringCloud等等 后专。
一些獨角獸公司以及騰訊、阿里输莺、百度戚哎、網(wǎng)易等知名大廠對Java人才的需求量連年升級,有2年工作經(jīng)驗的優(yōu)秀程序員能輕松達到30w+的水平嫂用,但與此同時對人才的要求也越來越高建瘫。
比如,大廠的面試官經(jīng)常會以如下句式來詢問:
聊一聊你對JVM的原理尸折,如何減少Full?GC的情況?
針對高并發(fā)場景殷蛇,如何優(yōu)化实夹,都采用了什么技術(shù)?
相比關(guān)系型數(shù)據(jù)庫粒梦,NoSQL的優(yōu)勢在哪里亮航,你們在什么場景下會用到?
可以看到匀们,對于社招同學而言(特別是有2~5年工作經(jīng)驗的同學)缴淋,不僅僅會問一些編程語言、設(shè)計模式等基礎(chǔ)問題泄朴,還要對一些項目有深入的實戰(zhàn)經(jīng)驗重抖。
但現(xiàn)實卻是,很多同學在技術(shù)生涯最初幾年都會沉浸在業(yè)務(wù)開發(fā)中祖灰,忽視了對系統(tǒng)知識的梳理和技術(shù)視野的擴展钟沛。日復一日,導致很多同學就以為這就是技術(shù)的全部局扶,同時在重復的體力勞動中也喪失了對技術(shù)細節(jié)的深入探討恨统。
每個程序員都追求“成就感”叁扫,而獲得成就感最好的方式就是自己在技術(shù)上的突破。
技術(shù)的突破需要依賴業(yè)務(wù)場景的需求和自身刻意的規(guī)劃學習畜埋,二者缺一不可莫绣,但前者是機會,往往不是自己能完全把控的悠鞍,如果在自己工作中沒有實踐場景对室,最好的辦法就是系統(tǒng)的學習與梳理,為自己制定一個不同時間段的發(fā)展道路狞玛,待機會來臨時就能一展身手软驰。
以工作前5年的規(guī)劃為例,至少需要突破三個層次:
對代碼精益求精
最開始工作的時候心肪,我們會抱怨業(yè)務(wù)需求對技術(shù)沒挑戰(zhàn)锭亏,覺得在學校學到的這么多知識卻沒有用武之地。
實質(zhì)上這是忽略了技術(shù)開發(fā)的本質(zhì)硬鞍,技術(shù)開發(fā)是一個工程項目慧瘤,而工程項目的落地最重要的就是細節(jié)控制,也就是代碼的品質(zhì)固该,比如:
代碼是否遵循了規(guī)約锅减?接口設(shè)計的是否隨意?測試用例是否都通過伐坏?
滿屏的if-else是否可以用合理的設(shè)計模式來替代怔匣?有沒有遵循SOLID原則,KISS原則桦沉?
有沒有考慮用更合理的數(shù)據(jù)結(jié)構(gòu)和算法改變代碼的復雜性每瞒,提升運行的性能?
代碼出bug的概率有多大纯露,能否降低剿骨?
這是程序員的立足之本,基本是工作1年左右要達到的埠褪。在這一階段看書是比較好的提升方式浓利,比如:《Java編程思想》、《effective java》等钞速。但要注意的是贷掖,在看書的過程中一定要思考能否運用書中的經(jīng)驗來改善自己寫的代碼,運用到實處渴语,比如看到final和static羽资,想想自己代碼中用的是否合理。
此外遵班,還可以看些常用的開源框架屠升,如果你用的是Spring框架等潮改,那么下面一個很好的知識結(jié)構(gòu):
跳出來,主動了解技術(shù)全貌
在將基礎(chǔ)打牢之后腹暖,需要主動突破舒適區(qū)汇在,不斷的去擴大自己的技術(shù)視野,做到有廣度脏答。
這一步比較難糕殉,因為很多同學會被公司的技術(shù)和業(yè)務(wù)牽著走,比如公司當前的業(yè)務(wù)規(guī)模決定了技術(shù)上不需要分布式技術(shù)殖告,那么很多同學就不會去思考如果規(guī)模大了之后阿蝶,如何利用分布式技術(shù)解決該問題。
如何解決這個問題黄绩?除了尋找更大規(guī)模的業(yè)務(wù)外羡洁,要時刻保持時刻跳出當前層級和環(huán)境來思考的習慣。比如爽丹,你只用了關(guān)系型數(shù)據(jù)庫筑煮,那么有沒有想過數(shù)據(jù)一直產(chǎn)生,到達TB級別的時候該如何快速檢索與保存呢粤蝎?
此外真仲,技術(shù)的全貌還包括各種技術(shù)之間的關(guān)系,你用了Dubbo初澎,那么Duboo和Netty是什么關(guān)系秸应,為什么會用到Zookeeper呢,和Spring Cloud又是什么關(guān)系碑宴?如果能在學習新技術(shù)的時候灸眼,將繁雜的技術(shù)關(guān)系理順,會有一覽眾山小的感覺墓懂。
在工作的2~3年時間內(nèi)達到這個水平,30w的年薪就離你不遠了霉囚。如果你對高并發(fā)和分布式技術(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ā)者卻只停留在了第一個層次中咪鲜,在日復一日的體力勞動中喪失了對技術(shù)細節(jié)的深入探討,也喪失了晉升和薪資談判中的籌碼撞鹉。
如何過渡到第二疟丙、三個層次?除了上文談到的內(nèi)容鸟雏,這里我還想給你2個切身的建議:
1享郊、擴寬自己的眼界,學著從全局看待問題孝鹊,并且勇于挑戰(zhàn)別人眼中的難題
2炊琉、持續(xù)提升你的學習能力,雖然有很多人以「在公司學不到東西」為理由離職又活,但你要知道:公司的目的是盈利苔咪。盈利的前提下锰悼,公司會盡力培養(yǎng)你,但是更多的時候能力成長還是得靠自己悼泌。學習能力弱的人松捉,在哪里都沒用。
在此我向大家推薦一個架構(gòu)學習交流群馆里。交流學習群號:938837867 暗號:555 里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring隘世,MyBatis,Netty源碼分析鸠踪,高并發(fā)丙者、高性能、分布式营密、微服務(wù)架構(gòu)的原理械媒,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備