(對,封面是嚴島神社大鳥居)

不管你是剛入門的新手,還是已經有了一定經驗的程序員,你一定早晚會意識到,在某一個崗位上幹了多長時間,並不是一個評判程序員是否優秀的好指標——因為這既不能反映出一個人的真實水平,也不能真正體現出ta工作經驗的多少(是,這句話該說給hr聽??)。

一個人能否在編程領域獲得成功,最具有決定性的因素,其實就隱藏在你業餘時間所做的事情中,隱藏在你如何主動學習新知識的過程中。

要想提高你的編程技術,有許多很棒的辦法,比如結對編程、在線學習、線下聚會,以及額外的工作經驗、項目構建經驗,還有找一個好導師。

我個人最喜歡的學習方式,是翻開一本好書,品味字裡行間閃爍著的智慧光芒,吸收多年經驗積澱而成的寶貴知識。


以下的九本書,是我個人強烈推薦給每一位開發者(特別是新手)值得一讀的好書。這些書在業內都已經產生了強烈的反響,有著廣泛的好評,有可能對你的工作、學習都產生深遠的影響。

和你想的不一樣,這些書並不都是專註在紛繁複雜的技術細節上,而是更多地傾向於提供一些實用的引導,幫助你處理好人際關係、提升專業水平,最終成為一名優秀的開發者。

譯註:原作者 Khalil Stemmler 推薦的書籍均為英文版,為方便國內讀者,譯者在亞馬遜等站尋找評分較高的對應中文譯本,但還是鼓勵有能力的讀者閱讀原版。

1. 代碼整潔之道

Clean Code

作者:羅伯特·C.馬丁 (Robert C. Martin) ,暱稱「鮑勃大叔」

中文版: amazon.cn/dp/B0031M9GHC

英文版: amazon.ca/gp/product/01

在克服了編程的基本挑戰並熟悉如何編寫代碼來解決問題之後,看看這本書是個好主意。事實證明,第一次讓代碼正常工作實際上只是最容易的那部分。而困難的部分是讓你的代碼容易閱讀,以便其他人能夠理解它並在將來對它進行改進。

想想看,如果你不得不閱讀像下面這樣的代碼,那是一種什麼體驗?

function calculateIt (a, b) { if (a.delta < b.element.x) { var x = b.element.x; return x - b.delta.x } else { var y = b.next.y; var h = b.element.y * 2; return y - h } }

源碼見:hell-code.js

誰知道它到底是做什麼的。像這樣的代碼可能會起作用,但是當我們需要修改它時,我們不得不希望代碼的原作者既沒有跳槽,也沒有進 ICU,並祈禱他們能夠以某種方式「破譯」自己多年前寫下的東西。

如果不小心注意編寫易於閱讀和維護的代碼,我們最終會得到像這樣「讓人不敢碰」的代碼。如果某天它不工作了,那我們就會有大麻煩了。

鮑勃大叔的《代碼整潔之道》將教你認識乾淨的代碼,鑒別出「壞」的代碼,並教你如何將其轉換為優秀的代碼。像這樣的任務對大多數人來說聽起來微不足道,但當你將這幾條簡潔的軟體設計原則轉化為工作習慣之後,這些習慣能讓你更加高效地編寫出更專業和可擴展的代碼。

你知道,我們就是軟體行業的手工匠人。構建軟體的原則,和建設房子的原則沒有什麼太大差別——我們都需要注意細節,否則如果第一次沒有做好,將來都要花費昂貴的代價去修復之前犯下的錯誤。

2. 代碼整潔之道:程序員的職業素養

The Clean Coder

作者:羅伯特·C.馬丁 (Robert C.Martin)

中文版:amazon.cn/dp/B01LZJ8L9J

英文版:amazon.ca/gp/product/01

這本書其實並不算是一本技術書籍,因為它是一本教你如何成為這個行業專業人士的書。專業人士在面對挑戰、不確定性和壓力時,將繼續將軟體開發視為一種手工藝,並將不懈地堅持他們的專業價值觀。

這本書在評估、重構、測試、處理衝突、時間表、避免職業倦怠等方面提供了大量實用建議。這些都是來自幾十年來一直在做這些事情的人的,值得信賴的建議。

它教給我們的最棒的東西之一,就是如何做一名誠信的開發者,何時該說「不」以及如何去說。

亞馬遜網站的編輯推薦語是:「匯聚編程大師40餘年編程生涯的心得體會」。

3. 重構:改善既有代碼的設計

Refactoring

作者:馬丁·福勒 (Martin Fowler)

中文版: amazon.cn/dp/B07PKP87K5

英文版: amazon.ca/gp/product/01

馬丁·福勒是我最喜歡的作家之一。原因之一是他很搞笑,他編寫的軟體書籍無疑有著個人的強烈風格。另一個原因是他非常擅長用簡單的方式來解釋複雜的主題,而不會讓你疲憊不堪。

Ruby on Rails 的作者曾經說過,你應該「在寫下另一行代碼之前先閱讀」《重構》這本書。在書中,福勒會指導你重構一個簡單的應用程序,以此向你介紹他在多年的職業生涯中積累和歸納出的一些技巧。

