淺談Java如何進階,告別工作兩年感覺就是增刪改查思維

前言

如果你工作兩年了卻感覺自己還停留在增刪改查階段,那麼只能說明你沒有用心去多想問題。說起來確實可以用增刪改查來概括,但是真正做起來卻沒那麼容易。

正文

下面是十萬個問題:

關係型和非關係型數據庫使用場景?

數據庫的三大範式真的要循規蹈矩嗎?

手寫數據庫連接池怎麼寫?

Java常用工具類積累了多少、理解了多少?

給你一個常見的Java類你能一口氣說出它是線程安全的還是線程不安全的嗎?

jvm調過參嗎?

gc原理了解多少?

rbac權限模型實現過嗎?

Java io nio玩得六不六?

Java各種併發工具類玩得六不六?

jsp、servlet原理說得明白嗎?

九大內置對象、四大作用域、三大組件都有哪些適用場景?

Tomcat運行機理?

Java反射機制瞭解多少?

spring的IOC和aop如何實現的?

spring全家桶瞭解多少?

Apache頂級項目瞭解多少個?

orm的原理?

高併發量怎麼處理?怎麼寫出高併發的程序(幾十幾百萬的併發量)

如何提高系統的魯棒性?

分佈式系統怎麼對session做緩存?

怎麼實現單點登錄?

全文搜索引擎Lucene、solr、elasticsearch瞭解多少?

restful會嗎?

Java常見框架了解多少?各自的應用場景又是怎樣的?源碼仔細研讀過嗎?c3po,DBCP,Druid,Struts1,Struts2,spring,springMVC,hibernate,mybatis。springboot,springcloud,微服務瞭解多少?

前後端分離具體怎麼搞?

websocket,webservice瞭解嗎?

消息隊列rabitmq、kafka瞭解多少?

hadoop、spark、spark streaming、storm、MapReduce、ZooKeeper、Hbase、Hive瞭解多少?

Linux玩得六不六?

如何做大數據實時流處理?

集群和分佈式搞過沒?

Java經典書籍讀了多少本?

下面還是稍微具體地說說你的增刪改查吧。

"增":

增加一條是增,增加一億條也是增。讓你寫個高性能的批量增加怎麼寫?數據量大了怎麼存?分庫分表怎麼搞?

"刪":

刪除真簡單,刪除也沒那麼簡單,外鍵關聯的情況怎麼刪?什麼時候考慮事物、回滾?物理刪除和邏輯刪除什麼時候選哪個?誤操作刪了不該刪的怎麼搞?難不成真的從刪庫到跑路?

"改":

參數完整性校驗,參數合法性校驗(當然這個在增裡面也有涉及)

"查":

各種SQL技巧寫法。怎麼調優?(SQL調優,數據庫調優)。MySQL裡面的innodb和myisam引擎的區別。怎麼提高查詢效率?(SQL優化、建索引、緩存[一級緩存、二級緩存....]、....),n+1查詢問題怎麼解決。

plus:

分佈式的增刪改查還是這樣嗎?

搭好的系統怎麼防SQL注入?怎麼防xss、csrf攻擊?怎麼對數據加密?怎麼限流防刷?怎麼防治DDoS攻擊?怎麼對系統做完善的高可擴性的日誌管理?

淺談Java如何進階,告別工作兩年感覺就是增刪改查思維

上面的問題答得怎麼樣?自己現在什麼水平、以後要往哪邊查漏補缺心裡有點B-Tree了嗎?

淺談Java如何進階,告別工作兩年感覺就是增刪改查思維

在這個互聯網動輒上億流量級別的時代,Java作為後端服務使用最廣泛的語言,誕生了一批又一批的新框架,包括HBase、Hadoop、MQ、Netty、SpringCloud等等 。

一些獨角獸公司以及BAT等知名大廠對Java人才的需求量連年升級,但與此同時 對人才的要求也越來越高。 面試官經常會考察如下問題:

聊一聊你對JVM的原理,如何減少Full GC的情況?

針對高併發場景,如何優化,都採用了什麼技術?

相比關係型數據庫,NoSQL的優勢在哪裡,你們在什麼場景下會用到?

可以看到,對於有2~5年工作經驗的開發者,更注重的是一些項目有深入的實戰經驗。但很多同學在技術生涯最初幾年都會沉浸在業務開發中,忽視了對系統知識的梳理和技術視野的擴展。 日復一日,導致很多同學就以為這就是技術的全部,同時在重複的體力勞動中也喪失了對技術細節的深入探討。

每個程序員都追求“成就感”,而獲得成就感最好的方式就是自己在技術上的突破。

以工作前5年的規劃為例,至少需要突破三個層次:

