学C++体会
一年前写的东西,整理了一下,贴出来。
大学时期我眼中的C++和C语言一样一样的,因为课时不够老师讲C++的时候只讲了前半部分语法(相当于C语言学了两遍),关于面向对象部分的东西还没讲到课程就结束了,秉着混日子的学习态度后边的也没看。这也造成了我为期四五年的天真无知的认为我懂C++,直到近期翻看《STL源码剖析》《Boost文档库》才老脸一红有了自知之明。现在想来即使老师把后半部分面向对象讲了也不算真正的懂C++(那破教材应该扔了,而且大学C++的课程时长应该翻三倍),C++的水太深了。
站在程序员的角度来说,一门成熟的编程语言应该具备以下一些东西:简洁易懂标准统一的语法语义,功能齐全的类库,工业级的代码规范和指导文档。从这方面看C++还处于生长期,而漫长的C++标准制定期给它的成长带来了很多羁绊(例如缺乏规范造成编译器各自不兼容),而在它缓慢的成长的同时,一些新的编程语言后来者居上并带来C++不具备的新特性,使得它为了追求兼容这些新特性而陷入更加痛苦漫长的标准制定期。它概念上的架构早已经确立,为了兼容新特性而产生的技巧上的东西对其本身没有太大的影响。概念上,真正的C++包括了过程化C子语言,面向对象部分,泛型编程。后面两者才是C++的灵魂所在。STL是这三部分的一个具体实现,一个类库,类似于C#对.net。而关于模板元编程这个新特性,更倾向于把它归结于一种编程技法,而很难提升到概念这一层。毕竟把运行期的工作提到编译器这种做法在程序设计的时候并没有通用的解(有一定的局限性,并不是所有的情况都可以这么干)。
单纯于语言来说,学习语言很简单,掌握了语法就算掌握了一门语言,但是如何把这门语言说的漂亮,这才是作家(大师)与读者(普通程序员)的区别。无论编程语言还是自然语言,每种语言都有自己独特的魅力,“你好”“吃了吗”这些司空见惯的语句凸显不出语言的魅力,适当的技法应用才能让语言生辉。通过近距离接触大师级作品(源码),你会发现语言独特且强大的魅力。对于编程语言来说,每种设计思想和技术都相当于一种全新的文体或者修辞手法,而类库相当于一些名著名言,是托生于些文体或修辞产生的名著名言,供后人引用调用。 STL是一个C++类库,提供一些常用容器和算法,STL的设计师们设计这套类库时创造了一些独特的技术和设计理念,类似迭代器,仿函数等等,这些独创的技术和理念才是STL的基石与灵魂,是STL最本质的东西。C++是一个仍在成长的语言(大批配套的类库和先进的语言特性需要完善,C++的生态系统正在形成中),大批优秀的编程大师们用自己天才般的智慧推动它的稳步成长,而通过研究源码了解它每一次成长的源动力会让自己更加触及它和它的创造者的灵魂,这对于一个孜孜追求进步的程序员来说是一个捷径。从不质疑C#,Java之类语言的优越性,但一个苦心孤诣的程序员如果只是满足于使用便捷的语言,那他永远是个不入流的程序员。C++才是编程语言世界里那颗最耀眼的明星。
就针对STL架构而言,从功能上分包括以下几个部分:容器,迭代器,算法,函数对象,适配器,Utility和Allocator。STL主要关乎容器和算法,其目标是容器和算法分离,而迭代器,函数对象等等都是为了实现这一目标而抽象出来的概念或者编程技法。单从应用上讲,你只需要找一个工具书去了解一下容器和算法即可以很方便的在编程时调用。但是阅读STL源码可以让你明白其实现挖掘机细节以及编程技法,学习这些技法有助于提升你的编程技巧。boost做为一个标准库的后备库,是C++标准化进程的发动机之一,不折不扣的“准”标准库。它提供了专家级的实验性质C++源码,如果感觉自己在C++领域已经到了一个瓶颈或者高处孤寒了,可以去阅读一下STL和Boost的源码。
学习一个语言归根到底是为了工程实践。虽然工程实践更加重视设计,架构,性能,等等,与选择的语言相关性不太大,但是毕竟再大的工程也是又语言一砖一瓦构建起来的。人们会从一个又一个工程实践中总结出来各种各样的经验,包括软件开发模式,设计模式,软件测试理论,等等,这也就是软件工程这门课存在的理由。工程实践还有一个非常重要的经验总结--对于特定语言在工程实践中的总结,比如怎样在工程中更加有效的使用特定语言,常见的错误,针对特定语言更加合理的设计架构等等。Scot Meyer的《effective C++》就是这样一本好书。。《effective C++》的种种条款或是提醒也好或是建议也好总结了大部分人都会犯的普遍性的错误,总结的很有条理性,而且挖掘定位的很精确。看完了这本书再去翻你保存的自认为很经典的源码你会发现它们是如此薄弱,随便拿出一条条款去检测都能搂出一堆潜在的bug。虽然看了这本书你依然会犯错,但至少当你意识到自己犯错的时候能够很快明白自己错在哪了。对于一个经常与C++打交道的程序员这应该是一本枕边书,随时都应该拿来看看。