程序員必讀書籍及部分圖書導讀指南

最近在網上看了一個很是好的帖子《程序員一輩子必讀的書》, 這張圖是由ThoughtWorks(全球軟件設計與定製領域的領袖級企業)的資深人士提供的,它將程序員要讀的書分爲四個類別,每一個類別又分爲初級、進階和高級讀物,並用黃色三角形點出了強烈推薦閱讀的書籍。四個類別包括:java

  • 編程實踐(Coding Practice)
  • 設計與架構(Design & Architecture)
  • 方法學(Methodology)
  • 思想與領導力(Thought & Leadership)

程序員必讀書籍的雷達圖

相信這張圖會幫助到不少迷茫的職業人,由於好書就像明燈同樣會照亮咱們的方向,那些大師級的人物將他們的經驗分享給咱們,真的有如浴春風的感受。有時候會很感慨國外有那麼多厲害的技術做家寫了那麼多好的做品,而國產技術書籍中的好書真算得上是百裏挑一。有時候也會問本身,能不能作一個技術做家呢,我想個人修煉還遠遠不夠。
雖然不可以本身寫一本好書,可是仍是很願意把本身的讀書心得跟你們一塊兒分享,雷達圖上的書我讀過的約有1/3,下面就把讀這1/3的心得跟你們分享。
程序員

Code Complete 《代碼大全》

這裏寫圖片描述


Refactoring《重構:改善既有代碼質量》

這裏寫圖片描述

       若是一我的沒有據說過《重構》這本書,那麼他必定不敢說本身是程序員;若是一我的沒有閱讀過《重構》這本書,那麼很難想象他會是一名優秀的程序員。這本書是不少公司要求Java程序員必讀的三本書之一(另外兩本書是《Java編程思想》和《Effective Java》),其實無關編程語言,是程序員就可以從這本書中受益。
  這本書我我的最喜歡的第三章 - 「代碼的壞味道」,由於我喜歡在寫完代碼後去思考個人代碼中有沒有這些壞味道,而後再去想想應該如何重構代碼。這本書的做者是世界級的軟件開發大師Martin Fowler,他也被譽爲軟件開發「教父」,同時他仍是敏捷開發的創始人之一。Martin Fowler編寫了不少極好的書籍,包括《企業應用架構模式》、《領域特定語言》、《NoSQL精粹》、《分析模式:可重用對象模型》等。Martin Fowler給出的代碼的壞味道包括:
-Duplicated Code(重複代碼):「代碼有不少中壞味道,重複是最壞的一種」,這句話我常常講給本身的學生聽,可是他們真正領悟並踐行這句話的人卻很少。一個類中的兩個方法有重複代碼,那麼必定能夠經過抽取方法的方式將重複代碼放到另外一個方法中以供調用;兩個互爲兄弟的子類中若是有重複代碼能夠將其重複代碼抽取到父類中;兩個沒有關係的類中若是有重複代碼,那麼能夠從新抽取一個類將重複代碼放到這個第三方類中。
-Long Method(長的方法):程序越長理解起來就越困難,這已是常識了,使用短小的方法首先符合高內聚的要求,同時也能夠給經過給方法起一個好的名字來幫助理解方法的做用。若是感受到方法的某個地方須要註釋來講明什麼,那麼能夠把這些東西放入一個獨立的方法中,並以用途(注意不是實現手法)來命名方法。
-Large Class(巨大的類):若是但願寫一個類來作不少的事情,那麼最終勢必致使重複和混亂的代碼。類的設計應當遵循單一職責原則(SRP)。重構一個巨大的類可使用抽取接口的方式來搞清楚這個類應該如何分解。
-Long Parameter List(長參數列表):這個對於作過Windows編程或者用過MFC(Microsoft Foundation Class)的程序員來講再熟悉不過了,Windows函數和MFC中的方法那些長得變態的參數列表對程序員來講都是惡夢。重構的方式不少,比較常見的是將相關的參數組織成一個對象來替換掉這些參數。
-Divergent Change(分散的可變性)和Shotgun Surgery(散彈式手術):這兩種壞味道前者講的是新功能難以加入,後者說的是某種變化會引起多個細節的修改。簡單的說若是程序中的可變因素散落在代碼的各個角落中,那麼代碼的維護將是一場惡夢。重構的方法是找到特定緣由形成的全部變化,而後將它們抽取到另外一個類中。設計模式中的橋樑模式就是爲了解決這一問題而提供的解決方案。
-Feature Envy:這個真沒想到如何翻譯會比較容易理解,簡答的說就是一個方法從另外一個類的對象那裏獲取許多的值,重構的方案是將該方法移到另外一個類中。
-Data Clumps(數據羣集):情況相似於長參數列表。
-Primitive Obsession(基本類型偏執)
-Switch Statements(重複的switch語句):面向對象程序的一個明顯特徵就是用多態替換掉switch結構,由於這種switch結構會在多個地方重複。
-Parallel Inheritance Hierarchies(平行繼承結構):狀況跟Shortgun Surgery差很少,可使用橋樑模式進行重構。
-Lazy Class(冗餘類):若是一個類不值得存在,那麼它就應該消失。
-Speculative Generality(投機通用性):重構方式是若是你的抽象類、委託、方法的參數沒有實際的做用,那麼就應當被移除掉。
-Temporary Field(臨時字段)
-Message Chains(消息鏈):我我的並無感受到這個有多麼壞。
-Middle Man(中間人):若是一個類的不少功能都經過委託給其餘類來完成,那麼就不如去掉這些中間人直接和真正負責的對象打交道。
-Inappropriate Intimacy(過於親密)
-Alternative Classes with Different Interfaces(殊途同歸)
-Incomplete Library Class(不完整類庫)
-Data Class(數據類):類的退化結構。咱們在分層開發中常用的失血模型(事務腳本模式)中的業務實體不就是數據類嗎,這明顯與面向對象的思想是背道而馳的。
-Refused Bequest(拒絕遺產):若是子類複用了父類的行爲,又不肯意支持父類的接口,能夠考慮用合成關係聚合關係取代繼承關係來消除這種壞味道
-Comments(註釋劣質代碼):註釋不是用來補救劣質代碼的,事實上若是咱們去除了代碼中的全部壞味道,當劣質代碼都被移除的時候,註釋已經變得多餘,由於代碼已經講清楚了一切。
  若是你但願完全根除這些壞味道,這本書的第六章到第十二章提供了完整的操做手冊,趕忙讀這本書吧!
