妙评

妙评

好书要读三遍——《Learning hard C#学习笔记》读后感

作者/ 袁国涛

袁国涛 交通专业出身,技术爱好者,侧重GIS、虚拟现实及可视化方向,长期京漂。

{%}

《Learning hard C#学习笔记》是一本面向C#初学者的实用教程,由浅入深地讲解了C#的基础语法和重要特性,分析了在开发中必须掌握的技术要领和经验心得。语言浅显易懂、轻松幽默,通过精心选择的实例和详尽的代码全面介绍了C#最具特色的关键知识点,有助于初学者迅速从一个C#开发的门外汉成长为全面掌握技术要领的开发人员。

“孔子晚而喜易……读易,韦编三绝”。

——《史记·孔子世家》

在陪老婆产检的漫长等待中,我快速地读了借来的这本书,读到泛型部分,大概接近全书一半。不过我知道,多数新特性都在后面,内容还挺多。之所以前面读得比较快是因为早年确实已经看过C#语言,本身不是初学,因而很多东西只是复习一下,一带而过。但有的地方,比如中间语言代码部分还是读得很慢,大部分时间都花在了这上面。

诚如一些读者所说,这真的是绝无水分的干货一本。不论你对语言本身了解程度有多深,里面的每一句话都很值得认真去读:知道的加深印象,不知道的仔细思考。本身已经是笔记,以至于再记笔记都显得多余。常有读书“先厚再薄”之说,显然,不是说这本的,这本是已经被读薄了之后的。我觉得,这本书最大的特点是既有基本知识概念,又有心得体会,还进一步深入到C#的背后,介绍了语言背后,Dotnet这个强大的后盾。从我个人的读书体会来说,这样的书才是好书,值得购买、收藏。尽管技术书籍的寿命确实都不长,毕竟,技术日新月异嘛。

今天陪老婆加班,又带着这本书,继续上次未完的内容。今天虽然时间不长,但是有比较安静的环境,因此收获还是蛮多的,今天看到了lambda表达式的开头部分。

我想我大致可以总结这本书有这么几个特色。

难度层次非常明显

从全书来说,一开始是基础,后面全是讲具体的特性,这样的分明的层次可以让一些有基础的读者能够快速阅读已知的部分,或者直接跳过这些部分,省下很多时间。

从每一个特性的来说,从特性的发展历史条件、目的开始中间;讲特性的使用方法、适用场景、注意事项,有时还有通其它方法的比较;后面加入一些对编译器实现细节的说说明,看看IL反汇编的结果。这样能够让不同层次的读者根据自身的情况进行选择。比如我,对于熟悉的特性,我可能会关心IL到底是个神马情况,而那些我不熟悉的特性,本身理解新东西就需要精力和时间以及实践过程,对编译器到底是作了什么处理也就不是很在意了。也许以后会关心,谁知道呢?

重现技术演进的过程

新技术不是凭空设计出来,它的出现总有原因而非说不清的因缘际会。之前的各种问题和困难促成了这个新技术的出现。C#本身就是借鉴各种语言和编程方法出现的,后来的各种新特性也仍旧让这个曾经 饱受争议的语言不断焕发新的活力。如果一个人要是直接接触泛型、Linq,免不了一头雾水——这些东西发明来干嘛的?真的有必要么?

本书的一大特点就是将C#的这些特性整个串了起来:有了委托才方便事件处理,也才有对匿名函数的需求,才会发展到lambda表达式,出现了异于常规语法形式的Linq。不得不说,这些特性有了作者这样承前启后的串联之后,整个来龙去脉就清晰多了。看过之后,如同伴随这门语言一路成长起来的老手的感觉,而不是刚刚初学乍练的学徒。当然,高手的路还很长,需要实践历练,但精神上,有了共同的经历。

在讲解有历史延续性的特性时,分别使用不同的版本来实现以说明新特性的意义是让人印象深刻的好办法。不仅仅是证明新特性的优势,也说明体现了这个语言的发展趋势——C#的编译器一直在做的就是减少开发人员的工作量,让编写代码更“简单”。(简单只是一个侧面,因为新人再来,门槛就高了)

不只告诉你正确答案

