gitbook/罗剑锋的C++实战笔记/docs/254478.md
2022-09-03 22:05:03 +08:00

78 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 结束语 | 路远,未有穷期
你好我是Chrono。
两个月的时间过得好快啊,一眨眼的功夫,就到了和你说“再见”的时候了。
和之前的《透视HTTP协议》一样我首先要感谢的还是你——感谢对我和这门课的支持正是你持续的支持和鼓励才让我有了创作的激情和动力Thanks for your support
同时我也要祝贺你祝贺你凭着力量、智慧和勇气《The Legend of Zelda》的黄金三角突破了C++的“重重迷雾”成功地掌握了C++的核心知识和应用技能,相信这将会是你今后工作履历中的一笔“浓墨重彩”。
现在再回头看各节课程,我觉得基本上算是达成了当初预计的目标:贴近实际的开发经验分享,没有剑走偏锋的“葵花宝典”,而是踏踏实实的“太祖长拳”。
但是我觉得这门课程的交付还是有一点点遗憾的。因为C++的内容实在是太丰富了,在课程里,我们只能挑出“必修”的重点和要点来讲,还有很多外围的点没办法展开细讲,还有很多小点来不及说出来,真是舍不得和你说再见。
所以我想在这最后一讲里我还能和你交代点啥我觉得最实际的就是和你聊聊结课后你该怎么继续学习C++。
## 课程结束后你该怎么学C++
要回答这个问题我们再来看看这门课的主角C++吧。
从1979年贝尔实验室发明“C with Classes”到1983年正式命名为“C++”再到现在C++已经走过了四十多年可以说是处于“不惑之年”了。在如今的编程语言界和Java1995、Go2009、Rust2010等比起来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),题目不多,希望你能抽出几分钟时间填写一下。我非常愿意听听你对这个课程的反馈和建议,你可以在问卷中畅所欲言。
好了,临别之际,在你上马、踏上新的征途之前,我再送你一句“老话”吧:
> 一个人写出一个好程序不难,难的是一辈子只写好程序,不写坏程序。
路远,未有穷期,期待我们的下次再会!