对于编程语言之说,王国维的三重意境,还是有一定道理的。而且现有的统计也表示,对一种编译语言越熟悉,越不容易犯错。所以,这里引出第一个观点。
对语言本身的熟悉程度并不是说抱着C++标准,逐字逐句的背下来,你就可以成为C++高手了。但是学习过一门语言的同学都应该知道,语感很重要。千锤百炼才会形成一种超乎直观感觉的一种认知。
C++因为各种历史原因,它的语法相当复杂,且支持多种编程范式。初入门的新手往往会沉浸在其中而无法自拔。个人觉得,可以找一到两本书,把C++的基本语法都啃一遍,但又不过分细究是比较好的一个尺度。

编程其实是一种非常注重实践的活动。光会看代码,不会写,始终会差了火候。人的学习能力,很多时候会从错误中得来。拿个编译器,把书上的代码一行行填进去,会报什么错?输出是什么?为什么错了?
学习语言的反馈回路
对内存模型的认知C++是一种编程语言,它的本质其实是一种抽象。在这一层抽象上进行编程要比底层汇编语言的编程要简单得多。但是,想要更好地理解它,要明白每一行代码真正做了些什么。需要了解计算机的原理。毕竟,真正执行代码的,还是自己的机器。
所以要知道,什么是堆,什么是栈,什么是静态存储区,什么是代码段,等等。通过这些基本的认知,结合对编译出来的汇编进行理解。你就可以知道,每一个对象是怎么分配的,构造函数做了什么,拷贝又拷贝了什么,为什么对某个地址解引用会Crash, ......
理解了内存,你才会理解C++编程背后隐藏的那些东西。知道这些,会让你的程序更加健壮,更加高效。
对大规模程序掌握能力古代一个将军能力有多强,要看他能掌控多少军队。而对于C++工程师,尤其是更进一步的工程师,要看他能控制多少C++代码而不乱。
对于编译型语言而言,小规模的程序其实没有太大意义。python, shell, 都可以很快地做到一些事情。体现它们真正价值的,还是在大规模程序之上。服务器程序,操作系统,数据库系统,编译器系统,等等,它们的代码动辄上百万,甚至上千万。这种系统的架构师,具备很强的代码控制能力。
在这个层级上,设计模式,抽象思维已经占据了多数。你看到的是整个系统的全景,甚至将来它可能的演进。
抽象认知能力抽象认知,其实是对某个事物的模型认知能力。比如说数据结构,算法,它们一个是数据聚合关系的模型抽象,另一个是对代码控制流组织模型的抽象。那么,对于你正在从事的系统,对于你来说,是个什么样的模型呢?
从这一点看,编程和数学是极为相似的,一个是用编程语言进行抽象,另一个则是使用数学符号进行抽象。
对于各种编程模型的驾驭能力多线程并发模型,异步模型,模板,函数式模型,命令式模型,等等。它们有些来自于编程语言,有些来自于新的体系架构需求。熟悉这些模型,它们是你在构思系统时的思维工具。
对系统性能的洞察能力C/C++为什么用在关键的系统上,本质在于它们的性能。离开了性能,其实任何系统都可以由某个图灵完备的编程语言实现。所以,性能问题,对于C++工程师来说,尤为重要。
笔者所接触到的高级工程师,对于性能基本都有一定程度的认知。同样是C++语言写的逻辑,不同的人写出来,性能可能天差地别。这同样也是C++有魅力的地方,上限很高。
对于性能,体系结构,算法,以及对业务的理解都属于是核心。
总结
学会C++不难,但成为一个出色的C++工程师,路漫漫其修远。共勉之。