金三銀四季,阿里工做10多年Java大牛的「心得」,獻給迷茫中的你

===mysql

當你從事Java一年後,從新找工做時,纔會真實的感覺到「金三銀四」這四個字背後的意思。linux

工做第一年,每每是什麼都充滿新鮮感,什麼都學習,衝勁十足的一年;WEB行業知識更新特別快,今天一個框架的新版本,明天又是另外一個新框架,有時每每根據項目的須要來不斷學習新東西;因此,不少時候感受,本身用過的東西不少呀!可是真正深刻研究的東西卻很少。程序員

面試,是跳槽後第一個須要面對的問題;並且不一樣公司面試的着重點不一樣;可是卻有一個共同點:Java基礎是必考的。面試

工做第一年,可能問你String對象建立的理解,經常使用的框架是什麼等等;

-redis

工做第三年,就問你Java內存分配機制是什麼,類是如何加載的等等;算法

-spring

工做第五年,就問你經常使用的設計模式是什麼,你在工做中充當什麼角色,怎麼獨立完成一個模塊等等;能夠看出——這是一個典型的程序員的成長過程:sql

使用Java-----→深刻理解Java積累經驗-----→獨立設計分析能力-----→獨當一面的多面手!數據庫

所以,必須學習:數據庫最經常使用的是Oracle了(固然銀行項目等須要DB2等),熟練掌握使用存儲過程,觸發器等;UML項目中常常要寫文檔,項目經理的基本功,程序員走向設計的基本功;linux系統須要掌握經常使用的linux命令——部署在windows操做系統上的項目不多吧。其餘就很少說了,你們能夠補充。學習上,興趣是最大的老師;項目驅動也是不錯的選擇,總之,不學習不行。windows

第一. 積累行業背景

行業背景很是重要;工做3年後必須肯定本身的行業背景

好比:一直從事電信行業,一直從事銀行項目,一直從事ERP行業等等。一個程序員不多是一直寫代碼的,就是寫代碼也要知道業務邏輯,知足什麼需求;俗話說隔行如隔山,每一個行業的業務都不同,甚至差異很大。

好比:你一直從事流媒體的研究,讓你跳槽到一家銀行項目,完了,一切從頭學吧,之前的行業經驗都用不上了;並且,一個公司公司招人,就是但願找到那些很容易上手,不須要培訓業務好久的程序員;頻繁跳槽的朋友,必定要注意這點;一直在一個行業呆久了,就能夠成爲這個行業的專家;咱們能夠常常看到,一個項目組的某個leader,代碼寫的通常,可是卻能夠跟客戶流暢的溝通,控制着新需求的提出,bug的修正等等;而客戶也很願意跟他打交道,由於那些老的項目只有他能維護,他甚至熟悉系統的每一張表結構——-可想在這個行業呆的時間有多久啦。

第二. 合理的職業規劃

什麼是職業規劃—-就是你短時間或者長期的一個職業計劃!大道理不講,咱簡單點。先問你幾個問題:

a.你工做幾年了,你願意一直和新入行的新手同樣就是個簡單的程序員嗎?

-

b. 你願意一直寫代碼,而不關心其餘嗎?

-

c. 一個項目的前期需求,設計,後期部署維護,領導找到你,你說咱搞不定,行嗎?程序員不是敲代碼的機器。第一年太多東西不懂,你能夠一切遵從老大的安排,敲敲代碼,看看數據庫,測試本身和別人的代碼;可是第二年,你仍是這樣嗎?不可能的,一年的經驗你徹底能夠入行了,是時候該學習怎麼進行需求分析,怎麼設計數據庫,怎麼寫各種文檔,怎麼寫更好的代碼?這是高級程序員的要求!

什麼是高級程序員?

  • 具備分析設計能力;
  • 能進行技術攻關;
  • 具備某行業深厚背景的程序員。

因此,一個項目立項後,你要積極的參與到前期設計中,跟老同志們一道思考分析問題,學習經驗!OK,你這就成長啦!千萬不要認爲程序員就是寫代碼的哦!!!

並且,經過一個項目的開發,你要能粗略的統計出一個功能的開發時間;好比一個模塊有20個小功能點,你開發了80個小時,每一個小功能點平均2小時——這時在前期就能評估工做量啦。

固然每一個人的效率和工做質量是不一樣的,因人而異,可是大概的工做量應該是能夠統計出來的,用於統計一個項目的工做週期;具有上面的能力,你起碼已是一個項目組的骨幹啦!