web


Clean Code 《代碼整潔之道》

這裏寫圖片描述

其實我應該先介紹下面那本書,喜歡下面那本書的緣由是書中有不少很是精煉可是有用的Tip,這些Tip能夠說是大師級的經驗總結;而我我的喜歡這本書多是由於非技術方面的緣由(我喜歡這本書中的插圖)。這本書的第一章的第一句話是這樣說的:讀這本書一般有兩個緣由:1. 你是一名程序員。2. 你想成爲更好的程序員。咱們須要更好的程序員。
  這本書的每一章均可以總結出一句話或是一張圖,就是下面這些:

面試

       本書的第一章是關於什麼是整潔代碼的討論,引用了Bjarne Stroustrup(C++之父)、Grady Booch(UML的創始人之一)等人固然也Bob大叔(本書的做者Robert Martin)本身對整潔代碼的理解。順便說一下,上面那張圖上的代碼應該是保齡球計分程序(你必須佩服個人眼力)。算法



無論是現實世界仍是軟件項目中,命名都是一件讓人頭疼的事情,給小孩起過名字的就知道,你但願把你對孩子的指望包含在這個名字中,你又但願這個名字讀起來要好聽,至少不至於未來成爲別人的笑柄(好比龐光大、魏升京這樣的名字),可能你還要考慮族譜的排輩等等。軟件項目中的命名狀況會更加複雜,簡單的說命名的原則是「見名知意」,固然你還須要用各類方式防範命名衝突的問題,不一樣的編程語言也有本身不成文的像契約同樣的命名規則和方式(例如匈牙利命名法),這些可能都是須要考慮的事情。


  第三章講的是函數,說了這麼一句話:Function should do one thing. They should do it well. They should do it only. (函數只應該作一件事情,把一件事情作好,並且只由它來作這一件事情),聽起來很簡單的一句話可是要踐行這條原則卻並不容易,因此咱們的代碼中才會有不少的壞味道(上一本書中提到的東西)。事實上,上升一個層次,咱們在設計類的時候也應該如此,這是面向對象設計原則中說的單一職責原則(SRP),當咱們的代碼中出現了冗長的方法或者巨大的類的時候,咱們就應該依據職責來對其進行拆分,這樣程序的結構纔會趨於合理,最終達到「高內聚」的目標。固然,這一章裏面還提到不少理念,包括:Command Query Separation(一個方法要麼執行某種命令,要麼返回查詢數據)、DRY(不要重複本身)、Prefer Exceptions to Returning Error Codes(異常優於返回錯誤碼)等。


