1. 程式人生 > >終於,我也要出一本C#的書了 - 我的寫作歷程與C#書單推薦

終於,我也要出一本C#的書了 - 我的寫作歷程與C#書單推薦

必須 並發編程 人工 後來 做成 沒有 wcf learn 可能

我之前的面試題停了很久,是因為 - 我寫書去了。

前言

我於2012年3月開始工作,到現在馬上就滿六年了。這六年裏,我從一個連Sql server是什麽都不知道,只會寫最簡單的c#的程序員開始做起,一步一步從一個籍籍無名的外包公司奮鬥到了一個比較大的金融機構的中層,工資也提升到剛參加工作的接近四倍。在奮鬥的過程中,我也走了很多彎路,一度十分消沈,但幸運的是,最終我的努力並沒有白費。

我一直就是一個比較喜歡寫文章的人。在平時工作時,我也喜歡把很多必要的東西(例如服務器的ip地址,登錄密碼等)寫下來,並做成文檔以便隨時查閱。在前幾年,我對自己的公司不滿意,在業余時間一直在準備跳槽,於是,我搜集了很多面試題和解答。後來我發現這樣準備毫無系統性,便去買了本書開始看。說來慚愧,我在工作的第三年才開始系統的看書,那時買的第一本書是《精通C#》第6版。在讀書的同時,我也知道了其實C#領域最出名的書是clr via c#,並買了一本,重寫了自己的文章(之前它們只是面試題的解答),慢慢貼到網上,成為了面試題系列。在這個系列的編寫過程中,我也參考了博客園上很多傑出的網友的優秀文章。這個過程中我的技術水平提高了很多。在寫博客的同時,我也得到了某公司編輯的註意。通過博客園站內信,編輯希望我寫一本關於C#的書。當時我清點了一下自己文章存貨,發現總字數已經有大概10萬左右,而且那時候公司工作也不忙,就同意了。

書籍寫作

在簽了初步合同之後,編輯將我的書命名為C#筆試面試題集,因為畢竟我在網上的博客和面試題關系比較密切。我根據自己電腦裏已有的文章存貨,提交了目錄,並擬定為7大塊:
1 .NET基礎知識,包括類型基礎,面向對象等
2 C#重要特性,包括委托事件,泛型反射,LINQ等
3 設計模式
4 數據庫基礎知識
5 算法基礎知識
6 測試,部署和持續集成
7 多線程

之所以包括這麽多內容,是因為我在準備面試時對這些都寫了文章。但在寫書的過程中,我逐漸發現,我的“野心太大”了。如果我按照上面的大綱去寫書,我不僅時間不夠,目前的能力也完全無法勝任:我的算法水平很一般,也不是設計模式和數據庫專家,對測試和部署的經驗也不多。而且,即使在剛開始寫.NET基礎知識這部分我自以為最“擅長”的部分時,我也在查資料和參考其他書時,發現我的認知其實還頗為皮毛。因此,在剛開始寫書時,雖然是在過去文章的基礎上改進,我的進度仍然很慢。有時候,我還會不時的在網上撞到一篇超強文章,它比我的認識透徹多了,導致之前寫的大部分內容都得重寫。

在寫書進行了幾個月之後,我決定從書中砍掉設計模式,數據庫,算法,測試和部署,並令書更加集中於c#的討論。這樣一來可以不讓書的內容過於松散,二來也讓自己更有信心。現在,整個書已經寫了90%,這個月底就全部交稿了。在交稿之後,相信還會有一段審稿和與編輯討論的時間。等到該書正式出版時,我再來通知大家。現在這本書的內容包括:
1 .NET基礎知識,包括程序集,類型基礎,內存分配,面向對象,字符串,GC等。介紹了一點關於IL的知識。
2 C#,包括委托事件,泛型反射,LINQ,DLR,C#6和7的新特性等
3 多線程,包括多線程基礎知識,同步與鎖,異步模型,async/await等