福勒在書中展示瞭如何在寫代碼和重構代碼之間進行切換,應該多久提交一次代碼以及何時編寫測試等經驗之談。強烈推薦。本書的最新版本已更新,添加了大量 JavaScript 的範例,這對我來說是一個額外的加分項,因為 JavaScript 是我最喜歡的語言。

4. 設計模式:可復用面向對象軟體的基礎

Design Patterns: Elements of Reusable Object-Oriented Software

作者:Erich Gamma、Richard Helm、Ralph Johnson 以及 John Vlissides

中文版: amazon.cn/dp/B001130JN8

英文版: amazon.ca/dp/0201633612

這是關於設計模式的開創性著作。你問什麼是設計模式?設計模式是針對軟體開發中的常見問題,提出廣為人知的解決方案。如果你熟悉這些模式,你將能夠大大減少為這些問題提出解決方案所需的時間。

如果你熟悉設計模式,你還能與其他開發人員更加有效地溝通這些問題的解決方案。

「沒錯,我就是用一個門面對象覆蓋了資料庫適配器從策略模式中載入的東西。」

「啊!我明白了。」

對,這本書是有點年頭了。但它仍然是最棒的參考書籍之一。如果你希望閱讀一些關於這個主題的更新、更友好的書籍,我也推薦你閱讀 Eric Freeman 的《深入淺出設計模式》(Head First Design Patterns: A Brain-Friendly Guide)。

5. 領域驅動設計:軟體核心複雜性應對之道

Domain-Driven Design: Tackling Complexity in the Heart of Software

作者:埃裏克·埃文斯(Eric Evans)

中文版:amazon.cn/dp/B01GZ6T12K

英文版:amazon.com/dp/032112521

為了使大型代碼庫得以繼續擴展,我們需要在邏輯上將代碼分成不同的部分。我們的想法是以某種方式對代碼進行分區,使得單獨的團隊可以在不影響其他任何人的情況下處理系統的不同部分。

能夠讓代碼庫往這個方向發展,其基本概念被稱作「領域驅動設計」(Domain-Driven Design,DDD)。這是一種軟體開發方法,我們將存在於「問題域」(現實世界)中的問題建模到若干個解決方案域之中。

當代碼庫大到一定程度的時候,DDD 就顯得尤為重要了。許多大型企業公司採用 DDD 的方法,以便分配不同的團隊到公司代碼庫的某些部分。

貧血模型很快就變得臃腫而繁瑣。(圖片來自 Vladimir Khorikov 的課程《將貧血領域模型重構成富有模型》)

埃裏克·埃文斯創造了「無所不在的語言(Ubiquitous Language)」這一術語,這個詞用於在開發人員、領域專家以及領域中的任何其他用戶或參與者之間建立一種通用的、全覆蓋的「語言」。通過使用這種無所不在的語言進行溝通,就可以確保最重要的領域概念得到很好的理解,並在軟體中得到實現。

這本書比我要介紹的其他書更具技術性,也更有挑戰。但如果你能熟悉這些概念,就將充分了解當今最大的那些企業是如何保持代碼庫的可管理性和可擴展性。

最後,這本書是因為封面是藍色的,往往被人稱為藍皮書。如果你覺得它對新手來說過於艱深,你也可以試試弗農 (Vaughn Vernon) 的《實現領域驅動設計》——這本書在業內被稱為「紅皮書」,它用更加簡明易懂的方式描述了領域驅動設計的概念及其實現方式。

6. 軟技能:代碼之外的生存指南

Soft Skills: The Software Developer』s Life Manual

作者:約翰·森梅茲(John Sonmez)

中文版:amazon.cn/dp/B01IB086H4

英文版:amazon.ca/gp/product/16

作為軟體開發人員,我們應該努力保持一種完美的平衡狀態。不幸的是,大多數人並沒有把「平衡」這種特質和軟體開發者聯繫在一起。而事實上,這種身心的平衡對一個人的學習、健康和整體狀態都是非常重要的。

「軟技能」是關於實際編程技術之外的重要能力,比如創造力、職業目標和個人理財等。作者還討論了個人投資,如何在 33 歲退休,健身中的額外技巧,以及如何維持人際關係——這些可不是你在編程社區裏能得到解決的問題。

它獨特的章節編寫方式使得每章的內容相對獨立,你可以任意選擇適合你的章節開始閱讀。

7. 架構整潔之道

Clean Architecture

作者:羅伯特·C.馬丁(Robert C. Martin)

中文版:amazon.cn/dp/B07HN66S4D

英文版:amazon.ca/gp/product/01

啥?鮑勃大叔寫的書就是好,不行嗎?

在學校裏,我們往往過份關注演算法,而不太關注軟體設計原則。我認為這可不是件好事,因為實際上,你並不會經常遇到那麼多演算法挑戰。相反,更常見的是,你將面對的是用模塊化、靈活、可讀的方式來構建代碼,以及在需求變化時快速添加新功能的種種挑戰。

