终于,我也要出一本C#的书了 - 我的写作历程与C#书单推荐
我之前的面试题停了很久,是因为 - 我写书去了。
前言
我于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# 从现象到本质》,将会有以下几个特点:
- 与时俱进,对最新推出的C# 7的特性也有涵盖,但不会介绍最基础的c#语法
- 夯实基础,深入本质,并非简单的msdn搬运工 + 一段又长又没有注释的代码这种风格的图书,例如,《21天。。。》。本书会提到IL,并不时张贴IL代码以便深入分析各种语法糖背后的实质
- 目前市面上关于c#多线程的中文资料较少,大部分c#书籍在这部分都是简单一提,但我的书中多线程将自成一篇,包括5章,使用通俗易懂的文字解释c#多线程相关的各种各样的锁和同步工具,以及异步编程模型,直到最新的async/await
- 重视英语,很多名词旁边配有对应英文翻译
参考书籍
我在写作的时候参考了大量书籍,从大名鼎鼎的赵三本到很多博客园网友写的书,和其他中英文书籍。在阅读他人的书籍时,我也发现有些书真的十分优秀,但却默默无闻。有些书的某些章节颇为精彩。这里我也将它们列出来,作为一个我自己推荐的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有着浓厚的兴趣,常常在写书时搞到废寝忘食,甚至在这段时间内觉得做其他事情都没意思了。另外,我的文章受到出版社编辑的赏识是对我能力的一种肯定,既然我接下了这个任务就应该认真完成,对得起自己写的每一个字,不误导读者。最后,我也希望通过写书这个契机认识更多的朋友,给自己带来更多的机会。整个写书的过程中,我收获了很多,也很快乐。