前言
PREFACE

一、为什么要写本书

很多朋友在学校参加过“C++语言”课程的学习,或许还读过《C++Primier》《C++编程思想》等经典著作,但是当参加工作进入C++研发岗位时,却仍然感觉不会写程序。这是为什么呢?因为这些C++经典著作侧重介绍C++理论知识,很少讲到软件设计、工程实践等方面的内容。这些书能够用浅显易懂的语言把深刻的理论知识讲得非常透彻,让读者非常容易理解,因此称之为经典,但是这些经典却很少介绍怎样完整开发一款软件,也很少讲到在实际工作中开发一款软件到底会用到哪些知识。即使市面上有所谓的C++实战类书籍,它们中的大部分也只是增加了教学视频,或再介绍些网络开发知识和STL的用法,甚至都没有介绍多个客户端情况下的网络通信程序设计、通信规约的设计与开发、插件开发、向后兼容的二进制文件格式的设计与开发等内容,而这些才是工作中真正需要用到的技能。用建筑房屋来举例,这些书只给读者提供了一堆建筑材料和特性说明,却没有提供建造一座完整房屋的具体步骤、方法和经验,假如读者想要建造一间浴室、一个游泳池、一间客厅或一栋别墅,仅靠一堆建筑材料和说明是无法完成的。介绍工作中真正用得上的实用技术才是本书关注的内容。作者从业20年来,经常需要给新员工做入职培训,但是手头却缺少一本全面、系统介绍C++跨平台研发实践技能的书籍,因此在完成《Qt 5/PyQt 5实战指南》的书稿后,作者就冒出了编写本书的想法。依赖多年的一线研发工作经验,对于本书的写作作者一气呵成。考虑到系统性、实用性,在编写本书时,着重思考了下列问题。

  • 一名C++软件工程师在入职前应该做哪些准备?
  • 怎样编写命令行程序?
  • 怎样让程序以后台服务方式运行?
  • 怎样开发可跨平台(Windows/Linux)的程序?
  • 怎样让程序随操作系统自动启动?
  • 怎样开发DLL?
  • 插件是什么?
  • 怎样开发插件?
  • 怎样引入第三方库?
  • 怎样访问磁盘上的文件?
  • 怎样设计向后兼容的文件格式?
  • 怎样开发多线程程序?
  • 怎样开发网络通信程序?
  • 怎样开发串口通信程序?
  • 怎样开发更加可靠的通信规约?
  • 怎样访问数据库?
  • 怎样利用单体模式实现对数据的唯一访问?
  • 怎样设计、开发C/S(客户端/服务器)程序?
  • 怎样利用观察者模式实现订阅、发布功能?
  • 怎样保存程序的运行数据断面并在程序重新启动后恢复数据?

通过60天的学习,这些问题在本书中都能一一找到答案。本书侧重介绍客户端/服务器模式的无界面程序开发,而《Qt 5/PyQt 5实战指南》着重介绍界面类应用程序的开发方法,因此,在C++跨平台程序开发方面,这两本书互为补充。

在本书写作之初,作者就曾考虑应该用什么风格进行写作。后来联想到自己20年的工作经历,想起自己如何从一位非计算机专业的学生通过努力一步一个脚印走到今天,所以,作者最终决定以日记体这种方式进行写作。选择日记体,不仅可以体验每天进步一点点的成就感,还可以让读者在本书学习的最后阶段回顾个人的成长历程,非常具有纪念意义。

二、内容特色

与同类书籍相比,本书有如下特色。

(1)为求职、面试指明方向。

很多人在求职时面对企业的求职及面试要求四处碰壁、一筹莫展。殊不知,求职、面试应该及早准备,甚至在毕业前一两年就开始。通过本书第1章的学习,可以熟悉C++软件研发岗位的求职必备知识,了解面试注意事项,为求职、面试指明方向。

(2)系统全面、贴近实战。

市面上大部分所谓的C++实战类书籍,一般都讲解C++基础语法知识,配备一些短小的案例,但是看完后还是不知道该怎样从无到有开发完整的Client/Server(客户端/服务器)程序。本书的案例来自作者20年C++跨平台研发工作经验,结合软件研发工作中典型案例进行设计,还原真实场景,完全贴近实战。例如,带菜单的命令行程序、让程序以后台服务方式运行、多客户端的网络通信程序设计、进程间通信、串口通信及串口调试工具、通信规约设计与实现等,这些案例所采用的技术全都来自真实的软件项目。除此之外,很多案例还涉及软件设计技能以及不同设计模式的运用,如工厂模式、观察者模式、单例模式、策略模式等,这对于培养、提升软件研发人员的设计思维有很好的指引作用。