此時,就能夠帶領小弟作開發而不是一個平凡的被帶領者啦。不少公司的項目骨幹和項目經理都不是經過招聘的來的,都是培養出來的——-工做2年,思考能力不錯,善於動手,很上道!OK,此時項目經理和公司中層可能就注意到你了,就會給你多分配任務慢慢的鍛鍊你,這時候千萬不要鬧彆扭哦(曾趕上這樣一個同事,技術很好,人也不錯,領導忽然給他分配不少任務,他開始是默默承受,後來鬧意見啦!領導找他談話後,他算明白啦!頂過一段時間就基本適應,能夠快速的作完;後來他成了咱們那批人中新的項目leader啦),跟帶你的人好好學習,多勞動,很快就出頭啦!若是你工做了多年,屬於老鳥了,也要善於帶人,能提攜小弟!由於只有小弟成長了,你身上的擔子纔會輕,項目纔會順暢的進行!

並且高級程序員(本科爲例)工做四年左右工資就達到一個瓶頸了(一線城市是9K—25K),這時候必須「轉型」—–高級程序員只是你能力的一部分,系統分析師,架構師,項目經理纔是你應該告訴別人的職務,薪資才能再次提高。

第三. 關於跳槽

跳槽要學習的技術就多了跳槽時時刻刻都在發生,可是我建議你們跳槽以前,先想清楚爲何要跳槽。

切不可跟風,看到同事一個個都走了,本身也盲目的開始面試起來(期間也沒有準備充分),究竟是由於技術緣由(影響本身的發展,偏移本身規劃的軌跡),仍是錢給少了,不受重視。準備不充分的面試,徹底是浪費時間,更是對本身的不負責(若是title很高,當我沒說)。

今天給你們分享下在此次跳槽中整理的Java面試大綱,其中大部分都是面試過程當中的面試題,能夠對照這查漏補缺,固然了,這裏所列的確定不可能覆蓋所有方式。

項目介紹大部分狀況,這是一場面試的考門題,面試官問這個問題,主要是考察你的概述能力全局視野。有的人常常抱怨本身天天在堆業務,但沒有成長。事實上,不少狀況下確實在堆業務,但並非沒有成長的。並不是作中間件或者技術架構纔是成長,例如咱們的需求分析能力溝通協做能力產品思惟能力抽象建模能力等都是一個很是重要的硬實力。

好的,如今進入正文:

  1. 明確項目是作什麼的
  2. 明確項目的價值。(爲何作這個項目,它解決了用戶什麼痛點,它帶來什麼價值?)
  3. 明確項目的功能。(這個項目涉及哪些功能?)
  4. 明確項目的技術。(這個項目用到哪些技術?)
  5. 明確我的在項目中的位置和做用。(你在這個項目的承擔角色?)
  6. 明確項目的總體架構。
  7. 明確項目的優缺點,若是從新設計你會如何設計。
  8. 明確項目的亮點。(這個項目有什麼亮點?)
  9. 明確技術成長。(你經過這個項目有哪些技術成長?)

Java基礎

  1. List 和 Set 的區別
  2. HashSet 是如何保證不重複的
  3. HashMap 是線程安全的嗎,爲何不是線程安全的(最好畫圖說明多線程環境下不安全)?
  4. HashMap 的擴容過程
  5. HashMap 1.7 與 1.8 的 區別,說明 1.8 作了哪些優化,如何優化的?
  6. final finally finalize
  7. 強引用 、軟引用、 弱引用、虛引用
  8. Java反射
  9. Arrays.sort 實現原理和 Collection 實現原理
  10. LinkedHashMap的應用
  11. cloneable接口實現原理
  12. 異常分類以及處理機制
  13. wait和sleep的區別
  14. 數組在內存中如何分配

Java 併發

  1. synchronized 的實現原理以及鎖優化?
  2. volatile 的實現原理?
  3. Java 的信號燈?
  4. synchronized 在靜態方法和普通方法的區別?
  5. 怎麼實現全部線程在等待某個事件的發生纔會去執行?
  6. CAS?CAS 有什麼缺陷,如何解決?
  7. synchronized 和 lock 有什麼區別?
  8. Hashtable 是怎麼加鎖的 ?
  9. HashMap 的併發問題?
  10. ConcurrenHashMap 介紹?1.8 中爲何要用紅黑樹?
  11. AQS
  12. 如何檢測死鎖?怎麼預防死鎖?
  13. Java 內存模型?
  14. 如何保證多線程下 i++ 結果正確?
  15. 線程池的種類,區別和使用場景?
  16. 分析線程池的實現原理和線程的調度過程?
  17. 線程池如何調優,最大數目如何確認?
  18. ThreadLocal原理,用的時候須要注意什麼?
  19. CountDownLatch 和 CyclicBarrier 的用法,以及相互之間的差異?
  20. LockSupport工具
  21. Condition接口及其實現原理
  22. Fork/Join框架的理解
  23. 分段鎖的原理,鎖力度減少的思考
  24. 八種阻塞隊列以及各個阻塞隊列的特性

