【乾貨】程序員必讀書單(上)

很是全面,Mark。太長了,居然超過SFG的字數限制 = = 分兩次發吧javascript


做者:Lucida
微博:@peng_gong
豆瓣:@figure9
原文連接:http://lucida.me/blog/developer-reading-list/php

關於

本文把程序員所需掌握的關鍵知識總結爲三大類19個關鍵概念,而後給出了掌握每一個關鍵概念所需的入門書籍,必讀書籍,以及延伸閱讀。旨在成爲最好最全面的程序員必讀書單。html

前言

Reading makes a full man; conference a ready man; and writing an exact man.前端

Francis Baconjava

優秀的程序員應該具有兩方面能力:python

  • 良好的程序設計能力:jquery

    *   掌握經常使用的數據結構和算法(例如鏈表,棧,堆,隊列,排序和散列);
    
    *   理解計算機科學的核心概念(例如計算機系統結構、操做系統、編譯原理和計算機網絡);
    
    *   熟悉至少兩門以上編程語言(例如C++,Java,C#,和Python);
  • 專業的軟件開發素養:git

    *   具有良好的編程實踐,可以編寫可測試(Testable),可擴展(Extensible),可維護(Maintainable)的代碼;
    
    *   把握客戶需求,按時交付客戶所須要的軟件產品;
    
    *   理解現代軟件開發過程當中的核心概念(例如面向對象程序設計,測試驅動開發,持續集成,和持續交付等等)。

和其它能力同樣,程序設計能力和軟件開發素養源自項目經驗和書本知識。項目經驗因人而異(來自不一樣領域的程序員,項目差別會很大);但書本知識是相通的——尤爲是經典圖書,它們都可以拓寬程序員的視野,提升程序員的成長速度。程序員

在過去幾年的學習和工做中,我閱讀了大量的程序設計/軟件開發書籍。隨着閱讀量的增加,我意識到:github

  • 經典書籍須要不斷被重讀——每一次重讀都會有新的體會;

  • 書籍並不是讀的越多越好——大多數書籍只是經典書籍中的概念延伸(有時甚至是照搬);

意識到這兩點以後,我開始思考一個很功利的問題:如何從儘量少的書中,獲取儘量多的關鍵知識?換句話說:

  • 優秀的程序員應該掌握哪些關鍵概念?

  • 哪些書籍來能夠幫助程序員掌握這些關鍵概念?

這便是這篇文章的出發點——我試圖經過程序員必讀書單這篇文章來回答上面兩個問題。

標準

進入必讀書單以前,我先介紹下書單裏的書籍選擇標準和領域選擇標準。固然你也點擊這裏直接跳轉到書單開始閱讀。

書籍選擇標準

  1. 必讀:什麼是必讀書籍呢?若是學習某項技術有一本書不管如何都不能錯過,那麼這本書就是必讀書籍——例如Effective Java於Java,CLR via C#於C#;

    *   注意我沒有使用「經典」這個詞,由於**經典**計算機書籍每每和**計算機科學**聯繫在一塊兒,並且經典每每須要10年甚至更長的時間進行考驗;
  2. 注重實踐,而非理論:因此這個書單不會包含過於原理性的書籍;

  3. 入門—必讀—延伸:必讀書籍的問題在於:1. 大多不適合入門;2. 不夠全面。考慮到沒有入門閱讀和延伸閱讀的閱讀列表是不完整的——因此書單中每一個關鍵概念都會由一本入門書籍,一本必讀書籍(有時入門書籍和必讀書籍是同一本),和若干延伸閱讀書籍所構成。

概念選擇標準

  1. 全面:全面覆蓋軟件開發中重要的概念;

  2. 通用:適用於每個程序員,和領域特定方向無關;

  3. 注重基礎,但不過於深刻:優秀的程序員須要良好的計算機科學基礎,但程序員並不必掌握過於深刻的計算機科學知識。以算法爲例,每一個程序員都應該掌握排序、鏈表、棧以及隊列這些基本數據結構和算法,但計算幾何、線性規劃和網絡流這些算法可能就不是每一個程序員都須要掌握的了;

經過這幾個標準,我把程序員應掌握的關鍵概念分爲程序設計,軟件開發,以及我的成長三大類,每一大類均由若干關鍵概念組成。

快速通道

自從開博以來,常常會有朋友在論壇,微博,和QQ上提問學習X技術讀什麼書合適(例如:學習Java讀什麼書合適?如何學習程序設計?)因此我在這裏列出了一個「快速通道」——把常見的問題集中在一塊兒,點擊問題,便可直接進入答案。(固然,若是你把本文從頭讀到尾幫助會更大 :-))

