专业的编程技术博客社区

网站首页 > 博客文章 正文

一个月薪30k的C++程序员的自我救赎之路

baijin 2024-10-01 07:34:34 博客文章 8 ℃ 0 评论

闲扯C++道路的经历

-

前言

不知道会不会被骂,毕竟作为一个还不能称为精通C++的人说这些在大神面前总显得有些班门弄斧了。

周围有不少的同学朋友编程都相对比较差,感觉是缺少一些方法,我把我的历程经验贴出来,供大家参考,也欢迎牛人继续讨论。

大学

大学时候,必修的C,选修的C++,当时就只知道什么类呀,继承啊,多态啊之类的称呼,根本不能说会用。

写个Retangle类还行,一碰到实际的需求,还是用C的过程性的描述,外面一大推的全局变量,然后一堆C函数堆砌在一起,就算完成任务了,根本没有面向对象的思想。

后有幸进入一家公司,进行了大约1年半的C++开发。

整个大学完成,会基本的C编程,数据结构知识略懂一些,用C实现过基本的数据结构,C++基本没有用过,知道STL的一些容器的用法。

工作

阅读底层库

刚入职的时候,一直充满着热情,加班算不上多,每日都有很多的空余時间。

我们公司有套1990年左右写的底层库,是1个涉及到大规模节点保持可靠通信的库。

以前校园内也没怎样看过他人写的代碼,如今突然之间冒出这么多的代碼,并且写的很好,一瞬间感覺自己差距太大了。

因此晚上下班了以后,我的每天的工作就是阅读公司的底层库,缓缓的知道怎样实现跨平台的线程,锁,怎样实现多线程之间的消息传递,怎样进行对象的封裝,怎么使用类的多态的特性,怎么使用状态机。

因为是1个古老版本的底层库,代碼量也算不上多,几千行的样子,看了好几周,才彻底弄懂內部的流程。

那时候感觉写那个代碼的人真得好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++有了更深层次的认知

那期的课程很长,我采用的方式每天晚上坚持学习(活到老,学到老),经常看的时候就发现这和我看过的源代码的思想有很多重叠,只不过课程中老师解释的更清楚,告诉我们他为什么那么做,真的很好。

现在依然记得的有异常处理,资源管理创建并分配,scoped_ptr,内存池,还有设计模式的一些应用,反正学的时候,是各种共鸣,与大学时候学习的概念完全是两码事。

虽然很长,我学的很快,很多课程我直接跳过了。

再后面学了c++对象模型

主要讲了类,继承,派生,多态到底是如何实现的,这一下子颠覆我的思维了,过去我一直作为c++的使用者,根本没有去想这些东西是如何实现的。

学了这课,知道了它的内存布局,以及编译器的处理流程,逼格立刻高了不少,是一堂让我升华的好课。

学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习C/C++或者为了入行、转行学习C/C++的伙伴可以私信回复小编“学习”领取全套免费C/C++学习资料、视频

继续谈工作

后边我的工作转向了修改sip代碼。

于是下載另个开源库,继续每日的读代碼,同样是纯c实现的,这一次读起来省劲的多了,很多都与自己有共鸣了。

看了一部分就能猜出来后面会怎么实现了。

老大了解我拿手搞这个,依然交给我。

我就负责读代碼,会上报告这个代碼的流程,并给出应该在哪里修改才能为我们所用。

在后边有段时间,我迷上了chromium以及webrtc,阅读了它里头的许多代碼,这两个都是c++的,利用许多c++的特性,因此实现起来就比c顺畅的多了。

有的时候c需要绕个弯才能实现的,c++直接就可以干。

收获颇丰。

后来

后来我辞职了,考了个研,加入了另外一家公司做ios开发。

我不喜欢开发界面,在ios组也几乎总是在做客户端的底层实现。

不过那些比起c++开发就容易一些了。

总结

针对学习c++,我感覺一个是要练习,多敲代码,1个是要多读书,读经典的书,还有一个是多读源码,吸收其他人敲代码的思维,认识自己敲代码的欠缺。

敲代码是提升自身熟练的程序,做到写得快;念书是提升自身的视域,提高自己的专业能力;

看其他人的代碼和念书有共同之处,可是它是以一种直接呈现的方式,因而需要自己仔细去感受写代码的人的良苦用心,才能真正体会到优秀代码的美。

这三者要结合在一起才行。

学好c++,再学习别的的語言,确实感覺简易的多。

学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习C/C++或者为了入行、转行学习C/C++的伙伴可以私信回复小编“学习”领取全套免费C/C++学习资料、视频

不过我个人建议最好再学习一门脚本语言,我选的是python,看了python基础教程,同时看了一本计算机程序的构造和解释(还有两章没看),这样才能对编译型和解釋型的語言都理解的好一点。

自己都没有统计分析过写了多少行的代碼。

自我评估大学的时候写的也就有三四千行的样子,在工作中有2万行,目前念书也就有个一万行。

认真看过的编程书籍列表:

  1. C程序设计语言
  2. C++程序设计语言
  3. effective C++
  4. 设计模式Gof
  5. 深入探索MFC
  6. header first设计模式
  7. 算法导论
  8. 数据结构c语言版(大学课本)
  9. Linux程序设计
  10. python基础教程
  11. java编程思想

没看完整的编程书:

  1. 计算机程序的构造和解释重构
  2. Java核心技术

-

如有侵权,请联系删除

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表