第一部分主要參考了clr via c#的第一和第二部分以及其他國內外相關書

第二部分主要參考了深入理解c#以及其他國內外相關書
第三部分主要參考了clr via c#最後一部分(關於線程的),深入理解c#的async/await那部分。我試圖用較為容易理解的語言將這兩本書的相關章節解釋清楚。

我對本書的定位是:適合有1-2年開發經驗的人士閱讀。該書的書名已經確定為《c# 從現象到本質》,將會有以下幾個特點:

  1. 與時俱進,對最新推出的C# 7的特性也有涵蓋,但不會介紹最基礎的c#語法
  2. 夯實基礎,深入本質,並非簡單的msdn搬運工 + 一段又長又沒有註釋的代碼這種風格的圖書,例如,《21天。。。》。本書會提到IL,並不時張貼IL代碼以便深入分析各種語法糖背後的實質
  3. 目前市面上關於c#多線程的中文資料較少,大部分c#書籍在這部分都是簡單一提,但我的書中多線程將自成一篇,包括5章,使用通俗易懂的文字解釋c#多線程相關的各種各樣的鎖和同步工具,以及異步編程模型,直到最新的async/await
  4. 重視英語,很多名詞旁邊配有對應英文翻譯

參考書籍

我在寫作的時候參考了大量書籍,從大名鼎鼎的趙三本到很多博客園網友寫的書,和其他中英文書籍。在閱讀他人的書籍時,我也發現有些書真的十分優秀,但卻默默無聞。有些書的某些章節頗為精彩。這裏我也將它們列出來,作為一個我自己推薦的C#進階書單。

如果你基礎不是很紮實,那麽可以找來《精通C# 第6版》入門(不用看wpf,wcf那幾部分),或者《Learning hard C#學習筆記》也行。前者內容比較多,後者相對比較簡練,可以增強學習信心。但最好的入門書我認為是《NET 4.0面向對象編程漫談 基礎篇》這本。

下面的書都不是用來入門的。

CLR via C#第四版
這本書實在太重要了,太有名了。實際上,它幾乎出現在任何一本講C#的書的參考資料中。該書雖然現在看來已經有點“過時”了,但它對CLR的講解是十分透徹的。很多國人的C#書籍,都或多或少的受了這本書的影響。

該書雖然很厚,但結構十分清晰,分為五大部分:
1. CLR基礎,講程序集的結構和部署,IL,JIT,類型系統。第一章很重要,必須好好看,第二章和第三章相對不那麽重要。
2. 設計類型,該部分遍覽了一個類型可以擁有的所有成員,所有章節都很重要,第12章泛型尤其重要。
3. 基本類型,13,14,16,17,19章很重要,15和18可以大概看看。
4. 核心機制,主要包括異常處理,GC,應用程序域,反射和序列化。
5. 線程處理,作為Windows操作系統的大師,作者對線程的理解非常深入。26章主要是概念,27-30章全是多線程,通讀這部分對多線程的理解幫助極大。不過,該部分充斥大量專有名詞,對非windows高手來說不太友好。可以和其他多線程書配合著看。

這本書由於成書較早,因此缺失了對C#一些較新版本功能的介紹,例如LINQ等。此時,就需要另外一本大名鼎鼎的書 - 《深入理解C#》出來救場了。

深入理解C#
這本書相比上一本不那麽“底層”,不過,它的閱讀難度也不小。對於更喜歡特性而非原理的讀者,可以通讀一遍此書,它按照演進順序講述了C#1-5的所有特性,對LINQ,異步的講解既實用又涉及原理。本書所有章節都很重要。

.NET設計規範:約定,慣用法與模式
在爭論應該是抽象類還是接口,應該是類還是結構時,我們其實看看這本書就夠了,它早就給了我們一大堆最佳實踐。不知道怎麽書寫異常處理?看看第七章吧。本書實際上就是一個代碼規範集合。