程序員必讀書單

入門書籍

程序設計:

  1. 基礎理論編碼:隱匿在計算機軟硬件背後的語言

  2. 編程語言

    *   [C](#c):[C和指針](#pointers_on_c)
    
    *   [C++](#cpp):[C++程序設計原理與實踐](#pppcpp)
    
    *   [Java](#java):[Java核心技術(第9版)](#core_java)
    
    *   [C#](#csharp):[精通C#(第6版)](#pro_csharp)
    
    *   [JavaScript](#javascript):[JavaScript DOM編程藝術(第2版)](#js_dom_scripting)
    
    *   [Python](#python):[Python基礎教程(第二版)](#beginning_python)
  3. 編程語言理論編程語言實現模式

  4. 程序設計程序設計方法

  5. 算法與數據結構算法(第4版)

  6. 程序調試調試九法——軟硬件錯誤的排查之道

軟件開發:

  1. 編程實踐程序設計實踐

  2. 面向對象程序設計Head First設計模式

  3. 重構重構

  4. 軟件測試How to Break Software

  5. 項目管理極客與團隊

  6. 專業開發程序員修煉之道:從小工到專家

  7. 大師之言奇思妙想:15位計算機天才及其重大發現

  8. 界面設計寫給你們看的設計書

  9. 交互設計通用設計法則

我的成長:

  1. 職業規劃軟件開發者路線圖

  2. 思惟方式程序員的思惟修煉:開發認知潛能的九堂課

  3. 求職面試金領簡歷:敲開蘋果微軟谷歌的大門

  4. 英語寫做The Only Grammar Book You'll Ever Need

必讀書籍

程序設計:

  1. 基礎理論深刻理解計算機系統(第2版)

  2. 編程語言

    *   [C](#c):[C程序設計語言(第2版)](#tcpl)
    
    *   [C++](#cpp):[C++程序設計語言(第4版)](#tcpppl)
    
    *   [Java](#java):[Effective Java(第2版)](#effective_java)
    
    *   [C#](#csharp):[CLR via C#(第4版)](#clr_via_csharp)
    
    *   [JavaScript](#javascript):[JavaScript語言精粹](#js_good_parts)
    
    *   [Python](#python):[Python參考手冊(第4版)](#python_essential_reference)
  3. 編程語言理論程序設計語言——實踐之路(第3版)

  4. 程序設計計算機程序的構造與解釋(第2版)

  5. 算法與數據結構編程珠璣(第2版)

  6. 程序調試調試九法——軟硬件錯誤的排查之道

軟件開發:

  1. 編程實踐代碼大全(第2版)

  2. 面向對象程序設計設計模式

  3. 重構修改代碼的藝術

  4. 軟件測試xUnit Test Patterns

  5. 項目管理人月神話

  6. 專業開發程序員職業素養

  7. 大師之言編程人生:15位軟件先驅訪談錄

  8. 界面設計認知與設計:理解UI設計準則(第2版)

  9. 交互設計交互設計精髓(第3版)

我的成長:

  1. 職業規劃軟件開發者路線圖

  2. 思惟方式如何把事情作到最好

  3. 求職面試程序員面試金典(第5版)

  4. 英語寫做風格的要素

這個閱讀列表覆蓋了軟件開發各個關鍵領域的入門書籍和必讀書籍,我相信它能夠知足絕大多數程序員的需求,不管你是初學者,仍是進階者,均可以從中獲益:

  • 基礎理論包括了程序員應該掌握的計算機基礎知識;

  • 編程語言對軟件開發相當重要,我選擇了CC++JavaC#Python,和JavaScript這六門主流編程語言進行介紹,若是想進一步理解編程語言,能夠閱讀編程語言理論裏的書目;

  • 在理解編程語言的基礎上,優秀的程序員還應該瞭解各類程序設計技巧,熟悉基本的算法數據結構,而且可以高效的進行程序調試

  • 良好的程序設計能力是成爲優秀程序員的前提,但軟件開發知識也是必不可少的:優秀的程序員應具有良好的編程實踐,知道如何利用面向對象重構,和軟件測試編寫可複用,可擴展,可維護的代碼,並具有軟件項目管理知識和專業開發素養;

  • 就像咱們能夠從名人傳記裏學習名人的成功經驗,程序員也能夠經過追隨優秀程序員的足跡使本身少走彎路。大師之言包含一系列對大師程序員/計算機科學家的訪談,任何程序員均可以從中獲益良多;

  • 爲了打造用戶滿意的軟件產品,程序員應當掌握必定的界面設計知識和交互設計知識(是的,這些工做應該交給UI和UX,但若是你想獨自打造一個產品呢?);

  • 專業程序員應當對本身進行職業規劃,並熟悉程序員求職面試的流程,以便在職業道路上越走越遠;

  • 軟件開發是一項須要不斷學習的技能,學習思惟方式能夠有效的提高學習能力和學習效率;

  • 軟件開發是一項國際化的工做,爲了讓更多的人瞭解你的代碼(工做),良好的英語寫做能力必不可少。

儘管我儘量的去完善這個書單,但受限於個人我的經歷,這個書單不免會有所偏頗。因此若是你有不一樣的意見,或者認爲這個書單漏掉了某些重要書籍,請在評論中指出,我會及時更新。:-)

程序設計

1. 基礎理論

編碼:隱匿在計算機軟硬件背後的語言這本書其實不該該叫編碼——它更應該叫「Petzold教你造計算機」——做者Charles Petzold創造性的以編碼爲主題,從電報機和手電筒講到數字電路,而後利用數字電路中的邏輯門構造出加法器觸發器,最後構造出一個完整的存儲程序計算機。不要被這些電路概念嚇到——編碼使用大量形象貼切的類比簡化了這些概念,使其成爲最精彩最通俗易懂的計算機入門讀物。

深刻理解計算機系統(第2版)這本書的全名是:Computer Systems:A Programmer's Perspective(因此它又被稱爲CSAPP),我我的習慣把它翻譯爲程序員所需瞭解的計算機系統知識,儘管土了些,但改名副其實。

深刻理解計算機系統是我讀過的最優秀的計算機系統導論型做品,它創造性的把操做系統,計算機組成結構,數字電路,以及編譯原理這些計算機基礎學科中的核心概念聚集在一塊兒,從而覆蓋了指令集體系架構,彙編語言,代碼優化,計算機存儲體系架構,連接,裝載,進程,以及虛擬內存這些程序員所需瞭解的關鍵計算機系統知識。若是想打下紮實的計算機基礎又不想把操做系統計算機結構編譯原理這些書通通讀一遍,閱讀深刻理解計算機系統是最有效率的方式。

延伸閱讀:

  • 世界是數字的:K&R中的K(Brian Kernighan)的近做,這本書源自Brian在普林斯頓大學所教授的計算機基礎課程,以通俗易懂的方式講述了現代人所應瞭解的計算機知識和網絡知識;

  • 圖靈的祕密:他的平生、思想及論文解讀:Charles Petzold的另外一部做品,這本書以圖靈的論文論可計算數及其在斷定問題上的應用On Computable Numbers, with an Application to the Entscheidungsproblem)爲主題,闡述了圖靈機(現代計算機的始祖)的構造,原理,以及應用。

  • 計算機系統概論(第2版):另外一部優秀的計算機系統導論型做品,和深刻理解計算機系統不一樣,這本書採用自下而上的方式,從二進制,和數字邏輯這些底層知識一步步過渡到高級編程語言(C),從而以另外一種方式理解計算機系統。

2. 編程語言

編程語言是程序員必不可少的平常工具。工欲善其事,必先利其器。我在這裏給出了C,C++,Java,C#,JavaScript,和Python這六種經常使用編程語言的書單(我我的不熟悉Objective-C和PHP,所以它們不在其中)。

須要注意的是:我在這裏給出的是編程語言(Programming Language)書籍,而非編程平臺(Programming Platform)書籍。以Java爲例,Effective Java屬於編程語言書籍,而Android編程權威指南就屬於編程平臺書籍。

C

忘記譚浩強那本糟糕不堪的C程序設計,C和指針纔是C語言的最佳入門書籍。它詳細但又不失簡練的介紹了C語言以及C標準庫的方方面面。

對於C語言初學者,最難的概念不只僅是指針和數組,還有指向數組的指針和指向指針的指針。C和指針花了大量的篇幅和圖示來把這些難懂但重要的概念講的清清楚楚,這也是我推薦它做爲C語言入門讀物的緣由。

儘管C程序設計語言是二十多年前的書籍,但它仍然是C語言——以及計算機科學中最重要的書籍之一,它的重要性不只僅在於它用清晰的語言和簡練的代碼描述了C語言全貌,並且在於它爲以後的計算機書籍——尤爲是編程語言書籍樹立了新的標杆。以致於在不少計算機書籍的扉頁,都會有「感謝Kernighan教會我寫做」這樣的字樣。

延伸閱讀:

  • C專家編程:不要被標題中的「專家」嚇到,這實際是一本很輕鬆的書籍,它既包含了大量C語言技術細節和編程技巧,也包含了不少有趣的編程軼事;

  • C陷阱與缺陷:書如其名,這本書介紹了C語言中常見的坑和一些稀奇古怪的編程「技巧」,很多刁鑽的C語言面試題都源自這本小冊子;

  • C語言參考手冊:全面且權威的C語言參考手冊,並且覆蓋C99,若是你打算成爲C語言專家,那麼這本書不可錯過;

  • C標準庫:給出了15個C標準庫的設計思路,實現代碼,以及測試代碼,配合C程序設計語言閱讀效果更佳;

  • C語言接口與實現:這本書展現瞭如何使用C語言實現可複用的數據結構,其中包含大量C語言高級技巧,以致於Amazon上排行第一的評論是「Probably the best advanced C book in existance」,而排行第二的評論則是「By far the most advanced C book I read」。

C++

做爲C++的發明者,沒有人能比Bjarne Stroustrup更理解C++。Bjarne在Texas A&M大學任教時使用C++爲大學新生講授編程,從而就有了C++程序設計原理與實踐這本書——它面向編程初學者,既包含C++教程,也包含大量程序設計原則。它不可是我讀過最好的C++入門書,也是我讀過最好的編程入門書。

比較有趣的是,C++程序設計原理與實踐直到全書過半都沒有出現指針,我想這多是Bjarne爲了證實不學C也能夠學好C++吧。

一樣是Bjarne Stroustrup的做品,C++程序設計語言是C++最權威且最全面的書籍。第4版相對於以前的版本進行了全面的更新,覆蓋了第二新的C++ 11標準,並砍掉了部分過期的內容。

延伸閱讀:

  • A Tour of C++:若是你以爲C++程序設計語言過於龐大,但你又想快速的瀏覽一遍新版C++的語言特點,那麼能夠試試這本小紅書;

  • C++語言的設計與演化:C++的「歷史書」,講述了C++是如何一步一步從C with Classes走到現在這一步,以及C++語言特性背後的故事;

  • C++標準庫(第2版):相對於其它語言的標準庫,C++標準庫雖然強大,但學習曲線十分陡峭,這本書是學習C++標準庫有力的補充;

  • 深度探索C++對象模型:這本書系統的講解了C++是如何以最小的性能代價實現對象模型,不少C++面試題(包括被問爛的虛函數指針)均可以在這本書裏找到答案;

  • Effective C++和More Effective C++:因爲C++的特性實在繁雜,所以很容易就掉到坑裏。Effective系列既講述了C++的良好編程實踐,也包含C++的使用誤區,從而幫你繞過這些坑。

Java

平心而論Java核心技術(即Core Java)並不算是一本特別出色的書籍:示例代碼不夠嚴謹,充斥着不少與C/C++的比較,語言也不夠簡潔——問題在於Java並無一本很出色的入門書籍,與同類型的Java編程思想相比,Java核心技術至少作到了廢話很少,與時俱進(Java編程思想還停留在Java 6以前),矮子裏面選將軍,Java核心技術算不錯了。

儘管Java沒有什麼出色的入門書籍,但這不表明Java沒有出色的必讀書籍。Effective Java是我讀過的最好的編程書籍之一,它包含大量的優秀Java編程實踐,並對泛型和併發這兩個充滿陷阱的Java特性給出了充滿洞察力的建議,以致於Java之父James Gosling爲這本書做序:「我很但願10年前就擁有這本書。可能有人認爲我不須要任何Java方面的書籍,可是我須要這本書。」

延伸閱讀:

  • 深刻理解Java虛擬機(第2版):很是優秀且可貴的國產佳做,系統的介紹了Java虛擬機和相關工具,並給出了一些調優建議;

  • Java程序員修煉之道:在這本書以前,並無一本Java書籍系統詳細的介紹Java 7的新特性(例如新的垃圾收集器,try using結構和invokedynamic指令),這本書填補了這個空白;

  • Java併發編程實踐:系統全面的介紹了Java的併發,如何設計支持併發的數據結構,以及如何編寫正確的併發程序;

  • Java Puzzlers:包含了大量的Java陷阱——以致於讀這本書時我說的最多的一個詞就是WTF,這本書的意義在於它是一個反模式大全,Effective Java告訴你如何寫好的Java程序,而Java Puzzlers則告訴你糟糕的Java程序是什麼樣子。更有意思的是,這兩本書的做者都是Joshua Bloch

C#

可能你會疑問我爲何會推薦這本接近1200頁的「鉅著」用做C#入門,這是個人答案:

  1. C#的語言特性很是豐富,很難用簡短的篇幅歸納這些特性;

  2. 精通C#之因此有近1200頁的篇幅,是由於它不但全面介紹了C#語言,並且還覆蓋了ADO.NET,WCF,WF,WPF,以及ASP.NET這些.Net框架。你能夠把這本書視爲兩本書——一本500多頁的C#語言教程和一本600多頁的.Net平臺框架快速上手手冊。

  3. 儘管標題帶有「精通」兩字,精通C#其實是一本面向初學者的C#書籍,你甚至不須要太多編程知識,就能夠讀懂它。

CLR via C#是C#/.Net最重要的書籍,沒有之一。它全面介紹了.Net的基石——CLR的運行原理,以及構建於CLR之上的C#類型系統,運行時關係,泛型,以及線程/並行等高級內容。任何一個以C#爲工做內容的程序員都應該閱讀此書。

延伸閱讀:

  • 深刻理解C#(第3版):C#進階必讀,這本書偏重於C#的語言特性,它系統的介紹了C#從1.0到C# 4.0的語言特性演化,並展現瞭如何利用C#的語言特性編寫優雅的程序;

  • .NET設計規範(第2版):C#專業程序員必讀,從變量命名規範講到類型系統設計原則,這本書提供了一套完整的.Net編程規範,使得程序員能夠編寫出一致,嚴謹的代碼,

  • C# 5.0權威指南:來自O'Reilly的C#參考手冊,嚴謹的介紹了C#語法,使用,以及核心類庫,C#程序員案頭必備;

  • LINQ to Objects Using C# 4.0和Async in C# 5.0:LINQ和async分別是.Net 3.5和.Net 4.5中所引入的最重要的語言特性,因此我認爲有必要在它們上面花點功夫——這兩本書是介紹LINQ和async編程的最佳讀物。

JavaScript

儘管JavaScript如今能夠作到客戶端服務器端通吃,儘管JQuery之類的前端框架使得一些人能夠不懂JavaScript也能夠編程,但我仍是認爲學習JavaScript從HTML DOM開始最爲適合,由於這是JavaScript設計的初衷。JavaScript DOM編程藝術系統的介紹瞭如何使用JavaScript,HTML,以及CSS建立可用的Web頁面,是一本前端入門佳做。

JavaScript語言包含大量的陷阱和誤區,但它卻又有一些至關不錯的特性,這也是爲何Douglas Crockford稱JavaScript爲世界上最被誤解的語言,並編寫了JavaScript語言精粹一書來幫助前端開發者繞開JavaScript中的陷阱。和同類書籍不一樣,JavaScript語言精粹用精煉的語言講解了JavaScript語言中好的那部分(例如閉包,函數是頭等對象,以及對象字面量),並建議讀者不要使用其它很差的部分(例如混亂的類型轉換,默認全局命名空間,以及奇葩的相等判斷符),畢竟,用糟糕的特性編寫出來的程序每每也是糟糕的。

延伸閱讀:

  • JavaScript高級程序設計(第3版):詳盡且深刻的介紹了Javascript語言,DOM,以及Ajax,並針對HTML5作了對應更新;

  • JavaScript權威指南(第6版):這本書的第5版曾被前端專家Douglas Crockford稱之爲「惟一靠譜的JavaScript書」。相對於JavaScript高級程序設計,JavaScript權威指南更像是一本案頭參考書,固然若是你感興趣也能夠從頭讀到尾;

  • 編寫可維護的JavaScript:書如其名,這本書給出了大量的優秀JavaScript編程實踐,使得程序員編寫出健壯且易於維護的JavaScript代碼;

  • JavaScript異步編程:和常見的支持併發的編程語言(例如Java和C#)不一樣,JavaScript自己是單線程的,所以不能把其它語言處理併發的方式照搬到JavaScript。JavaScript異步編程系統的介紹了JavaScript中的併發原理,並闡述瞭如何使用PromiseDeferred以及Async.js編寫出簡潔高效的異步程序。

Python

Python的入門書籍不少,並且聽說質量大多不錯,我推薦Python基礎教程的緣由是由於它是個人Python入門讀物——簡潔,全面,代碼質量很不錯,並且有幾個頗有趣的課後做業,使得我能夠快速上手。

這裏順便多說一句,不要用Python學習手冊做爲Python入門——它的廢話實在太多,你能想象它用了15頁的篇幅去講解if語句嗎?儘管O'Reilly出了不少經典編程書,但這本Python學習手冊絕對不在其中。

權威且實用的Python書籍,覆蓋Python 2和Python 3。儘管它名爲參考手冊,但Python參考手冊在Python語法和標準庫基礎之上對其實現機制也給出了深刻的講解,不容錯過。

延伸閱讀:

  • Python袖珍指南(第5版):實用且便攜的Python參考手冊,我會說我在飛機上寫程序時用的就是它麼 -_-#;

  • Python Cookbook(第3版):很是好的Python進階讀物,包含各類經常使用場景下的Python代碼,使得讀者能夠寫出更加Pythonic的代碼;

  • Python編程實戰:運用設計模式、併發和程序庫建立高質量程序:Python高級讀物,針對Python 3,2014年的Jolt大獎圖書,不可錯過;

  • Python源碼剖析:少見的國產精品,這本書以Python 2.5爲例,從源代碼出發,一步步分析了CPython是如何實現類型,控制流,函數/方法的聲明與調用,類型以及裝飾器等Python核心概念,讀過以後會大大加深對Python的理解。儘管這本書有些過期,但咱們仍然能夠按照它分析源代碼的方式來分析新版Python。

3. 編程語言理論

大多數程序員並不須要從頭編寫一個編譯器或解釋器,所以龍書(編譯原理)就顯得過於重量級;然而多數程序員仍是須要解析文本,處理配置文件,或者寫一個小語言,編程語言實現模式很好的知足了這個需求。它把經常使用的文本解析/代碼生成方法組織成一個個模式,併爲每一個模式給出了實例和應用場景。這本書既會提升你的動手能力,也會加深你對編程語言的理解。Python發明者Guido van Rossum甚至爲這本書給出了「Throw away your compiler theory book!」這樣的超高評價。

程序員天天都要和編程語言打交道,可是思考編程語言爲何會被設計成這個樣子的程序員並很少,程序設計語言——實踐之路完美的回答了這個問題。這本書從編程語言的解析和運行開始講起,系統了介紹了命名空間,做用域,控制流,數據類型以及方法(控制抽象)這些程序設計語言的核心概念,而後展現了這些概念是如何被應用到過程式語言,面嚮對象語言,函數式語言,腳本式,邏輯編程語言以及併發編程語言這些具備不一樣編程範式的編程語言之上。這本書或極大的拓寬你的視野——不管你使用什麼編程語言,都會從這本書中獲益良多。理解這一本書,賽過學習十門新的編程語言。

延伸閱讀:

  • 七週七語言:理解多種編程範型:儘管咱們在平常工做中可能只使用兩三門編程語言,可是瞭解其它編程語言範式是很重要的。七週七語言一書用精簡的篇幅介紹了Ruby,Io,Prolog,Scala,Erlang,Clojure,和Haskell這七種具備不一樣編程範式的語言——是的,你無法經過這本書變成這七種語言的專家,但你的視野會獲得極大的拓寬;

  • 自制編程語言:另外一本優秀的編譯原理做品,自制編程語言經過從零開始製做一門無類型語言Crowbar和一門靜態類型語言Diksam,把類型系統,垃圾回收,和代碼生成等編程語言的關鍵概念講的清清楚楚;

  • 計算的本質:深刻剖析程序和計算機:披着Ruby外衣的計算理論入門書籍,使你對編程語言的理解更上一層樓。

4. 程序設計

程序設計方法

現代編程語言的語法大多很繁雜,初學者使用這些語言學習編程會致使花大量的時間在編程語言語法(諸如指針,引用和類型定義)而不是程序設計方法(諸如數據抽象和過程抽象)之上。程序設計方法解決了這個問題——它專一於程序設計方法,使得讀者無需把大量時間花在編程語言上。這本書還有一個與之配套的教學開發環境DrScheme,這個環境會根據讀者的程度變換編程語言的深度,使得讀者能夠始終把注意力集中在程序設計方法上。

我我的很奇怪程序設計方法這樣的佳做爲何會絕版,而譚浩強C語言這樣的垃圾卻大行其道——好在是程序設計方法第二版已經被免費發佈在網上。

計算機程序的構造與解釋是另外一本被國內大學忽視(至少在我本科時不多有人知道這本書)的教材,這本書和程序設計方法有不少共同點——都使用Scheme做爲教學語言;都專一於程序設計方法而非編程語言自己;都擁有至關出色的課後題。相對於程序設計方法,計算機程序的構造與解釋要更加深刻程序設計的本質(過程抽象,數據抽象,以及元語言抽象),以致於Google技術總監Peter Norvig給了這本書超高的評價

延伸閱讀:

  • 編程本來:STL做者的關於程序設計方法佳做——他把關係代數和羣論引入編程之中,試圖爲程序設計提供一個堅實的理論基礎,從而構建出更加穩固的軟件。這本書是程序設計方法和計算機程序的構造與解釋的絕好補充——前者使用函數式語言(Scheme)講授程序設計,而編程本來則使用命令式語言(C++);

  • 元素模式:設計模式總結了面向對象程序設計中的模式,而元素模式這本書分析了程序設計中的常見模式的本質,閱讀這本書會讓你對程序設計有更深的理解;

  • The Science of Programming:會編程的人不少,但可以編寫正確程序的人就少多了。The Science of Programming經過前條件——不變式——後條件以及邏輯謂詞演算,爲編寫正確程序提供了強有力的理論基礎,而後這本書經過實例闡述瞭如何應用這些理論到具體程序上。任何一個想大幅提升開發效率的程序員都應閱讀此書。

5. 算法與數據結構

我在算法學習之路一文中提到個人算法入門教材是數據結構與算法分析:C語言描述,我曾經認爲它是最好的算法入門教材,但自從我讀到Sedgewick的算法以後我就改變了觀點——這本算法纔是最好的算法入門教材:

  • 使用更爲容易的Java語言做爲教學語言;

  • 覆蓋全部經常使用的數據結構和算法,並均給出其完整實現;

  • 包含大量的圖示用於可視化算法——事實上這是我讀過的圖示最爲豐富形象的書籍,這也是我稱其爲最好的算法入門書籍的緣由。

編程珠璣(第2版)是一本少見的實踐型算法書籍——它並不是一一介紹數據結構/算法的教材,而是實踐性極強的算法應用手冊。做者(Jon Bentley)從他多年的實際經驗精選出一些有趣而又實用的問題,而後展現了他解決這些問題的過程(分析問題,選擇合適的算法,解決問題,以及驗證答案)。任何程序員均可以從中獲益。

延伸閱讀:

  • 編程珠璣(續):嚴格來講這本書並不是編程珠璣的續做,而是一本相似於番外篇的編程技巧/實踐手冊;它不像編程珠璣那般重視算法的應用,而是全面覆蓋了程序員所需的能力;

  • 算法導論(第3版):儘管我在這邊文章開頭提到會盡可能避免理論性的書籍,但沒有算法導論的算法閱讀列表是不完整的,我想這本書就不須要我多介紹了; :-)

  • 算法設計與分析基礎(第3版):側重於算法設計,這本書創新的把常見算法分爲分治,減治,變治三大類,並覆蓋了動態規劃,回溯,以及分支定界等高級算法設計方法,屬於算法設計的入門佳做;

6. 程序調試

一個讓非編程從業人員驚訝的事實是程序員的絕大多時間都花在調試上,而不是寫程序上,以致於Bob大叔調試時間佔工做時間的比例做爲衡量程序員開發能力的標準。調試九法——軟硬件錯誤的排查之道既是調試領域的入門做品,也是必讀經典之做。調試九法的做者是一個具備豐富實戰經驗的硬件工程師,他把他多年的調試經驗總結成九條調試法則,並對每一條法則都給對應的實際案例。任何程序員都應經過閱讀這本書改善調試效率,即使是非程序員,也能夠從這本書中學到系統解決問題的方

相關文章
相關標籤/搜索