這裏寫圖片描述
  第四章講的是註釋,有一句話我很喜歡,說的是:Comments Do Not Make Up for Bad Code (註釋不是對劣質代碼的補救)。事實上好的代碼即使沒有註釋也擁有良好的可讀性,但恰當的註釋會讓代碼變得更可讀、可維護性更高。


  第五章講的是代碼風格。現代IDE(集成開發環境)幾乎都有代碼格式化代碼的功能,你只須要設置好你使用的代碼風格就能夠了,其實不僅是IDE,不少高級的文本編輯工具也可以按照指定的風格格式化你的代碼。用什麼樣的代碼風格不是關鍵,關鍵是整個項目組的成員應當使用相同的代碼風格,讓多我的編寫的代碼看起來像一我的書寫的。我我的特別鍾愛1TBS(One True Bracing Style,也叫作K&R風格,這種風格是Kernighan和Ritchie兩位老師在The C Programming Language一書中使用的代碼風格),固然Allman風格(FreeBSD系統的做者之一使用的代碼風格)也是很好的選擇。


  第六章討論的是對象和數據結構,讀完以後的感受是雖然咱們每天都嚷着吼着要面向對象編程,可是不少時候咱們都使用了類的退化結構,包括咱們開發時常用的失血模型和貧血模型(事務腳本模式)都和麪向對象的設計理念相違背。我得認可在讀這一章的時候我沒有太抓住做者的觀點,也歡迎你們來幫助我理解這章的內容。


  第七章對錯誤處理(異常)的講解仍然是很是精彩的,整潔的代碼中對錯誤的處理應當是被分離的關注點(不要跟正常的業務邏輯混雜在一塊兒),而面向對象中的異常機制就是一種在不打亂原有業務邏輯的前提下處理掉程序在運行時發生的不正常情況的手段。這章有兩個觀點我特別欣賞,一是Use Unchecked Exceptions(非受檢異常容許你在適當的地方處理異常,而適當的地方就是異常影響代碼執行邏輯的地方,無論作哪一種類型的應用,都應該儘量向用戶隱藏異常的發生,除非發生了不可挽救的情況,這纔是符合最小驚訝原則的設計);二是Don’t Return Null(若是一個方法在出情況的時候返回null,那麼調用者都要經過頻繁的檢查返回值來斷定是否出錯,一旦忘了這件事情就有可能出錯,既然null是一種異常情況,那麼用拋出異常的方式來代替null明顯是更好的作法)。


  第八章的內容對實際開發有重要的指導意義,由於咱們的項目中不可避免的要使用第三方工具,所以咱們須要將這些東西整潔的歸入到咱們的系統中,這時就須要考慮系統邊界的問題。有的時候咱們會千辛萬苦的發現系統中的一些bug是來源於第三方工具的,固然咱們基本上沒有時間去重頭學習和研究第三方工具或者本身寫代碼來實現第三方工具的功能,可是咱們至少應該先對第三方工具進行測試。我在之前的項目中,即便用Apache提供的那些著名的第三方工具,個人作法也是先寫測試代碼對這些工具的可用性和有效性進行證明,固然有的時候多是過於謹慎了,但這種習慣和作法自己是好的行爲。在這種場景下,適配器模式是很是好的設計,它不只能將不兼容的接口改寫成兼容的接口,還可以對經過對第三方工具從新封裝來避免邊界的變化對系統的影響。

  第九章的內容是單元測試。Bob大叔是TDD(測試驅動開發)的倡導者,這一章講的是如何編寫整潔的測試,Bob大叔的答案是FIRST規則(Fast、Independent、Repeatable、Self-Validating、Timely)。

  第十章介紹類的設計,最重要的仍是SRP。

  第十一章是關於系統設計的內容,開篇引用了微軟首席技術官Ray Ozzie的一句話:Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test. (複雜要人命,它消磨開發者的生命,讓產品難於規劃、構建和測試)。這章對於但願瞭解面向切面編程的開發者是極好的,包括了對依賴注入、代理模式以及AOP的探討。

  第十二章探討了系統的迭代式演進。spring


  第十三章對併發編程的討論很是常常,不少開發者都畏懼併發編程,也有的開發者迷信多線程能夠解決全部的併發問題,若是你是這兩類人之一,本章會教給你真正的併發編程。編程


  第十四章是一個精彩的案例用來說解對代碼的持續改進,你能夠本身好好閱讀一次。

  第十五章到第十七章說的都是重構,至關精彩。你在《重構》中瞭解過的代碼的壞味道及其改進方案這裏幾乎都能見到它是如何應用的。

