「年輕人,你的問題主要在于讀書不多而想得太多?!?--- 楊絳
2015 年讀了不少書,收獲也不少,到了年底寫個小結。
自從轉行之后面對一個全新的領域,很多知識要去補,并且互聯網本身可能是現在這個時代發展最迅速的一個領域了,所以為了趕上步伐,更是有無窮無盡的知識值得去學習。再加上創業這個「快速列車」,踏上的不一定是快速積累財富的通道,但一定是快速成長學習的一個通道(當然,前提是你真的在努力做這件事)。接下來就分享下最近一年讀的書以及書評,書單是按讀的時間順序從舊到新排序的,書評是將非技術類的放前面,技術類的按語言劃分放后面。
2015 年的書單:
- 精益創業
- The Swift Programming Language
- JavaScript: The Definitive Guide
- JavaScript: The Good Parts
- 深入淺出 Node.js
- 計算機程序的構造和解釋 (SICP)
- 淘寶技術這十年
- 黑客與畫家
- Think in Java
- Spring in Action
- 人月神話
- SQL 必知必會
《黑客與畫家》
這本書是我今年讀到的最好的一本書,所以放第一個。
這本書是一個文集,各個章節是獨立的,作者是硅谷最著名的孵化器 Y Combinator 的創始人 Paul Graham。前面一半講的內容基本跟技術無關,但也是個人覺得最有價值的內容,主要是關于創新、教育、財富的積累分配、如何思考等等,內容非常有啟發性,即使不在這個領域也很建議讀一下。
詳細的內容不想展開講了,200 頁的書一兩天就能看完,我是陪老婆逛街時站著看完的……然后吃飯時迫不急待地把書里闡述的想法跟她講了一通……
書里的技術部分有些我不太茍同,作者一直在安利 Lisp,唱衰 Java 什么的,普通的公司項目別說用 Lisp 了,搞個 Go 什么的也找不到靠譜的程序員啊。
《人月神話》
前兩天看到個微博:
一個女人生一個孩子要十個月,所以十個女人生出這個孩子只需要一個月,加加班還可以壓縮到兩個星期……嗯,給你五個女人,一個月后我要看到這個孩子。 —— IT公司老板的思考邏輯
上面這個微博闡述了什么是「人月」,一個女人生一個孩子要十個月,也就是說生一個孩子的工作量是十個「人月」,很多愚蠢的老板想當然地覺得要讓項目快速完成,只需要多些人手或者是讓員工加班就解決了,但問題其實沒有那么簡單,生一個孩子這事是無法由多人來拆分工作繼而共同完成的,很多項目(尤其是中大型的)也同樣是無法簡單拆分工作的。當項目越來越復雜,需要的人手越來越多的時候,人與人之間的額外的溝通成本就迅速增加(幾乎是指數式的),然后公司就開始漸漸跳入一個深坑,變得累贅不堪,再也爬不出來。
這本書主要就是為了解決軟件工程上遇到的這類問題,書里講的很多內容都是實際項目中經常會踩到的坑,我看的時候時不時地會覺得自己跳過的坑實在太多了,后悔沒早點看這書,剛創業那會真是太 naive 了。
書的背后還有這樣一句話:
有些書對讀者和作者像是年金,它們年復一年地分紅……
為什么對于讀者像是年金?因為這本書的信息量比較大,你可能要親自跳過一些坑之后才會對里面的內容感同身受,所以你每年拿出來讀一遍說不定都會有新的見解,
為什么對于作者像是年金?這本書是四十年前出版的,沒錯,軟件這個發展這么快的行業,居然能有一本書熱賣四十年,雖然里面提到的技術名詞我們這代人可能壓根沒聽過,但里面闡述的軟件工程上的一些坑,我們這代人還在繼續跳,我們還是在尋求著橄欖枝。
《精益創業》
這本書正好是一年前看的了,內容大多記不得了,當初也是囫圇吞棗看了一遍。
個人對成功學這一類的書比較反感,我始終的一個觀點就是「紙上得來終覺淺,絕知此事要躬行」。但這本書闡述的觀點我還是比較認同的,在現在這個創業環境中,失敗太常見了,小到一個細節上的設計失誤,大到公司戰略決策上的失誤,無數公司黯然收場。如果我們無法做到有超越常人的預見性,就該「擁抱變化」、「擁抱失敗」、不停試錯。但試錯是有成本的,我們應當盡量把這個成本降到最低,于是就催生了快速迭代、敏捷開發、最小化可行產品等等理念。
總的來說,這本書主導的一些做法在多數優秀的初創公司都是比較盛行的,還是比較有借鑒意義的。
《計算機程序的構造和解釋》
這本書原名《Structure and Interpretation of Computer Programs》,簡稱「SICP」,被稱作為「魔法書(Wizard Book)」。為什么這本書被稱為魔法書呢?因為書里的內容在你眼里可能會是滿滿的「黑魔法」。
我們這一代理工科的多少都學過一些程序語言,大多是從 C 語言開始學的,接下來不管是學校課程還是自學,無非就是 C++,Java,Python 等等,這些更高級的語言最重要的一個特性就是面向對象。如果說量子力學是對物理系本科生的第一個 Brain Storm 的話,那么面向對象可能就是對 CS 本科生的第一個 Brain Storm,從此面向對象的思維方式就會貫穿今后的工作學習了。
而這本書是用一種 Lisp 方言(Scheme)來講解的。第一章講了在 Lisp 的世界里,函數是一等公民,函數可以被當做參數進行傳值、返回,這個特性賦予了程序更高的抽象能力,所以對習慣了面向對象的思維方式的程序員來說,這可能又是一個 Brain Storm,這種編程方式被稱為函數式編程(Functioanl Programming),這種思維方式可以對應于數學中的泛函。
這本書看著不算厚,但想好好理解的話得刷書里的題,很費時間,我才刷了兩章。刷完兩章題目后的感受是:對程序抽象能力是一種很好的培養。雖然實際工作中用函數式編程的場景不多,更很少有機會寫 Lisp(雖然現在各個主流的語言都支持 Lambda 了,但工業界覺得面向對象才是最適合整合廣大程序員力量的一種方式),但當你從一個更高的維度降下來,再看待同樣的東西的時候,你的理解會更透徹,可以理解為《三體》里的『降維攻擊』:)
當然,這本書只是 MIT 的本科教材,也沒必要把它捧得太神啦:)
《The Swift Programming Language》
市面上多數程序語言的書籍都有一些不足,譬如:
- 內容過于膚淺,只講 How,不講 Why,一般實踐類的書都是這樣
- 語言很機械,讓人食之難咽,中文翻譯的書不少都這樣
- 講得過于面面俱到,有些很少用到的東西還在那長篇大論
- 舉例子可能會走兩個極端:沒有例子,讀完了也寫不出什么程序;例子太長,2-3 頁的例子看代碼要看老半天
這些問題有些是因為作者自身理解不透徹,有些是作者語言風格的問題,還有些是書本身定位的讀者群體就是這樣的。
但這本 Apple 官方的 Swift 書籍個人覺得在這些問題上拿捏的很好,排版很清晰有條理,對于有一定語言基礎的讀起來應該會很順暢,Swift 獨特的語法以及理念會講得比較深入,語言界的「江湖規矩」就不會太拖泥帶水。個人覺得 Swift 看這本就夠了。
Swfit 這門語言個人也很喜歡,這是門很「現代」的語言,語言特性很豐富,譬如:auto、optional、generics、lambda、tuple 等等。一些老牌語言也只是近些年來才加上這些特性,譬如 auto, tuple 是 C++11 才有的,optional, lambda 是 Java 8 才有的。
語法方面也比較簡潔,公司的 iOS 程序員從 OC 轉到 Swift 之后寫得更開心、生產效率也更高了:)
而且 Swift 現在在 Linux 平臺上也可以使用了,說不定以后在服務器端也能占得一席呢。
《Think in Java》
中文名《Java 編程思想》,是 Java 的經典書籍了。
這是本大部頭的書,比較難啃,我是花了兩個星期硬啃下來的,跳過了一些內容,尤其是有關桌面的完全不用看(因為這個領域 Java 已經失去地位了,哈哈)
書的內容方面個人不太喜歡,感覺比較繁瑣,面面俱到,沒什么側重點,有些例子太長了,像反射、注解什么的。
但深入了解 Java 的書籍貌似也不多,下次可以考慮看下 Oracle 官方的試試。這本看完可以接著看看《Effective Java》、并發編程、JVM 虛擬機什么的。感覺 Java 的世界真的是太龐大了……
《Spring in Action》
這本書剛出了第四版,還沒有中文翻譯的,但肯定得看最新版的。
Spring 這個框架是企業級 Web 框架里最成熟的了。Java EE 官方也有相應的東西叫 EJB(Enterprise Java Bean),這個 EJB 據說是 Java Bean 的加強版,但配置太困難了(這點我也是道聽途說),所以大家更喜歡用 Spring 的 POJO(Plain Old Java Object),簡單的理解就是 Spring 框架下一個很普通的 Class 生成的 Bean 能跟 EJB 有同樣的威力。據說當年 Sun 公司的人安利過淘寶用 EJB,用了一段時間后淘寶還是全部轉到 Sping 框架了:)
Spring 本身現在已經越來越龐大了,功能也非常多,再加上這里面還穿插著 Java EE 的技術,入門的門檻有點高了。
我個人是從 Spring Boot 入門的,然后結合 Spring Web、Security、Data JPA 等 Project,可以快速上手做個小項目玩玩。等有個大概的了解后,開始看看官方的 Spring Framework Reference Documentation 深入理解一下。但這個 Reference Documentation 也是很龐大的,沒有例子解釋,更適合當字典來參考,沒什么基礎直接啃還是比較困難的。
這本《Spring in Action》主要講了 Spring 框架下核心的和常用的內容,詳略得當,個人覺得作為入門挺合適的,語言風格也很好。
《JavaScript: The Definitive Guide》
JavaScript 的世界據說是充斥著爛代碼,我以前的印象也是這樣的,因為剛有互聯網那個年代網頁經常出錯、蹦出對話框什么的,覺得都是 JS 的鍋。而且以前大家對 JS 也不太看重,直到 Google 搞出個 Gmail,大家才發覺原來可以用 JS 做這么炫酷的事,直到今天,JS 是互聯網上唯一通行的腳本語言了,沒有競爭者,所以這門語言再怎么有問題都得好好用呀。再加上如今 Node.js 的出現,JS 就更加受到關注。感覺 JS 已經完全脫離了當初設計時的初衷,被賦予了超過其本身的使命。
而我們最初的一個項目用的也是 Node.js,所以我當時有必要對 JavaScript 好好了解一下,但只看了這本書 前面 JavaScript 核心的部分,后面有關 DOM 樹操作的沒看。這本書作為 JavaScript 圣經,內容是很翔實的,而且根據 Douglas Crockford(我也不清楚這人啥來頭……)的說法,JavaScript 世界里的爛書太多了,因為大家都不真正理解它,這本貌似是他唯一推薦的一本。
《JavaScript: The Good Parts》
前面說了,JavaScript 爛代碼太多。主要原因是 JS 非常靈活,你怎么寫都是對的,而且像內存泄露什么這種事發生也影響不大,因為頁面一關就都銷毀掉了。
為了學習正確的打開方式,把代碼寫得規范點,還是很有必要讀下這本書的,200 多頁,應該很輕松讀完。作者 Douglas Crockford 還寫了個 JSLint 工具,就是檢查你寫的風格是不是按他要求的做的:)現在還衍生出來 ESLint 什么的,已經成為前端工作流中的一個環節。
《深入淺出 Node.js》
Node.js 現在看著挺熱鬧的,但好書不多,國內流傳得比較多的就這本。想深入了解下 Node.js 的可以讀讀,講的都是 Node.js 底層的東西??淳W上大家吹捧 Node.js 多好多好,不如自己好好了解一下。
最近已經放下 Node.js,主攻 Java 和 Spring 框架了,所以也不太了解這個領域未來的發展。但這個領域變化很快,還沒很成熟的模塊、框架,大家要做好學完就過時的心里準備,當初撐起 Node 半邊天的 Tj 大神已經轉戰 Go 了,他弄的 Express 框架應用得非常廣泛,但最近也有點面臨無人維護的困境。
《淘寶技術這十年》
個人挺喜歡這本書,也是本輕松的讀物。從這本書里可以了解到一個看似簡單易用的淘寶,背后是多么復雜龐大的一個系統,凝聚了多少人的力量,所有技術的產物都是把簡單易用留給用戶,把復雜藏在背后的系統里。并且這樣一個龐大的系統是如何一步一步走到今天的,從當初的簡陋的 LAMP 架構,到購買 IOE,再到去 IOE,最后自主研發底層的基礎設施??赐暧X得還是挺喜歡阿里的工作氛圍的。
《SQL 必知必會》
這本數據庫的書很簡單,一天就能輕松看完,主要就是講怎么寫 SQL 語句,適合服務器端開發人員對數據庫進行一些簡單的操作。查詢講得比較多(因為用得也多),一些高級的特性也都簡單介紹了一下,至少讓你知道有這么個東西可以用。所以總體來實用性很好,適合數據庫入門,或者想快速上手做點東西,拿來簡單地參考一下。想深入了解或是走 DBA 這條路的話,這本書顯然是不夠的。
2016 年的讀書計劃
過去一年中,覺得書還是系統地獲取知識的最佳途徑,項目實踐是深化理解的一個過程,而搜索引擎則是解決問題、獲取某個知識點的快速途徑。
2015 年接觸的東西比較雜,基本上從前端到數據庫都親手做過,語言、框架也學習了好幾種,接下來一年里計劃深入研究下 Java、Spring 以及數據庫,架構設計、項目管理這些能力也要走在公司發展的前頭,還有算法、網絡基礎什么的欠缺的都得補上,最后非技術類的也得盡量多學習。
當 Glendower 咆哮道「我可以召喚地下的幽魂」,
Hotspur 說「我也會,誰都會,可是你召喚它們的時候,它們果然會來嗎?」
--- 莎士比亞的《亨利四世》
現在這個時代的科技巨頭里我最欣賞的是 Elon Musk,跨界跨領域創造傳奇靠的不光光是膽識,也靠強大的行動力。