對代碼精益求精

最開始工作的時候,我們會抱怨業務需求對技術沒挑戰,覺得在學校學到的這麼多知識卻沒有用武之地。

實質上這是忽略了技術開發的本質,技術開發是一個工程項目,而工程項目的落地最重要的就是細節控制,也就是代碼的品質,比如:

代碼是否遵循了規約?接口設計的是否隨意?測試用例是否都通過?

滿屏的if-else是否可以用合理的設計模式來替代?有沒有遵循SOLID原則,KISS原則?

有沒有考慮用更合理的數據結構和算法改變代碼的複雜性,提升運行的性能?

代碼出bug的概率有多大,能否降低?

需要Java架構學習資料視頻請加Q群793042903群內提供免費的學習指導 架構資料 以及解答 不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導

這是程序員的立足之本, 基本是工作1年左右要達到的。在這一階段看書是比較好的提升方式,比如:《Java編程思想》、《effective java》等。但要注意的是,在看書的過程中一定要思考能否運用書中的經驗來改善自己寫的代碼,運用到實處,比如看到final和static,想想自己代碼中用的是否合理。

此外,還可以看些常用的開源框架,如果你用的是Spring框架等,那麼下面一個很好的知識結構:

淺談Java如何進階,告別工作兩年感覺就是增刪改查思維

跳出來,主動了解技術全貌

在將基礎打牢之後,需要主動突破舒適區,不斷的去擴大自己的技術視野,做到有廣度。

這一步比較難,因為很多同學會被公司的技術和業務牽著走,比如公司當前的業務規模決定了技術上不需要分佈式技術,那麼很多同學就不會去思考如果規模大了之後,如何利用分佈式技術解決該問題。

如何解決這個問題? 除了尋找更大規模的業務外,要時刻保持時刻跳出當前層級和環境來思考的習慣。 比如,你只用了關係型數據庫,那麼有沒有想過數據一直產生,到達TB級別的時候該如何快速檢索與保存呢?

此外,技術的全貌還包括各種技術之間的關係,你用了Dubbo,那麼Duboo和Netty是什麼關係,為什麼會用到Zookeeper呢,和Spring Cloud又是什麼關係?如果能在學習新技術的時候,將繁雜的技術關係理順,會有一覽眾山小的感覺。

在工作的2~3年時間內達到這個水平,30w的年薪就離你不遠了。 如果你對高併發和分佈式技術感興趣,那麼下面一幅圖會有幫助:

淺談Java如何進階,告別工作兩年感覺就是增刪改查思維

不去造輪子,前提是得知道輪子的內部結構

如果說,第二步是增加你的知識廣度,那麼造輪子就是增加你的技術深度,通過造輪子,才能真正把握技術的來龍去脈。 很多人信奉“不去造輪子”,看似性價比很高的一句話,卻不知道這句話是有前提的,那就是“你得知道輪子的內部結構”,否則就是自我麻痺。 接下來需要選擇某一個或幾個方面深入研究下去,構建自己的核心競爭力。

比如,消息隊列在高併發分佈式系統中一個及其重要的組件,起到削峰填谷、系統解耦的作用。 我們以消費端如何快速獲取數據來看思維是如何一步步深入的:

首先消費端要想及時獲取數據,是否需要建立一個長連接?長連接的實現方式如何?

數據是通過push還是pull方式給到消費端,各自有什麼弊端?

如果消費失敗,可能是哪些原因引起?如果是因為網絡原因引起,該如何解決?

這些問題都會在你自己造輪子的過程中暴露出來,從而加深你的理解和技術深度, 一個有技術深度的程序員才是有靈魂的 。而大廠也是願意為有趣的靈魂買單的,這個時候看的就不僅僅是工資水平,更多的是在於晉升和發展前景的廣闊性。

在Java語言上有所建樹的開發者,都經歷過以上3個層次。但可惜的是,囿於外界環境和自身設限, 大部分的Java開發者卻只停留在了第一個層次中, 在日復一日的體力勞動中喪失了對技術細節的深入探討,也喪失了晉升和薪資談判中的籌碼。

淺談Java如何進階,告別工作兩年感覺就是增刪改查思維

如何過渡到第二、三個層次? 除了上文談到的內容,這裡我還想給你2個切身的建議:

1、擴寬自己的眼界,學著從全局看待問題,並且勇於挑戰別人眼中的難題

2、持續提升你的學習能力, 雖然有很多人以「在公司學不到東西」為理由離職,但你要知道:公司的目的是盈利。盈利的前提下,公司會盡力培養你,但是更多的時候能力成長還是得靠自己。學習能力弱的人,在哪裡都沒用。

相關推薦

推薦中...