而《架構整潔之道》中介紹的基本軟體設計原則和模式,正是你能夠用來應對這些挑戰的制勝祕籍。

「整潔」的架構模型,感謝鮑勃大叔!

本書中提出的原則中,最棒的幾點是關於依賴產生的成本,穩定代碼與非穩定代碼的對比,以及「SOLID」原則:編寫代碼以使其更易理解,更靈活也更易維護的方法。

本書的其他部分中,非常有用的是「尖叫的架構」和「按組件打包」這幾個概念,它們將教會你如何更有效地組織你的模塊,這樣當別人閱讀你的項目代碼時,這個架構在某種意義上會向讀者「尖叫」出項目的全部情況。

本書與「領域驅動設計」密切相關,通過使用「分層架構」或鮑勃大叔稱之為「整潔」的架構(也就是所謂「埠」和「適配器」)來實現。對於那些想要提升自己架構知識體系,學習如何有效地在高層對系統進行設計,同時又能在細節層面上優雅地處理依賴的人來說,這是一本很棒的書。

8. 高效的工程師

The Effective Engineer

作者:Edmond Lau

本書未找到中譯本。

豆瓣頁面: book.douban.com/subject英文版: amazon.ca/gp/product/09

時間是我們生命中最寶貴的資產,我們應該將不斷提高時間利用率作為目標。但在現實中,我們往往很容易陷入困境,花費大量時間去修復錯誤、浪費精力、做重複的工作,等等。而《高效的工程師》就是教你如何在更短的時間內完成更多工作,並避免重複勞動。

我們可以通過一個名為「槓桿(leverage)」的機制來減少在重複性任務上浪費的時間和精力。

「槓桿」可以幫助你鑒別日常的各項事務,挑出那些投入產出比例最差的工作。它是一個可以應用於任何事情的機制,無論是學習、編程、調試……沒錯,任何事情!

9. 程序員修鍊之道:從小工到專家

The Pragmatic Programmer

作者:安德魯·亨特(Andrew Hunt)和大衛·託馬斯(David Thomas)

中文版:amazon.cn/dp/B004GV08CY

英文版:amazon.ca/gp/product/02

《程序員修鍊之道》是一本應該放在各級開發人員桌面上的書,它以深入淺出、易於理解而著稱。 安德魯和大衛都是程序員,他們不僅在自己的事情上花了很多年時間,還不斷地關注他們正在做的事情,並努力確定是否可以做得更好

本書凝聚了他們多年的經驗和總結,介紹了程序員職業生涯中要遵循的一些基本哲學理念,比如「程序員應該有『要麼只做一次,要麼將它自動化』的理念」。

它包括了許多簡明又詳盡的建議,在編寫另一行代碼或啟動新項目之前,你應該隨身攜帶,並謹記在心。

結語

作為新手程序員或初級開發者,書籍確實是提高知識和技能的最佳工具,還往往具有很高的投資回報率——你知道學好編程可以賺很多錢嗎???

這些只是我個人認為 2019 年最好的一些書籍。它們並不是最新的,但那不過是因為「編程」這件事多年來一直保持著相同的一般哲學和最佳的實踐做法。作為一名教授,我曾經不得不說,「你只需閱讀這些該死的手冊,就可以在這個行業賺很多錢」。

那麼,親愛的讀者,你讀過這些書嗎?有沒有什麼看法可以跟我們分享?如果你發現了其他未提及的好書,歡迎留言告訴我!

拓展閱讀

除了上面的 9 本書之外,這裡還有一些關於類似主題的額外文章。如果你沒有辦法騰出時間精讀上面的這些書籍(我強烈建議你讀一讀),那你也可以通過下面這些文章對這些重要概念有所理解,希望這在你的程序員之路上能有所助益。

  • 重構.guru: refactoring.guru/
  • SOLID 設計原則: stackify.com/solid-desi
  • DRY 原則(Don』t Repeat Yourself): en.wikipedia.org/wiki/D
  • NodeJS 及其優秀實例: blog.codeminer42.com/no
  • 在 Node.js 上實現 SOLID 和「洋蔥」架構: dev.to/remojansen/imple
  • 利用「整潔」的架構實現更好的軟體設計: fullstackmark.com/post/
  • 架構整潔之道官方博客: blog.cleancoder.com/unc

繼續努力,繼續成長,並祝你時刻樂在其中!加油!

圖片來源:UnSplash

原作: Khalil Stemmler 編譯:歐剃

編譯來源: medium.freecodecamp.org

知乎機構號:來自矽谷的終身學習平臺——優達學城(Udacity.com),專註於技能提升和求職法則,讓你在家能追隨 Google、Facebook、IBM 等行業大佬,從零開始掌握數據分析、機器學習、深度學習、人工智慧、無人駕駛等前沿技術,激發未來無限可能!

優達學城(Udacity)?

www.zhihu.com
圖標

知乎專欄:優達技術流,每天分享來自行業大牛、工程師必讀的技術乾貨

優達技術流?

zhuanlan.zhihu.com
圖標

推薦閱讀:
相關文章