
2-8 C/C++程序员成长经验
当你学习了一门基本语言,建立起这些程序设计的基本概念之后,你会逐步成长,甚至有时候会加速度成长。所以本章来回顾一下一个嵌入式程序员的成长道路。为后面的开发经验介绍定下一个基调。也希望这些经验能给读者一些激励和帮助。
算上大学开始的编码工作,我写程序已有十多年历史了,现在呢,也靠这个吃饭。据说十年磨一剑,我也希望我这十多年的编程经验对大家有所帮助。基本上经历了以下三个时期:
● 初期:C语言是一门课程,用来对付考试的。
● 中期:C语言是一个工具,用来帮助学习的。
● 现在:C语言是用来解决问题的。
差不多经历了从知道语法,熟练C语言,到用C语言解决一些工程数学或者其他教学的相关问题,并开始扩展自己的知识面。比如,链表学习的时候完全不知道它有什么用处,不过等到学到操作系统的时候便会明白,原来这么多进程在电脑中只不过是一张张链表罢了。如果你看懂了上面这一句话,其实你这门课基本上也就合格了。
第一阶段:C语言的学习
C语言是我的第二门编程语言功课。当时的大学课程设置可能和现在不同,入学会学习一门程序设计语言,根据专业不同,Pascal、Fortran、Basic等都有。而且上机是在一个小型机的终端上进行。等这门课快结束的时候,刚刚有点儿感觉,就要考试了,这门课就结束了。基本上什么也没有学到,就知道使用键盘敲入字母字符了。
真正的C语言学习是大三的这门C语言课程。而且学校的机房开始流行PC机了,每台电脑上都有Turbo C。基本上上一节课就会抽空去机房待一两个小时,调试一点程序。现在还记得第一个程序,有个字母打错了,半天找不到原因,编译提示的英文每个单词都认识,合起来的意思却看不太懂。自己还觉得和书上的一模一样,找了一个同学来看,原来是少了一个字母。
这个时候,只能说熟悉一下电脑的用法,那个时候还是DOS,还要记忆各种命令。然后就是把书上的代码敲入Turbo C中,一一验证这些语法。感谢学校的一个规定,当时C语言考试,上机要占部分成绩。不然,以我对课程的态度,肯定只上课不上机了。当然,那个时候,不知道将来要靠C语言为生,只是把它当成一门课程来学习。
还好那个时候学校风气不错,大家都说,不会应用计算机,将来会有危险。对我们这个专业来说,会应用计算机,当然标准就是会利用计算机开发需要的程序了。
总结一下,第一个阶段,只是通过上机验证C语言的语法。不断地编写一些程序,熟能生巧。后来问过很多同事,都说有这个阶段。只不过他们有些人当时就很爱干这个,做起来兴致勃勃,我属于中间,感觉还不错,既不特别喜欢,也不像有些同学对计算机编程有畏惧心理。当时要知道熟练掌握C/C++可以让我的工资快速加倍,我就肯定不是上课就去机房了,我有空就去,把C语言练习得无比熟练,就像我们说话一样,它其实也是一门语言,是一门和计算机交流的语言。
第二阶段:课程设计和毕业设计
感谢学校,当时教学改革,给我们这个专业开了一门叫作软件开发基础的课程。现在明白了,就是计算机专业的数据结构,操作系统和软件工程的三合一。
数据结构主要是链表、树等,老师要求我们用C语言实现,特别是课程设计,开始人生第一个超过1000行的代码。
以前的学习,最多不过是200行的代码,当代码规模扩大后,你就感觉不一样了,慢慢地经验也不相同。现在看来,熟悉了基本语法之后,就是给自己题目,让自己编写越来越长的代码就可以了。
当时并没有这个认识,幸好还有两门课程的课程设计,给了我编写更长程序的机会,一门是复变函数,老师让抄写书上的一个算法用C语言实现,一门是信号与系统,很难也很有意思的课程,有个算法难得很,我都没有搞懂,只是到图书馆抄了一个代码来实现,慢慢地搞懂了。
说到这里,数字电路和计算机原理两门课程设计也同样精彩,后来硬件上能这么熟悉,全靠这两个课程设计时打下的基础。
然后就是毕业设计。我的系统比较简单。但好像代码也有一万多行,第一次编写这么大的项目,而且还要和别的同学衔接。真的有飞跃的感觉。当然,现在回头来看,这个代码也简单得很,而且幼稚,其中很多代码都是简单重复。比如两个文件,实现的功能都差不多,程序逻辑也差不多。对自己训练不多。只不过,当时那个阶段,需要不断地重复达到一个熟练的程度。
总结一下,这个阶段,才是真正的接触程序编码的阶段,虽然简单,但毕竟代码都是自己去想,自己去写的,即使抄袭,也是读懂了的,相比只是验证语法的第一阶段。其实是一个飞跃。
第三阶段:硬件开发和学习C++
毕业的前两年,其实我很少用C语言开发东西,那时全是用单片机去实现。有段时间,还去管了一下智能仪器的现场生产。当然,后来没有想到,这些经历居然也是财富。
编写了几个项目,都是汇编语言,自己再笨,也发现了一点规律,其实这些系统都是一个输入:传感器;一个输出:LED;CPU或者说微处理器的功能就是根据输入计算和控制,然后控制输出。其实看穿了都很简单。
然后开始想转型,想朝软件开发方面发展,大学没有学习过C++。就买了两本书来自学。大学教育的目的不是教会你什么,而是教会你自己学习。当然,这个时候学习和读书不一样,不是为了分数,而是为了合理知识结构。
很快就用上了C++的知识。有个项目,就是血压计的项目。原理很简单,就是传感器测试出一个人的血压,得到一个电压,把这个电压显示出来。将电压就变成人能理解的血压。系统里面的代码很简单,用汇编简单就能编写出来。
这个项目我查了很多医学文献和专利文档,形成算法的过程。这些数据汇总形成算法,C++就派上用场了,当然,用C语言也能实现,只不过当时C++开发平台已经有很多库,用起来效率高很多。
总结一下,这个阶段主要是和硬件打交道。日子其实比较苦闷。但也积累了不少硬件方面的知识,没想到后来这成了我的一个优势,大多数开发人员不像我有硬件背景,大多数硬件开发人员又不像我有软件开发背景。特别是电子设备生产现场经验,有经验的人又没有开发经验。我就成了那个他们之间互相沟通的人。
第四阶段:中型项目开发经验
其实前面我碰到的项目都很小,后来机会来了我想转型,就换了一份工作。我居然获得了一个开发独立项目的机会,这个项目开发的时候,挺紧张的,还好可以查书。
这个项目使我明白了核心算法的重要性,还有学习能力的重要性。普通的代码,到一定的阶段大家都会编写。这个项目要用到一些新设备,很快就能掌握它们的功能和应用,学习能力显得尤为重要。项目的搭建,核心算法的确立,是项目的两个关键。
这个项目从基本上来说,只是一个前后台系统,还算简单。后面项目用到了操作系统。从此,我经历的项目都是用嵌入式操作系统实现的大系统。又进入了一个新的阶段。
总结一下这个阶段,学习能力,系统整体框架的搭建能力,核心算法的编写能力。慢慢就会显示出优势来。但实际上,痛苦往往在于调试。
第五阶段:大型项目开发经验
后来慢慢有机会参与一些大型项目的开发。当然,我个人只是参与其中很小的一部分。本来这个阶段想积累一些项目管理的经验,不过尝试了几次,看来自己不是这块材料,还是朝资深工程师这条路上走吧!
总结个人学习成长的道路
现在回头看看,当时自己也很幼稚,只不过是简单的语法,都要编写一个程序去验证一下。不过,这也说明学习和成长是一个有加速度的过程。
现在反而后悔那个时候,没有多多进行训练,打下更好的基础呢。我可能比别人笨,别人一周上机一次就够了,我多上机两次行不行。
时间久了,点滴的积累,成就了今天的熟练。当然,技术这个东西水很深,懂得越多,接触未知领域就越多。
我个人经历有限,见识也有限。
只是读大学的时候,完全不知道哪些课程将来有用,哪些课程将来无用。
我希望我的图书能帮读者把这些东西串一串,给读者一个比较清晰的认识。加上自己的上机自我训练,希望读者能找到满意的工作。
因材施教:使用两套教材
因材施教对我来说就是根据自己的情况,选用不同的教材。因为我有同时使用两本教材的习惯。
一般来说,老师在选购教材的时候,要考虑到绝大多数同学的情况。而作为一个学习的个体,你要考虑到你自己的情况,选购一本教材作为补充。
最经典的案例是《线性代数》,我们老师讲的那本非常浅,我自己选购了一本。
内容就刚好衔接上,深度广度厚度都够,我学得不亦乐乎,后来期末的时候,不用复习都考了高分。快毕业的时候,同学都来借这本书。因为他们考研要用。
当然大多数教材内容会互相重复。
比如学Pascal语言,老师推荐了一本,比较薄,只有基本知识。我又购买了一本,里面有Object Pascal的内容,这是面向对象的开发知识,一般的Pascal语言图书不讲。
开始我以自己购买的这本书为主来学习,发现好难。转头用老师推荐的图书,发现老师够牛,确实这本书在入门知识部分讲解得比较独到。
两本书合起来用刚刚好,这对后来我学习C++毫不费力,起到了很重要的作用。
这个案例之后,我也开始习惯先找一些比较浅的书来读。然后再转为比较深、比较厚的图书,发现有时候学习效率比一开始就啃大厚书高很多。
印象最深刻是电子学的基础课程,我开始居然没有看懂,后来找了一本中专教材,轻松就看懂了。然后继续学习自己的专业教材,刚好互补。
所以,不要瞧不起图书馆里的一些老的、浅的图书,关键时刻挺有用。
工作后发现也有这样的情况。
比如,有一个项目我要用PowerPC这个芯片。也是买了两本图书来互补,看不懂这本,就拿起另外一本看。
现在网络已经非常方便了。我同时也在网上下载了很多PowerPC的相关材料来学习。
这样,逐步建立起了比较合理的知识结构,工作效率也提高了很多。