学习的过程是一个不断顿悟的过程。所谓的渐进微观上也是量子化的,当这些微小的顿悟积累到一定程度,就可以算是掌握了某种知识。但这个过程,那些曾经困扰我们的点点滴滴在我们回顾学习过程的时候都消失了,好像这些东西我们出生时就掌握了,看到那些还在摸门的人,我们只能着急。顿悟这事,只能自己搞定么?是的,只能靠自己,但有前人的指点,会更快地达到。只是那些已经“知道”的人可能已经忘了自己是怎么“知道”的了。而要命的是,这些人写了书,只会告诉你所有正确的东西。他们书写的东西无比正确,以至于你只能端着书本敲示例代码,放下书本,面对的全是各种错误提示。

我觉得一本好书,除了要告诉我们哪里是正确的方向之外,还应该告诉我们哪里有坑,需要绕过去。更重要的是,还要写上掉到坑里之后,如何自救。好吧,我说的就是常犯的错误,以及对于错误提示肯能是因为那些错误引起的。在本书中,我看到了各种在理解过程中因为片面理解可能出现的错误和对应的错误提示。我想,作者恐怕也在那里跟他们死磕了不少时间吧。

时间就是生命。感谢作者把这些记录下来,避免了后来人继续浪费生命。其实,学习别人的错误比学习别人的成功更有意义,是吧?

有个流行句式,说重要的事情要说三遍。为什么要说三遍?第一,重复表示强调,说明这事情真的重要;第二,重要的事情你要记在脑子里,重复可以强化记忆;第三,我没想出来。

我想,好书也应该多读几遍。鉴于大家时间有限,书也太多,看太多次也不太可能。也跟个流行,读三遍吧。

第一遍,整个翻一遍,当然对于已经有知识结构树或者知识框架的内容,看目录就够了。这一遍基本上就是要确定第二遍要看的内容。我把内容大致分三类:1,已经知道的内容,对于我,这部分内容就是C#的基本语法和周边的知识;2,不知道和不明白但是想想能明白的内容,对于我,一些新特性,和我已经知道的特性的实现细节内容;3,怎么想也想不明白的内容,对于我来说,可能就是一些编译器如何具体实现的的部分。

一般来说,一本书对于特定一个读者,内容总是可以分成这三类。第一类内容看看可以加强印象,但不值得浪费太多时间,多看无所增益。第二类内容是重点,一本书对你来说第二类内容越多,说明这书越适合你。所以第二遍就是把你能读懂的地方读懂,能吃透的地方吃透。第三类内容,怎么看也看不明白的,要么就是经验不足,要么就是经历不够,要么就是知识上缺环。在不具备理解条件的时候,在上面花再多时间,未必不能有点收获,但从效率上讲,得不偿失。我相信,书读百遍,其义自见,问题是,你有这么多时间么?

所以,我所说的第三遍,就是隔上一段时间,让自己有时间对新内容有更深一层的认识和理解之后,再加上一定的实践,第三类内容就不再是怎么看也看不懂的了。毕竟,那又不是天书。

对于李志的这本书《Learning hard C#学习笔记》,我现在相当于在读第二遍,个人以为非常值得使用C#的同志收藏,当作C#历史看也好啊,呵呵。只是希望第二版的时候别再有漏掉图片这么严重的问题了。

《Python Web开发:测试驱动方法》读后感

{%}

作者/ 黄峰达

毕业于西安文理学院电子信息工程专业, 现就职于ThoughtWorks。长期活跃在各开源软件社区和技术交流社区,目前专注于物联网和前端。是CSDN博客专家、InfoQ物联网周报编辑,《Learning Internet of Things》英文版审阅者,并著有电子书《一步步搭建物联网系统》、《Github漫游指南》。

{%}

《Python Web开发:测试驱动方法》手把手教你从头开始开发一个真正的Web应用,并且展示使用Python做测试驱动开发(TDD)的优势。你将学到如何在开发应用的每一个部分之前先编写和运行测试,然后再编写最少量的代码让测试通过。也就是说,你将学会应用TDD理念,写出简洁可用、赏心悦目的代码。

这本书的原名是叫Test-Driven Development with Python,小标题是 Obey the Testing Goat: Using Django, Selenium, and JavaScript。虽然有点难以理解为何这本书的中文名变成了《Python Web开发:测试驱动方法》,总感觉怪怪的,毕竟Kent Beck的那本书名是《测试驱动开发》。

如我在微博上所说,这本书的Python Web开发所用的框架是Django。问了几个出版社都没有出版Django书的计划,要知道有这么多公司使用了Django:

{%}

尽管最近几年里Flask似乎比Django受欢迎,但是Django是一个设计得非常巧妙的框架。而且,越来越多的公司开始使用Django替换他们原有的系统,如Firefox所在的Mozilla。吐槽完毕,让我们进入正题。

