金三銀四季,阿里工作10多年Java大牛的“心得”,獻(xiàn)給迷茫中的你
當(dāng)你從事Java一年后,重新找工作時(shí),才會(huì)真實(shí)的感受到“金三銀四”這四個(gè)字背后的意思。
工作第一年,往往是什么都充滿新鮮感,什么都學(xué)習(xí),沖勁十足的一年;WEB行業(yè)知識(shí)更新特別快,今天一個(gè)框架的新版本,明天又是另一個(gè)新框架,有時(shí)往往根據(jù)項(xiàng)目的需要來不斷學(xué)習(xí)新東西;所以,很多時(shí)候感覺,自己用過的東西很多呀!但是真正深入研究的東西卻不多。
面試,是跳槽后第一個(gè)需要面對(duì)的問題;而且不同公司面試的著重點(diǎn)不同;但是卻有一個(gè)共同點(diǎn):Java基礎(chǔ)是必考的。
工作第一年,可能問你String對(duì)象創(chuàng)建的理解,常用的框架是什么等等;
-
工作第三年,就問你Java內(nèi)存分配機(jī)制是什么,類是如何加載的等等;
-
工作第五年,就問你常用的設(shè)計(jì)模式是什么,你在工作中充當(dāng)什么角色,怎么獨(dú)立完成一個(gè)模塊等等;可以看出——這是一個(gè)典型的程序員的成長過程:
使用Java-----→深入理解Java積累經(jīng)驗(yàn)-----→獨(dú)立設(shè)計(jì)分析能力-----→獨(dú)當(dāng)一面的多面手!
因此,必須學(xué)習(xí):數(shù)據(jù)庫最常用的是Oracle了(當(dāng)然銀行項(xiàng)目等需要DB2等),熟練掌握使用存儲(chǔ)過程,觸發(fā)器等;UML項(xiàng)目中經(jīng)常要寫文檔,項(xiàng)目經(jīng)理的基本功,程序員走向設(shè)計(jì)的基本功;linux系統(tǒng)需要掌握常用的linux命令——部署在windows操作系統(tǒng)上的項(xiàng)目很少吧。其他就不多說了,大家可以補(bǔ)充。學(xué)習(xí)上,興趣是最大的老師;項(xiàng)目驅(qū)動(dòng)也是不錯(cuò)的選擇,總之,不學(xué)習(xí)不行。
第一. 積累行業(yè)背景
行業(yè)背景非常重要;工作3年后必須確定自己的行業(yè)背景
比如:一直從事電信行業(yè),一直從事銀行項(xiàng)目,一直從事ERP行業(yè)等等。一個(gè)程序員不可能是一直寫代碼的,就是寫代碼也要知道業(yè)務(wù)邏輯,滿足什么需求;俗話說隔行如隔山,每個(gè)行業(yè)的業(yè)務(wù)都不一樣,甚至差別很大。
比如:你一直從事流媒體的研究,讓你跳槽到一家銀行項(xiàng)目,完了,一切從頭學(xué)吧,以前的行業(yè)經(jīng)驗(yàn)都用不上了;而且,一個(gè)公司公司招人,就是希望找到那些很容易上手,不需要培訓(xùn)業(yè)務(wù)很久的程序員;頻繁跳槽的朋友,一定要注意這點(diǎn);一直在一個(gè)行業(yè)呆久了,就可以成為這個(gè)行業(yè)的專家;我們可以經(jīng)??吹?,一個(gè)項(xiàng)目組的某個(gè)leader,代碼寫的一般,但是卻可以跟客戶流暢的溝通,控制著新需求的提出,bug的修正等等;而客戶也很愿意跟他打交道,因?yàn)槟切├系捻?xiàng)目只有他能維護(hù),他甚至熟悉系統(tǒng)的每一張表結(jié)構(gòu)——-可想在這個(gè)行業(yè)呆的時(shí)間有多久啦。
第二. 合理的職業(yè)規(guī)劃
什么是職業(yè)規(guī)劃—-就是你短期或者長期的一個(gè)職業(yè)計(jì)劃!大道理不講,咱簡單點(diǎn)。先問你幾個(gè)問題:
a.你工作幾年了,你愿意一直和新入行的新手一樣就是個(gè)簡單的程序員嗎?
-
b. 你愿意一直寫代碼,而不關(guān)心其他嗎?
-
c. 一個(gè)項(xiàng)目的前期需求,設(shè)計(jì),后期部署維護(hù),領(lǐng)導(dǎo)找到你,你說咱搞不定,行嗎?程序員不是敲代碼的機(jī)器。第一年太多東西不懂,你可以一切聽從老大的安排,敲敲代碼,看看數(shù)據(jù)庫,測試自己和別人的代碼;但是第二年,你還是這樣嗎?不可能的,一年的經(jīng)驗(yàn)?zāi)阃耆梢匀胄辛?,是時(shí)候該學(xué)習(xí)怎么進(jìn)行需求分析,怎么設(shè)計(jì)數(shù)據(jù)庫,怎么寫各類文檔,怎么寫更好的代碼?這是高級(jí)程序員的要求!
什么是高級(jí)程序員?
- 具有分析設(shè)計(jì)能力;
- 能進(jìn)行技術(shù)攻關(guān);
- 具有某行業(yè)深厚背景的程序員。
所以,一個(gè)項(xiàng)目立項(xiàng)后,你要積極的參與到前期設(shè)計(jì)中,跟老同志們一道思考分析問題,學(xué)習(xí)經(jīng)驗(yàn)!OK,你這就成長啦!千萬不要認(rèn)為程序員就是寫代碼的哦?。?!
而且,通過一個(gè)項(xiàng)目的開發(fā),你要能粗略的統(tǒng)計(jì)出一個(gè)功能的開發(fā)時(shí)間;比如一個(gè)模塊有20個(gè)小功能點(diǎn),你開發(fā)了80個(gè)小時(shí),每個(gè)小功能點(diǎn)平均2小時(shí)——這時(shí)在前期就能評(píng)估工作量啦。
當(dāng)然每個(gè)人的效率和工作質(zhì)量是不同的,因人而異,但是大概的工作量應(yīng)該是可以統(tǒng)計(jì)出來的,用于統(tǒng)計(jì)一個(gè)項(xiàng)目的工作周期;具備上面的能力,你起碼已經(jīng)是一個(gè)項(xiàng)目組的骨干啦!
此時(shí),就可以帶領(lǐng)小弟做開發(fā)而不是一個(gè)平凡的被帶領(lǐng)者啦。很多公司的項(xiàng)目骨干和項(xiàng)目經(jīng)理都不是通過招聘的來的,都是培養(yǎng)出來的——-工作2年,思考能力不錯(cuò),善于動(dòng)手,很上道!OK,此時(shí)項(xiàng)目經(jīng)理和公司中層可能就注意到你了,就會(huì)給你多分配任務(wù)慢慢的鍛煉你,這時(shí)候千萬不要鬧別扭哦(曾遇上這樣一個(gè)同事,技術(shù)很好,人也不錯(cuò),領(lǐng)導(dǎo)突然給他分配很多任務(wù),他開始是默默承受,后來鬧意見啦!領(lǐng)導(dǎo)找他談話后,他算明白啦!頂過一段時(shí)間就基本適應(yīng),可以快速的做完;后來他成了我們那批人中新的項(xiàng)目leader啦),跟帶你的人好好學(xué)習(xí),多勞動(dòng),很快就出頭啦!如果你工作了多年,屬于老鳥了,也要善于帶人,能提攜小弟!因?yàn)橹挥行〉艹砷L了,你身上的擔(dān)子才會(huì)輕,項(xiàng)目才會(huì)順暢的進(jìn)行!
而且高級(jí)程序員(本科為例)工作四年左右工資就達(dá)到一個(gè)瓶頸了(一線城市是9K—25K),這時(shí)候必須“轉(zhuǎn)型”—–高級(jí)程序員只是你能力的一部分,系統(tǒng)分析師,架構(gòu)師,項(xiàng)目經(jīng)理才是你應(yīng)該告訴別人的職務(wù),薪資才能再次提升。
第三. 關(guān)于跳槽
跳槽要學(xué)習(xí)的技術(shù)就多了跳槽時(shí)時(shí)刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。
切不可跟風(fēng),看到同事一個(gè)個(gè)都走了,自己也盲目的開始面試起來(期間也沒有準(zhǔn)備充分),到底是因?yàn)榧夹g(shù)原因(影響自己的發(fā)展,偏移自己規(guī)劃的軌跡),還是錢給少了,不受重視。準(zhǔn)備不充分的面試,完全是浪費(fèi)時(shí)間,更是對(duì)自己的不負(fù)責(zé)(如果title很高,當(dāng)我沒說)。
今天給大家分享下在這次跳槽中整理的Java面試大綱,其中大部分都是面試過程中的面試題,可以對(duì)照這查漏補(bǔ)缺,當(dāng)然了,這里所列的肯定不可能覆蓋全部方式。
項(xiàng)目介紹大部分情況,這是一場面試的考門題,面試官問這個(gè)問題,主要是考察你的概述能力和全局視野。有的人經(jīng)常抱怨自己每天在堆業(yè)務(wù),但沒有成長。事實(shí)上,很多情況下確實(shí)在堆業(yè)務(wù),但并不是沒有成長的。并非做中間件或者技術(shù)架構(gòu)才是成長,例如我們的需求分析能力,溝通協(xié)作能力,產(chǎn)品思維能力,抽象建模能力等都是一個(gè)非常重要的硬實(shí)力。
好的,現(xiàn)在進(jìn)入正文:
- 明確項(xiàng)目是做什么的
- 明確項(xiàng)目的價(jià)值。(為什么做這個(gè)項(xiàng)目,它解決了用戶什么痛點(diǎn),它帶來什么價(jià)值?)
- 明確項(xiàng)目的功能。(這個(gè)項(xiàng)目涉及哪些功能?)
- 明確項(xiàng)目的技術(shù)。(這個(gè)項(xiàng)目用到哪些技術(shù)?)
- 明確個(gè)人在項(xiàng)目中的位置和作用。(你在這個(gè)項(xiàng)目的承擔(dān)角色?)
- 明確項(xiàng)目的整體架構(gòu)。
- 明確項(xiàng)目的優(yōu)缺點(diǎn),如果重新設(shè)計(jì)你會(huì)如何設(shè)計(jì)。
- 明確項(xiàng)目的亮點(diǎn)。(這個(gè)項(xiàng)目有什么亮點(diǎn)?)
- 明確技術(shù)成長。(你通過這個(gè)項(xiàng)目有哪些技術(shù)成長?)
Java基礎(chǔ)
- List 和 Set 的區(qū)別
- HashSet 是如何保證不重復(fù)的
- HashMap 是線程安全的嗎,為什么不是線程安全的(最好畫圖說明多線程環(huán)境下不安全)?
- HashMap 的擴(kuò)容過程
- HashMap 1.7 與 1.8 的 區(qū)別,說明 1.8 做了哪些優(yōu)化,如何優(yōu)化的?
- final finally finalize
- 強(qiáng)引用 、軟引用、 弱引用、虛引用
- Java反射
- Arrays.sort 實(shí)現(xiàn)原理和 Collection 實(shí)現(xiàn)原理
- LinkedHashMap的應(yīng)用
- cloneable接口實(shí)現(xiàn)原理
- 異常分類以及處理機(jī)制
- wait和sleep的區(qū)別
- 數(shù)組在內(nèi)存中如何分配
Java 并發(fā)
- synchronized 的實(shí)現(xiàn)原理以及鎖優(yōu)化?
- volatile 的實(shí)現(xiàn)原理?
- Java 的信號(hào)燈?
- synchronized 在靜態(tài)方法和普通方法的區(qū)別?
- 怎么實(shí)現(xiàn)所有線程在等待某個(gè)事件的發(fā)生才會(huì)去執(zhí)行?
- CAS?CAS 有什么缺陷,如何解決?
- synchronized 和 lock 有什么區(qū)別?
- Hashtable 是怎么加鎖的 ?
- HashMap 的并發(fā)問題?
- ConcurrenHashMap 介紹?1.8 中為什么要用紅黑樹?
- AQS
- 如何檢測死鎖?怎么預(yù)防死鎖?
- Java 內(nèi)存模型?
- 如何保證多線程下 i++ 結(jié)果正確?
- 線程池的種類,區(qū)別和使用場景?
- 分析線程池的實(shí)現(xiàn)原理和線程的調(diào)度過程?
- 線程池如何調(diào)優(yōu),最大數(shù)目如何確認(rèn)?
- ThreadLocal原理,用的時(shí)候需要注意什么?
- CountDownLatch 和 CyclicBarrier 的用法,以及相互之間的差別?
- LockSupport工具
- Condition接口及其實(shí)現(xiàn)原理
- Fork/Join框架的理解
- 分段鎖的原理,鎖力度減小的思考
- 八種阻塞隊(duì)列以及各個(gè)阻塞隊(duì)列的特性
Spring
- BeanFactory 和 FactoryBean?
- Spring IOC 的理解,其初始化過程?
- BeanFactory 和 ApplicationContext?
- Spring Bean 的生命周期,如何被管理的?
- Spring Bean 的加載過程是怎樣的?
- 如果要你實(shí)現(xiàn)Spring AOP,請問怎么實(shí)現(xiàn)?
- 如果要你實(shí)現(xiàn)Spring IOC,你會(huì)注意哪些問題?
- Spring 是如何管理事務(wù)的,事務(wù)管理機(jī)制?
- Spring 的不同事務(wù)傳播行為有哪些,干什么用的?
- Spring 中用到了那些設(shè)計(jì)模式?
- Spring MVC 的工作原理?
- Spring 循環(huán)注入的原理?
- Spring AOP的理解,各個(gè)術(shù)語,他們是怎么相互工作的?
- Spring 如何保證 Controller 并發(fā)的安全?
Netty
- BIO、NIO和AIO
- Netty 的各大組件
- Netty的線程模型
- TCP 粘包/拆包的原因及解決方法
- 了解哪幾種序列化協(xié)議?包括使用場景和如何去選擇
- Netty的零拷貝實(shí)現(xiàn)
- Netty的高性能表現(xiàn)在哪些方面
分布式相關(guān)
- Dubbo的底層實(shí)現(xiàn)原理和機(jī)制
- 描述一個(gè)服務(wù)從發(fā)布到被消費(fèi)的詳細(xì)過程
- 分布式系統(tǒng)怎么做服務(wù)治理
- 接口的冪等性的概念
- 消息中間件如何解決消息丟失問題
- Dubbo的服務(wù)請求失敗怎么處理
- 重連機(jī)制會(huì)不會(huì)造成錯(cuò)誤
- 對(duì)分布式事務(wù)的理解
- 如何實(shí)現(xiàn)負(fù)載均衡,有哪些算法可以實(shí)現(xiàn)?
- Zookeeper的用途,選舉的原理是什么?
- 數(shù)據(jù)的垂直拆分水平拆分。
- zookeeper原理和適用場景
- zookeeper watch機(jī)制
- redis/zk節(jié)點(diǎn)宕機(jī)如何處理
- 分布式集群下如何做到唯一序列號(hào)
- 如何做一個(gè)分布式鎖
- 用過哪些MQ,怎么用的,和其他mq比較有什么優(yōu)缺點(diǎn),MQ的連接是線程安全的嗎
- MQ系統(tǒng)的數(shù)據(jù)如何保證不丟失
- 列舉出你能想到的數(shù)據(jù)庫分庫分表策略;分庫分表后,如何解決全表查詢的問題
- zookeeper的選舉策略
- 全局ID
數(shù)據(jù)庫
- mysql分頁有什么優(yōu)化
- 悲觀鎖、樂觀鎖
- 組合索引,最左原則
- mysql 的表鎖、行鎖
- mysql 性能優(yōu)化
- mysql的索引分類:B+,hash;什么情況用什么索引
- 事務(wù)的特性和隔離級(jí)別
緩存
- Redis用過哪些數(shù)據(jù)數(shù)據(jù),以及Redis底層怎么實(shí)現(xiàn)
- Redis緩存穿透,緩存雪崩
- 如何使用Redis來實(shí)現(xiàn)分布式鎖
- Redis的并發(fā)競爭問題如何解決
- Redis持久化的幾種方式,優(yōu)缺點(diǎn)是什么,怎么實(shí)現(xiàn)的
- Redis的緩存失效策略
- Redis集群,高可用,原理
- Redis緩存分片
- Redis的數(shù)據(jù)淘汰策略
JVM
- 詳細(xì)jvm內(nèi)存模型
- 講講什么情況下回出現(xiàn)內(nèi)存溢出,內(nèi)存泄漏?
- 說說Java線程棧
- JVM 年輕代到年老代的晉升過程的判斷條件是什么呢?
- JVM 出現(xiàn) fullGC 很頻繁,怎么去線上排查問題?
- 類加載為什么要使用雙親委派模式,有沒有什么場景是打破了這個(gè)模式?
- 類的實(shí)例化順序
- JVM垃圾回收機(jī)制,何時(shí)觸發(fā)MinorGC等操作
- JVM 中一次完整的 GC 流程(從 ygc 到 fgc)是怎樣的
- 各種回收器,各自優(yōu)缺點(diǎn),重點(diǎn)CMS、G1
- 各種回收算法
- OOM錯(cuò)誤,stackoverflow錯(cuò)誤,permgen space錯(cuò)誤