總之,這本書從引言到附錄都無比精彩,趕忙去閱讀吧。

The Pragmatic Programmer: From Journeyman to Master 《程序員修煉之道:從小工到專家》

這裏寫圖片描述

  這本書最初出中文譯本的時候,它的名字叫《務實的程序員》,而這本書也正像它書名的副標題那樣,是一本帶領程序員從小工成爲行業專家的著做。這本書裏有70個Tip(指點、提示),這些Tip都是短小精煉的句子,但都是大師們編程經驗的總結和沉澱。所以無論何時看這本書,也無論你翻到第幾頁,總會發現這樣的Tip,而它們也會讓你有醍醐灌頂的感受。下面分享了這本書部分的Tip:設計模式

  • Tip8: Invest Regularly in Your Knowledge Portfolio (按期爲你的知識資產投資)
  • Tip9: Critically Analyze What You Read and Hear (批判的分析你讀到的和聽到的)
  • Tip10: It’s Both What You Say and the Way You Say It (你說什麼和你怎樣說一樣重要)
  • Tip11: DRY - Don’t Repeat Yourself (不要重複本身)
  • Tip13: Eliminate Effects Between Unrelated Things (消除無關事物之間的影響)
  • Tip18: Estimate to Avoid Surprises (經過估計來避免意外發生)
  • Tip20: Keep Knowledge in Plain Text (用純文本保存知識)
  • Tip23: Always Use Source Code Control (老是使用源碼控制)
  • Tip27: Don’t Assume It - Prove It (不要假定要證實)
  • Tip29: Write Code That Writes Code (用代碼生成代碼)
  • Tip31: Design with Contracts (按照契約設計)
  • Tip33: If It Can’t Happen, Use Assertion to Ensure That It Won’t (用斷言確保不能發生的不發生)
  • Tip38: Put Abstraction in Code, Details in Metadata (將抽象置於代碼,細節置於元數據)
  • Tip39: Analyze Workflow to Improve Concurrency (分析工做流以改善併發性)
  • Tip42: Separate Views from Models (讓視圖和模型分離)
  • Tip63: Coding Ain’t Done ‘Til All the Tests Run (測試不經過編碼不中止)
  • Tip69: Gently Exceed Your User’s Expectations (超出用戶指望一點點就好)

  除此以外,該書中有不少名人名言以及不少經驗的分享,例如:「不要讓調試改變了被調試系統的行爲」、「異常儘可能不被做爲程序正常流程的一部分來使用」、「要善始善終,分配資源的程序也應當釋放它」、「最大的弱點是懼怕暴露弱點」等等。 固然,這本書也包括了對契約式編程、解耦合、重構、算法效率、測試等內容的探討。
  老實說,整本書的內容都很棒,附錄也不例外,附錄A中列出了一些做者推薦閱讀的計算機書籍,這些書籍正好也出如今了咱們給的這個必讀書籍的列表中,真的是英雄所見略同(就算我臭美了一次哈)
api


The Practice of Programming 《程序設計實踐》

這裏寫圖片描述


Design Patterns 《設計模式》

這裏寫圖片描述


Domain-Driven Design 《領域驅動設計》

這裏寫圖片描述


The Art of UNIX Programming 《UNIX編程藝術》

這裏寫圖片描述

  這本書是給予我無數次幫助的書籍,我會慢慢的把我讀這本書的心得記錄在這裏。每次當我遇到問題不知所措的時候,這本書老是能給我答案;在我參加的全部面試中,只要有答不上來的問題,想一想這本書中的一些隻言片語就能在電光火石間發現答案。數組


Practical API Design 《軟件框架設計的藝術》

這裏寫圖片描述


Patterns of Enterprise Application Architecture 《企業應用架構模式》

這裏寫圖片描述



  還有不少好書可能由於選擇標準的不一樣在雷達圖中雖然沒有出現,可是仍然值得每一個程序員去閱讀,這些好書包括:

The C Programming Language 《C語言程序設計》

這裏寫圖片描述

C語言之父Dennis Ritchie以及Brian Kernighan兩位老師合著的神同樣的書籍。我到如今都沒有想明白爲何國內只有極少數的幾所大學用這本書做爲教材,難道C語言的入門書中還有出其右者嗎?這本書的內容無比精彩,無論是對於初學者仍是有經驗的程序員;這本書中的代碼無與倫比,幾乎每一段代碼都是經典。即便你尚未讀過本書,可是你必定據說過一個叫Hello, world的程序,該程序就出如今這本書中。


