15年11月19日,我打开了一个不常用的邮箱,看到了2天前编辑给我发的邮件,问我想不想写本Python相关的书。

那个时候正是我的黑暗期,一个专注写代码几年的人开始做一些管理工作,一方面要学习,要转换思想,一方面心情也不好,每天就是在处理各种杂事,别说是技术进步了,哪怕把事情考虑周全的时间都没有。每天
一个人当成2个人来用,操碎了各种心,很累。

对于我这种写代码的,甚至都不善于逗小孩笑的程序员,总想给女儿点不一样的礼物。希望我带给她一些精神上的帮助。看到邮件的一瞬间,我就想象女儿长大之后,对其他人说:喏,那是我爸写的书,给我做生日礼物…

就是这2个理由。我决定写这本书。

12月4日,我提交的大纲顺利通过审核。

12月6日,CODE真的开源了,喜大普奔。我靠着情怀坚持做完了。CODE那段时间上了Github Trending,我很欣慰,虽然一切都太晚了。

接下来的20多天里面,我正忙着弄CODE开源的事情,只是在构思这本书都要有什么内容,并没有下笔。我天真的觉得同时可以把2件事做好,但是后来发现时间完全是不够的,所以我停止的CODE的进一步的迭代。其他的原因是豆瓣已经决定迁移到Github企业版,我一个人并无力改变什么,如果公司自己都不用,那开源的就没有意义了。再则我也受到了厂内很多质疑和嘲讽,心碎。

一些写书的介绍可以看这篇专栏《写一本技术书籍》,并建议大家关注这个专栏,近期将有一大波文章要在专栏发呢。

专栏有些结论先发出来:

  1. 开始写书是在圣诞节左右,结束时间是8月15日。也就是差不多240天。
  2. 写这本书能让我挣2W多,嗯,时薪23块钱。

现在开始介绍这本书。

谁应该看本书

看书名可知这是一本Web开发相关的书,但事实上里面有大概一半的内容其实是Python工程师都能用到的。我对书的受众的理解是:

  1. Web开发者
  2. 运维开发
  3. 想提高Python技能的开发者
  4. 其他想了解Python Web开发的其他开发者

需要注意,阅读本书需要有一定的Python基础,因为书中没有基础语法教程,如果你之前没用Python写过程序阅读起来可能会受到影响。

为什么值得看

我阅读过大量和Python有关的纸质书和开源图书,渐渐学到了很多控制自己“剁手”买书的方法。我来分析一下为什么你值得拥有本书。:)

为什么要买书来看?我认为不外乎两个原因:有趣和能学到东西。技术书肯定不会太有趣,那么最重要的就是能学到东西。市面上Python相关的书相当多,但是有些内容陈旧或者不符合国情,经常能看到并非开发第一线的人写或者翻译的书,这些书显然价值就要低一些;其次是同质化和向入门级别靠拢,我个人认为市面上关于Python入门或者教授语法知识的书不少,而再深入一点的就很匮乏了。

本书有几个特点: 第一,使用了当前主流和前瞻性的技术,如Docker、Ubuntu 16.04 LTS、Cython、CFFI、Py.test、asyncio、IPython 5.0 LTS等,书中一部分内容是在Python 3下完成的。本书中全部工具都使用当前最新版,能保证在相当长的时间内书中的内容都不会过时。 第二,笔者在国内应用Python最大的豆瓣网做产品开发,一直在第一线写代码,大量例子和经验都是根据实际经验出发的。 第三,笔者非常关注Github和Python社区,会第一时间了解到新的趋势和思想,并在书中体现。举个例子,代码检查工具pep8已经在Guido van Rossum的要求下改名为pycodestyle了。

叔本华在《人生的智慧》中说过一段话,大意是人要么庸俗,要么孤独。笔者认为这个道理在阅读上面也成立:读什么样的书,就会逐渐成为什么样的人。本书提供了很多笔者在其他书中没有看到过的思考方式和Python的用法,这也是本书存在的意义。

本书涵盖的内容

第一章.「初识Python Web开发」

将回答Python工程师关心的如下3个问题:

  1. 为什么应该选择Python作为Web开发语言?
  2. 在Python 2和Python 3之间如何选择?
  3. 在这么多的Python Web框架中哪些是主流的,它们的特点是什么,该如何选择?

第二章. 「Web开发前的准备」

  1. 环境的准备,以便读者能够使用Vagrant或者Docker提供的Ubuntu环境运行书中的例子。
  2. 介绍包管理工具pip及一些高级用法。
  3. 实现PYPI的缓存代理和完全镜像。
  4. 使用virtualenv及其扩展实现虚拟环境管理。

第三章. 「Flask Web开发」

  1. 通过多个应用例子了解Flask框架使用的一些精髓。
  2. 介绍目前最流行的模板引擎Jinja2和Mako的使用,以及实践总结和做选择时的建议。
  3. 通过一些例子让读者熟悉MySQLdb的使用,并演示如何和Flask应用集成。
  4. 通过源码帮助读者理解Flask的上下文设计,并演示大型应用中使用上下文钩子的例子。
  5. 通过一个真实的案例学以致用。先分析需求,接着从零开始实现一个文件托管应用。

