C++学习路径
C++的学习曲线是漫长的,不仅仅是因为其支持的范式多,知识点较多。还有一个很重要的原因是陷阱比较多,由于机制复杂导致了机制之间会有相互制约。最近半个月又重新浏览了一遍C++ Primer,把自己没有掌握好的一些知识点重新复习了一下,收货颇丰。这篇文章我会一直更新下去,直到我认为我对C++的理解很全面了。
技术之外,想多谈谈一些其他问题。学习C++的初衷不仅仅是因为兴趣,也是想要自己有一门技术不容易失业。我觉得推动C++发展的一个是九十年代如日中天的微软,这样有影响力的公司的重视,依托于Windows上MFC,COM技术发展,工业界的需求使得C++快速发展;另一个是2000年以后互联网的发展要求高性能的服务器,对C++也有了更多的需求。而学习C++之于我自己,可以更好的面对工作,多一个窗口多一份视野;在工作之中,我也看到了工业界对于计算机处理的大量需求,这也可以让自己与别人相比,更突出一些。
然而要对计算机有更深层次的理解,绝不会是对于具体语言或者语言之上的各种高大上的框架的认识。而是在于计算理论,状态机,CPU架构,操作系统等的认识;我自己也很想在学好C++能写出一些满足工作需求的软件之后,更加注重对于计算本质的理解,这是生而为人对于世界最原始的好奇。世界之复杂,技术之外别有洞天;也要去多看看,多理解技术之外的各种社会现象。(2018/03/30更新)
距离这篇文章初次写作快五年时间了,回看这篇文章还是漏洞百出,而且很多理解太浅些。我现在第三次重新修正一些东西,感觉现在看C++的全貌更加清晰了。文章的主要目的是构建整个知识的框架,每次想要梳理一遍的时候,只要跟着文章走一遍就好。算是更精简版的A Tour Of C++吧。(2020/10/09更新)
再次更新,觉得自己想要在一篇文章中把整个C++的全貌描述清楚是不可能的。因此我把标题改成了C++的学习路径,并且删除了大多数的关于C++的语法知识的描述。我主要想通过自己认为的C++学习路径,来阐述自己对于C++的理解,主要从两个方面来解析这个问题:一个是C++发展过程中出现的经典书籍,另一个是C++的发展历史脉络。这些经典书籍很多都已经过时了,因此需要从现代C++的眼光去看待,我在文章中会对这些需要注意用现代C++重新诠释的地方,会详细讲解以下。(2022/02/10更新)
C++发展历史
这一块C++创始人Bjarne Stroustrup是有一些论文的。目前最新的是HOPL4(Hisotry of Programming Language, 4th)的论文是BS老爷子关于C++的最新论文,博览网召集了中国比较牛的C++大佬一起翻译了这篇论文放在GitHub的仓库里。所以发展历史这块我不多赘述了,想要强调的是模板的发展始终贯穿了整个C++的发展,因此不要认为C++的模板知识是高级知识可以不需要学习,这会对整个职业发展有极大伤害,因为我们工作中无时不刻都会用上模板。
C++学习路径
首先当然是好好啃C++ Primer,这是在C++11之前的经典学习方法。不过自2011年之后,也出现了不少好书。BS老爷子的A tour of C++和Programming: Principles and Practices using C++就是专门给初学者写的书。
通常语法入门后,我们会学习一本Inside C++ Object Model的书,这本书也很是比较老的书籍。但是所讲的东西抽象级别较低,在分析内存中的布局。但是我们需要自己用现代编译器去实践一下里面的分析,会发现现代编译器还是会有一些不一样的地方的。
通常这两本书学习完后,我们对于用C++去实现面向对象的程序设计已经绰绰有余了。但是这还只是C++的入门水平,我们要完整的释放C++的所有能力,模板学习是不可避免的。这里非常推荐2018年新出的C++ Templates 2nd,能够让你对于C++17之前的所有模板知识有个完整的了解。我想在强调一次的是,模板是C++的基础知识,是必须要学会的,否则会发现很多源码看不懂,很多类型不知道如何使用。学习模板我们主要关注的是
- 如何设计特征和实现特征模板
- 利用特征实现泛型编程和元编程
- 动态多态和静态多态的结合
C++是一门通用性的系统编程语言。有人说C++是面向对象语言,但这并不是C++的全貌。但是面向对象的程序设计方法是目前业界最主流的方法,因此这也是我们学习C++过程中最开始接触到的东西。但是C++肯定是不止于此的,模板的引入,函数式程序设计都让C++的设计模式和常见的面向对象程序设计所构造的设计模式有很大不同,这是在学习C++的设计模式中需要非常注意的东西。关于C++的设计模式的启蒙,可以看一本经典老书Modern C++ Design,书的中文名称翻译的很经典很棒叫做《C++设计新思维》,在当时那个年代确实是新思维,它打破了当时GOF的运行期设计模式,通过引入模板实现了很多编译期设计模式,让我最为惊叹的主要是两个,基于规则的类设计(policy-based class design)和多对象多态(multimethods)。
但是从一个现代C++的角度去看,这本书中很多东西已经进入到了语言本身。
- 类型表其实就是参数包,C++已经默认自带,且boost::mp11可以操控类型表
- 特征已经进入了C++标准库type_traits
- 智能指针已经进入了C++标准库memory
- 泛型函数对象已经进入了C++标准其实就是std::function
- 线程安全的单例模式已经被很多现代C++编译器支持了,通过static关键字已经可以实现
- 利用std::tuple或者std::variant等异质容器可以轻易实现观察者模式且可以静态绑定
但是这本书所引入的新思维方式,非常值得我们去用现代观点去学习。如果在学习完C++ Templates 2nd后还能自己实现Modern C++ Design中的各种设计模式,就算是模板入门了。
Modern C++ Design打开了C++的新时代,但是对于元编程的完整理解,是在C++ Template Metaprogramming中诠释的。
最后是很多源码的研究,这些其实在C++ Templates 2nd中也有提及,但是是非常简单的实现,我们需要去看gcc/clang/msvc的实现
- std::function
- std::tuple
- std::variant
- std::any
- std::optional
除此之外的多线程、协程等源码的研究也是必不可少的。
相关网站#
首要推荐的当然是C++标准委员会的网站,然后是著名的C++查询网站。
最近发现了purecpp这个网站,是c++爱好者自己建立的旨在团结中国的所有c++爱好者和开发者的网站,并且举办了2018年的c++大会,感兴趣的可以关注这个网站并注册会员,可以在论坛互动。
Modern Effective C++这本书是在2014年出版的,由C++标准委员会主席Herb Sutter写推荐语的,由业界大牛Scott Mayer编写的,详细介绍了C++11和C++14带来的全新特性。这个作者是Brown University毕业的博士,著名的C++顾问和培训者。
同时在2014年Bjarne Stroustrup自己又写了一本新书,这本书是在C++14标准发布后发布的,旨在希望大家能够摒除C++98当年的各种诟病,能够重新从C++14开始学习起新的C++,这本书的名字是Programming: Principles and Practices using C++。不过很多人认为这本书与其说是在介绍C++,倒不如说是介绍编程的通用知识,用C++的例子作为讲解。看这本书可以让你对于程序设计有个更深的理解,不仅限于C++。
最后推荐的是我强烈推荐的,那就是在2015年的时候Bjarne Stroustrup和Herb Sutter两位C++权威人物合力编写的C++ GuideLines,这个C++编程指南其实就是我上面介绍的四本书的精髓的集中,而且还是在最新的C++14标准基础上而编写的C++编程指南,规范了C++的代码编写方式,从而以合理的编码习惯来有效的避免了对象拷贝,对象错误析构等各种低效率内存使用或者错误使用的问题,这个指南我觉得是C++学习者必看。
推荐C++委员会在GitHub上公开的C++标准草案,一直都在更新。(2018/03/22更新)
跟随时代的进展
业界进展
目前我所知道的是,软件开发在往多线程编程和异步编程方向发展。这两个方向产生的原因本质上,都是互联网的发展要求服务器有多线程编程支持更多用户,以及异步编程解决IO阻塞的问题,当然多线程编程和异步编程还可以解决UI的响应问题。目前C++11标准已经有了多线程库和异步编程库,学习者可以多多关注一下。
还有微软起步也比较早,在C++11还没有成型时候就已经有了自己的Concurrency Runtime和Parallelism Pattern Library用于多线程编程和异步编程,可以在微软的帮助文档上找到更多资料。
除此之外CppCon等C++相关的会展是非常好的了解C++最新进展的地方,每年都会有一些非常经典的keynote值得学习。
业界大牛
关于C++方面的大牛,我推荐这么几个人,可以Google到他们的个人博客,有很多值得学习的博文
- Bjarne Stroustrup,C++创始人,就这一条就牛的不行了,TAMU终身教授,Columbia University客座教授,Morgan Stanley高级顾问。
- Herb Sutter,十年C++ ISO标准委员会成员,微软C++/CLI架构师,Exceptional系列的三本书就是他的代表作。他的个人网站有非常多好文章,很值得一读,毕竟是标准委员会成员。cppcon他也经常做主持,有很多cppcon的视频可以在channel9或者youtube上找到。
- Scott Meyer,Brown University的博士,Effective系列丛书作者,C++顾问和培训师。
- Stanley Lippman,C++ Primer的作者,C++初期和BS同时开发C++的早期版本,算是C++的早期创始人之一,后来2007年受雇于微软作为架构师开发Visual C++。
- Kenny Kerr,微软MVP,他创造了C++/WinRT,将标准C++再次带入到了微软的开发环境中。微软曾经也是C++的主力坚持者,后来2000年左右推出.NET以后C++就退居二线了。(2018/03/22更新)
- vczh,陈梓莘,华南理工大学毕业的大牛,从初中开始编程,本科毕业入职MSRA,然后转入西雅图总部至今,知乎上人人皆知的轮子哥。
C++ Primer
中文版审校,可以看出水平很高,而且在华人C++圈有影响力。
总结
C++是通用性的系统编程语言,不仅仅是面向对象语言。模板是C++的基础知识和必须掌握的知识,否则无法充分利用现代C++的完整能力。追赶上C++的最新发展,才能解决新问题和更好地提高工作效率。