我在科罗拉多州的奥罗拉市参加了 CppCon 2021 大会。能够再一次与国际 C++ 社区见面真是太棒了!本周一,我就 C++ 的复杂性问题发表了演讲(点击链接查看幻灯片)。
与我在 CoreCpp 2021 的演讲中所采用的方式一样,通过一份调查问卷,我向观众提问:为什么你会觉得 C++ 复杂?
这个问题自然具有主观性,不过很少会有人觉得 C++ 不复杂(调查中也提供了这一选项)。
“为什么你会觉得 C++ 复杂”这个问题有着重要的潜在意义。我们或许会认为:
- 在教授一些功能时可能需要采取更好的方法
- 部分领域可能需要经过 ISO 流程优化
- 一些情况下或许应该采用其他更好的工具
这份调查问卷中的选项与我在 CoreCpp 的演讲中使用的清单内容相同,是我与 C++ 社区成员协商后得出的结果,并尝试将所有潜在的复杂性因素罗列出来。以下就是列出的清单——调查对象可以勾选任意数量的选项:
- 没有——我认为 C++ 中的所有内容都很容易
- 指针和参考
- 内存和生命期管理
- 常量正确性
- 右值和移动语义
- 构建器/破坏器
- 运算符重载
- 隐式转换
- 多重继承
- 虚拟继承
- 多态
- 协变返回类型
- 异常情况处理
- Lambda 表达式
- 模板特化
- SFINAE
- 模板问题
- 智能指针
- 多线程和并发
- 无锁算法和内存栅栏
- 性能
- 测试
- 与外部库的使用
- 保持使用新的 C++ 标准
- 协程
- 编译和/或链接
- 处理较长构建时间
- 与动态库的使用
- 封装和部署
- 调试内存泄漏
- 调试和故障排除崩溃问题
- 调试问题
- 具体 GPU 编程问题
- 具体实时编程问题
除上述选项外,还有“其他”选项,选择“其他”选项的人需要说明具体原因。
这份在线上发布并在现场发放的问卷还让调查对象填写了他们已使用 C++ 多长时间,包括:0-1 年、2-4 年、5-8 年、9-12 年及 12 年以上。
结果非常有趣。
首先是观众的 C++ 使用经验
只有一位调查对象添加了一个“其他”选项,并表示“C++ 的语法即使是与 C 相比也不简单”。但 C++ 作为一种更为丰富的语言,期望它的语法比 C 更简单易懂或许是较为一厢情愿的想法。不过,这依然是合理的担忧。
清单中还包括“没有——我认为 C++ 中的所有内容都很容易”这一选项。值得注意的是,在总共 74 名调查对象中,没有一个人选择该选项。而当时在 CoreCpp,大约 9% 的调查对象选择了这一选项。CoreCpp 大会今年是在当地举办的,观众主要是以色列人,由此我们可以推断出以色列人对 C++ 的使用比其他人要更有把握。
以下是所有选项对应的结果,总共 74 人:可能具体的类别不够清晰,但你可以看出大概的占比差异(请向下滚动屏幕查看我们的 CppCon 调查初始结果):
排在前五名的分别是:
- 右值和移动语义
- 调试内存泄漏
- 多线程和并发
- 内存和生命期管理
- 保持使用新的 C++ 标准
不过,在基于使用经验进行分析时,老手和新手眼中的复杂性也有区别。
对于老手而言,排名前五的是:
- 处理较长构建时间
- SFINAE
- 右值和移动语义
- 协程
- 保持使用新的 C++ 标准
最令老手费解的点:
对于新手而言,排名前五的是:
- 右值和移动语义
- 指针和参考
- 多线程和并发
- 调试内存泄漏
- 内存和生命期管理
最令新手费解的点:
有趣的是,“处理较长构建时间”在针对老手的调查结果中排名前五,表明这一问题只靠经验是无法解决的。当然,Incredibuild 非常乐意为你解决这个问题。业内许多公司也选择了 Incredibuild 的分布式构建加速方案为其业务提供支持。
值得注意的是,即使智能指针已被业内广泛接受很长时间,“调试内存泄漏”问题的占比却依然很高(35% 的人都选择了该选项——与 CoreCpp 调查结果相同)。目前尚不清楚人们究竟是不使用智能指针还是使用方法有误。这一点还需进一步调查。
另一个有趣的结果是,“右值和移动语义”的占比排在第一位,不只是新手,还包括老手(占调查对象总人数的 55%,至少有 12 年经验的人占比为 42%)。看来,为了在教授相关内容时使之更容易学习和理解,我们确实还有一些工作要做。
总结
CppCon 调查问卷的结果与我在 CoreCpp 2021 的演讲中得到的结果都反映了相同的问题。人们认为 C++ 的某些部分十分复杂,需要进一步学习;其他复杂性问题则可能需要更好的工具辅助。值得注意的是,我们在这两篇文章中都呈现了参加 C++ 会议的人认为该语言复杂的点。一方面,这不一定能代表所有 C++ 开发者的观点。另一方面,这确实能够反映出在 C++ 语言使用方面更为活跃的人所持有的看法,以及他们面对的难题和该语言可以改进的地方。
资源
“为什么你会觉得 C++ 复杂?”的 CppCon 调查问卷初始结果,以及上述分析的数据,都可以在这里找到。