掌握语法特性

第一次接触C++是在南开的大一的课堂上。那时候我对编程非常抵触,充满厌恶(当然,那时候我对生活中几乎所有的东西都感到厌倦)。我的这种态度和学校的教学方法不无关系。毕竟国内高校的教学方法总是高高在上,呆板老旧。很少有老师或教材会尝试站在学生的视角去设计教学的方法,尝试站在当下的视角去选择教学的内容,从而导致很多简单、自然的概念和原则变得晦涩、生硬,导致很多实用的课程变得空洞、抽象。

入门C++的阶段主要是在熟悉C++的语法特性,掌握常见的使用方法。入门C++最好的选择或许是选择一个时下受欢迎的视频教程。其中,世界cs名校的公开课程录像是最优选择,培训机构的公开视频教程次之。这类教程往往由真正的大佬教学,教学内容对新手友好并且跟得上时代,而且有着设计精妙、发人深思的课后练习。但因为最佳选择往往隔几年就会更替,简单搜索就能找到,所以此处并无推荐。此外,选择一个热门的教学视频还意味着课后作业可以轻易找到大量讨论作为参考。

在了解了基本语法特性后,应该根据学习目标进行大量实践。实践的过程中再去学习和掌握新的语法特性和设计思想,再去学习数据结构、算法设计、操作系统、编译原理、计算机系统等领域的重要方法和原则。推荐在cppreference查找和确认C++内置语法特性及STL的细节,也可以通过搜索引擎搜索相关的讨论和分析,不过要注意鉴别讨论者的可靠性。也推荐在LeetCode选择一些题目进行编程练习,提高算法设计和实现能力。

一条个人经验:C++更接近一种软件,而不是一种思想,它的的发展动力来源于归纳(induction),而不是演绎(deduction)。学习语法特性最重要的是搞清楚这个特性是为了什么而被提出,应该用在什么场景。例如看到一条C++新标准增加的新特性不是自己琢磨为什么增加这样的特性,体现了什么思想;而是查查大佬们是怎么用这个特性的,它到底能解决什么问题,是更安全更清晰了,还是更高效更方便了?所以在看大佬写的代码的时候,不要畏惧没见过的用法,而是主动学习积累新特性的正确用法。学习其他语言也是一样的。

学习最佳实践

C++语法特性众多,可以称得上是一个语言的联邦(语出《effective C++》)。那么实现相同的功能,可能有很多的思路和工具可用。这时候就要考虑实现的可读性、安全性、易维护性,否则会导致软件维护困难(例如我见过不会用多态、通篇dynamic_cast还大谈设计模式的程序员),或者更实际的角度来说,到时你的代码无法通过pr或者cr。实际上,无论是大到整个软件架构的设计,还是小到具体的子问题的解决,往往都有其他大佬探索后总结的最佳实践经验。学习、审视和应用这些最佳实践无疑是提高技术理解的捷径。阅读相关书籍、文章固然有效,但往往相对滞后;加入一个高水平的技术团队或者参与高水平的开源代码库开发才是真正提高技术的不二之选。