赖勇浩(http://laiyonghao.com)程序员
最近,有一位朋友由于工做须要,须要从网游的客户端编程转向服务器端编程,找我推荐一本书。我推荐了《Linux 多线程服务器端编程——使用 muduo C++ 网络库》给他,他在网上书店看了之后问我为何推荐这么厚一本书给他,正好这本书我已经早就看完了,一直也想写篇“书评”,就在这里多扯几句。其实实在算不上书评,缘由有二:一是读书的时候囫囵吞枣,理解不够深入,不深入天然不能评;二是这几年虽然在 Linux 下写服务器端的网络程序,但不多用多线程,也不多用 C++,书里谈的东西,算是不熟悉的领域,天然也不能乱评。因此今天这篇,应当是推荐,是为陈硕老师背书。web
这本书展现了使用 C++、多线程进行网络编程的许多最佳实践,甚至称为标准作法也不为过。好比当谈到 C++ 的内存管理问题的时候,以“不配对的 new[]/delete”为例,用“把 new[] 通通替换为 std::vector/scoped_array”为解决方案,提出使用“智能指针”解决大部份内存问题,堪称金玉良言。又好比当谈到“如何限制并发链接数”时,做者直接引用了 libev 做者 Marc Lehmann 提出的几个方案,并另外给出一个更为简单的方案。编程
这些最佳实践的意义在于,当你读完了 APUE 和 UNP,却发现本身写出来的网络程序彻底不堪商用,而后花费了许多日日夜夜修补业务漏洞、内存泄漏、并发性能,勉强支撑了公司业务之后,读到此书时那种相见恨晚的感受。你会发现虽然本身身经百战,可是仍然可以从书中找到本身彻底不了解的“常识”;对你来讲,也许最大的欣慰就是以为之后团队新人终于有一本实践指南,可让新人快速成长起来,不用再一次趟过你已经趟过的坑。服务器
这本书展现了好的代码,特别是好的 C++ 代码。历来不缺少 C++ 的批评之声,可是 C++ 应当怎么用,如何写 C++ 才是现代的、真正的 C++,在此书以前,几乎历来没有成体系的讲法。我参与过一些 C++ 项目的编程,也见过许多技术负责人一边视 boost 为洪水猛兽,甚至对 STL 也避之不及,却又一边自行制造一样目的、质量差强人意的山寨版轮子。做者很是理性地看待 C++,约束本身对其特性的使用,并提出“朴素的 C++ 设计”理念,在编程中挑选 boost 库中久经考验的、优秀的子库善加应用,好比“使用 boost::function 和 boost::bind 取代虚函数”,减小代码的同时得到很是可靠的代码质量,是很是值得咱们学习借鉴的。网络
这本书展现了基础的重要性。直接读,能够发现不少章节讲的内容均可以说是常识,可是做为一名久经考验的程序员,能够说,我以为这里面讲的常识都是“一不留神坑死你”的。好比“shared_ptr 技术与陷阱”一节中,做者提到析构的线程不必定是是对象诞生的线程,个人膝盖就中过一箭。当时我为一个动做游戏编写非玩家角色的人工智能,在游戏中,大部分 CPU 资源都被用在图形渲染上,留给人工智能的资源很是有限,我又要作计算量超大的团队人工智能,因此很“卡”。后来的优化方案是把内存释放操做放到另外一条线程去执行,虽然当时没有使用 shared_ptr,但由于问题的缘由和解决方案都是同样的,若是咱们当时都读过这本书,应该不会踏入这个坑。若是有出身草莽的野路子程序员,读一下这本书,应该仍是大有补益的。多线程
这本书展现了对业务理解的重要性。不管是 muduo 库,仍是这本书,都没有想作到面面俱到。对于 muduo,做者追求的是完成业务领域的需求,并压榨硬件的极限;对于这本书,做者讲求的是“经验与实践”,并无把这本书写成枕头书,而是把“应当注意的、我这样作的理由”讲得通透。说老实话,读这本书,感受到做者就像一对一的培训那么贴心。并发
虽然我从 2013 年起,以 web 开发和团队管理工做为主,已经不写基于 TCP 协议的服务器端程序,甚至“几乎不使用 C++”三年了,但阅读这本书仍然极有意义:一是理解 Linux 关于网络方面的新特性,这一块对我如今作基于 HTTP 协议的开发工做也是极有帮助的;二是理解多线程的最佳实践,其实工做中免不了多少要跟多线程打交道,掌握这方面的最佳实践,在遇到使用场景时,能够立刻给出“没大错”的方案;三是理解 C++,跟上它的发展,这对于我编写、学习其它编程语言也极有指导意义。固然,对于我朋友这种从客户端转过来服务器端的程序员来讲,最重要的是可以快速地写出“正统的”服务器端代码了。