大家都说C++比较难学,但对于我这种一直没系统学过其他语言的C++程序员来说,并不会觉得C++难,因为我没去体会过其他语言的简单。最近在学习设计模式,引发了我对编程的一些感悟,所以打算记录一下。
听说"低级程序员才讨论语言的差别",我可能就是吧。
C++基础中总是会提到C++编程的过程:写代码->预处理->编译->汇编->链接->运行。当然,还有一些其他阶段,例如debug阶段。这个基础知识我看过无数边,记的滚瓜烂熟。但是我发现它的重要性一直被我忽略,它能够指导程序员去整理自己的知识体系。
例如:如果你对你的C++水平不够满足,则会去学习很多知识,但是发现要学的东西太多太杂,仿佛永远学不完,直到放弃。但是,你学的每一个零散的知识点,都可以将它归结到C++开发的这几个阶段其中一个。
例如我最近在学设计模式,设计模式可以归结到C++的写代码阶段,设计模式的用途就是将代码写的容易看懂(别跟我说设计模式的作用不止这一个,复用代码/解耦代码/各种设计原则/设计模式等等 最终作用全都是为了代码容易看懂),理解了这一点,你就能发现自己编程时的弱项在哪个阶段,并且带着明确意图 通过学习去弥补它。
如果你学习宏定义的各种奇技婬巧,则你只会弥补你在预处理阶段的能力。而对于语言差别的讨论者,大概是在讨论C++的语法多/杂/灵活/丰富/怪癖,这应该归到C++的编译阶段,编译器对C++代码的语法处理,然而,想成为一名合格的C++程序员,也许对C++的语法并不需要完全了解。甚至即使你全都学会了,整个团队写项目时,为了统一代码风格,也不会让你随便show各种生僻语法。
如果你学习汇编语言,学习反汇编,则可能你在弥补的是你对汇编阶段的理解能力,debug能力(当然debug时只是偶尔用到汇编知识),这一部分对业务开发来说几乎完全用不到。
当你的项目足够复杂时,文件超过100个,代码上万,百万时,你需要去弥补的,不是C++语法,不是汇编,而大部分应该去学习链接器的链接规则,并去学习一些项目管理工具,如make,cmake之类的。
作为一个C++程序员, 我学过的知识非常杂乱,想起什么来就去学一点。可能C++语言本身对程序员的要求就是这样吧,你用C++做什么,就找准C++里面相应的那一小部分,去学习,如果没找到,或者找错了,那你将会学的很迷茫。
最后总结一下我针对各个阶段,了解/学习过哪些知识。也许不够完整,但可能能够帮到你:
1:针对 编码阶段,我学习过:C++语法,STL,设计模式,《代码整洁之道》,面向对象设计,了解模板编程,借鉴开源库libco,操作系统API,
2:针对 预处理阶段,我学习过:宏定义from谭浩强的《C》和《C++》教科书/《深入浅出MFC》
3:针对 编译阶段,我学习过:C++语法,模板编程,cppreference
4:针对 汇编阶段,我学习过:简单的汇编语言from《深入理解计算机体系》,linux内核源码,libco中的CPU上下文切换汇编
5:针对 链接阶段,我学习过:windows vs工程配置,g++命令,linux内核工程,
6:针对 运行阶段,我学习过:操作系统,linux内核,gdb/strace等动态跟踪工具,tcpdump+wireshark网络包分析,windebug
7:更多其他内容:有的东西学习了对各个阶段都有好处,突然发现我总结起来也不是很顺溜。另外除了这些阶段,还有一些阶段不属于C++范畴,但对C++程序员很重要,我也没有列上。甚至一些课外书
另外值得一提的是,目前我们学习知识的方法大多数比较低效,需要查阅网页,需要购买书籍,需要找到负责人的老师等等,而不是像《黑客帝国》那样,一根数据线直接输入,瞬间学会全套中国功夫。所以学习过程中的寂寞和枯燥是避免不了的,也有了"吃得苦中苦方为人上人"的说法。目前来说,我知道的最好的提升办法就是找到适合自己的书籍,反复研读,并尽量寻找实验机会。当然偶尔查查网上资料也是有效果的。如果你找不到合适的人指导,那就看书吧,痛苦是目前避免不了的。
如《算法导论》,《深入理解计算机体系》,《effective C++》,Linux内核 等 经典之所以经典,是因为它们对很多阶段都有指导性作用。
总结归纳能力对C++程序员真的非常重要,值得我画大量时间去思考。
如果说python和js分别是数学和绘画,那C++很难给他一个分类,它是一个综合学科,比如叫它 理科,如果你啥都想做,但不想学一大堆语言,又有时间,耐心,和对抽象的浓厚兴趣,那就试试C++吧