(3)60天轻松掌握C++跨平台开发技能。

所谓跨平台,指的是开发一套代码,只需要进行编译而无须进行修改就能运行在不同的平台上。也就是说,对于同一套程序,既能在Windows上编译运行,也能在UNIX/Linux上编译运行。对跨平台的需求已经成为现今软件研发工作的一种趋势。本书案例融入了跨平台软件研发所需掌握的相关内容,如类库选择、数据的大端小端知识、开发通信软件的注意事项、跨平台数据库访问、跨平台文件访问、跨平台多线程程序开发等多方面的知识。通过掌握本书内容,就可以满足C++跨平台开发的常用技能要求。绝大部分案例采用标准C++、操作系统API、STL库进行实现,运行时避免依赖第三方库。本书旨在通过60天时间带领读者循序渐进地进入客户端/服务器程序设计、开发的世界。

(4)拒绝从零开始。

配套代码含有改动前的基础代码(也称作基线代码)及改动后的最终代码。其中改动前的代码在src.baseline目录,改动后的最终代码在src目录。在阅读时,读者可以在改动前的基础代码上对照案例讲解的内容直接进行修改,这样可以有效提高学习效率,方便练手。通过利用WinMerge等对比软件,也可以对比改动前后的代码,查看改动的具体内容,加深对案例的理解。

(5)代码兼容性好。

绝大部分案例采用标准C++以及通过调用操作系统API来实现功能,从而减少对第三方类库的依赖,个别案例引入第三方类库。在案例开头一般都配有运行效果图,并说明是否依赖第三方类库以及依赖哪种第三方类库。

(6)配套资源丰富,提供超值服务。

配套资源

本书提供以下配套资源。

  • 程序代码、辅助资料等,请扫描此处二维码或到清华大学出版社官方网站本书页面下载。
  • 微课视频(44集,共1150分钟),请扫描各章节对应位置的二维码观看,读者可跟随视频中演示的步骤进行学习。
  • 第2~8章附有配套练习,配套练习的参考答案见配套资源。
  • 想获取更多跨平台开发知识,请关注微信公众号“软件特攻队”(详见配套资源)。
  • 加入书友群,与更多朋友交流软件开发技能。书友群见配套资源中的“书友群”文件夹。

三、阅读建议

  • 先下载本书附带的源代码(见配套资源中),阅读本书时请查阅对应源代码进行学习。
  • 本书的源代码分为两部分,改动前的代码在src.baseline目录中,各案例以改动前的代码为基础进行修改,改动后的最终代码在src中。可以使用WinMerge等对比软件对比案例中改动前后的代码,以便查看到底进行了哪些改动。
  • 第1章为环境搭建及准备工作,第2~8章介绍C++跨平台软件开发的各方面技能,第9章为综合案例。请根据需求进行阅读。
  • 部分章节的代码依赖POCO、tinyXML或Qt类库,在各章节开头已进行说明。
  • 在进行描述时,有的接口只写了接口名称,但是并未写明详细的参数列表,请根据上下文理解。
  • 因篇幅所限,文中部分代码做了省略,请查看附带的源代码。
  • 代码清单中第一行一般是源代码的文件路径,并非源代码内容。
  • 为了节省篇幅,个别头文件代码中省略了命名空间描述namespace xxx {},请查看附带的源代码。
  • 本书与《Qt 5/PyQt 5实战指南》一起堪称C++跨平台研发领域的双剑合璧。同时学习这两本书,既能学到无界面类程序的开发方法,又能学到界面类程序的开发方法。

四、读者对象

  • 有一定C++语法基础的软件爱好者。
  • 在职的C++跨平台软件研发人员。
  • 计算机科学与技术相关专业有C++语法基础的毕业生。

五、致谢

感谢领导、同事对我工作中的帮助与指引、包容与理解。感谢我的家人对我一如既往的支持,感谢父母教会我勤劳、不怕吃苦,感谢妻子让我懂得温柔,感谢女儿带给我的各种感动。

限于编者的水平和经验,加之时间比较仓促,书中疏漏或者错误之处在所难免,敬请读者批评指正,有兴趣的朋友可发送邮件至workemail6@163.com。

编者

2021年7月于济南