<audio id="audio" title="结束语 | 路远，未有穷期" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/27/b2/27ef54452cd5a9354a070f93178a5bb2.mp3"></audio>

你好，我是Chrono。

两个月的时间过得好快啊，一眨眼的功夫，就到了和你说“再见”的时候了。

和之前的《透视HTTP协议》一样，我首先要感谢的，还是你——感谢对我和这门课的支持，正是你持续的支持和鼓励，才让我有了创作的激情和动力，Thanks for your support！

同时，我也要祝贺你，祝贺你凭着力量、智慧和勇气（《The Legend of Zelda》的黄金三角），突破了C++的“重重迷雾”，成功地掌握了C++的核心知识和应用技能，相信这将会是你今后工作履历中的一笔“浓墨重彩”。

现在再回头看各节课程，我觉得基本上算是达成了当初预计的目标：贴近实际的开发经验分享，没有剑走偏锋的“葵花宝典”，而是踏踏实实的“太祖长拳”。

但是我觉得这门课程的交付还是有一点点遗憾的。因为C++的内容实在是太丰富了，在课程里，我们只能挑出“必修”的重点和要点来讲，还有很多外围的点没办法展开细讲，还有很多小点来不及说出来，真是舍不得和你说再见。

所以，我想在这最后一讲里，我还能和你交代点啥，我觉得最实际的就是和你聊聊结课后，你该怎么继续学习C++。

## 课程结束后，你该怎么学C++？

要回答这个问题，我们再来看看这门课的主角C++吧。

从1979年贝尔实验室发明“C with Classes”，到1983年正式命名为“C++”，再到现在，C++已经走过了四十多年，可以说是处于“不惑之年”了。在如今的编程语言界，和Java（1995）、Go（2009）、Rust（2010）等比起来，C++真算得上是“老前辈”。

这么多年来，C++一直没有停止发展的脚步（不过确实有点缓慢），不仅修补了曾经的缺陷，还增加了越来越多的新特性。不可否认，C++虽然变得越来越复杂和庞大，但也正在一步步趋近“完美”，你可以批评它，但绝不能无视它。

个人认为，**C++最大的优点是与C兼容，最大的缺点也是与C兼容**。

一方面，它是C之外唯一成熟可靠的系统级编程语言（目前Rust还没有达到可以和C++“叫板”的程度），大部分用C的地方都能用C++替代，这就让它拥有了广阔的应用天地。而面向对象、泛型等编程范式，又比C能够更好地组织代码，提高抽象层次，管理复杂的软件项目。比如前段时间刚成功发射的“龙”飞船，它的应用软件就是用C++开发的。

但另一方面，为了保持与C兼容，C++的改革和发展也被“束缚了手脚”，做出任何新设计时，都要考虑是否会对C代码造成潜在的破坏。这就使得很多C++新特性要么是“一拖再拖”，要么是“半成品”，要么是“古里古怪”，最后导致C++变得有些不伦不类，丢掉了编程语言本应该的简洁、纯粹。

如果你看看新出的C++17、C++20，这两方面就表现得特别明显（比如结构化绑定、模块、协程、模板lambda）。也许，这就是C++追求自由和性能的代价吧。

这次的课程里，我们主要用的是C++11/14，**那么面对后续的新标准、新特性，在没有“入职导师”的情况下，你要再怎么学呢？**

我觉得，对于C++这样复杂的编程语言，你要把握一个基本原则：**不要当“语言律师”**（language lawyer）。也就是说，不要像孔乙己那样，沉迷于“茴”字有多少种写法，又或者是“抖机灵”式的代码，而是要注重实践、实用。

因为C++的编程范式太多，“摊子”实在是铺得太大，它为了避免各种特性可能导致的歧义和冲突，就会有许许多多细致到“令人发指”的规定，我们在学习的时候，一不小心就会钻进细节里出不来了。

这样的例子有很多，比如说ADL、引用折叠、可变参数模板、“++”的前置和后置用法、模板声明里的typename和class、初始化列表与构造函数、重载函数里的默认参数……

弄懂这些位于“犄角旮旯”里的特性（无贬义），需要花费我们很多的脑力，但在我们一般的开发过程中，通常很少会触及这些点，或者说是会尽力避免，它们通常只是对编译器有意义，所以在这些“细枝末节”上下功夫就不是很值了，说白了，就是性价比太低。

我个人认为，在掌握了专栏里C++11/14知识的基础上，如果再面对一个C++新的语言特性，你不能够在五分钟（或者再略长一点）的时间里理解它的含义和作用，就说明它里面的“坑”很深。

你应当采用“迂回战术”，暂时放弃，不要细究，把精力集中在现有知识的消化和理解上，练好“基本功”，等你以后真正不得不用它的时候，通过实践再来学习会更好。

这也是我自己多年实践的经验，希望对你有用。

## 结课赠言

结束语的最后，我还是要来一个“首尾呼应”，回顾一下开篇词里的“初心”。

还记得开课时的那三句编程格言吗？

> 
任何人都能写出机器能看懂的代码，但只有优秀的程序员才能写出人能看懂的代码。


> 
有两种写程序的方式：一种是把代码写得非常复杂，以至于“看不出明显的错误”；另一种是把代码写得非常简单，以至于“明显看不出错误”。


> 
“把正确的代码改快速”，要比“把快速的代码改正确”，容易得太多。


这两个月的学习下来，结合C++的各种编程范式、特性和应用经验，你是否对它们又有了一些新的认识呢？

我说说我对这三句格言的理解吧，也许能和你产生共鸣：

- 写代码，是为了给人看，而不是给机器（编译器、CPU）看，也就是human readable；
- 代码简单、易理解最重要，长而复杂的函数、类是不受欢迎的，要经常做Code Clean；
- 功能实现优先，性能优化次之，在没有学会走之前，不要想着跑，也就是Do the right thing。

课程即将结束，在漫长的学习道路上，它的作用就好像是一个小小的驿站，让你适时停下来休息，补充点食物和清水，为下一次冒险做好准备。希望在你将来的回忆里，还会记得有这么一个给你安心和舒适的地方。

这里我还给你准备了一份[毕业问卷](https://jinshuju.net/f/tGsQrr)，题目不多，希望你能抽出几分钟时间填写一下。我非常愿意听听你对这个课程的反馈和建议，你可以在问卷中畅所欲言。

好了，临别之际，在你上马、踏上新的征途之前，我再送你一句“老话”吧：

> 
一个人写出一个好程序不难，难的是一辈子只写好程序，不写坏程序。


路远，未有穷期，期待我们的下次再会！
