作者丨Saurabh Maurya
譯者丨核子可樂
策劃丨Tina
我們逐漸在工作當中找到了狀態,部署生命周期不再是神秘的難題,代碼審查的速度也終於超過了代碼編寫。最重要的是,我們開始發布真正能夠運行的成果。
但是接下來,我們可以松懈嗎?當然不行!對知識的探索,永遠是我們時刻追求的目標。
在克服惰性方面,一種務實的方法是堅持學習那些能夠幫助我們在面試中表現更好的知識。
如此一來,我們就會擁有一種明顯的進步以及值得始終堅守的目標。
請關注以下五個方面——
低級 / 庫設計
系統設計
並發
設計模式
一般編碼慣例
我在本文中給出的資源主要與 Java 相關,但大家肯定也能找到針對其他語言的類似資料。無論如何,這裡提到的大部分設計理念與語言無關。
低級 / 庫設計
如果大家回顧一下 Uber、亞馬遜等企業在第 2/3 輪軟體開發工程師面試當中提出的問題,就會發現其中至少會有一輪主要涉及此類低級設計方向。我聽說過的兩大常見場景分別是:
設計一套記錄器庫
使用 Java 語言實現流框架
我特別喜歡這個關於記錄器的問題;因為根據求職者的業務水準,大家可能會想到多種多樣的答案。
這裡大家可以先著手試試。在完成之後,請各位思考以下幾個問題:
您是否將實現分解為不同的接口?或者說使用了一個超類來涵蓋一切?
您是否考慮到類當中的線程安全問題?
您的記錄器是單體的嗎?採用懶惰加載還是急切加載?為什麽?
它具備可插拔性嗎?第三方可以利用其它實現來擴展您的庫嗎?
垃圾收集機制是如何實現的?您是否創建了過多對象?
Log4j2是一套設計上極為出色的記錄工具,感興趣的朋友可以點擊此處參考它的實現思路。我暫時沒找到其它更好的低級設計資源。如果各位有什麽好主意,請在評論中不吝賜教。
系統設計
開發人員們可能更熟悉“設計問題”這種表述。我聽說過的具體案例包括:
設計一套 URL 縮短系統
設計 Twitter 的 NewsFeed 系統
這裡我向大家推薦 Donne Martin 的《設計入門》。雖然篇幅很長,但這確實是一種優秀的廣度優先方法,能夠幫助大家快速熟悉系統設計原理。
至少,大家應該熟悉以下知識:
異步與同步寫入;消息隊列
一致性模式——特別是最終一致性
數據庫類型(SQL 與 NoSQL)以及規模伸縮
不同級別的緩存
將問題陳述分解為不同的獨立服務
這裡我要向大家推薦《深入理解系統設計訪談》。其中詳細探討了系統設計的具體問題,包括我之前提到的兩個例子。雖然屬於付費資源,但絕對物有所值。
並 發
並發性是初級工程師與高級工程師之間的一大核心區別。很多朋友可能想象不到,並發實際上非常難以實現。
這裡推薦大家閱讀《Java 並發實踐(Java Concurrency in Practice)》一書。在讀完之後,大家應該會對以下問題擁有更深刻的理解:
Java 的記憶體模型
發生前關係
虛假喚醒調用
易失性與同步性
線程安全、等待與通知等
如果大家使用的是其他編程語言,也請參考對應的書籍。總之,如果沒能徹底掌握相關概念,我們將很難對競爭條件進行調試。
Educative 的《Java 多線程與並發( Java Multithreading and Concurrency )》 也是很好的資源,推薦大家閱讀其中的概念,而後結合常見的面試問題進行理解。
設計模式
雖然面試一般不會問到這些問題,但在研究不同的設計用例時,大家或多或少都會接觸到。
而在了解了相關概念之後,我們就會意識到這些模式無處不在。舉幾個例子:
Adapter — Arrays.asList()
Decorator — Collections.synchronizedCollection(new ArrayList())
Prototype — Immutables.copyOf()
Command — Runnable interface
Strategy — java.util.Comparator#compare()
StackOverflow 中列出一份長長的 Java 核心庫模式清單,推薦大家了解一下。
我也嘗試過閱讀經典的《設計模式:可重用面向對象軟體中的元素(Design Patterns: Elements of Reusable Object-Oriented Software)》,但我承認我真的啃不下來。
但我也試過《深入淺出談設計模式(Head First Design Patterns)》,這看起來不像是技術讀物,但卻給我帶來了巨大的幫助。
這本書裡的故事選得很好,清晰梳理出了類似模式之間的微妙差別。我花了一個周末讀完了它,真的是乾貨多多又有趣。過一陣子我想再回去啃啃《可重用面向對象軟體中的元素》,這本書同樣極具價值,只是比較硬核、對開發經驗的要求更高。
一般編碼慣例
看書、看書、再看書
《高效 Java(Effective Java)》。這是大家熟悉 Java 表達與最佳實踐的理想方法。其中分為 90 個獨立的主題,每個主題都長達數頁。因此,我們可以選擇與當前工作內容相關性最強的部分。
《清潔代碼(Clean Code)》——有了這本書的幫助,大家能夠更快更方便地閱讀並審查其他人編寫的代碼。與《高效 Java》類似,我同樣推薦大家有選擇地閱讀這本書中的對應章節。
熟練掌握您的 IDE
好吧,這一點跟面試沒什麽關係。但說真的,熟練掌握 IDE 能夠極大提升編程的效率與趣味性!
我個人使用 IntelliJ,還安裝了一款“Key Promoter X”插件。每當我使用了能夠通過快捷鍵實現的滑鼠操作時,它都會發出提醒。只需要幾周,大家就能掌握快捷鍵操作並讓自己看起來專業萬分~當然,這都是被提示磨出來的。如果大家使用的是其他 IDE,也可以試試類似的小工具。但我還是強烈推薦 IntelliJ,真的很棒。
《42 項 IntelliJ 提示與技( 42 IntelliJ Idea Tips and Tricks )》是 YouTube 上的一段講座,大家可以通過這種有趣的方式熟悉 IntelliJ 中提供的各種常用功能。
這份清單挺長的,不過大家不用著急,閱讀的意義不在於讀完,而在於借此改善自己在日常工作中的體驗。加油!
順便說一句,這份清單主要面向已經擁有 0 到 4 年開發經驗的人群。如果各位還沒開始工作,請先從 Leet Code 入手,等有了一定積累之後再閱讀這份書單。
一般來說,直到接觸現實場景中的實際系統之後,大家才會遇到設計概念層面的問題。
相關書籍
下面,我再立足各個基礎方向推薦一本好書,盡可能把它們組織成一個學習體系。
Effective Java— Java 最佳實踐入門,閱讀難度很低。
Clean Code— 助您快速掌握編碼中的經驗法則。
Java Concurrency In Practice— 用於掌握並發機制的基礎書籍。
Head First Design Patterns— 有趣、有效的面向對象設計思維學習方式。
Designing Data Intensive Applications— 我見過的最高級別的技術類書籍,包含極為豐富的系統設計知識——但也非常難啃,建議大家一次讀一點慢慢消化。
https://medium.com/javarevisited/growing-pains-becoming-an-intermediate-developer-6108a00211d5
點個在看少個 bug