程序員可能必讀書單推薦(一)

寫在前面

從最開始寫博客到今天已經有將近七年的時間了,有很多博客的讀者都向作者要過書單,但是一直以來這件事情都沒有提上日程。作者一直都覺得分享書單和推薦書籍是一件很嚴肅的事情,大多數工程師的時間和精力都很有限,不希望因爲推薦的不合適書籍而浪費大家的時間。

這篇文章以及可能存在的後續文章會審慎地推薦書籍,雖然所有的書都是作者讀過並且嚴格挑選的,但是因爲讀者的背景不同會有完全不同的體驗,這些額外的變量是作者無法控制的,希望各位讀者可以理解。

概述

可能是因爲大多數英文書籍的名字都很長,很多比較出名的書籍都有廣爲人知的縮寫,今天要介紹的三本書籍也都有各自的縮寫,SICP、CTMCP 和 DDIA,可能很多人都聽過這三本書的名字,這三本書對作者都有很大的影響。

SICP

在這裏首先要介紹和推薦的就是《計算機程序的構造和解釋》[^1](Structure and Interpretation of Computer Programs、SICP),相信很多人都曾經看到過這本書的推薦,而作者在這裏也不能免俗。我們想談一談作者在閱讀這本書時的一些經歷和主觀上的感受。

SICP

圖 1 - 計算機程序的構造和解釋

第一次聽說這本書的時候是在大二,具體從哪裏聽到過這本書已經不記得了,最開始覺得這本書的名字有一點故弄玄虛,僅憑書名無法想象這本書的內容(這可能也是很多好書被埋沒的原因)。因爲之前一直接觸的都是面向對象的編程語言,所以開始學習這本書時受到了極大的震撼,它爲我理解計算機程序提供了非常不一樣的視角。

作爲一本介紹計算機程序的書,它選擇一門非常小衆的編程語言 Scheme[^2],Scheme 是 Lisp 的方言,作爲 1970 年從 MIT 實驗室中走出的語言,它卻一開始就支持了函數式的編程範式。與今天覆雜的編程語言相比,該語言中的概念和元素非常少,然而越是簡單的工具越能揭示編寫計算機程序時遇到的基本問題。

近些年來,函數式編程的思想基本上已經入侵了大多數的編程語言,無論是 Objective-C 中的代碼塊、C++ 中的成員函數引用、Java 和其他編程語言中的匿名函數都會有一些函數式編程的意味。然而 Scheme 作爲根正苗紅的函數式編程語言,我們能更清晰地理解函數式編程到底是什麼,如何使用函數式的編程範式如何構建複雜的軟件系統。

(let loop ((n 1))
(if (> n 10)
'()
(cons n
(loop (+ n 1)))))

===> (1 2 3 4 5 6 7 8 9 10)

雖然學習這本書的過程異常艱難,作者大概花了三、四個月的時間閱讀這本書,作者還將 1986 年該書的作者 Hal Abelson 和 Gerald Jay Sussman 在 HP 公司上課的視頻作爲輔助資料學習。我相信閱讀這本書並觀看相關的視頻對於沒有接觸過函數式編程的讀者來說,會從根本上改變對編程的看法。

作者在學習完 SICP 之後,還曾經癡迷於 Haskell 並且在 Coursera 上學習過函數式編程語言的相關課程,而函數式編程語言的學習也是對作者的影響最深的幾個事件之一。

CTMCP

《計算機程序設計的概念、技術和模型》[^3](Concepts, Techniques and Models of Programming Language、CTMCP)是 Peter Van Roy 和 Seif Haridi 在 2004 年出版的大部頭。這本書通過統一的方式介紹主流的全部編程範式、它們之間的關係以及它們的具體應用。

CTMCP

圖 2 - 計算機程序的概念、技術和模型

編程範式在今天應該不是一個令人感到陌生的名字,面向對象編程、函數式編程都是編程範式的一種,今天的編程語言往往由多個複雜的編程範式組成的。在某種程度上,我們可以將編程語言理解爲編程範式的集合。

programming-paradigms

圖 3 - 編程範式

這本書的作者爲了展示書中介紹的不同編程範式,特意設計並實現了名爲 Oz 的多編程範式的編程語言[^4]。該編程語言包含了大多數主流的編程範式,其中包括邏輯、函數式、命令式、面向對象、約束式、分佈式和並行編程,這種設計使得比較不同範式時不會遇到上下文不同導致的問題,避免了因爲編程範式實現細節的不同而陷入的瑣碎問題。

如果對這本書沒有那麼感興趣,其實快速閱讀該書的前九章就足夠了,感興趣的讀者也可以閱讀剩餘的內容,雖然書中有很多代碼,但是因爲語言不是主流的編程語言,所以可能會遇到示例代碼無法跑通的情況。我們在閱讀這本書時也應該更加關注概念以及形而上的知識,而不是形而下的一些具體實現。

DDIA

最後要介紹的是豆瓣上評分 9.7 分的《設計數據密集型應用》[^5](Designing Data-Intensive Applications、DDIA),該書是 2018 年出版的一本新書,初看這個名字可能會誤認爲這是僅僅給數據開發者閱讀的書籍,但是作者相信這本書能給所有的開發者帶來不同的閱讀體驗。

DDIA

圖 4 - 設計數據密集型應用

該書的第一部分是圍繞數據本身展開的,其中介紹了數據的模型、查詢語言、存儲和獲取以及編碼方式;第二部分介紹了分佈式的數據應該如何處理,其中包括副本、分片、事務、一致性和共識等內容;最後一部分主要介紹的是衍生數據的處理,其中包括批處理、流處理和未來的數據系統,而真正與研究大數據開發方向的同學關係緊密也是這一部分。

作者認爲,雖然這本書沒有創新性的引入一些新的概念和技術,書中描述的大多數問題和解決方案都能在網絡上找到,但是這本書的閱讀可以幫助我們重新構建系統性的知識體系、打通不同知識之間的聯繫。它能讓我們在看待數據和分佈式系統時帶着更加通透的感覺,而這也是作者想要推薦這本書的目的。

總結

在這裏還是想強調一點,上面的這三本書都是作者閱讀過的書籍,這裏做的評價都僅僅出於作者的主觀判斷。雖然作者確實從這三本書中獲得了大家所說的 "Aha moment",但是這三本書都是大部頭,認真閱讀這三本書可能需要花費大半年的時間,作者不能對各位讀者自身的閱讀體驗負責,也希望各位讀者在選擇輸入源時有自己的判斷、也更加謹慎地思考。

如果各位讀者對這個系列比較感興趣,作者在後面還會推薦一些自己閱讀過的其他書籍,也歡迎大家在評論中留下帶給自己 "Aha moment" 的書籍,我們可以一同學習和討論。

[^1]: 計算機程序的構造和解釋(原書第2版) https://book.douban.com/subject/1148282/

[^2]: Wikipedia: Scheme https://en.wikipedia.org/wiki/Scheme_(programming_language)

[^3]: Concepts, Techniques and Models of Programming Language https://book.douban.com/subject/1782316/

[^4]: Wikipedia Oz (programming language)https://en.wikipedia.org/wiki/Oz_(programming_language)

[^5]: 數據密集型應用系統設計 https://book.douban.com/subject/30329536/


本文分享自微信公衆號 - newbe技術專欄(newbe36524)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章