CPP-Summit 2020
2020 年是 CPP-Summit 第一次来到深圳,也是赶在了 2020 的尾巴。感谢公司让我有机会参加这种会议见见世面,在此记录下这两天的经历和想法,就当是记笔记交作业了。
简单介绍下这个会议,中文名是『全球 C++ 及系统软件技术大会』。虽然它的英文名里省略了『全球』,但从演讲嘉宾阵容上来看,也算是对得起『全球』二字了:有将近三分之一的演讲者来自国外。官网上的大会主席是『C++ 之父』Bjarne Stroustrup,他今年演讲的主题是《C++ 20 与C++的持续演化》。顺便说下,这个是『真·西佳佳之父』。会议的主办方是一家叫 Boolan 的技术咨询和培训机构,所以会议开始会植入一波硬广,这也算是常规操作了。大会的演讲嘉宾有极少部分是来自这家机构以及大会金主爸爸的,大部分嘉宾都是来自行业内有一定经验的开发者,阵容还算可以。
先说下总体感受:C++ 作为一门亘古不衰的语言,在各行各业都存在着经验丰富的开发者。随着各种更加『现代化』的语言的兴起,C++ 也迎来了更多的变化。不过很多新增语法特性的改进更像是戴着脚镣跳舞,保证对存量代码的向前兼容。在大会上也深深感受到互联网行业对传统软件行业的冲击,甚至讨论了 C++ 这碗饭还香不香的问题。大会的议题总体分为三大类:
- 新特性的研究和布道
- 性能和安全的实践经验
- 研发模式、测试和工程化等方法论
一般这种大会都是分为多个分会场同时演讲的,我只能选其中一些我比较感兴趣的议题去参加,大部分集中在前两类。国外开发者分享的议题大部分集中在第三类,由于今年疫情的原因,都改为线上会议了。国内开发者的分享更侧重于性能和安全,或者尝鲜新特性,尤其是大厂更强调业务落地。这里按时间顺序列出我参加的分享,并附上我的一句话短评:
- Bjarne Stroustrup * C++ 20 与 C++ 的持续演化:介绍了 C++ 历史和 C++ 20 的新特性,以及工作组如何讨论和制定标准,后续的规划。
- John Lakos * C++ 大规模软件开发方法:作者写了一本书,这里是第一章,有关组件化相关的内容。
- Charley Bay * 系统架构师的三个视角:开发、架构与设计视角:架构师要做的事情,各种方法论。
- 吴咏炜 C++ 性能调优纵横谈:结合编译器选项和工具介绍了性能测试的正确姿势以及优化经验,列举了很多实践案例和测试数据,干货满满。
- 马骏 (良斌) C++ 协程在阿里的推广和大规模应用:阿里的编译器工作组对协程的支持,技术实现和业务落地。
- 分论坛 下一代软件架构与工程变革
- 刘新铭 如何检测业务逻辑导致的安全漏洞:他们做了一款基于 open64 编译器实现的 C++ 代码静态扫描工具。
- 陈峰 腾讯广告系统大规模 C++ 工程实践:腾讯广告系统的代码库组织方式、构建系统等实践。
- 张银奎 从纳秒级优化谈 CPU 眼里的好代码:总结了高性能编程的经验,结合 CPU 底层原理和编译器选项调优,干货满满,硬核分享。
- 谈静国 渗透视角下的 C/C++ 安全编码实践:列举了一些编码安全隐患以及渗透原理,介绍了常用的解决方案,其中也涉及静态扫描工具。
- 冉昕 低延迟场景下的性能优化实践:介绍了低延迟场景下性能测试的测不准问题,从方方面面一点点抠性能,列举了大量常见 API 的 benchmark。
- Ivan Čukić * 如何设计优雅的API 同时不牺牲性能:国外开发者少有的深入编码实践的分享,利用 C++ 11 的右值引用特性梳理了大量实践,并通过比较汇编代码的差异分析性能。
- 张汉东 Rust系统级开发的优势与劣势:业界戏称『Rust 之父』前来踢馆,安利一波 Rust 的好与坏。
![]()
- 张超 C++ Modules 与大规模物理设计:对 C++ Modules 新特性的介绍,还算是不错的培训机构课程。
接下来胡扯下我感受到的几个点。
性能与安全
如果要分析性能,那就一定要涉及到编译器开启的优化选项,不同级别的优化会导致差异很大的结果。有些代码会因为过于简单而被编译器优化没了,从而导致测试结果的偏差。这时候往往需要对照生成的汇编代码来看,推荐一个在线工具:Compiler Explorer
安全方面能做的大都是自动化代码静态扫描工具。C++ 除了接入扫描工具检查之外,也在努力添加新特性,想把一些事情放在编译期去做。好像很多现代化语言都喜欢在编译期保证空值安全,类型安全等等,甚至是编译期就已经计算好了一些常量,推导出了一些结果。想要在编译期做更多事情,就需要语法特性上做更多要求。带来的负面影响就是学习成本高,很难做动态化。比如 Rust,初学者想让自己的代码编译通过都有点难。
C++ 的生命力
C++ 对嵌入式、培训和咨询等行业影响很深,但是移动互联网时代大家更偏向于使用 Go、Python、Rust 等语言。比如有人提到招 C++ 的应届生很难,由于前一阵子深度学习很火,好多都是只会 Python 的候选人。接着也有人回应说深度学习的应用层的确是 Python,但是各种引擎和框架还是需要 C++来实现,这恰恰反映出 C++ 高性能的优势。甚至有人说要是以后大家不学 C++ 了,那么在座的各位待遇就会翻倍了,因为有大量现存的代码是用 C++ 写的,只有我们才看得懂。
大会上好多拥有二三十年 C++ 开发经验的大佬,我这种毕业四年的萌新只能在一旁打 call。大量熟悉底层软硬件的资深开发努力分享经验,做咨询和教育。大家并不希望 C++ 因为过时而构起了壁垒,而是积极拥抱变化,布道更现代化的 C++。
但话又说回来,C++ 的这些新特性很多要照顾已有的旧语法,用起来还是少了内味儿。比如各种现代语言都具有的 Modules 概念,C++至今也并未普及,这也导致 C++ 没有一个公认的制品库管理工具。站在一些现代语言的开发者的视角,C++ 不过是在努力变革求生罢了。尴尬之处就在于,维护 C++ 老代码时没必要升级到新特性(有工作量和风险),若是写新业务还不如直接用上 Go,Java,Scala 等。一门语言的命运啊,当然要靠自我奋斗,但是也考虑到历史的行程。
国内与国外
在一次午餐的时候,我听到隔壁桌聊天说国外开发者讲的东西太虚了。我作为一线开发者深表赞同,也是在『踩坑』后避开了大部分国外开发者的分享。可能这里不仅仅是分享内容不被大家讨喜的原因,主办方的实时翻译效果也不太好。建议主办方考虑下,不要为了追求『全球』国际化而刻意安排国外开发者分享的比例。
为主办方点赞的是现场可以通过贴小心心的方式为分享者打 call。(主办方的小姐姐给了我三颗小心心让我贴给心心比较少的几位,然而我比较耿直,还是送给了我想打 call 的几位分享者)
![]()
![]()
最受欢迎的当属『C++ 之父』的分享,我觉得这不仅仅是分享内容受欢迎了,『教父』自带的人气和信仰也是很重要的。提问环节甚至有一位华为的项目经理上来就是一句 “Dear father!”,然后在主持人的一通喊停之下来了一通自我介绍,并邀请 Bjarne Stroustrup 来甚至华为参观,想来个拥抱交个朋友。最后说自己没有问题要提问,单纯想膜拜下。(非原话,差不多这个意思)反正把大伙儿都逗笑了。更逗的是线上提问,亮点自寻:
![]()