The Mythical Man-Month 《人月神話》

這裏寫圖片描述

這本書是號稱軟件工程領域的第一奇書,與《人件》合稱爲軟件工程著做中的倚天劍和屠龍刀。Brooks博士爲人們管理複雜項目提供了最具洞察力的看法。既有不少發人深省的觀點,又有大量軟件工程的實踐,其內容都是來自Brooks博士在IBM公司System/360家族和OS/360中的項目管理經驗。這本書是項目經理和系統分析師必讀的不朽之做,也是流行了30多年的傳奇經典。


Hackers and Painters 《黑客與畫家》

這裏寫圖片描述

該書是我最近幾乎天天都翻翻的一本書,準確的說這本書是硅谷創業之父Paul Graham的文集,主要介紹優秀程序員(書中稱之爲黑客,固然這和咱們尤爲是國內對黑客的理解有所差異)的愛好和動機,討論它們如何成長以及如何爲世界作出貢獻,固然也包括了對編程語言和優秀程序員工做方法等的探討和思考。該書的內容不但有助於瞭解計算機編程的本質、互聯網行業的規則,還會幫助讀者瞭解咱們這個時代,迫使讀者獨立思考。該書的中文版是阮一峯博士翻譯的,翻譯的水準和書中的旁註都至關好。


The Art of Computer Programming 《計算機程序設計藝術》

這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述

Introduction to Algorithms 《算法導論》

這裏寫圖片描述

Object-Oriented Analysis and Design with Applications 《面向對象分析與設計》

這裏寫圖片描述

除此以外,由於本身作了很長時間的Java程序員,有一些Java方面的好書能夠推薦給你們

Thinking in Java 《Java編程思想》

這裏寫圖片描述

Effective Java

這裏寫圖片描述

《Java與模式》

這裏寫圖片描述

The Well-Grounded Java Developer 《Java程序員修煉之道》

這裏寫圖片描述

POJOs in Action

這裏寫圖片描述

  其實國產的Java書籍裏面也有部分優秀的書籍,雖然國產書的質量整體偏低,可是最近幾年仍是有不少有責任感的技術做家(他們不少人同時也是一線程序員或架構師)寫了很多好書。

《設計模式之禪》

這裏寫圖片描述

《編寫高質量代碼:改善Java程序的151個建議》

這裏寫圖片描述

《Spring 3.x企業應用開發實戰》

這裏寫圖片描述

《Tomcat與Java Web開發技術詳解》

這裏寫圖片描述

《瘋狂Java:突破程序員基本功能的16課》

這裏寫圖片描述

  若是你之前不是計算機相關專業又想轉型從事軟件行業,那麼我推薦先看一些專業氣質養成類書籍,固然最入的書就是《計算機導論》、《計算機文化》之類的書,也能夠看看《計算機科學概論》或者是《計算機專業英語》,建議看原版的,一方面對整個行業有一個全面的瞭解,另外一方面鍛鍊一下本身的英語水平。不管如何,我以爲程序員仍是應該讓英語成爲本身的工做語言。

Computer Concepts 《計算機文化》

這裏寫圖片描述

Computer Science Illuminated 《計算機科學概論》

這裏寫圖片描述

Computing Essentials 《計算機專業英語》

這裏寫圖片描述

  若是你但願從零基礎開始作一個Java程序員,那麼我建議的這些書的閱讀順序是這樣的(每項讀一本就OK了):

  1. Computer Concepts / Computer Science Illuminated
  2. The C Programming Language
  3. Core Java (Vol. 1 & Vol. 2) / Introduction to Java Programming
  4. MySQL Crash Course / 深刻淺出MySQL / Sams Teach Yourself SQL in 10 Minutes
  5. Thinking in Java / Effective Java / 編寫高質量代碼:改善Java程序的151個建議
  6. Servlet & JSP: A Tutorial / Head First Servlets & JSP
  7. Java與模式 / Design Patterns Explained / 設計模式之禪
  8. 精通Hibernate / Java Persistence with Hibernate
  9. Spring in Action / Spring企業應用開發實戰 / Spring技術內幕
  10. Clean Code / Refactoring Impoving the Design of Existing Code
  11. The Well-Grounded Java Developer
  12. Algorithms / Data Structures and Algorithm Analysis in Java
  13. POJOs in Action / Core J2EE Patterns: Best Practices and Design Strategies
  14. Java Performance
  15. Software Engineering A Practitioner’s Approach
說明:讀書心得我只能一點點與你們分享和交流了
相關文章
相關標籤/搜索