赖勇浩(http://laiyonghao.com)

最近,有一位朋友因为工作需要,需要从网游的客户端编程转向服务器端编程,找我推荐一本书。我推荐了《Linux 多线程服务器端编程——使用 muduo C++ 网络库》给他,他在网上书店看了以后问我为什么推荐这么厚一本书给他,正好这本书我已经早就看完了,一直也想写篇“书评”,就在这里多扯几句。其实实在算不上书评,原因有二:一是读书的时候囫囵吞枣,理解不够深刻,不深刻自然不能评;二是这几年虽然在 Linux 下写服务器端的网络程序,但很少用多线程,也很少用 C++,书里谈的东西,算是不熟悉的领域,自然也不能乱评。所以今天这篇,应当是推荐,是为陈硕老师背书。

这本书展示了使用 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++,跟上它的发展,这对于我编写、学习其它编程语言也极有指导意义。当然,对于我朋友这种从客户端转过来服务器端的程序员来说,最重要的是能够快速地写出“正统的”服务器端代码了。

推荐《Linux 多线程服务器端编程》相关推荐

  1. 《通信革命-无线带宽如何改变我们的世界》推荐!

    推荐一本古老的书,2000年的神书<Telecosm:How Infinite Bandwidth Will Revolutionize Our World>,中文版为<通信革命-无 ...

  2. 嵌入式开发模拟红外测距仪---UDP通信实现无线装置

    嵌入式开发疫情期间的模拟工作-UDP通信实现无线装置 嵌入式开发模拟红外测距仪 这学期学习嵌入式开发,由于没有硬件设备,因此课程主要由模拟构成 主要是通过UDP实现服务端和客户端的交互,客户端向服务端 ...

  3. 开吃吧无线订餐机 改变餐饮O2O外卖行业

    本文讲的是开吃吧无线订餐机 改变餐饮O2O外卖行业,北京一家中式快餐厅一到中午便忙的不可开交,收银员一边要为堂吃客点餐,一边要去给客人端茶送水,送外卖的伙计也不停的进进出出,堂吃生意风风火火,外卖生意 ...

  4. 它们改变了整个世界 盘点50个最伟大的游戏创意

    它们改变了整个世界 盘点50个最伟大的游戏创意 http://game.dbw.cn 2013-01-31 08:40:26 进入游戏论坛 http://game.dbw.cn/system/2013 ...

  5. 智能可穿戴设备改变移动支付世界

    智能可穿戴设备改变移动支付世界 2015-10-22 11:08 中关村在线 字号: 随着各大巨头公司生产出自家的智能设备之后,开始不满足就这单一市场,所以巨头目前都在移动支付领域竞相出招,希望能在这 ...

  6. 罗永浩曾经深刻地改变过这个世界

    罗永浩的一举一动都会成为头条,就算如今低调到微博只剩转发了,几乎一声不吭,也会有各种谣言追着贴上去,比如下面这个.相信不少人在各种媒体号上看过这个新闻,估计微信群朋友圈疯传好几遍了. 先造个谣,让谣言 ...

  7. C++语言,已经深深改变我们的世界

    C++之父Bjarne Stroustrup C++语言,已经深深改变我们的世界. 作为一门系统级编程语言,C++语言就像是C语言的超集,支持面向对象程序设计方法的所有概念,擅长面向对象程序设计,还可 ...

  8. 改变你的文字 改变你的世界

    改变你的文字 改变你的世界 这几个字说起来简单,但做起来是很难的. 表面上是改变文字, 而实质上是改变你的思维方式, 改变你的心态, 改变你看事物的角度. 视频中是不是有点夸张了呢? 改变几个文字的效 ...

  9. LoRa扩频、稳定通信、无线抄表、更远距离

    相比传统无线通信,LoRa能够在相同发射功率的情况下实现更远的通信距离,同时拥有更强的抗干扰能力. 因此,LoRa无线模组广泛应用于无线抄表等长距离无线通信应用中. 高成本单片机·稳定性更强 AS62 ...

  10. 通信原理——信号带宽、信道带宽、奈奎斯特带宽

    1.速率 为码元传输速率,又称传码率.符号速率.波特率,定义为每秒传输码元的速度,符号为波特(Baud),设每个码元的长度为(s),则有(Baud) 为信息传输速率,又称传信率.比特率,定义为每秒传输 ...

最新文章

  1. cmd中实现scott的解锁和开锁以及授予dba权限
  2. 一文解析|首个上榜科创板的机器人企业,江苏北人“闯关记”
  3. centos静态IP配置方法
  4. Intel3945ABG无线上网问题总结
  5. python typeerror* wants int_python-TypeError:’int’对象是不可迭代的?
  6. 关于apache的虚拟主机配置
  7. python判断网页密码加密方式_Python模拟网页中javascript加密与验证的相关处理
  8. csgo手机上看demo_仪表上的车速和手机导航不一样,哪个更准?碰到测速了该看哪个?...
  9. 南昌工程学院计算机考试题库和答案,南昌工程学院 语试题答案.doc
  10. 科学计算库BLAS LAPACK ATLAS OpenBLAS MKL EIGEN等之间的关系
  11. android坐标画图软件下载,几何平板Geometry Pad(绘图,测量数字坐标轴)2.7.0
  12. linux weblogic部署项目路径,Weblogic部署web项目获取项目根目录为null
  13. Unity Editor资源重命名
  14. keil5 调试不进主函数一直卡在0x1FFFF3B2 F8D01808 LDR r1,[r0,#0x808]
  15. 如何快速找回丢失的数据?
  16. F1, 中位数,四分位距IQR等指标的统计检验
  17. 【2020 Java基础快速学习路线】写了很久,这是一份最适合普通大众、非科班的路线
  18. pl/sql插入语句插入数据库中文为????
  19. mysql常用的tamper脚本,tampermonkey 实用脚本
  20. hey 安装_如何使用“ Hey Siri”在Mac上启动Siri

热门文章

  1. Oracle ORA-00947: 没有足够的值
  2. 基于Java毕业设计采购物料质量检验系统源码+系统+mysql+lw文档+部署软件
  3. python中uniform(a、b)_Python stats.uniform方法代码示例
  4. 西门子PLC源码原创最新 CPU:STM32F103RCT6(或其他STM32F103系列大容量芯片)
  5. 加速下载工具motrix
  6. 十分钟小课堂:IP地址及子网划分
  7. 谷粒商城属性分组功能实现内部包含子组件给父组件数据传递
  8. 002-1电容基础知识
  9. Android IJKPlayer封装
  10. dy极速版2-艳云脚本云控系统