# 程序設計
[TOC=2,2]
## 1\. 基礎理論
[](http://www.amazon.cn/gp/product/B009RSXIB4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B009RSXIB4&linkCode=as2&creative=3132)
[編碼:隱匿在計算機軟硬件背后的語言](http://www.amazon.cn/gp/product/B009RSXIB4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B009RSXIB4&linkCode=as2&creative=3132)這本書其實不應該叫編碼——它更應該叫“Petzold教你造計算機”——作者[Charles Petzold](http://en.wikipedia.org/wiki/Charles_Petzold)創造性的以編碼為主題,從電報機和手電筒講到數字電路,然后利用[數字電路](http://zh.wikipedia.org/wiki/%E6%95%B0%E5%AD%97%E7%94%B5%E8%B7%AF)中的邏輯門構造出[加法器](http://zh.wikipedia.org/wiki/%E5%8A%A0%E6%B3%95%E5%99%A8)和[觸發器](http://zh.wikipedia.org/wiki/%E8%A7%A6%E5%8F%91%E5%99%A8),最后構造出一個完整的[存儲程序計算機](http://zh.wikipedia.org/wiki/%E5%AD%98%E5%82%A8%E7%A8%8B%E5%BA%8F%E8%AE%A1%E7%AE%97%E6%9C%BA)。不要被這些電路概念嚇到——[編碼](http://www.amazon.cn/gp/product/B009RSXIB4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B009RSXIB4&linkCode=as2&creative=3132)使用大量形象貼切的類比簡化了這些概念,使其成為最精彩最通俗易懂的計算機入門讀物。
[](http://www.amazon.cn/gp/product/B004BJ18KM/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004BJ18KM&linkCode=as2&creative=3132)
[深入理解計算機系統(第2版)](http://www.amazon.cn/gp/product/B004BJ18KM/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004BJ18KM&linkCode=as2&creative=3132)這本書的全名是:Computer Systems:A Programmer’s Perspective(所以它又被稱為CSAPP),我個人習慣把它翻譯為程序員所需了解的計算機系統知識,盡管土了些,但更名副其實。
[深入理解計算機系統](http://www.amazon.cn/gp/product/B004BJ18KM/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004BJ18KM&linkCode=as2&creative=3132)是我讀過的最優秀的計算機系統導論型作品,它創造性的把操作系統,計算機組成結構,數字電路,以及編譯原理這些計算機基礎學科中的核心概念匯集在一起,從而覆蓋了指令集體系架構,匯編語言,代碼優化,計算機存儲體系架構,鏈接,裝載,進程,以及虛擬內存這些程序員所需了解的關鍵計算機系統知識。如果想打下扎實的計算機基礎又不想把操作系統計算機結構編譯原理這些書統統讀一遍,閱讀[深入理解計算機系統](http://www.amazon.cn/gp/product/B004BJ18KM/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004BJ18KM&linkCode=as2&creative=3132)是最有效率的方式。
**延伸閱讀:**
* [世界是數字的](http://www.amazon.cn/gp/product/B00DSQZBDE/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00DSQZBDE&linkCode=as2&creative=3132):[K&R](http://www.amazon.cn/gp/product/B0011425T8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011425T8&linkCode=as2&creative=3132)中的K([Brian Kernighan](http://www.cs.princeton.edu/~bwk/))的近作,這本書源自Brian在普林斯頓大學所教授的計算機基礎課程,以通俗易懂的方式講述了現代人所應了解的計算機知識和網絡知識;
* [圖靈的秘密:他的生平、思想及論文解讀](http://www.amazon.cn/gp/product/B00AAQXKXS/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00AAQXKXS&linkCode=as2&creative=3132):[Charles Petzold](http://en.wikipedia.org/wiki/Charles_Petzold)的另一部作品,這本書以圖靈的論文**論可計算數及其在判定問題上的應用**([On Computable Numbers, with an Application to the Entscheidungsproblem](http://www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf))為主題,闡述了圖靈機(現代計算機的始祖)的構造,原理,以及應用。
* [計算機系統概論(第2版)](http://www.amazon.cn/gp/product/B0011F9OQE/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011F9OQE&linkCode=as2&creative=3132):另一部優秀的計算機系統導論型作品,和[深入理解計算機系統](http://www.amazon.cn/gp/product/B004BJ18KM/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004BJ18KM&linkCode=as2&creative=3132)不同,這本書采用自下而上的方式,從二進制,和數字邏輯這些底層知識一步步過渡到高級編程語言(C),從而以另一種方式理解計算機系統。
## 2\. 編程語言
編程語言是程序員必不可少的日常工具。工欲善其事,必先利其器。我在這里給出了C,C++,Java,C#,JavaScript,和Python這六種[常用編程語言](http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)的書單(我個人不熟悉Objective-C和PHP,因此它們不在其中)。
需要注意的是:我在這里給出的是編程語言(Programming Language)書籍,而非編程平臺(Programming Platform)書籍。以Java為例,[Effective Java](http://www.amazon.cn/gp/product/B001PTGR52/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001PTGR52&linkCode=as2&creative=3132)屬于編程語言書籍,而[Android編程權威指南](http://www.amazon.cn/gp/product/B00J4DXWDG/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00J4DXWDG&linkCode=as2&creative=3132)就屬于編程平臺書籍。
### C
[](http://www.amazon.cn/gp/product/B00163LU68/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00163LU68&linkCode=as2&creative=3132)
忘記譚浩強那本糟糕不堪的C程序設計,[C和指針](http://www.amazon.cn/gp/product/B00163LU68/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00163LU68&linkCode=as2&creative=3132)才是C語言的最佳入門書籍。它詳細但又不失簡練的介紹了C語言以及C標準庫的方方面面。
對于C語言初學者,最難的概念不僅僅是指針和數組,還有指向數組的指針和指向指針的指針。[C和指針](http://www.amazon.cn/gp/product/B00163LU68/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00163LU68&linkCode=as2&creative=3132)花了大量的篇幅和圖示來把這些難懂但重要的概念講的清清楚楚,這也是我推薦它作為C語言入門讀物的原因。
[](http://www.amazon.cn/gp/product/B0011425T8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011425T8&linkCode=as2&creative=3132)
盡管[C程序設計語言](http://www.amazon.cn/gp/product/B0011425T8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011425T8&linkCode=as2&creative=3132)是二十多年前的書籍,但它仍然是C語言——以及計算機科學中最重要的書籍之一,它的重要性不僅僅在于它用清晰的語言和簡練的代碼描述了C語言全貌,而且在于它為之后的計算機書籍——尤其是編程語言書籍樹立了新的標桿。以至于在很多計算機書籍的扉頁,都會有“感謝Kernighan教會我寫作”這樣的字樣。
**延伸閱讀:**
* [C專家編程](http://www.amazon.cn/gp/product/B0012NIW9K/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0012NIW9K&linkCode=as2&creative=3132):不要被標題中的“專家”嚇到,這實際是一本很輕松的書籍,它既包含了大量C語言技術細節和編程技巧,也包含了很多有趣的編程軼事;
* [C陷阱與缺陷](http://www.amazon.cn/gp/product/B0012UMPBY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0012UMPBY&linkCode=as2&creative=3132):書如其名,這本書介紹了C語言中常見的坑和一些稀奇古怪的編程“技巧”,不少刁鉆的C語言面試題都源自這本小冊子;
* [C語言參考手冊](http://book.douban.com/subject/6519268/):全面且權威的C語言參考手冊,而且覆蓋C99,如果你打算成為C語言專家,那么這本書不可錯過;
* [C標準庫](http://www.amazon.cn/gp/product/B00IZW4DK8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00IZW4DK8&linkCode=as2&creative=3132):給出了15個C標準庫的設計思路,實現代碼,以及測試代碼,配合[C程序設計語言](http://www.amazon.cn/gp/product/B0011425T8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011425T8&linkCode=as2&creative=3132)閱讀效果更佳;
* [C語言接口與實現](http://www.amazon.cn/gp/product/B005LAJ9F6/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B005LAJ9F6&linkCode=as2&creative=3132):這本書展示了如何使用C語言實現可復用的數據結構,其中包含大量C語言高級技巧,以至于Amazon上排行第一的評論是“Probably the best advanced C book in existance”,而排行第二的評論則是“By far the most advanced C book I read”。
### C++
[](http://www.amazon.cn/gp/product/B003VPX6YS/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B003VPX6YS&linkCode=as2&creative=3132)
作為C++的發明者,沒有人能比[Bjarne Stroustrup](http://en.wikipedia.org/wiki/Bjarne_Stroustrup)更理解C++。Bjarne在Texas A&M大學任教時使用C++為大學新生講授編程,從而就有了[C++程序設計原理與實踐](http://www.amazon.cn/gp/product/B003VPX6YS/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B003VPX6YS&linkCode=as2&creative=3132)這本書——它面向編程初學者,既包含C++教程,也包含大量程序設計原則。它不但是我讀過最好的C++入門書,也是我讀過最好的編程入門書。
比較有趣的是,[C++程序設計原理與實踐](http://www.amazon.cn/gp/product/B003VPX6YS/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B003VPX6YS&linkCode=as2&creative=3132)直到全書過半都沒有出現指針,我想這可能是Bjarne為了證明不學C也可以學好C++吧。
[](http://www.amazon.cn/gp/product/0321958322/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0321958322&linkCode=as2&creative=3132)
同樣是[Bjarne Stroustrup](http://en.wikipedia.org/wiki/Bjarne_Stroustrup)的作品,[C++程序設計語言](http://www.amazon.cn/gp/product/0321958322/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0321958322&linkCode=as2&creative=3132)是C++**最權威且最全面**的書籍。第4版相對于之前的版本進行了全面的更新,覆蓋了第二新的C++ 11標準,并砍掉了部分過時的內容。
**延伸閱讀:**
* [A Tour of C++](http://www.amazon.com/Tour-C--Depth/dp/0321958314/):如果你覺得[C++程序設計語言](http://www.amazon.cn/gp/product/0321958322/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0321958322&linkCode=as2&creative=3132)過于龐大,但你又想快速的瀏覽一遍新版C++的語言特色,那么可以試試這本小紅書;
* [C++語言的設計與演化](http://book.douban.com/subject/1096216/):C++的“歷史書”,講述了C++是如何一步一步從C with Classes走到如今這一步,以及C++語言特性背后的故事;
* [C++標準庫(第2版)](http://www.amazon.cn/gp/product/B00APCO6DA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00APCO6DA&linkCode=as2&creative=3132):相對于其它語言的標準庫,C++標準庫雖然強大,但學習曲線十分陡峭,這本書是學習C++標準庫有力的補充;
* [深度探索C++對象模型](http://www.amazon.cn/gp/product/B006QXQXTM/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B006QXQXTM&linkCode=as2&creative=3132):這本書系統的講解了C++是如何以最小的性能代價實現對象模型,很多C++面試題(包括被問爛的虛函數指針)都可以在這本書里找到答案;
* [Effective C++](http://www.amazon.cn/gp/product/B004G72P24/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004G72P24&linkCode=as2&creative=3132)和[More Effective C++](http://www.amazon.cn/gp/product/B004IP8BD6/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004IP8BD6&linkCode=as2&creative=3132):由于C++的特性實在繁雜,因此很容易就掉到坑里。Effective系列既講述了C++的良好編程實踐,也包含C++的使用誤區,從而幫你繞過這些坑。
### Java
[](http://www.amazon.cn/gp/product/B00G9KF4JC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00G9KF4JC&linkCode=as2&creative=3132)
平心而論[Java核心技術](http://www.amazon.cn/gp/product/B00G9KF4JC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00G9KF4JC&linkCode=as2&creative=3132)(即Core Java)并不算是一本特別出色的書籍:示例代碼不夠嚴謹,充斥著很多與C/C++的比較,語言也不夠簡潔——問題在于Java并沒有一本很出色的入門書籍,與同類型的[Java編程思想](http://www.amazon.cn/gp/product/B0011F7WU4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011F7WU4&linkCode=as2&creative=3132)相比,[Java核心技術](http://www.amazon.cn/gp/product/B00G9KF4JC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00G9KF4JC&linkCode=as2&creative=3132)至少做到了廢話不多,與時俱進([Java編程思想](http://www.amazon.cn/gp/product/B0011F7WU4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011F7WU4&linkCode=as2&creative=3132)還停留在Java 6之前),矮子里面選將軍,[Java核心技術](http://www.amazon.cn/gp/product/B00G9KF4JC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00G9KF4JC&linkCode=as2&creative=3132)算不錯了。
[](http://www.amazon.cn/gp/product/B001PTGR52/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001PTGR52&linkCode=as2&creative=3132)
盡管Java沒有什么出色的入門書籍,但這不代表Java沒有出色的必讀書籍。[Effective Java](http://www.amazon.cn/gp/product/B001PTGR52/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001PTGR52&linkCode=as2&creative=3132)是我讀過的最好的編程書籍之一,它包含大量的優秀Java編程實踐,并對泛型和并發這兩個充滿陷阱的Java特性給出了充滿洞察力的建議,以至于Java之父[James Gosling](http://en.wikipedia.org/wiki/James_Gosling)為這本書作序:*“我很希望10年前就擁有這本書。可能有人認為我不需要任何Java方面的書籍,但是我需要這本書。”*
**延伸閱讀:**
* [深入理解Java虛擬機(第2版)](http://www.amazon.cn/gp/product/B00D2ID4PK/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00D2ID4PK&linkCode=as2&creative=3132):非常優秀且難得的國產佳作,系統的介紹了Java虛擬機和相關工具,并給出了一些調優建議;
* [Java程序員修煉之道](http://www.amazon.cn/gp/product/B00E0D2OX4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00E0D2OX4&linkCode=as2&creative=3132):在這本書之前,并沒有一本Java書籍系統詳細的介紹Java 7的新特性(例如新的垃圾收集器,`try using`結構和`invokedynamic`指令),這本書填補了這個空白;
* [Java并發編程實踐](http://www.amazon.cn/gp/product/B0077K9XHW/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0077K9XHW&linkCode=as2&creative=3132):系統全面的介紹了Java的并發,如何設計支持并發的數據結構,以及如何編寫正確的并發程序;
* [Java Puzzlers](http://book.douban.com/subject/1328664/):包含了大量的Java陷阱——以至于讀這本書時我說的最多的一個詞就是WTF,這本書的意義在于它是一個[反模式](http://zh.wikipedia.org/wiki/%E5%8F%8D%E9%9D%A2%E6%A8%A1%E5%BC%8F)大全,[Effective Java](http://www.amazon.cn/gp/product/B001PTGR52/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001PTGR52&linkCode=as2&creative=3132)告訴你如何寫好的Java程序,而[Java Puzzlers](http://book.douban.com/subject/1328664/)則告訴你糟糕的Java程序是什么樣子。更有意思的是,這兩本書的作者都是[Joshua Bloch](http://en.wikipedia.org/wiki/Joshua_Bloch)。
**視頻教程:**
* [Java語言學習極速之旅](http://www.jikexueyuan.com/event/java.html?hmsr=lucida_tuijian_java_04.14):系統全面的Java語言教程,6個階段Java基礎入門,循序漸進掌握Java面向對象精髓。3個Java進階方向,Java SE、Java EE、Android開發,每一個都包含相應的知識點精講和項目開發實例,快速上手。
* [Android 0基礎極速養成計劃](http://www.jikexueyuan.com/event/android.html?hmsr=lucida_tuijian_android_04.14):Android開發快速入門視頻教程,通過對Android基礎知識講解,詳細介紹Android開發環境搭建,同時包含Android實戰案例解析,通過全新實戰的Android課程,系統學習Android開發。
### C#
[](http://www.amazon.cn/gp/product/B00DVDDP0K/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00DVDDP0K&linkCode=as2&creative=3132)
可能你會疑問我為什么會推薦這本接近1200頁的“巨著”用作C#入門,這是我的答案:
1. C#的語言特性非常豐富,很難用簡短的篇幅概括這些特性;
2. [精通C#](http://www.amazon.cn/gp/product/B00DVDDP0K/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00DVDDP0K&linkCode=as2&creative=3132)之所以有近1200頁的篇幅,是因為它不但全面介紹了C#語言,而且還覆蓋了ADO.NET,WCF,WF,WPF,以及ASP.NET這些.Net框架。你可以把這本書視為兩本書——一本500多頁的C#語言教程和一本600多頁的.Net平臺框架快速上手手冊。
3. 盡管標題帶有“精通”兩字,[精通C#](http://www.amazon.cn/gp/product/B00DVDDP0K/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00DVDDP0K&linkCode=as2&creative=3132)實際上是一本面向初學者的C#書籍,你甚至不需要太多編程知識,就可以讀懂它。
[](http://www.amazon.cn/gp/product/B00P8VZ8T4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00P8VZ8T4&linkCode=as2&creative=3132)
[CLR via C#](http://www.amazon.cn/gp/product/B00P8VZ8T4/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00P8VZ8T4&linkCode=as2&creative=3132)是C#/.Net最重要的書籍,沒有之一。它全面介紹了.Net的基石——[CLR](http://en.wikipedia.org/wiki/Common_Language_Runtime)的運行原理,以及構建于CLR之上的C#類型系統,運行時關系,泛型,以及線程/并行等高級內容。任何一個以C#為工作內容的程序員都應該閱讀此書。
**延伸閱讀:**
* [深入理解C#(第3版)](http://www.amazon.cn/gp/product/B00J94AG2A/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00J94AG2A&linkCode=as2&creative=3132):C#進階必讀,這本書偏重于C#的語言特性,它系統的介紹了C#從1.0到C# 4.0的語言特性演化,并展示了如何利用C#的語言特性編寫優雅的程序;
* [.NET設計規范(第2版)](http://book.douban.com/subject/4231292/):C#**專業**程序員必讀,從變量命名規范講到類型系統設計原則,這本書提供了一套完整的.Net編程規范,使得程序員可以編寫出一致,嚴謹的代碼,
* [C# 5.0權威指南](http://www.amazon.cn/gp/product/B00G51PUDA/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00G51PUDA&linkCode=as2&creative=3132):來自O’Reilly的C#參考手冊,嚴謹的介紹了C#語法,使用,以及核心類庫,C#程序員案頭必備;
* [LINQ to Objects Using C# 4.0](http://www.amazon.cn/gp/product/0321637003/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0321637003&linkCode=as2&creative=3132)和[Async in C# 5.0](http://www.amazon.cn/gp/product/1449337163/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=1449337163&linkCode=as2&creative=3132):LINQ和`async`分別是.Net 3.5和.Net 4.5中所引入的最重要的語言特性,所以我認為有必要在它們上面花點功夫——這兩本書是介紹LINQ和`async`編程的最佳讀物。
### JavaScript
[](http://www.amazon.cn/gp/product/B004VJM5KE/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004VJM5KE&linkCode=as2&creative=3132)
盡管JavaScript現在可以做到客戶端服務器端通吃,盡管[JQuery](http://jquery.com/)之類的前端框架使得一些人可以不懂JavaScript也可以編程,但我還是認為學習JavaScript從HTML DOM開始最為適合,因為這是JavaScript設計的初衷。[JavaScript DOM編程藝術](http://www.amazon.cn/gp/product/B004VJM5KE/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004VJM5KE&linkCode=as2&creative=3132)系統的介紹了如何使用JavaScript,HTML,以及CSS創建可用的Web頁面,是一本前端入門佳作。
[](http://www.amazon.cn/gp/product/B0097CON2S/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0097CON2S&linkCode=as2&creative=3132)
JavaScript語言包含大量的陷阱和誤區,但它卻又有一些相當不錯的特性,這也是為什么[Douglas Crockford](http://javascript.crockford.com/)稱JavaScript為[世界上最被誤解的語言](http://javascript.crockford.com/javascript.html),并編寫了[JavaScript語言精粹](http://www.amazon.cn/gp/product/B0097CON2S/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0097CON2S&linkCode=as2&creative=3132)一書來幫助前端開發者繞開JavaScript中的陷阱。和同類書籍不同,[JavaScript語言精粹](http://www.amazon.cn/gp/product/B0097CON2S/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0097CON2S&linkCode=as2&creative=3132)用精煉的語言講解了JavaScript語言中好的那部分(例如閉包,函數是頭等對象,以及對象字面量),并建議讀者**不要**使用其它不好的部分(例如混亂的類型轉換,默認全局命名空間,以及[奇葩的相等判斷符](https://dorey.github.io/JavaScript-Equality-Table/)),畢竟,用糟糕的特性編寫出來的程序往往也是糟糕的。
**延伸閱讀:**
* [JavaScript高級程序設計(第3版)](http://www.amazon.cn/gp/product/B007OQQVMY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007OQQVMY&linkCode=as2&creative=3132):詳盡且深入的介紹了Javascript語言,DOM,以及Ajax,并針對HTML5做了對應更新;
* [JavaScript權威指南(第6版)](http://www.amazon.cn/gp/product/B007VISQ1Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007VISQ1Y&linkCode=as2&creative=3132):這本書的第5版曾被前端專家[Douglas Crockford](http://javascript.crockford.com/)稱之為*“唯一靠譜的JavaScript書”*。相對于[JavaScript高級程序設計](http://www.amazon.cn/gp/product/B007OQQVMY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007OQQVMY&linkCode=as2&creative=3132),[JavaScript權威指南](http://www.amazon.cn/gp/product/B007VISQ1Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007VISQ1Y&linkCode=as2&creative=3132)更像是一本案頭參考書,當然如果你感興趣也可以從頭讀到尾;
* [編寫可維護的JavaScript](http://www.amazon.cn/gp/product/B00BQ7RMW0/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00BQ7RMW0&linkCode=as2&creative=3132):書如其名,這本書給出了大量的優秀JavaScript編程實踐,使得程序員編寫出健壯且易于維護的JavaScript代碼;
* [JavaScript異步編程](http://www.amazon.cn/gp/product/B00CYM0Z8Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00CYM0Z8Y&linkCode=as2&creative=3132):和常見的支持并發的編程語言(例如Java和C#)不同,JavaScript本身是**單線程**的,因此不能把其它語言處理并發的方式照搬到JavaScript。[JavaScript異步編程](http://www.amazon.cn/gp/product/B00CYM0Z8Y/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00CYM0Z8Y&linkCode=as2&creative=3132)系統的介紹了JavaScript中的并發原理,并闡述了如何使用`Promise`、`Deferred`以及`Async.js`編寫出簡潔高效的異步程序。
### Python
[](http://www.amazon.cn/gp/product/B00KAFX65Q/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KAFX65Q&linkCode=as2&creative=3132)
Python的入門書籍很多,而且據說質量大多不錯,我推薦[Python基礎教程](http://www.amazon.cn/gp/product/B00KAFX65Q/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00KAFX65Q&linkCode=as2&creative=3132)的原因是因為它是我的Python入門讀物——簡潔,全面,代碼質量很不錯,而且有幾個很有趣的課后作業,使得我可以快速上手。
這里順便多說一句,不要用[Python學習手冊](http://www.amazon.cn/gp/product/B004TUJ7A6/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004TUJ7A6&linkCode=as2&creative=3132)作為Python入門——它的廢話實在太多,你能想象它用了15頁的篇幅去講解`if`語句嗎?盡管O’Reilly出了很多經典編程書,但這本[Python學習手冊](http://www.amazon.cn/gp/product/B004TUJ7A6/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004TUJ7A6&linkCode=as2&creative=3132)絕對不在其中。
[](http://www.amazon.cn/gp/product/B004H0784U/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004H0784U&linkCode=as2&creative=3132)
權威且實用的Python書籍,覆蓋Python 2和Python 3。盡管它名為參考手冊,但[Python參考手冊](http://www.amazon.cn/gp/product/B004H0784U/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004H0784U&linkCode=as2&creative=3132)在Python語法和標準庫基礎之上對其實現機制也給出了深入的講解,不容錯過。
**延伸閱讀:**
* [Python袖珍指南(第5版)](http://www.amazon.cn/gp/product/B00QT9IA2G/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00QT9IA2G&linkCode=as2&creative=3132):實用且便攜的Python參考手冊,我會說我在飛機上寫程序時用的就是它么 –_–#;
* [Python Cookbook(第3版)](http://www.amazon.cn/gp/product/B00IZRMQAM/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00IZRMQAM&linkCode=as2&creative=3132):非常好的Python進階讀物,包含各種常用場景下的Python代碼,使得讀者可以寫出更加Pythonic的代碼;
* [Python編程實戰:運用設計模式、并發和程序庫創建高質量程序](http://www.amazon.cn/gp/product/B00MHDPIJ6/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00MHDPIJ6&linkCode=as2&creative=3132):Python高級讀物,針對Python 3,2014年的[Jolt大獎圖書](http://www.drdobbs.com/joltawards/jolt-awards-the-best-books/240169070?pgno=7),不可錯過;
* [Python源碼剖析](http://book.douban.com/subject/3117898/):少見的國產精品,這本書以Python 2.5為例,從源代碼出發,一步步分析了CPython是如何實現類型,控制流,函數/方法的聲明與調用,類型以及裝飾器等Python核心概念,讀過之后會大大加深對Python的理解。盡管這本書有些過時,但我們仍然可以按照它分析源代碼的方式來分析新版Python。
## 3\. 編程語言理論
[](http://www.amazon.cn/gp/product/B007HYMPBY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007HYMPBY&linkCode=as2&creative=3132)
大多數程序員并不需要從頭編寫一個編譯器或解釋器,因此[龍書(編譯原理)](http://www.amazon.cn/gp/product/B001NGO85I/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001NGO85I&linkCode=as2&creative=3132)就顯得過于重量級;然而多數程序員還是需要解析文本,處理配置文件,或者寫一個小語言,[編程語言實現模式](http://www.amazon.cn/gp/product/B007HYMPBY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B007HYMPBY&linkCode=as2&creative=3132)很好的滿足了這個需求。它把常用的文本解析/代碼生成方法組織成一個個模式,并為每個模式給出了實例和應用場景。這本書既會提高你的動手能力,也會加深你對編程語言的理解。Python發明者Guido van Rossum甚至為這本書給出了*“Throw away your compiler theory book!”*這樣的超高評價。
[](http://www.amazon.cn/gp/product/B008FQHHW0/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008FQHHW0&linkCode=as2&creative=3132)
程序員每天都要和編程語言打交道,但是思考編程語言為什么會被設計成這個樣子的程序員并不多,[程序設計語言——實踐之路](http://www.amazon.cn/gp/product/B008FQHHW0/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008FQHHW0&linkCode=as2&creative=3132)完美的回答了這個問題。這本書從編程語言的解析和運行開始講起,系統了介紹了命名空間,作用域,控制流,數據類型以及方法(控制抽象)這些程序設計語言的核心概念,然后展示了這些概念是如何被應用到過程式語言,面向對象語言,函數式語言,腳本式,邏輯編程語言以及并發編程語言這些具有不同編程范式的編程語言之上。這本書或極大的拓寬你的視野——無論你使用什么編程語言,都會從這本書中獲益良多。理解這一本書,勝過學習十門新的編程語言。
**延伸閱讀:**
* [七周七語言:理解多種編程范型](http://www.amazon.cn/gp/product/B008041DUY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008041DUY&linkCode=as2&creative=3132):盡管我們在日常工作中可能只使用兩三門編程語言,但是了解其它編程語言范式是很重要的。[七周七語言](http://www.amazon.cn/gp/product/B008041DUY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B008041DUY&linkCode=as2&creative=3132)一書用精簡的篇幅介紹了Ruby,Io,Prolog,Scala,Erlang,Clojure,和Haskell這七種具有不同編程范式的語言——是的,你沒法通過這本書變成這七種語言的專家,但你的視野會得到極大的拓寬;
* [自制編程語言](http://www.amazon.cn/gp/product/B00GAUNDYY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00GAUNDYY&linkCode=as2&creative=3132):另一本優秀的編譯原理作品,[自制編程語言](http://www.amazon.cn/gp/product/B00GAUNDYY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00GAUNDYY&linkCode=as2&creative=3132)通過從零開始制作一門無類型語言`Crowbar`和一門靜態類型語言`Diksam`,把類型系統,垃圾回收,和代碼生成等編程語言的關鍵概念講的清清楚楚;
* [計算的本質:深入剖析程序和計算機](http://www.amazon.cn/gp/product/B00PG0MM3C/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00PG0MM3C&linkCode=as2&creative=3132):披著Ruby外衣的[計算理論](http://en.wikipedia.org/wiki/Theory_of_computation)入門書籍,使你對編程語言的理解更上一層樓。
## 4\. 程序設計
[](http://book.douban.com/subject/1140942/)
現代編程語言的語法大多很繁雜,初學者使用這些語言學習編程會導致花大量的時間在編程語言語法(諸如指針,引用和類型定義)而不是程序設計方法(諸如數據抽象和過程抽象)之上。[程序設計方法](http://book.douban.com/subject/1140942/)解決了這個問題——它專注于程序設計方法,使得讀者無需把大量時間花在編程語言上。這本書還有一個與之配套的教學開發環境[DrScheme](http://plt-scheme.org/software/drscheme/),這個環境會根據讀者的程度變換編程語言的深度,使得讀者可以始終把注意力集中在程序設計方法上。
我個人很奇怪[程序設計方法](http://book.douban.com/subject/1140942/)這樣的佳作為什么會絕版,而譚浩強C語言這樣的垃圾卻大行其道——好在是程序設計方法[第二版](http://www.ccs.neu.edu/home/matthias/HtDP2e/)已經被免費發布在網上。
[](http://www.amazon.cn/gp/product/B0011AP7RY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011AP7RY&linkCode=as2&creative=3132)
[計算機程序的構造與解釋](http://www.amazon.cn/gp/product/B0011AP7RY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011AP7RY&linkCode=as2&creative=3132)是另一本被國內大學忽視(至少在我本科時很少有人知道這本書)的教材,這本書和[程序設計方法](http://book.douban.com/subject/1140942/)有很多共同點——都使用[Scheme](http://en.wikipedia.org/wiki/Scheme_(programming_language))作為教學語言;都專注于程序設計方法而非編程語言本身;都擁有相當出色的課后題。相對于[程序設計方法](http://book.douban.com/subject/1140942/),[計算機程序的構造與解釋](http://www.amazon.cn/gp/product/B0011AP7RY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011AP7RY&linkCode=as2&creative=3132)要更加深入程序設計的本質(過程抽象,數據抽象,以及元語言抽象),以至于Google技術總監[Peter Norvig](http://norvig.com/)給了這本書[超高的評價](http://www.amazon.com/gp/review/R403HR4VL71K8/ref=cm_cr_pr_rvw_ttl?ie=UTF8&ASIN=0262510871)。
**延伸閱讀:**
* [編程原本](http://www.amazon.cn/gp/product/B006P7V73G/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B006P7V73G&linkCode=as2&creative=3132):[STL](https://www.sgi.com/tech/stl/)作者的關于程序設計方法佳作——他把關系代數和群論引入編程之中,試圖為程序設計提供一個堅實的理論基礎,從而構建出更加穩固的軟件。這本書是[程序設計方法](http://book.douban.com/subject/1140942/)和[計算機程序的構造與解釋](http://www.amazon.cn/gp/product/B0011AP7RY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B0011AP7RY&linkCode=as2&creative=3132)的絕好補充——前者使用函數式語言(Scheme)講授程序設計,而[編程原本](http://www.amazon.cn/gp/product/B006P7V73G/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B006P7V73G&linkCode=as2&creative=3132)則使用命令式語言(C++);
* [元素模式](http://www.amazon.cn/gp/product/B00LPQ6KAW/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00LPQ6KAW&linkCode=as2&creative=3132):[設計模式](http://www.amazon.cn/gp/product/B001130JN8/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B001130JN8&linkCode=as2&creative=3132)總結了**面向對象程序設計**中的模式,而[元素模式](http://www.amazon.cn/gp/product/B00LPQ6KAW/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00LPQ6KAW&linkCode=as2&creative=3132)這本書分析了**程序設計**中的常見模式的本質,閱讀這本書會讓你對程序設計有更深的理解;
* [The Science of Programming](http://www.amazon.cn/gp/product/0387964800/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0387964800&linkCode=as2&creative=3132):會編程的人很多,但能夠編寫正確程序的人就少多了。[The Science of Programming](http://www.amazon.cn/gp/product/0387964800/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=0387964800&linkCode=as2&creative=3132)通過**前條件——不變式——后條件**以及邏輯謂詞演算,為編寫正確程序提供了強有力的理論基礎,然后這本書通過實例闡述了如何應用這些理論到具體程序上。任何一個想大幅提高開發效率的程序員都應閱讀此書。
## 5\. 算法與數據結構
[](http://www.amazon.cn/gp/product/B009OCFQ0O/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B009OCFQ0O&linkCode=as2&creative=3132)
我在[算法學習之路](http://lucida.me/blog/on-learning-algorithms/)一文中提到我的算法入門教材是[數據結構與算法分析:C語言描述](http://www.amazon.cn/gp/product/B002WC7NGS/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B002WC7NGS&linkCode=as2&creative=3132),我曾經認為它是最好的算法入門教材,但自從我讀到[Sedgewick](http://www.cs.princeton.edu/~rs/)的[算法](http://www.amazon.cn/gp/product/B009OCFQ0O/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B009OCFQ0O&linkCode=as2&creative=3132)之后我就改變了觀點——這本[算法](http://www.amazon.cn/gp/product/B009OCFQ0O/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B009OCFQ0O&linkCode=as2&creative=3132)才是最好的算法入門教材:
* 使用更為容易的Java語言作為教學語言;
* 覆蓋所有常用的數據結構和算法,并均給出其完整實現;
* 包含大量的圖示用于可視化算法——事實上這是我讀過的圖示最為豐富形象的書籍,這也是我稱其為最好的算法入門書籍的原因。
[](http://www.amazon.cn/gp/product/B00SFZH0DC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00SFZH0DC&linkCode=as2&creative=3132)
[編程珠璣(第2版)](http://www.amazon.cn/gp/product/B00SFZH0DC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00SFZH0DC&linkCode=as2&creative=3132)是一本少見的實踐型算法書籍——它并非一一介紹數據結構/算法的教材,而是實踐性極強的算法應用手冊。作者([Jon Bentley](http://en.wikipedia.org/wiki/Jon_Bentley))從他多年的實際經驗精選出一些有趣而又實用的問題,然后展示了他解決這些問題的過程(分析問題,選擇合適的算法,解決問題,以及驗證答案)。任何程序員都可以從中獲益。
**延伸閱讀:**
* [編程珠璣(續)](http://www.amazon.cn/gp/product/B004ZWBW5G/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B004ZWBW5G&linkCode=as2&creative=3132):嚴格來說這本書并非[編程珠璣](http://www.amazon.cn/gp/product/B00SFZH0DC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00SFZH0DC&linkCode=as2&creative=3132)的續作,而是一本類似于番外篇的編程技巧/實踐手冊;它不像[編程珠璣](http://www.amazon.cn/gp/product/B00SFZH0DC/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00SFZH0DC&linkCode=as2&creative=3132)那般重視算法的應用,而是全面覆蓋了程序員所需的能力;
* [算法導論(第3版)](http://www.amazon.cn/gp/product/B00AK7BYJY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00AK7BYJY&linkCode=as2&creative=3132):盡管我在這邊文章開頭提到會盡量避免理論性的書籍,但沒有[算法導論](http://www.amazon.cn/gp/product/B00AK7BYJY/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00AK7BYJY&linkCode=as2&creative=3132)的算法閱讀列表是不完整的,我想這本書就不需要我多介紹了; :–)
* [算法設計與分析基礎(第3版)](http://www.amazon.cn/gp/product/B00S4HCQUI/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00S4HCQUI&linkCode=as2&creative=3132):側重于算法設計,這本書創新的把常見算法分為分治,減治,變治三大類,并覆蓋了動態規劃,回溯,以及分支定界等高級算法設計方法,屬于算法設計的入門佳作;
## 6\. 程序調試
[](http://www.amazon.cn/gp/product/B00CBBLUFK/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00CBBLUFK&linkCode=as2&creative=3132)
一個讓非編程從業人員驚訝的事實是程序員的絕大多時間都花在調試上,而不是寫程序上,以至于[Bob大叔](http://en.wikipedia.org/wiki/Robert_Cecil_Martin)把**調試時間占工作時間的比例**作為衡量程序員開發能力的標準。[調試九法——軟硬件錯誤的排查之道](http://www.amazon.cn/gp/product/B00CBBLUFK/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00CBBLUFK&linkCode=as2&creative=3132)既是調試領域的入門作品,也是必讀經典之作。[調試九法](http://www.amazon.cn/gp/product/B00CBBLUFK/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00CBBLUFK&linkCode=as2&creative=3132)的作者是一個具有豐富實戰經驗的硬件工程師,他把他多年的調試經驗總結成九條調試法則,并對每一條法則都給對應的實際案例。任何程序員都應通過閱讀這本書改善調試效率,即便是非程序員,也可以從這本書中學到系統解決問題的方法。
**延伸閱讀:**
* [Writing Solid Code](http://www.amazon.com/Writing-Solid-Code-20th-Anniversary/dp/1570740550/):**最好的調試是不調試**——[Writing Solid Code](http://www.amazon.com/Writing-Solid-Code-20th-Anniversary/dp/1570740550/)介紹了斷言,設計清晰的API,以及單步代碼等技巧,用于編寫健壯的代碼,減少調試的時間;
* [軟件調試的藝術](http://www.amazon.cn/gp/product/B00IOAM6VE/ref=as_li_ss_tl?ie=UTF8&camp=536&tag=lucida-23&creativeASIN=B00IOAM6VE&linkCode=as2&creative=3132):調試工具書——這本書詳細的介紹了常見的調試器工具,并通過具體案例展示了它們的使用技巧;