书的作者在一家使用敏捷开发的软件公司里

如果你想(复制一下小结):

1. 学习自动测试(针对Developer)

2. 测试驱动开发

3. 持续交付

那么,这本书是非常值得看的。

测试

这本书的主要话题自然是测试了。

TDD(测试驱动开发)

传统的软件公司的测试和开发是分离的,这就意味着你并不需要写你的功能测试。由于,没有在那样的公司工作过,我也不知道他们是否写单元测试。反正我所在的公司,单元测试和功能测试都是要写的。但是,我相信他们需要有个三次握手的过程:

{%}

这就有点像开发团队和产品团队在互相推诿责任,“你们的需求实现不了”,“你们开发的东西有问题”。对于产品来说,最好的过程莫过于产品团队和开发团队一起开发实现功能。同比,如果你的测试和产品代码是分开写的,如果你不打算改变现状、走出舒适区或者尝试新的东西,那么你不需要TDD,你也不需要这本书。

So,这本书的大部分内容都是关于如何展开TDD的。

自动测试

现在,有一个新的项目来了,客户想到一个TO-DO List。TDD的第一要素是测试,所以先用Selenium来了一个单元测试,用于测试首页是存在的,并且标题中含有Django。

from selenium imoprt webdriver

browser = webdriver.Firefox()
browser.get('http://localhost:8000')

assert 'Django' in browser.title

你可能已经猜到结果了,这个测试必须是挂的。如果你没有用到Selenium这样的自动测试工具,你应该试试,它会在你运行的时候,自动打开浏览器。

{%}

因为Web服务并没有启动,所以你需要用django-admin.py去创建一个项目,然后就是经典的Hello,World。

如果你写过Java或者Python等等的测试,你可能已经猜到了。你写的测试都会自动的执行下去,所以他会把这些任务一个个跑一遍。并且,是由机器来执行:

1. Selenium会打开一个浏览器窗口,打开某个页面,输入表单信息,然后点击确认,最后验证信息是不是正确的。

2. Selenium会打开一个浏览器窗口,打开某个页面查看页面的标题是不是正确的。

3. Selenium会打开一个浏览器窗口,并按照你的需要点击页面的某个button,然后检查页面是不是会出现类似的东西。

{%}

而你并没有实现这些功能,所以你需要去实现他们。

然后这本书就在重复上面的过程,过程中你学会了怎么使用Django。但是,你并不会意识到这其中的美妙之处。

红-绿-重构

实现上,我们在重复的过程是:红-绿-重构。

通常来说,红的原因是因为我们依据客户需求编写测试用例。接着,通过让测试变绿(成功),我们就知道我们实现了这个功能。如果你的功能代码写得很好,那么你不就需要去重构代码了。所以,其实重构代码的前提是你已经有了测试,而TDD就是在保证你有测试来cover功能代码。

所以,如果你所在的项目之所以没有人敢重构,就是因为测试覆盖率不够。

测试小结

接着,作者对实践过程中遇到的问题进行了一些总结。如测试速度、拆分测试、什么时候使用集成测试(书中翻译为整合测试),这些小结相当重要。像在我们的项目中,运行所有的测试大概要半个小时,这期间不断跳到的Firefox浏览器(~10个)会夺走你对电脑的使用权。

好了,这本书2/3的话题已经完了。

持续交付

这是这本书另外1/3的话题划分到了持续交付这样的话题,当然这只是我对他们的总结。

持续交付意味着几个话题,如持续集成、持续发布、自动部署,所以书中提到了几个不错的软件:

1. Fabric,一个用于自动部署的工具 —— Python语言。

2. HTTP服务器Nginx。

3. WSGI服务器Gunicorn

4. Jenkins,持续集成(CI)。虽然我们项目上用的是Bamboo,但是他们都是持续集成构建服务器软件。这意味着,在你PUSH代码后,在CI上会安装依赖、运行测试、发布版本等等。

(ps: 我的博客就是 Django + Nginx + Gunicorn + Mezzanine (CMS) + Fabric (Mezzanine自带),但是没有Jenkins)

忘说了,上面的所有内容都是敏捷的开发流程。

小结

So,So,如果你想:

1. 学习自动测试

2. 测试驱动开发

3. 持续交付

那么,这本书是非常值得看的。

如果你不感兴趣,那么就送给我吧。