嵌入式开发经验分享,把学习当作一种兴趣
分享过来人的经验之谈,希望能给刚入行嵌入式开发的朋友一点儿帮助。
混迹互联网行业七年有余,期间走了很多弯路,吃了不少苦。
大学阶段
我读的大学并不是什么好大学,所以在大学开学之前我就打定主意要好好学习,凭技术吃饭。开学前学完了PASCAL,那时连程序的概念都没有,只好死记硬背代码,拿纸做笔记。记不清楚用纸写了多少程序,最长的一次在A4草稿纸写了30多页。就在这样的条件下入门了C/C++。
第一个C语言HelloWorld程序,调试了几个星期,当时没有人告诉我TC2.0需要设置下才能用。
大一学完了C、X86的汇编、数据结构、C++ 。
大二准备学VC和BC,当时难以取舍,后来选了VC,不为别的,只为书店里两本书,VC那本便宜6块钱。
我的努力在班上无人能及,学的日夜不分,大三有了自己的计算机后更是如此。很多次父亲在半夜教训我,责怪我是不是不要命了。我一直觉得自己基础差,记忆力又不行,条件也不好,所以觉得只有多花点时间才能赶上别人。后来有许多朋友说我有计算机的天赋,我只能干笑。
我当时用的是486,16M内存、1G硬盘。显示器是个二手的,辐射非常大,开机屏幕冒火花。安装一个Windows NT4.0需要一个通宵,编译一个BC5.0向导生成的程序需要两个小时。但是就是这台破机器陪伴我两年,让我学会了VC、Delphi、SQL Server等。
大三假期在一个计算机研究所找了个实习机会,工作了两个月一分钱也没有拿到,但是这两个月对我的发展帮助很大。由于工作认真,在一位长者的引荐下开始和他们一起做项目,这使我在读书期间有了自己的收入,在学生期间有1000多的收入我已经非常满足了,后来终于用自己赚的钱换了个新计算机。
涉足社会
大四下学期开始找工作,当时非常幼稚地认为工作经验已经很多。听父母的想法,想去那个研究所。之前在那边实习过的部门领导也希望我能去,大概是这种单位比较官僚的原因,最后没去成。最后去了我兼职过的一家公司做管理信息系统MIS(Management Information System)的公司。毕业之前一年的时间里,做过各种MIS,从煤矿、烟厂、铁路、到高校,什么有钱就做什么,工作也辛苦,经常加班、通宵。从跟客户谈需求到设计,再到编码、测试、交付都要干。那时有满满的成就感,干劲十足,对自己很满意,现在回想起来觉得真是肤浅。
刚走上工作岗位的学生容易被误导,觉得很受公司器重,实际上这样的工作做下去可能永远是一个低层次的开发者。
你以为去跟用户谈需求、做设计就是系统分析和设计了吗,国内又有几个公司能够做的很到位很规范?一个公司不是通过了ISO9000或者CMM就能规范了,我现在在一家有几十年历史的外企工作,里面的管理不是一般国内企业所能企及的。
作为一个毕业不久、刚步入过社会的学生,几乎不可能在很短的时间掌握系统分析和设计,面向对象、UML只是一个工具,关键是人本身的思想,不是说你熟悉了C++ 、Rose就能够做出好的设计。
注:统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。
我的观点是不在于你用什么工具和语言,而在于你干什么工作。你的设计体现了你的技术层次。
转行嵌入式
干了一年MIS,我觉得非常苦闷,做的大多数都是熟练工种的活,个人技术上没有太多的提高也看不到方向。所以决定离开这个城市去上海,寻求更好的发展,并且打算放弃我以前的MIS。
由于是全新的行业,我学的VC、Delphi、数据库派不上用场,摆在我面前的是嵌入式、协议、信令一些我从未接触过的知识。于是拼命的学习,把自己当做一个应届毕业生,半年过去我终于熟悉了工作,薪水也涨了。
记得公司安排我维护一个接入服务器软件,由于代码量不算太小(5万行),资料和文档都不齐全,我维护起来非常吃力,所以想重新把它做一遍,花了半年时间完成了接入服务器的软件,并且实现了一个相对完整的TCP/IP协议栈。在这里我学会了嵌入式系统设计、驱动开发、TCP/IP和很多通信的知识。花了一年时间终于使自己从MIS开发转到了通信行业,并且站稳了脚跟。
此时,我的开发大多是对硬件的直接操作,不再受操作系统,VC、Delhpi这些开发工具的约束,看到了另外一片天空。
学习IC设计
随着开发的深入,软件开发与硬件联系越来越紧密,硬件知识的匮乏又对我的发展产生了障碍。芯片技术基本上掌握在国外公司的手里,这对做系统级设计是一个非常大的制约,一个新产品出来,第一道利润也往往是最丰厚的利润常常都被IC公司赚去了,国内的厂商只能喝点汤。所以我决心解决自己的硬件技术障碍,并打算离开通信行业,进入IC设计相关领域。
当然我明白如果我对硬件了解的非常少,没有哪家IC公司会仁慈到招我这样一个一窍不通的人来培训。所以我必须努力打好基础,学一些相关知识为以后做准备。
就像我开始从MIS转到通信一样,我看过大量通信方面的书,并且给一个ISP(因特网服务提供商)做过RADIUS计费分拣台,在这样的背景下这家通信公司才给了我这个机会。
我在的通信公司是做系统设计的,有不少PCB Layout硬件人员,平常我就注意向他们学习,由于我做的是软件,在公司看硬件资料不好意思,所以开始只好在家看,刚来上海工作我连续一年都在加班,后来不加了,因为我要挤出时间学习,通常我12点左右睡,第二天5点半起,我上班比较早,地铁上如果人不多,我也用来看书。
学习当然不会是一帆风顺的,有些实在不懂的问题就积累起来问硬件人员,他们的帮助使我学习进度快了很多。因为在没有人点拨的情况下自学,我的一半时间是花在解决疑难问题上,但这种问题经常是别人的一句话就可以让我豁然开朗,我非常庆幸我有这样的学习环境。
在后面的一年里,我学会了看硬件原理图,学会了简单的硬件设计。当你熟悉硬件后大家又会觉得你好像原本就是软硬件都懂的,同事们也都习以为常了。这个时候我可以把硬件资料堂堂正正的拿到公司看,没有人再大惊小怪了。
让我比较自豪的是我通过自己的努力做了一个IAD(软交换的终端设备)系统方案,包含软硬件的选型、设计等内容,这个方案得到了公司和同事们的认同,让我感到非常欣慰。技术是相辅相成的,当我的硬件有了一定的进步后,我的软件设计也有了很大的提高 ,我可以从更深层次理解问题。
软硬件的结合使我的设计水平上了一个台阶。我现在写的这个操作系统,编译后我把程序反编译成汇编,找出其中不优化的代码,然后在C程序中进行调整。
举个例子,很多CPU没有专门的乘法指令,这个大家应该都知道,在这种CPU上进行一个乘法操作常常会花费大量的指令周期,有的朋友会说这个我知道。我会尽量避免采用×号,但是事情往往不是那么简单,你知道C语言中数组的下标操作是怎么实现的吗?仔细看看反汇编的代码你就会明白,同样是通过下标的定位操作,C编译器会有时候会产生位移指令,但有时候会用乘法实现,两者效率往往是天壤之别,所以明白这些问题你才能将系统性能提升到极致。
希望在软件上做的比较深入的朋友们有机会学学硬件以及其它相关知识,尤其是做底层开发和嵌入式设计的。这对软件技术的提高有非常大的帮助,否则很多事情你只知道该这样但不会明白为什么该这样。
只有干好本职工作后,我才会学习与工作关系不大的技术,这样公司的上司才不至于反感。
在入门阶段的问题我通常不去问那些资深人士 ,而是问一些资历比较浅的朋友,比如刚毕业不久的学生,因为他们往往会跟你详细的讲解,而资深人士通常觉得你的问题太简单,所以回答的也很简单,我又不好意思多问。等技术上了一定的层次后我才会问他们,他们也能给你比较深入的回答。
我最终目的是IC而不是PCB,所以我下一步的准备开始学习IC设计的知识。公司的同事没有懂IC设计的,后面的路又要靠自己了。买了不少相关的书,在网上也查了很多的资料。花了大量的时间去学习VHDL,并且用软件进行了一些简单的设计和仿真。没有设计ASIC,只是针对FPGA。我渐渐明白了IC设计的基本流程,同时也明白了这条路的艰辛。
跨行发展
换行业是一个非常痛苦的过程,尤其从一个春风得意的位置换到一个陌生的岗位。在原来那家通信公司,我是唯一一个两年时间涨了五次工资的员工,公司和同事都给了我极大的认可,工作上也常常被委以重任。
最终还是做好了跳槽的准备,我向一家业界有一定知名度的IC设计公司投了简历,经过4个多小时漫长的面试。其他的一切我都比较满意,唯独薪资差强人意,我也明白原因,因为我是这个行业的新人,我没有经验。
公司老板问我6000多一个月能不能接受,我知道他也是照章办事。想想我通信行业的朋友们,基本上都是年薪10万以上,月薪过万的也比比皆是,朋友们也帮我介绍了不 少待遇不错的公司。
当时我很犹豫,我热爱我的事业,但我也是一个普通的人,也需要养家糊口,也想早一点买房买车。生活给我出了一道难题。
为了能离自己的梦更近一些,我选择了这家IC公司,自己的薪资和公司刚进来的硕士研究生相差无几,但为了今后的发展只能忍受,一切得重新开始。
在已经在这家新公司上了一个多月的班,开始非常艰难,现在慢慢适应了。第一个月结束时,Team Leader找我谈话,说我是新进员工中最优秀的一个,我心里很欣慰,这也算对我努力的一个肯定吧。
总结
引用父亲常说的一句话,身体是革命的本钱。
我来上海以前学习过于拼命,常常晚上只睡3个多小时,家人也说像我这样拼命活不过60岁。那时的拼命使我的身体受到了影响,有一次早上突然腰肌剧痛难忍,痛的我倒在床上站不起来。
学习工作是一个长期的过程, 像马拉松而非百米冲刺。要注意调整学习和工作的强度,保证每天尽量有相对充沛的精力。
以前换行业是因为自己的兴趣所致,希望我的经历不要给朋友一个错误的导向,其实各行各业做到顶尖都是大有可为的。
现在我非常注意学习的效率和技巧,比如说学一相对陌生的技术,不妨问一问有经验的人,不需要问很多,往往他不经意的几句话会给你非常大的帮助。