“孔子晚而喜易……读易,韦编三绝”。——《史记·孔子世家》
在陪老婆产检的漫长等待中,我快速地读了借来的这本书,读到泛型部分,大概接近全书一半。不过我知道,多数新特性都在后面,内容还挺多。之所以前面读得比较快是因为早年确实已经看过C#语言,本身不是初学,因而很多东西只是复习一下,一带而过。但有的地方,比如中间语言代码部分还是读得很慢,大部分时间都花在了这上面。诚如一些读者所说,这真的是绝无水分的干货一本。不论你对语言本身了解程度有多深,里面的每一句话都很值得认真去读:知道的加深印象,不知道的仔细思考。本身已经是笔记,以至于再记笔记都显得多余。常有读书“先厚再薄”之说,显然,不是说这本的,这本是已经被读薄了之后的。我觉得,这本书最大的特点是既有基本知识概念,又有心得体会,还进一步深入到C#的背后,介绍了语言背后,Dotnet这个强大的后盾。从我个人的读书体会来说,这样的书才是好书,值得购买、收藏。尽管技术书籍的寿命确实都不长,毕竟,技术日新月异嘛。
************繁忙的分割线 ********************
今天陪老婆加班,又带着这本书,继续上次未完的内容。今天虽然时间不长,但是有比较安静的环境,因此收获还是蛮多的,今天看到了lambda表达式的开头部分。
我想我大致可以总结这本书有这么几个特色。
1、难度层次非常明显
从全书来说,一开始是基础,后面全是讲具体的特性,这样的分明的层次可以让一些有基础的读者能够快速阅读已知的部分,或者直接跳过这些部分,省下很多时间。 从每一个特性的来说,从特性的发展历史条件、目的开始中间;讲特性的使用方法、适用场景、注意事项,有时还有通其它方法的比较;后面加入一些对编译器实现细节的说说明,看看IL反汇编的结果。这样能够让不同层次的读者根据自身的情况进行选择。比如我,对于熟悉的特性,我可能会关心IL到底是个神马情况,而那些我不熟悉的特性,本身理解新东西就需要精力和时间以及实践过程,对编译器到底是作了什么处理也就不是很在意了。也许以后会关心,谁知道呢?
2、重现技术演进的过程
新技术不是凭空设计出来,它的出现总有原因而非说不清的因缘际会。之前的各种问题和困难促成了这个新技术的出现。C#本身就是借鉴各种语言和编程方法出现的,后来的各种新特性也仍旧让这个曾经 饱受争议的语言不断焕发新的活力。如果一个人要是直接接触泛型、Linq,免不了一头雾水——这些东西发明来干嘛的?真的有必要么?
本书的一大特点就是将C#的这些特性整个串了起来:有了委托才方便事件处理,也才有对匿名函数的需求,才会发展到lambda表达式,出现了异于常规语法形式的Linq。不得不说,这些特性有了作者这样承前启后的串联之后,整个来龙去脉就清晰多了。看过之后,如同伴随这门语言一路成长起来的老手的感觉,而不是刚刚初学乍练的学徒。当然,高手的路还很长,需要实践历练,但精神上,有了共同的经历。
在讲解有历史延续性的特性时,分别使用不同的版本来实现以说明新特性的意义是让人印象深刻的好办法。不仅仅是证明新特性的优势,也说明体现了这个语言的发展趋势——C#的编译器一直在做的就是减少开发人员的工作量,让编写代码更“简单”。(简单只是一个侧面,因为新人再来,门槛就高了)
3、不只告诉你正确答案
学习的过程是一个不断顿悟的过程。所谓的渐进微观上也是量子化的,当这些微小的顿悟积累到一定程度,就可以算是掌握了某种知识。但这个过程,那些曾经困扰我们的点点滴滴在我们回顾学习过程的时候都消失了,好像这些东西我们出生时就掌握了,看到那些还在摸门的人,我们只能着急。顿悟这事,只能自己搞定么?是的,只能靠自己,但有前人的指点,会更快地达到。只是那些已经“知道”的人可能已经忘了自己是怎么“知道”的了。而要命的是,这些人写了书,只会告诉你所有正确的东西。他们书写的东西无比正确,以至于你只能端着书本敲示例代码,放下书本,面对的全是各种错误提示。
我觉得一本好书,除了要告诉我们哪里是正确的方向之外,还应该告诉我们哪里有坑,需要绕过去。更重要的是,还要写上掉到坑里之后,如何自救。好吧,我说的就是常犯的错误,以及对于错误提示肯能是因为那些错误引起的。在本书中,我看到了各种在理解过程中因为片面理解可能出现的错误和对应的错误提示。我想,作者恐怕也在那里跟他们死磕了不少时间吧。
时间就是生命。感谢作者把这些记录下来,避免了后来人继续浪费生命。其实,学习别人的错误比学习别人的成功更有意义,是吧?
************啰嗦的分割线 ********************
有个流行句式,说重要的事情要说三遍。为什么要说三遍?第一,重复表示强调,说明这事情真的重要;第二,重要的事情你要记在脑子里,重复可以强化记忆;第三,我没想出来。
我想,好书也应该多读几遍。鉴于大家时间有限,书也太多,看太多次也不太可能。也跟个流行,读三遍吧。
第一遍,整个翻一遍,当然对于已经有知识结构树或者知识框架的内容,看目录就够了。这一遍基本上就是要确定第二遍要看的内容。我把内容大致分三类: 1, 已经知道的内容,对于我,这部分内容就是C#的基本语法和周边的知识; 2, 不知道和不明白但是想想能明白的内容,对于我,一些新特性,和我已经知道的特性的实现细节内容; 3, 怎么想也想不明白的内容,对于我来说,可能就是一些编译器如何具体实现的的部分。
一般来说,一本书对于特定一个读者,内容总是可以分成这三类。第一类内容看看可以加强印象,但不值得浪费太多时间,多看无所增益。第二类内容是重点,一本书对你来说第二类内容越多,说明这书越适合你。所以第二遍就是把你能读懂的地方读懂,能吃透的地方吃透。第三类内容,怎么看也看不明白的,要么就是经验不足,要么就是经历不够,要么就是知识上缺环。在不具备理解条件的时候,在上面花再多时间,未必不能有点收获,但从效率上讲,得不偿失。我相信,书读百遍,其义自见,问题是,你有这么多时间么?
所以,我所说的第三遍,就是隔上一段时间,让自己有时间对新内容有更深一层的认识和理解之后,再加上一定的实践,第三类内容就不再是怎么看也看不懂的了。毕竟,那又不是天书。
对于李志的这本书《Learning hard C#学习笔记》,我现在相当于在读第二遍,个人以为非常值得使用C#的同志收藏,当作C#历史看也好啊,呵呵。只是希望第二版的时候别再有漏掉图片这么严重的问题了。