本書適合在需要的時候隨時查閱。以上三本書相輔相成,包括了一個中級開發者需要掌握的所有主語言相關技能(實際上,即使只理解一半也已經足夠好了),故被某知名程序員稱為“趙三本”。該程序員還認為,充分理解了“趙三本”的開發者在大陸的待遇應至少為20k人民幣每月,即中級開發者。

Pro .NET Performance
本書以一個獨特的視角 – 性能作為切入點,講述了.NET程序和類型在性能這一方面的體現。該書的前兩章主要討論了性能測試的衡量方法和工具,第三章深入了類型系統,第四章詳細的講述了GC,這兩章值得細讀。

本書目前只有英文版,閱讀難度很大。

.NET本質論 第一卷 公共語言運行時(Don Box)
本書實際上就是在講CLR,它也是對CLR的探討中,我目前知道的書中,最底層,最深入的一本。該書的作者同時也是COM專家,因此,對於CLR這個更好的COM來說,他必然也是駕輕就熟。

本書中我最喜歡的部分是第6章,作者使用了一章的篇幅討論了方法調用。該書過於底層,成書年代也很早,讀起來可能有些脫離實際的感覺。

NET 4.0面向對象編程漫談 基礎篇
本書的作者是金旭亮老師。他的這本書(以及後面相鄰的那本)以生動有趣的筆觸講解了.NET的方方面面。我個人非常喜歡這本書。如果你覺得《CLR via C#》太枯燥,行文方式又過於老外,看不下去,可以先看這本。這本書雖然沒有《CLR via C#》那麽深,但對於底層也有頗多涉及,它和很多粗制濫造的“拖控件教程”有著本質的不同。

NET 4.0面向對象編程漫談 應用篇
作者在此書中著重分析了進程和線程以及在C#中的實地應用。這是多線程方面來自國人的為數較少的好資料。這本書和上一本一樣,我強烈推薦。

你必須知道的.NET(第二版)
本書的編排順序十分獨特。它的視角是完全面向對象的,並且將.NET各個知識點以逐個對比的方式呈現在了讀者面前,第一次閱讀時,可能會覺得不太適應。本書有一定深度,而且作者行文比較幽默,因此讀起來也不是很枯燥。

本書有很多SOLID和設計模式方面的內容,對開發者不無裨益。

Threading in C#
本書(以網頁形式在網上公開)提供了另一個關於C#多線程的介紹資料,目前已經有翻譯版本https://blog.gkarch.com/threading/part1.html。該書對.NET提供的各種各樣的鎖都有所涉及,可以和《CLR via C#》最後四章一起看。

.NET之美 .net關鍵技術深入解析
本書是博客園網友張子陽的作品。這本書的委托那章是經典之作。

其他多線程書籍包括async in c#(只有英文),c#並發編程經典實例(這本內容新,但實在是。。。難懂)以及C#並行編程高級教程(這本難度還比較溫和但沒有async/await)。

結語

我寫書並非是指望它掙多少錢(稿費很低)。首先,我對技術與.net有著濃厚的興趣,常常在寫書時搞到廢寢忘食,玩遊戲都覺得沒意思了。另外,我的文章受到出版社編輯的賞識也是對我能力的一種肯定,我既然接下了這個任務就應該認真完成,對得起自己寫的每一個字,不誤導讀者。最後,我也希望通過寫書這個契機認識更多的朋友,給自己帶來更多的機會。這本書順利出版之後,我的下一步可能會轉向人工智能或機器學習方向的學習和研究(我自學過作曲理論,也一直對人工智能作曲很有興趣),或者算法方面的研究(出一本書用c#實現各種小遊戲求解,例如華容道,數字拼圖等等),現在還沒有確定。但是我可以確定的是,整個寫書的過程中,我收獲了很多,也很快樂。

終於,我也要出一本C#的書了 - 我的寫作歷程與C#書單推薦