你好,我是楊曉峰。今天是周末,我們稍微放松一下來聊聊“Java 核心技術”之外的內容,正好也借這個機會,兌現一下送出學習獎勵禮券的承諾。我在每一講后面都留下了一道思考題,希望你通過學習,結合自身工作實際,能夠認真思考一下這些問題,一方面起到檢驗學習效果的作用,另一方面可以查漏補缺,思考一下這些平時容易被忽略的面試考察點。我并沒有給出這些思考題的答案,希望你通過專欄學習或者查閱其他資料進行獨立思考,將自己思考的答案寫在留言區與我和其他同學一起交流,這也是提升自己重要的方法之一。
截止到今天,專欄已經更新了 15 講,走完了基礎模塊正式進入進階模塊。現在也正是一個很好的時機停下來回顧一下基礎部分的知識,為后面進階的并發內容打好基礎。在這里,我也分享一下我對 Java 學習和面試的看法,希望對你有所幫助。
首先,有同學反饋說專欄有的內容看不懂。我在準備專欄文章的時候對一些同學的基礎把握不太準確,后面的文章我進行了調整,將重點技術概念進行講解,并為其他術語添加鏈接。
再來說說這種情況,有人總覺得 Java 基礎知識都已經被講爛了,還有什么可學的?
對于基礎知識的掌握,有的同學經常是“知其然而不知其所以然”, 看到幾個名詞聽說過就以為自己掌握了,其實不然。至少,我認為應該能夠做到將自己“掌握”的東西,**準確地表達出來**。
愛因斯坦曾經說過,“如果你不能把它簡單地解釋出來,那說明你還沒有很好地理解它”。了解 - 掌握 - 精通,這是我們對事物掌握的一個循序漸進的過程。從自己覺得似乎懂了,到能夠說明白,再到能夠自然地運用它,甚至觸類旁通,這是不斷提高的過程。
在專欄學習中,如果有些術語很陌生,那么了解它就達到了學習目的,如果能夠理解透徹達到掌握的程度當然更好。樂觀點來看,反正都是有收獲,也完全不必過分擔心。
從學習技巧的角度,每個人都有自己的習慣,我個人喜歡動手實踐以及與人進行交流。
* 動手實踐是必要一步,如果連上手操作都不肯,你會發現自己的理解很難有深度。
* 在交流的過程中你會發現,很多似是而非的理解,竟然在試圖組織語言的時候,突然就想明白了,而且別人的觀點也驗證了自己的判斷。技術領域尤其如此,把自己的理解整理成文字,輸出、交流是個非常好的提高方法,甚至我認為這是技術工作者成長的必經之路。
再來聊聊針對技術底層,我們是否有必要去閱讀源代碼?
閱讀源代碼當然是個好習慣,理解高質量的代碼,對于提高我們自己的分析、設計等能力至關重要。
* 根據實踐統計,工程師實際工作中,閱讀代碼的時間其實大大超過寫代碼的時間,這意味著閱讀、總結能力,會直接影響我們的工作效率!這東西有沒有捷徑呢,也許吧,我的心得是:“**無他,但手熟爾**”。
* 參考別人的架構、實現,分析其歷史上掉過的坑,這是天然的好材料,具體閱讀時可以從其修正過的問題等角度入手。
* 現代軟件工程,節奏越來越快,需求復雜而多變,越來越凸顯出**白盒**方式的重要性。快速定位問題往往需要黑盒結合白盒能力,對內部一無所知,可能就沒有思路。與此同時,通用平臺、開源框架,不見得能夠非常符合自己的業務需求,往往只有深入源代碼層面進行定制或者自研,才能實現。我認為這也是軟件工程師地位不斷提高的原因之一。
那么,源代碼需要理解到什么程度呢?
對于底層技術,這個確實是比較有爭議的問題,我個人并不覺得什么東西都要理解底層,懂當然好,但不能代表一切,畢竟知識和能力是有區別的,當然我們也要尊重面試官的要求。我個人認為,不是所有做 Java 開發的人,都需要讀 JVM 源代碼,雖然我在專欄中提供了一些底層源代碼解讀,但也只是希望真的有興趣、有需要的工程師跟進學習。對于大多數開發人員,了解一些源代碼,至少不會在面試問到的時候完全沒有準備。
關于閱讀源代碼和理解底層,我有些建議:
* **帶著問題和明確目的去閱讀**,比如,以 debug 某個問題的角度,結合實踐去驗證,讓自己能夠感到收獲,既加深理解,也有實際幫助,激勵我們堅持下來。
* **一定要有輸出**,至少要寫下來,整理心得,交流、驗證、提高。這和我們日常工作是類似的,千萬不要做了好長一段時間后和領導說,沒什么結論。
大家大都是工程師,不是科學家,軟件開發中需要分清表象、行為(behavior),還是約定(specification)。喜歡源代碼、底層是好的,但是一定要區分其到底是實現細節,還是規范的承諾,因為如果我們的程序依賴于表現,很有可能帶來未來維護的問題。
我前面提到了白盒方式的重要性,但是,需要慎重決定對內部的依賴,分清是 Hack 還是 Solution。出來混,總是要還的!如果以某種 hack 方式解決問題,臨時性的當然可以,長久會積累并成為升級的障礙,甚至堆積起來愈演愈烈。比如說,我在實驗 Cassandra 的時候,發現它在并發部分引用了 Unsafe.monitorEnter()/moniterExit(),這會導致它無法平滑運行在新版的 JDK 上,因為相應內部 API 被移除了,比較幸運的是這個東西有公共 API 可以替代。
最后談談我在面試時會看中候選人的哪些素質和能力。
結合我在實際工作中的切身體會,面試時有幾個方面我會特別在乎:
* **技術素養好,能夠進行深度思考,而不是跳脫地夸夸其談**,所以我喜歡問人家最擅長的東西,如果在最擅長的領域尚且不能仔細思考,怎么能保證在下一份工作中踏實研究呢。當然這種思考,并不是說非要死扣底層和細節,能夠看出業務中平凡事情背后的工程意義,同樣是不錯的。畢竟,除了特別的崗位,大多數任務,如果有良好的技術素養和工作熱情,再配合一定經驗,基本也就能夠保證勝任了。
* **職業精神,是否表現出認真對待每一個任務**。我們是職場打拼的專業人士,不是幼兒園被呵護的小朋友,如果有人太挑活兒,團隊往往就無法做到基本的公平。有經驗的管理角色,大多是把自己的管理精力用在團隊的正面建設,而不是把精力浪費在拖團隊后腿的人身上,難以協作的人,沒有人會喜歡。有人說你的職業高度取決于你“填坑”的能力,我覺得很有道理。現實工作中很少有理想化的完美任務,既目標清晰又有挑戰,恰好還是我擅長,這種任務不多見。能夠主動地從不清晰中找出清晰,切實地解決問題,是非常重要的能力。
* **是否 hands-on,是否主動**。我一般不要求當前需要的方面一定是很 hands-on,但至少要表現出能夠做到。
- 前言
- 開篇詞
- 開篇詞 -以面試題為切入點,有效提升你的Java內功
- 模塊一 Java基礎
- 第1講 談談你對Java平臺的理解?
- 第2講 Exception和Error有什么區別?
- 第3講 談談final、finally、 finalize有什么不同?
- 第4講 強引用、軟引用、弱引用、幻象引用有什么區別?
- 第5講 String、StringBuffer、StringBuilder有什么區別?
- 第6講 動態代理是基于什么原理?
- 第7講 int和Integer有什么區別?
- 第8講 對比Vector、ArrayList、LinkedList有何區別?
- 第9講 對比Hashtable、HashMap、TreeMap有什么不同?
- 第10講 如何保證集合是線程安全的? ConcurrentHashMap如何實現高效地線程安全?
- 第11講 Java提供了哪些IO方式? NIO如何實現多路復用?
- 第12講 Java有幾種文件拷貝方式?哪一種最高效?
- 第13講 談談接口和抽象類有什么區別?
- 第14講 談談你知道的設計模式?
- 模塊二 Java進階
- 第15講 synchronized和ReentrantLock有什么區別呢?
- 第16講 synchronized底層如何實現?什么是鎖的升級、降級?
- 第17講 一個線程兩次調用start()方法會出現什么情況?
- 第18講 什么情況下Java程序會產生死鎖?如何定位、修復?
- 第19講 Java并發包提供了哪些并發工具類?
- 第20講 并發包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么區別?
- 第21講 Java并發類庫提供的線程池有哪幾種? 分別有什么特點?
- 第22講 AtomicInteger底層實現原理是什么?如何在自己的產品代碼中應用CAS操作?
- 第23講 請介紹類加載過程,什么是雙親委派模型?
- 第24講 有哪些方法可以在運行時動態生成一個Java類?
- 第25講 談談JVM內存區域的劃分,哪些區域可能發生OutOfMemoryError?
- 第26講 如何監控和診斷JVM堆內和堆外內存使用?
- 第27講 Java常見的垃圾收集器有哪些?
- 第28講 談談你的GC調優思路?
- 第29講 Java內存模型中的happen-before是什么?
- 第30講 Java程序運行在Docker等容器環境有哪些新問題?
- 模塊三 Java安全基礎
- 第31講 你了解Java應用開發中的注入攻擊嗎?
- 第32講 如何寫出安全的Java代碼?
- 模塊四 Java性能基礎
- 第33講 后臺服務出現明顯“變慢”,談談你的診斷思路?
- 第34講 有人說“Lambda能讓Java程序慢30倍”,你怎么看?
- 第35講 JVM優化Java代碼時都做了什么?
- 模塊五 Java應用開發擴展
- 第36講 談談MySQL支持的事務隔離級別,以及悲觀鎖和樂觀鎖的原理和應用場景?
- 第37講 談談Spring Bean的生命周期和作用域?
- 第38講 對比Java標準NIO類庫,你知道Netty是如何實現更高性能的嗎?
- 第39講 談談常用的分布式ID的設計方案?Snowflake是否受冬令時切換影響?
- 周末福利
- 周末福利 談談我對Java學習和面試的看法
- 周末福利 一份Java工程師必讀書單
- 結束語
- 結束語 技術沒有終點
- 結課測試 Java核心技術的這些知識,你真的掌握了嗎?