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

C++学习的一些经历相关推荐

  1. 我的三年研究生(CS)学习与工作经历(ZT)

    我的三年研究生(CS)学习与工作经历(ZT) 2001年,我考入NJU计算机系,因为是要自己解决学费和生活费,一直在半工半读. 研一时,一边读书拿学分,一边在一家小公司做兼职.因为兼职的公司很不正规, ...

  2. 记录一下2019年-2020年期间的学习、工作经历

    记录一下2019年-2020年期间的学习.工作经历 2019年,我正在学PHP,那时的我怀着对各种编程知识的好奇心,认为编程界这么多种语言,只要学好一门,以后想转其他的语言应该都不难.于是我就开始疯了 ...

  3. 学习音乐的经历是如何帮助我学习编程的

    前言 你心里可能在想,学音乐和学编程有什么关系? 哈哈,作为一名专业的双簧管吹奏者,我发现二者其实存在很多共通之处. 这两件事都需要你极为专注.自律和坚持才能做好. 下面我将通过一些事例来说明学习音乐 ...

  4. golang学习和校招经历

    如果您有时间的话好好看完   如果您还在学校的话好好看完    如果您想学golang的话好好看完     读完大概3分钟 简单介绍一下golang go语言又称golang  我喜欢叫golang ...

  5. 【英语专业,外企三年】我的完整学习和求职经历

    昨天在豆瓣上发了个帖子,出乎意料引起了大家的共同反响.大家都是学英语的,聊得很高兴,能帮到大家是最好不过了.不过,在交流的过程中我也发现了很多共性的问题,比如,怎么学英语,怎么备考专业考试以及求职方面 ...

  6. 学习SEO可能经历的五个阶段

    最近看了一些有关SEO的书籍和视频,发现了一些问题和技巧,我们可以把学习SEO分为5个阶段,只不过每个人学习的过程,所走的路程不一样罢了,而下面便是我改写学习SEO的历程,每天上班的第一件事就是打开站 ...

  7. 【绝对干货】Python数据分析师学习的亲身经历

    今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该如何学习才能做到毫不费力. 想象是美好的,现 ...

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

    2015年9月20日,我永远也忘不了的日子,我痛下决心辞去四年的工作来到了帝都北京,学习改变我命运的技能,想用这一技之长来改变自己以后的生活,算是给自己前半生的一个圆满句号. 在我的生命里,体育运动是 ...

  9. 读书笔记——我的学习与研究经历(杨振宁/2012)

    上面讲到了好多项我个人多年来得到的启发与感受: 1)一方面直觉非常重要,可是另一方面又要及时吸取新的观念修正自己的直觉. 2)和同学讨论是极好的真正学习的机会. 3)博士生为找题目感到沮丧是极普遍的现 ...

最新文章

  1. HDU 2080 夹角有多大II
  2. -Objc 、 -all_load 、 -force_load
  3. 找出数组中出现次数超过一半的数
  4. Part1_4 python函数、文件操作、异常处理
  5. 中3d库后接负载_什么是假负载?如何利用假负载维修变频器?
  6. Android开发万能Utils(工具大全)
  7. 5g无线网络对电子竞技市场发展影响
  8. IDEA 修改项目名称
  9. ios12上滑关闭程序动画_iOS 12.3正式版终于来了:这类用户升级需谨慎!
  10. 构建自己的PHP框架--实现Model类(2)
  11. 数字人民币APP(试点版)上线引关注 | 产业区块链发展周报
  12. 经纬度PLT文件格式说明
  13. C语言程序代码 25 编程实现将任意一个华氏法表示的温度,转换为以摄氏法表示的温度。
  14. web注释@WebService,@WebMethod,@Oneway,@WebParam
  15. MSI(Message Signaled Interrupt)/MSI-X
  16. java合并word_java实现合并多个word文档 且可换页 实例代码(基于docx4j)
  17. 第六十七篇:opencv中KeyPoint与point2f之间相互转换
  18. 第七届全球云计算大会-中国站9月宁波举办
  19. 机器人的弊议论文_机器人的利与弊议论文
  20. Java内部类与异常类(上机实践二)

热门文章

  1. jQuery Ajax 实例 全解析(转载)
  2. 英特尔暂缓扩建大连芯片厂 或吞并全球最大芯片生厂商之一美光科技
  3. 基于Greenplum构建下一代数据分析平台
  4. 成都java培训,尽在传智播客成都中心
  5. 如果我有100块钱……
  6. 新突破!德国MPQ证实光子是量子比特载波的优选
  7. 国科大学习资料--最优化计算方法(王晓)--第六次作业答案
  8. Target “pango_windowing“ links to target “Eigen3::Eigen“ but the target was not found. Perhaps a
  9. python中cv是什么_python里面cv是什么意思
  10. Linux shell 的ss