Spring

  1. BeanFactory 和 FactoryBean?
  2. Spring IOC 的理解,其初始化過程?
  3. BeanFactory 和 ApplicationContext?
  4. Spring Bean 的生命週期,如何被管理的?
  5. Spring Bean 的加載過程是怎樣的?
  6. 若是要你實現Spring AOP,請問怎麼實現?
  7. 若是要你實現Spring IOC,你會注意哪些問題?
  8. Spring 是如何管理事務的,事務管理機制?
  9. Spring 的不一樣事務傳播行爲有哪些,幹什麼用的?
  10. Spring 中用到了那些設計模式?
  11. Spring MVC 的工做原理?
  12. Spring 循環注入的原理?
  13. Spring AOP的理解,各個術語,他們是怎麼相互工做的?
  14. Spring 如何保證 Controller 併發的安全?

Netty

  1. BIO、NIO和AIO
  2. Netty 的各大組件
  3. Netty的線程模型
  4. TCP 粘包/拆包的緣由及解決方法
  5. 瞭解哪幾種序列化協議?包括使用場景和如何去選擇
  6. Netty的零拷貝實現
  7. Netty的高性能表如今哪些方面

分佈式相關

  1. Dubbo的底層實現原理和機制
  2. 描述一個服務從發佈到被消費的詳細過程
  3. 分佈式系統怎麼作服務治理
  4. 接口的冪等性的概念
  5. 消息中間件如何解決消息丟失問題
  6. Dubbo的服務請求失敗怎麼處理
  7. 重連機制會不會形成錯誤
  8. 對分佈式事務的理解
  9. 如何實現負載均衡,有哪些算法能夠實現?
  10. Zookeeper的用途,選舉的原理是什麼?
  11. 數據的垂直拆分水平拆分。
  12. zookeeper原理和適用場景
  13. zookeeper watch機制
  14. redis/zk節點宕機如何處理
  15. 分佈式集羣下如何作到惟一序列號
  16. 如何作一個分佈式鎖
  17. 用過哪些MQ,怎麼用的,和其餘mq比較有什麼優缺點,MQ的鏈接是線程安全的嗎
  18. MQ系統的數據如何保證不丟失
  19. 列舉出你能想到的數據庫分庫分表策略;分庫分表後,如何解決全表查詢的問題
  20. zookeeper的選舉策略
  21. 全局ID

數據庫

  1. mysql分頁有什麼優化
  2. 悲觀鎖、樂觀鎖
  3. 組合索引,最左原則
  4. mysql 的表鎖、行鎖
  5. mysql 性能優化
  6. mysql的索引分類:B+,hash;什麼狀況用什麼索引
  7. 事務的特性和隔離級別

緩存

  1. Redis用過哪些數據數據,以及Redis底層怎麼實現
  2. Redis緩存穿透,緩存雪崩
  3. 如何使用Redis來實現分佈式鎖
  4. Redis的併發競爭問題如何解決
  5. Redis持久化的幾種方式,優缺點是什麼,怎麼實現的
  6. Redis的緩存失效策略
  7. Redis集羣,高可用,原理
  8. Redis緩存分片
  9. Redis的數據淘汰策略

JVM

  1. 詳細jvm內存模型
  2. 講講什麼狀況下回出現內存溢出,內存泄漏?
  3. 說說Java線程棧
  4. JVM 年輕代到年老代的晉升過程的判斷條件是什麼呢?
  5. JVM 出現 fullGC 很頻繁,怎麼去線上排查問題?
  6. 類加載爲何要使用雙親委派模式,有沒有什麼場景是打破了這個模式?
  7. 類的實例化順序
  8. JVM垃圾回收機制,什麼時候觸發MinorGC等操做
  9. JVM 中一次完整的 GC 流程(從 ygc 到 fgc)是怎樣的
  10. 各類回收器,各自優缺點,重點CMS、G1
  11. 各類回收算法
  12. OOM錯誤,stackoverflow錯誤,permgen space錯誤

還有跟多就不在這裏一一列舉了。固然可能還有些沒有寫上去,還請諒解。如需完整資源可加QQ:941002778 進行領取。

本次分享的資源涵蓋知識點:Java基礎、Java集合、JVM、多線程、spring原理、微服務、分佈式、Netty、RPC、設計模式、網絡、Java算法、數據結構、雲計算等

有什麼問題,也很是歡迎你們留言溝通,在這裏提早祝你們2020年都能找到一個合適的工做~

特別聲明:本文素材來源於網絡,僅做爲分享學習之用,若有侵權,請聯繫刪除!
相關文章
相關標籤/搜索