C++学习的一些经历

闲扯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

时间: 2024-10-05 23:59:01

C++学习的一些经历的相关文章

谈谈我学习图像处理的经历与收获

谈谈我学习图像处理的经历与收获 大概是在2011年年底的时候,我在家里整理以前的IT书籍.发现我买的几本图像处理的书,于是我又随手翻了翻,发现自己还是挺感兴趣的,就直接放到书架上了,说实话做Java这么多年了,一直都是做外包,想想自己也没什么拿得出手的竞争力.想想英语没英国人讲的好.工作没年纪轻的加班猛.沟通交流没有文科生那圆滑.还是走技术吧,毕竟自己还做了这么久,想想大学毕业设计是关于图像处理的,于是我又捡了起来.从2012年初.坚持自己研究图像处理.期间也有几次想放弃.想去学学安卓什么的,但

复旦微电子牛人学习模电经历

复旦微电子牛人学习模电经历 2011-03-09 18:41:40 分类: IT职场 注:文章内容来自网络,网址不详 复旦攻读微电子专业模拟芯片设计方向研究生开始到现在五年工作经验,已经整整八年了,其间聆听过很多国内外专家的指点.最近,应朋友之邀,写一点心得体会和大家共享. 我记得本科刚毕业时,由于本人打算研究传感器的,后来阴差阳错进了复旦逸夫楼专用集成电路与系统国家重点实验室做研究生.现在想来这个实验室名字大有深意,只是当时惘然.电路和系统,看上去是两个概念,两个层次. 我同学有读电子学与信息

asp.net MVC 小白的笔记-说下这几天学习mvc的经历

到现在才来学习mvc,算是有点晚了,接触的比较晚! 首先是接触到了基础的EF,先说下EF,EF是一种ORM(实体映射对象)框架,是基于ado.net的一种开发更便捷的对数据库进行的技术,有2种开发,一种是ModelFirst,就是 先通过新建ado模型,把数据库中的表直接映射到项目中的模型视图 , 该模型视图下有数据库中的各种字段,并且这些字段会自动生成一个类,映射成一个实体类.还有另外一种就是CodeFirst,顾名思义 就是先写代码,建视图,根据所建的视图,视图之间的关系,关系这里有一个非常

老男孩学习之亲身经历心得

2015年9月20日,我永远也忘不了的日子,我痛下决心辞去四年的工作来到了帝都北京,学习改变我命运的技能,想用这一技之长来改变自己以后的生活,算是给自己前半生的一个圆满句号. 在我的生命里,体育运动是伴随我时间最长的一项运动,我的项目是中长跑,从我初中的生活就开始,这使得我有一种坚持的精神,我相信只要是自己想达到的愿望,通过自己不懈的努力就可以实现,不管什么事情,最难能可贵的就是坚持.所以我依然辞职,挤进了这个快节奏高消费的大都市--北京. 我对linux没有一点认识,在我的脑海里,电脑就是用来

聊一聊学习树的经历吧

之前也没有系统的学过数据结构,但是平时用到的数组,链表等还是比较简单的,理解的时候即便没有接触过但是撸一撸源码,看一看画的图,基本上也就会了,树,二叉树,二叉搜索树,平衡二叉树,2-3树(完美平衡二叉树),红黑树.这次主要是在整理Java基本的数据类型Collection和Map子类的时候,发现要想吃透的话,还是绕不过这一块,更别提现在的hashMap和CurrentHashMap在容量大于8时,也抛弃了用链表转向红黑树的实现,这些种种都说明了树对于一个由码农进阶程序员的人来说有多重要. 树对于

JAVA学习心得

学习JAVA一个学期了,虽然学的不是很好,也没有彻底理解JAVA的真正内涵,但是我认为学习java应该是循环渐进,有始有终,按部就班,脚踏实地.java是一门有着阶梯性的一们语言,信心,恒心,毅力是最重要的.这是我们必须具备的心理素质.要是学习这门语言开始的时候很有兴趣,遇到苦难就退缩,这样最终会放弃学习java,没有经历风雨怎么见彩虹.编程就是有的时候就是那么这么人.会遇到很多的困惑.但是一旦你弄懂了,或者是你把问题解决了,你会感到很兴奋,编程的快乐就在此 了. 总之,新学期,加油!

学习JAVA的心得体会

面向对象Java程序与设计这门选修课,说实话,我认为的确是一门实用性很强的课程.但是要想上好这门课程,我们必须要有一定的基础,否则上这门课,你一定是听不懂的,最后让你失去兴趣,在最后,一学期下来,我们可能一无所获,就知道了老师口里经常喊的“class”.“public”等等.老师让我们采用分组学习的方法,我们既可以看到其他组员不同的学习方法,取其精华去其糟粕.又可以与其他组之间构成竞争,彼此之间相互学习,共同进步. 学习了半年的JAVA, 我更加明白了信心.恒心.毅力是的重要性.这是我们必须具备

如何学习(3):迭代学习,精益求精

古人云「十年寒窗无人问,一举成名天下知」,这是中国古代为数不多的读书人的真实写照.大多数读书人只有十年寒窗,却不见得成名. 在软件开发领域有瀑布模式的软件工程方法论,它将软开发的几个过程「需求分析,概要设计,详细设计,编码,测试,发布」严格串行起来,只有需求分析充分分析后,输出需分析文档,才开始做概要设计,依次类推,直到每个过程都完成后才给最终客户发布软件.但很多时候出现双方都不愿意看到的结果,那就是交付的产品并不是客户所期望的. 这两件事情有类似的地方,那就是它们运行在 封闭的系统,只有内部循

Python学习之旅—Day06(字符串+字典+列表重点方法)

前言: 本篇博客主要针对字符串,字典和列表中的一些容易忽略的重点方法进行整理,以期进一步夯实大家的基础. [001]字符串方法--isspace()方法 isspace()方法主要检测字符串是否只由空格组成.我们通过如下的实际例子来查看该方法: str1 = " " print(str1.isspace()) str2 = "cisco 123" print(str2.isspace()) str3 = " #" print(str2.isspa