终于,我也要出一本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有着浓厚的兴趣,常常在写书时搞到废寝忘食,玩游戏都觉得没意思了。另外,我的文章受到出版社编辑的赏识也是对我能力的一种肯定,我既然接下了这个任务就应该认真完成,对得起自己写的每一个字,不误导读者。最后,我也希望通过写书这个契机认识更多的朋友,给自己带来更多的机会。这本书顺利出版之后,我的下一步可能会转向人工智能或机器学习方向的学习和研究(我自学过作曲理论,也一直对人工智能作曲很有兴趣),或者算法方面的研究(出一本书用c#实现各种小游戏求解,例如华容道,数字拼图等等),现在还没有确定。但是我可以确定的是,整个写书的过程中,我收获了很多,也很快乐。
终于,我也要出一本C#的书了 - 我的写作历程与C#书单推荐的更多相关文章
- 设计模式PDF下载了4.0万本!那,再肝一本《Java面经手册》吧!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 1. 先祝贺下自己拿下4.0万本下载量! <重学Java设计模式>PDF ...
- 我的新书《C++服务器开发精髓》终于出版啦
一.千呼万唤始出来 亲爱的各位读者,我的新书<C++ 服务器开发精髓>终于终于终于与大家见面了,图书如下: 图书的封面设计很精美,当然内容一定不负众望.因出版社老师要求提供一张照片放到封面 ...
- cas单点登出
由于项目需求要实现单点登出需要在网上找了N久终于实现单点登出. 使用cas-server-core-3.3.3.jar(CAS Server 3.3.3) 使用cas-client-core-3.1. ...
- 走出MFC子类化的迷宫
走出MFC子类化的迷宫 KEY WORDS:子类化 SUBCLASSWINDOW MFC消息机制 许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习 ...
- bat脚本弹出消息示例(msg命令详细解释)
弹出消息的bat,其实就是通过批处理调用msg命令,msg是系统自在的一个可以发送信息的命令. 示例: @echo off rem 测试MSG msg * "ok" rem 测试M ...
- TFS 强制撤销别人签出的代码
有个同事离职一段时间了,今天改一下她的代码,发现有个文件签出了,晕,而且TFS用的也是只允许单用户签出. 1,找原来的用的机器,已经被人占用了,系统已经重做. 2,只有用命令行来搞了. 大致如下: t ...
- 推荐一本好书给即将走入工作的程序员and程序媴
近期买了几本IT届推崇的经典书籍.当中有一本<程序猿修炼之道:专业程序猿必知的33个技巧>.由于这本比較薄,所以先翻着看. 这本书有别于其它的技术书籍,事实上算不上一本技术书籍.它不是教你 ...
- ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前
原文:ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前 背景 当数据量大.查询条件复杂,多样多的时候,我们可能需要单独做一个查询界面,当用户选择设置了相关的 ...
- 用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)
用PopupWindow实现弹出菜单是一个比较好的方式.当然我们还有一个类PopupMenu也能实现弹出菜单,但那个太过于局限了,所以不是很推荐. 这个实例的效果是这样的:点击按钮后,一个菜 ...
随机推荐
- 9 C. Hexadecimal's Numbers
题目链接 http://codeforces.com/contest/9/problem/C 题目大意 输入n,计算出n之内只有0和1组成的数字的数量 分析 k从1开始,只要小于n,就给sum++,并 ...
- 关于scanf,gets
1.用了gets后,假如你没有输入任何东西直接[enter],它将执行下一条命令 2.用了scanf后,直接按了[enter],它将换行并等待你的输入,直到你输入非[enter],再执行下一条命令. ...
- ASP.NET Core 2.0 : 一. 概述
为什么要使用 ASP.NET Core? .NET Core 刚发布的时候根据介绍就有点心里痒痒, 大概看了一下没敢付诸于行动, 现在2.0发布了一段时间了, 之前对其"不稳定" ...
- rabbitmq的构架和原理(三)
前面两篇博文已经将环境安装和相关配置介绍了,现在开始正式学习rabbitmq的使用了: rabbitMQ的构架 rabbitmq作为消息队列,一条消息从发布到订阅消费的完整流程为: 消息 --> ...
- libGDX-wiki发布
为方便大家学习和访问,我将libgdx的wiki爬取到doku-wiki下,专门建立了以下地址.欢迎大家来共同完善. http://wiki.v5ent.com
- My Calendar III
class MyCalendarThree(object): """ Implement a MyCalendarThree class to store your ev ...
- FTP配置之 chroot_list 用户切换文件夹
FTP配置文件vsftpd.conf关于限制用户在默认目录的配置,涉及到三个字段:chroot_local_user,chroot_list_enable,chroot_list_file. 我们按顺 ...
- iOS-硬件授权检测【通讯录、相机、相册、日历、麦克风、定位授权】
总结下几个常用到的获取手机权限,从iOS8以后,获取手机某种权限需要在info.plist文件中添加权限的描述文件 <key>NSContactsUsageDescription</ ...
- 原生JS实现图片轮播
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Spring整合JMS(一)-基础篇
1.基础知识 图1 同步通信和异步通信通信过程示意图 RMI使用的是同步通信,JMS使用的是异步通信.从图1可以看出异步通信的好处就是减少了不必要的等待,提高了效率. JMS中有两个主要的概念:消 ...