闲扯C++道路的经历
前言
不知道会不会被骂,毕竟作为一个还不能称为精通C++的人说这些在大神面前总显得有些班门弄斧了。 周围有不少的同学朋友编程都相对比较差,感觉是缺少一些方法,我把我的历程经验贴出来,供大家参考,也欢迎牛人继续讨论。
大学
大学时候,必修的C,选修的C++,当时就只知道什么类呀,继承啊,多态啊之类的称呼,根本不能说会用。 写个Retangle类还行,一碰到实际的需求,还是用C的过程性的描述,外面一大推的全局变量,然后一堆C函数堆砌在一起,就算完成任务了,根本没有面向对象的思想。后有幸进入一家公司,进行了大约1年半的C++开发。
整个大学完成,会基本的C编程,数据结构知识略懂一些,用C实现过基本的数据结构,C++基本没有用过,知道STL的一些容器的用法。
工作
阅读底层库
刚入职的时候,总是充满着激情,加班不算多,每天都有大量的空闲时间。我们公司有一套1990年左右写的底层库,是一个涉及大规模节点保持可靠通信的库。 过去在学校也没怎么看过别人写的代码,现在一下子涌出那么多的代码,而且写的那么好,瞬间感觉自己差距好大。于是晚上下班之后,我的每天的工作就是阅读公司的底层库,慢慢的知道了如何实现跨平台的线程,锁,如何实现多线程之间的消息传递,如何进行对象的封装,如何使用类的多态的特性,如何使用状态机。因为是一个最原始版本的底层库,代码量也不算多,几千行的样子,看了好几周,才完全搞懂内部的流程。 当时感觉写那个代码的人真的好nb,这么复杂的结构都可以设计的出来。
总经理的建议
我有阅读的习惯,平常周末闲着没事,就喜欢看看书。 当时有幸和我们的总经理hyy讨论这个库,总经理特别给我推荐了MFC的实现代码,其实MFC大学我也看过,但也是浅尝辄止,当时还装逼式的买了一本深入浅出MFC,自己还真把他基本看完了,不过只是看,并没有真正理解里面的美妙。 当时总经理特别强调了它里面用的最好的是宏,他那么一说,我立刻就反应过来了。确实呀,里面的动态创建,消息传递,运行时类型识别,序列化和反序列化都是用宏实现的,将内部的很多代码隐藏了起来,就只需要在类中加入DECLARE(…)这样的字样,就可以实现很多特性,这些declare都是宏。 既然总经理大力称赞,咱必须再次拜读一下。
重读深入浅出MFC
有了阅读开源库的经历,我发现再次重读深入浅出MFC并没有那么吃力了,前面讲述的虚函数的机制,虚表的一些构成我立刻就心有戚戚焉了,而不是如过去的死记硬背一样。后面就是关于动态创建,运行时类型识别等等特性的实现机制,我不再像过去那样,仅仅是阅读而已,这次我要实现它。 我就按照那本书说的机制,已经书上贴出来的代码,一点点的敲。书看得很快,一个特性一两天就可以基本吃透,但是写代码自己就慢多了,各种调试错误,毕竟书中的代码是一片一片的,我需要按照自己的感觉将它们整合在一起,自己就会犯各种错误。功夫不负有心人,大约1个月的样子,我把它的所有特性都挨个实现了一遍,总共代码量有一两千行的样子,虽然主要是抄的,但是感觉自己真心学到不少。 这个宏真是太奇妙了,而且还实现的怎么优雅,那种感觉真的特别好。
看c程序设计语言
这本书大学的时候读过,当时也写了不少的代码,给自己帮助很大,这一次重新读了一些过去跳过的章节,收获很丰富。 我建议初学习c++的朋友一定先仔细读读这本书,课后习题多做一些。 我自己做不到每题都做,但是书上的例题我全部抄完,课后的习题我选了部分进行了实现。
看设计模式
后面我就开始看设计模式(四人帮的那一本)。很多人都说这本书特别晦涩难懂,说实话,确实有点难度,语言很抽象,比较费劲,虽然书非常薄,但是每一种模式都让我花了不短的时间才搞定。 有了过去的经验,我不再满足于看了,每看完一个模式,我都去实现一种。 当然那种代码没有什么特别的意义,就纯粹为了实现而实现,但实现完的感觉就是爽。 现在我已经忘记了自己是否都实现了,常用的我肯定都实现过,而且不只一遍,大约有10几种吧。 设计模式是一种思想性的东西,它教会我如何针对一个实际问题,去构造单独的类,然后设计类内部以及类之间通信的接口,从而给外部提供一个更好的抽象。
看Effective C++
看完设计模式,我又把视角回到了C++的学习上。 大家都说C++程序设计语言是C++最经典的书,我大学的时候买过一本,但是没怎么看,感觉太晦涩了。 那难的不行,先选个简单的看看吧。 于是选了effective C++, 这本书提供了C++编程的一些tips,看着真心好,后面公司写代码的时候我很多都会参照这些tips去写代码,当然也并不是完全照搬的。 这本书有些设计模式的思想和GOF的那本有重叠,让我对有些设计模式理解的更深入了。 我还买了一本more effective C++,但是读了前两章之后,感觉太难读了,就没再读下去。
这中间的工作
这中间我们在一个开源代码asterisk上进行修改。我主要负责底层dahdi驱动这一层面,当然上层的代码我也要改。 有很长的一段时间,我都在阅读asterisk的代码,代码是纯c语言的,但是整个代码的框架并不是面向过程,而是面向对象,同时还有继承,虚函数的思想。 那是我第一次发现c实现面向对象也可以实现的这么优雅,结构体的嵌套,函数指针作为结构体的成员等等。 后来老大派了一个任务,让把asterisk的流程梳理一下,这正合我意。 我那一两周每天就是读代码,打日志,跟踪程序的执行流程,写了不少的文档,对c实现面向对象理解的更加深入了。 同时里面那么类之间的沟通协作,他们做的非常好,真的很牛。
读代码最重要的是真心读懂,吸收别人的精华,并为我所用。
继续读书
后面有两本书直接将我的c++的能力提升到了一个新的层次。重磅推荐c++程序设计语言以及深度探索C++对象模型。 有了那么多的读代码的经验,我再看代码就可以很容易猜出它的意图了,因此我感觉是时候看c++程序设计语言那本大部头的书了。 那本书特别厚,我采用的方式是只看自己感兴趣的章节,经常看的时候就发现这和我看过的源代码的思想有很多重叠,只不过书中解释的更清楚,告诉我们它为什么那么做,真的很好。 现在依然记得的有异常处理,资源管理创建并分配,scoped_ptr,内存池,还有设计模式的一些应用,反正看的时候,是各种共鸣,与大学时候一股脑的背书完全是两码事。 虽然很厚,我看的很快,很多知道的我直接跳过了。
再后面看了深度探索c++对象模型,这本书又是一本难啃的书。主要讲了类,继承,派生,多态到底是如何实现的,这一下子颠覆我的思维了,过去我一直作为c++的使用者,根本没有去想这些东西是如何实现的。看了这本书,知道了它的内存布局,以及编译器的处理流程,逼格立刻高了不少,是一本让我升华的好书。
继续谈工作
后面我的工作转向了修改sip代码。 于是下载另一个开源库,继续每天的读代码,同样是纯c实现的,这次读起来省力的多了,很多都与自己有共鸣了。看了一部分就能猜出来后面会怎么实现了。老大知道我擅长搞这个,依然交给我。 我就负责读代码,会上报告这个代码的流程,并给出应该在哪里修改才能为我们所用。
在后面有一段时间,我迷上了chromium以及webrtc,阅读了它里面的很多代码,这两个都是c++的,利用很多c++的特性,因此实现起来就比c顺畅的多了。有的时候c需要绕个弯才能实现的,c++直接就可以干。收获颇丰。
后来
后来我离职了,考了个研,进入了另外一家公司做ios开发。我不喜欢开发界面,在ios组也基本上一直在做客户端的底层实现。不过那些比起c++开发就容易一些了。现在在读书,研究方向为分布式存储编码容错,欢迎探讨哈。
总结
对于学习c++,我感觉一个是要练习,多写代码,一个是要多读书,读经典的书,还有一个是多读源代码,吸收别人写代码的思想,发现自己写代码的不足。 写代码是增加自己熟练的程序,做到写得快;读书是增加自己的视野,提升自己的能力;看别人的代码和读书有相似之处,但是它是以一种直接呈现的方式,因此需要自己细心去体会写代码的人的良苦用心,才能真正体会到优秀代码的美。 这三者要结合在一起才行。学完c++,再学习其他的语言,真的感觉简单的多。不过我个人建议最好再学习一门脚本语言,我选的是python,看了python基础教程,同时看了一本计算机程序的构造和解释(还有两章没看),这样才能对编译型和解释型的语言都理解的好一些。
自己没有统计过写了多少行的代码。自我评估大学的时候写的也就有三四千行的样子,工作中有两万行,现在读书也就有个1万行。
认真看过的编程书籍列表:
C程序设计语言
C++程序设计语言
effective C++
设计模式Gof
深入探索MFC
header first设计模式
算法导论
数据结构c语言版(大学课本)
Linux程序设计
python基础教程
java编程思想
没看完整的编程书:
计算机程序的构造和解释
重构
Java核心技术
本人lpstudy,转载请注明出处 http://blog.csdn.net/lpstudy/article/details/50980737