第四章. 「Flask 开发进阶」

  1. Flask的信号机制。利用信号可以实现一部分的业务解耦。
  2. Flask的一些常用、主流的扩展,如Flask-Script、Flask-DebugToolbar、Flask-Migrate、Flask-WTF、Flask-Security、Flask-RESTful、Flask-Admin和Flask-Assets。每个扩展都包含至少一个完整的真实例子。
  3. Flask的依赖库Werkzeug的使用。

第五章. 「REST和Ajax」

  1. 帮助读者理解REST。
  2. 学习如何设计一个合理、好用、符合标准的API。
  3. 使用jQuery和fetch分别完成一个前后端交互的Ajax应用。

第六章. 「网站架构」

  1. 了解WSGI协议。
  2. 主流的Python应用服务器的特点和使用方法。
  3. 使用Nginx和Python应用服务器部署Flask应用。
  4. 介绍豆瓣开源的Libmc和豆瓣常用的缓存使用方式。
  5. 举例说明Redis的几个应用场景,包含使用MessagePack进行序列化和反序列化工作。
  6. 介绍使用NoSQL的原因和场景。
  7. 使用pymongo,并用Mongoengine重构文件托管服务的模型。
  8. MongoDB索引、高可用和分片的经验。
  9. 以豆瓣的基础架构为原型,展示主流大型网站的架构模式,并详细介绍相关重要模式,以及Web前端的性能优化经验。

第七章. 「系统管理」

  1. 使用Supervisor管理进程。
  2. 使用Fabric进行应用部署。
  3. 通过部署Redis了解配置管理工具SaltStack和Ansible。
  4. 使用Psutil获取系统CPU、内存、硬盘和网络等信息。
  5. 配图演示Sentry的安装和收集错误信息的效果。
  6. 使用StatsD、Graphite、Diamond和Grafana搭建Web监控,并介绍常见的运维监控工具及其主要应用场景。

第八章. 「测试和持续集成」

  1. 介绍和使用Python内置测试模块unittest和doctest。
  2. 介绍和使用第三方测试工具py.test和mock。
  3. 深入持续集成,并通过Buildbot实际地对一个Github项目进行集成。

第九章. 「消息队列和Celery」

  1. 使用Beanstalkd。
  2. 解释AMQP,深入理解RabbitMQ,介绍RabbitMQ插件系统,RabbitMQ集群的故障转移方法等。
  3. 介绍Celery的架构,运行起一个真实的应用,在Flask应用中使用Celery等功能。
  4. 深入Celery,介绍Celery的依赖及独立用法、Worker管理、监控等高级功能。
  5. 笔者总结的一些Celery实践经验。

第十章. 「服务化」

  1. 为什么需要服务化。
  2. 使用Thrift对文件托管服务改造。
  3. 介绍豆瓣服务化实践——PIDL的起因、基本原理和基本架构。

第十一章. 「数据处理」

  1. 使用纯Python代码实现MapReduce功能。
  2. 配置DPark环境,深入了解DPark,演示如何用DPark对业务日志进行PV和UV的分析。
  3. 通过发送带有样式和附件的邮件,创建包含带样式和Sparkline图表的xlsx文件,以及创建包含多工作表和4. 图表的xlsx文件这三个有用的例子,展示笔者对数据报表的理解和运用。
  4. 基于数据报表中的数据,用Pandas进行分析和展示。

第十二章. 「帮助工具」

  1. 解释为什么应该使用IPython,配置IPython、调试复杂代码、并行计算等。
  2. 介绍Jupyter Notebook的用途,配置Jupyter Notebook,在Notebook里使用Echarts自定义JavaScript和CSS样式等高级功能。
  3. 介绍常用的获得Linux服务器相关情况的工具。
  4. 介绍性能测试工具Boom和tcpcopy,并演示如何搭建一个tcpcopy环境。
  5. 介绍分析Python程序性能瓶颈的工具。
  6. 演示如何定制基于IPython的交互解释环境。
  7. 演示豆瓣东西在2014年双十一进行的Jupyter Notebook实践。

第十三章. 「Python并发编程」

使用多线程、多进程、Gevent、Future和asyncio这五种方式实现一个爬取微信公众号的抓取。其中还揭秘了一些写爬虫的经验。尤其是告诉读者如何选择并发方式。

第十四章. 「Python进阶」

  1. 介绍errno、subprocess、contextlib、glob、operator、functools、collections模块的使用方法。
  2. 笔者对《Python之禅》的理解。
  3. 笔者总结的一些Python实践经验,并列举了两篇最佳实践的文章。
  4. 介绍一些Python 3的有用功能,并移植到Python 2。
  5. 通过真实的例子演示如何使用CFFI/Cython编写Python扩展,并对比二者的执行效率。
  6. 演示使用PyObjC发送通知的例子,让开发者收到的通知更有针对性。

第十五章. 「Web开发项目实践」

  1. 介绍笔者的Web项目开发流程和经验。
  2. 介绍开源的代码质量保证工具,以及豆瓣的一些质量保证实践。
  3. 使用AST对真实的业务逻辑做静态检查,实现业务流程的检查。
  4. 谈谈代码评审的意义和实际经验。

PS: 本书还有其他惊喜,我就不打广告了。感谢大家支持,也希望通过本书能让你有所收获。