一個阿里工作4年java程式設計師的從業心得,寫給還在迷茫的朋友

java填坑路發表於2018-09-30

貌似這一點適應的行業最廣,但是我可以很肯定的說:當你從事Java一年後,重新找工作時,才會真實的感受到這句話。

工作第一年,往往是什麼都充滿新鮮感,什麼都學習,衝勁十足的一年;WEB行業知識更新特別快,今天一個框架的新版本,明天又是另一個新框架,有時往往根據專案的需要來不斷學習新東西;所有,很多時候感覺,自己用過的東西真多呀!但是真正深入研究的東西卻不多。面試,是跳槽後第一個需要面對的問題;而且不同公司面試的著重點不同;但是卻有一個共同點:Java基礎是必考的。

工作第一年,可能問你String物件建立的理解,常用的框架是什麼等等;

工作第三年,就問你Java記憶體分配機制是什麼,類是如何載入的等等;

工作第五年,就問你常用的設計模式是什麼,你在工作中充當什麼角色,怎麼獨立完成一個模組等等;

可以看出——這是一個典型的程式設計師的成長過程:

使用Java—->深入理解Java積累經驗——>獨立設計分析能力——>獨當一面的多面手!

因此,必須學習:

資料庫

最常用的是Oracle了(當然銀行專案等需要DB2等),熟練掌握使用儲存過程,觸發器等;

UML

專案中經常要寫文件,專案經理的基本功,程式設計師走向設計的基本功;

linux系統

需要掌握常用的linux命令——部署在windows作業系統上的專案很少吧。

其他就不多說了,大家可以補充。

學習上,興趣是最大的老師;專案驅動也是不錯的選擇,總之,不學習不行。

第一. 積累行業背景;

行業背景非常重要;工作3年後必須確定自己的行業背景,比如一直從事電信行業,一直從事銀行專案,一直從事ERP行業等等。

一個程式設計師不可能是一直寫程式碼的,就是寫程式碼也要知道業務邏輯,滿足什麼需求;俗話說隔行如隔山,每個行業的業務都不一樣,甚至差別很大,比如你一直從事流媒體的研究,讓你跳槽到一家銀行專案,完了,一切從頭學吧,以前的行業經驗都用不上了;而且,一個公司公司招人,就是希望找到那些很容易上手,不需要培訓業務很久的程式設計師;頻繁跳槽的朋友,一定要注意這點;

一直在一個行業呆久了,就可以成為這個行業的專家;我們可以經常看到,一個專案組的某個leader,程式碼寫的一般,但是卻可以跟客戶流暢的溝通,控制著新需求的提出,bug的修正等等;而客戶也很願意跟他打交道,因為那些老的專案只有他能維護,他甚至熟悉系統的每一張表結構——-可想在這個行業呆的時間有多久啦。

第二. 合理的職業規劃

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

a.你工作幾年了,你願意一直和新入行的新手一樣就是個簡單的程式設計師嗎?

b. 你願意一直寫程式碼,而不關心其他嗎?

c. 一個專案的前期需求,設計,後期部署維護,領導找到你,你說我們搞不定,行嗎?

程式設計師不是敲程式碼的機器。第一年太多東西不懂,你可以一切聽從老大的安排,敲敲程式碼,看看資料庫,測試自己和別人的程式碼;但是第二年,你還是這樣嗎?不可能的,一年的經驗你完全可以入行了,是時候該學習怎麼進行需求分析,怎麼設計資料庫,怎麼寫各類文件,怎麼寫更好的程式碼?這是高階程式設計師的要求!

什麼是高階程式設計師?

具有分析設計能力,能進行技術攻關,而且具有某行業深厚背景的程式設計師!

所有,一個專案立項後,你要積極的參與到前期設計中,跟老同志們一道思考分析問題,學習經驗!OK,你這就成長啦!

千萬不要認為程式設計師就是寫程式碼的哦!!!

而且,通過一個專案的開發,你要能粗略的統計出一個功能的開發時間;比如一個模組有20個小功能點,你開發了80個小時,每個小功能點平均2小時——這時在前期就能評估工作量啦。當然每個人的效率和工作質量是不同的,因人而異,但是大概的工作量應該是可以統計出來的,用於統計一個專案的工作週期;

具備上面的能力,你起碼已經是一個專案組的骨幹啦!此時,就可以帶領小弟做開發而不是平凡的一個被帶領者啦。

很多公司的專案骨幹和專案經理都不是通過招聘的來的,都是培養出來的——-工作2年,思考能力不錯,善於動手,很上道!OK,此時專案經理和公司中層可能就注意到你了,就會給你多分配任務慢慢的鍛鍊你,這時候千萬不要鬧彆扭哦(曾遇上這樣一個同事,技術很好,人也不錯,領導突然給他分配很多工,他開始是默默承受,後來鬧意見啦!領導找他談話後,他算明白啦!頂過一段時間就基本適應,可以快速的做完;後來他成了我們那批人中新的專案leader啦),跟帶你的人好好學習,多勞動,很快就出頭啦!

如果你工作了多年,屬於老鳥了,也要善於帶人,能提攜小弟!因為只有小弟成長了,你身上的擔子才會輕,專案才會順暢的進行!

而且高階程式設計師(本科為例)工作四年左右工資就達到一個瓶頸了(一線城市是9K—1.2W),這時候必須“轉型”—–高階程式設計師只是你能力的一部分,系統分析師,架構師,技術主管才是你應該告訴別人的職務,薪資才能再次提升。

第三. 關於跳槽

跳槽要學習的技術就多了

跳槽時時刻刻都在發生,但是我建議大家跳槽之前,先想清楚為什麼要跳槽。切不可跟風,看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準備充分),到底是因為技術原因(影響自己的發展,偏移自己規劃的軌跡),還是錢給少了,不受重視。

準備不充分的面試,完全是浪費時間,更是對自己的不負責(如果title很高,當我沒說)。

今天給大家分享下chenssy在這次跳槽中整理的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錯誤

歡迎工作一到五年的Java工程師朋友們加入Java架構開發:744677563

群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用”沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!


相關文章