好的書要讀三遍——《Learning hard C#學習筆記》書評兼論讀書方法

袁國濤發表於2015-11-01

“孔子晚而喜易……讀易,韋編三絕”。——《史記·孔子世家》

在陪老婆產檢的漫長等待中,我快速地讀了借來的這本書,讀到泛型部分,大概接近全書一半。不過我知道,多數新特性都在後面,內容還挺多。之所以前面讀得比較快是因為早年確實已經看過C#語言,本身不是初學,因而很多東西只是複習一下,一帶而過。但有的地方,比如中間語言程式碼部分還是讀得很慢,大部分時間都花在了這上面。
誠如一些讀者所說,這真的是絕無水分的乾貨一本。不論你對語言本身瞭解程度有多深,裡面的每一句話都很值得認真去讀:知道的加深印象,不知道的仔細思考。本身已經是筆記,以至於再記筆記都顯得多餘。常有讀書“先厚再薄”之說,顯然,不是說這本的,這本是已經被讀薄了之後的。我覺得,這本書最大的特點是既有基本知識概念,又有心得體會,還進一步深入到C#的背後,介紹了語言背後,Dotnet這個強大的後盾。從我個人的讀書體會來說,這樣的書才是好書,值得購買、收藏。儘管技術書籍的壽命確實都不長,畢竟,技術日新月異嘛。

************繁忙的分割線********************

今天陪老婆加班,又帶著這本書,繼續上次未完的內容。今天雖然時間不長,但是有比較安靜的環境,因此收穫還是蠻多的,今天看到了lambda表示式的開頭部分。
我想我大致可以總結這本書有這麼幾個特色。
1、難度層次非常明顯
從全書來說,一開始是基礎,後面全是講具體的特性,這樣的分明的層次可以讓一些有基礎的讀者能夠快速閱讀已知的部分,或者直接跳過這些部分,省下很多時間。 從每一個特性的來說,從特性的發展歷史條件、目的開始中間;講特性的使用方法、適用場景、注意事項,有時還有通其它方法的比較;後面加入一些對編譯器實現細節的說說明,看看IL反彙編的結果。這樣能夠讓不同層次的讀者根據自身的情況進行選擇。比如我,對於熟悉的特性,我可能會關心IL到底是個神馬情況,而那些我不熟悉的特性,本身理解新東西就需要精力和時間以及實踐過程,對編譯器到底是作了什麼處理也就不是很在意了。也許以後會關心,誰知道呢?

2、重現技術演進的過程
新技術不是憑空設計出來,它的出現總有原因而非說不清的因緣際會。之前的各種問題和困難促成了這個新技術的出現。C#本身就是借鑑各種語言和程式設計方法出現的,後來的各種新特性也仍舊讓這個曾經 飽受爭議的語言不斷煥發新的活力。如果一個人要是直接接觸泛型、Linq,免不了一頭霧水——這些東西發明來幹嘛的?真的有必要麼?
本書的一大特點就是將C#的這些特性整個串了起來:有了委託才方便事件處理,也才有對匿名函式的需求,才會發展到lambda表示式,出現了異於常規語法形式的Linq。不得不說,這些特性有了作者這樣承前啟後的串聯之後,整個來龍去脈就清晰多了。看過之後,如同伴隨這門語言一路成長起來的老手的感覺,而不是剛剛初學乍練的學徒。當然,高手的路還很長,需要實踐歷練,但精神上,有了共同的經歷。
在講解有歷史延續性的特性時,分別使用不同的版本來實現以說明新特性的意義是讓人印象深刻的好辦法。不僅僅是證明新特性的優勢,也說明體現了這個語言的發展趨勢——C#的編譯器一直在做的就是減少開發人員的工作量,讓編寫程式碼更“簡單”。(簡單只是一個側面,因為新人再來,門檻就高了)

3、不只告訴你正確答案
學習的過程是一個不斷頓悟的過程。所謂的漸進微觀上也是量子化的,當這些微小的頓悟積累到一定程度,就可以算是掌握了某種知識。但這個過程,那些曾經困擾我們的點點滴滴在我們回顧學習過程的時候都消失了,好像這些東西我們出生時就掌握了,看到那些還在摸門的人,我們只能著急。頓悟這事,只能自己搞定麼?是的,只能靠自己,但有前人的指點,會更快地達到。只是那些已經“知道”的人可能已經忘了自己是怎麼“知道”的了。而要命的是,這些人寫了書,只會告訴你所有正確的東西。他們書寫的東西無比正確,以至於你只能端著書本敲示例程式碼,放下書本,面對的全是各種錯誤提示。
我覺得一本好書,除了要告訴我們哪裡是正確的方向之外,還應該告訴我們哪裡有坑,需要繞過去。更重要的是,還要寫上掉到坑裡之後,如何自救。好吧,我說的就是常犯的錯誤,以及對於錯誤提示肯能是因為那些錯誤引起的。在本書中,我看到了各種在理解過程中因為片面理解可能出現的錯誤和對應的錯誤提示。我想,作者恐怕也在那裡跟他們死磕了不少時間吧。
時間就是生命。感謝作者把這些記錄下來,避免了後來人繼續浪費生命。其實,學習別人的錯誤比學習別人的成功更有意義,是吧?

************囉嗦的分割線********************

有個流行句式,說重要的事情要說三遍。為什麼要說三遍?第一,重複表示強調,說明這事情真的重要;第二,重要的事情你要記在腦子裡,重複可以強化記憶;第三,我沒想出來。
我想,好書也應該多讀幾遍。鑑於大家時間有限,書也太多,看太多次也不太可能。也跟個流行,讀三遍吧。
第一遍,整個翻一遍,當然對於已經有知識結構樹或者知識框架的內容,看目錄就夠了。這一遍基本上就是要確定第二遍要看的內容。我把內容大致分三類:1,已經知道的內容,對於我,這部分內容就是C#的基本語法和周邊的知識;2,不知道和不明白但是想想能明白的內容,對於我,一些新特性,和我已經知道的特性的實現細節內容;3,怎麼想也想不明白的內容,對於我來說,可能就是一些編譯器如何具體實現的的部分。
一般來說,一本書對於特定一個讀者,內容總是可以分成這三類。第一類內容看看可以加強印象,但不值得浪費太多時間,多看無所增益。第二類內容是重點,一本書對你來說第二類內容越多,說明這書越適合你。所以第二遍就是把你能讀懂的地方讀懂,能吃透的地方吃透。第三類內容,怎麼看也看不明白的,要麼就是經驗不足,要麼就是經歷不夠,要麼就是知識上缺環。在不具備理解條件的時候,在上面花再多時間,未必不能有點收穫,但從效率上講,得不償失。我相信,書讀百遍,其義自見,問題是,你有這麼多時間麼?
所以,我所說的第三遍,就是隔上一段時間,讓自己有時間對新內容有更深一層的認識和理解之後,再加上一定的實踐,第三類內容就不再是怎麼看也看不懂的了。畢竟,那又不是天書。

對於李志的這本書《Learning hard C#學習筆記》,我現在相當於在讀第二遍,個人以為非常值得使用C#的同志收藏,當作C#歷史看也好啊,呵呵。只是希望第二版的時候別再有漏掉圖片這麼嚴重的問題了。

相關文章