【转】蓦然回首:回望我的7年编程路 很有意思的分享,转过来,与大家共勉!全文较长,不过线索分明,每一阶段作者都有自己的小结,而在最后,作者更是对于自己的7年历程作了全程回顾及总结,看来收获不小,希望你也会有所收获,或者你也会有分享的冲动!
大学时代:
2005年刚读大学,就立下了好好写程序的目标。。所以大一从学习C语言开始,一有时间就望学校的机房跑,老老实实地调程序。。对着书本,一句一句code地调。。慢慢地,积累了一些经验。后来,又加入了学校的一个制作网站的学生团队,学习ASP.NET网站制作。这个团队对我影响比较大。。里面有我相当崇拜的人物。
人物A: 非科班出身,从asp做起,一直做到asp.net , 参与了很多网站开发。熟悉web的各种前端开发技术。曾经暑假的时候,一个星期没有出过门在家写程序,后来直到被老妈骂才停手。 快毕业时原在一家大型国企做web开发,后来觉得没有意思,就直接跑去北京,参加某个大型网站的初创开发。
人物B:也是非科班出身。大二暑假就跑去A所在的公司工作,直到大四才回来参加各种补考,最后拿到毕业证与否我倒不知道。后来,他刚毕业的时候,到百度做了前端开发,后来又到了360做web前端。。
诸如此种,在这种前人的影响下,我一度觉得能疯狂调试code是一件值得骄傲的事。。所以学习起来技术更加crazy。。大一下的以后,都没有好好上课了。。上课的时候,老师在上面讲,我在下面看自己的技术书。。那个时候,技术没有功底,很多高级的东西都是硬着头皮看的。像C#之类的,似懂非懂地看着。。刚读大一那会,自己没有电脑的。。所以asp.net的学习主要是看书了,调试的机会不多。。后来为了调试环境的方便,就跑去study了一下asp, php之类的,这两者在学校机房安装起来相对简单。安装包不大,装在U盘就好了。下次接着装。大一下的时候,果断买了电脑,而且把握着一个原则,坚决不玩游戏。。买了电脑,天天对着电脑调着asp.net code, 这玩意没有人教,主要是自己对着书,对着电脑一句一句地写。。慢慢有了一些了解,能照着书写一个简单的留言本了。。
大二上跟着学院的一个老师做一个MIS系统,是一个产品。这个产品让我学习相对大一些系统的开发。。我当时觉得一个系统能超过100张表的已经很大了。(平时做网站一般也就15张表左右),还会用到SQL Server2000, 学习了T-SQL存储过程编程。。写得多的时候,存储过程也写了上百行。这个产品,我跟着老师做了2年,一直到大三暑假我要考研了才停手。一个产品做2年其实也是蛮痛苦的,因为到后面不是技术的累积,纯粹是业务逻辑的分析了。每天copy修改差不多的代码,是件蛮无聊的事情。甚至可以说,有些痛苦。那时候,人比较单纯的啦,中途想撤出来学习其他有趣的技术,但碍于种种情面,一直拖到考研那会。其实想想确实是浪费了真正学习技术的时间。
跟老师做产品的同时,也兼职学生团队的网站。所以大学时候,也算是比较忙。有一种自我得意与满足感。。因为技术还算可以,在学校把自己看得太高了。对别人非技术人员多多少少地有些鄙视。。到现在看来,应该是鄙视的自己,而非他人。
有人也许会好奇,我天天不好好上课,考试咋办?一般考试我会把书仔细看一遍,把书上的例题做做,就直接去考试了。还好都过了。大学就挂了一门课,《计算机组成原理》。尼玛,考前几天一直在赶项目,没有时间复习。。最后只看了一天的书,就去考了。结果挂了。后来补考过了。
在技术这块,网上好多人觉得做web开发入门门槛太低了,因为开发工具太强大了。。一般的人员培训几个月就能干活了,技术含量不是太高。所以感觉做这个方向没有前途,所以打算转C/C++方向了。。学校没有开C++课程,所以自学了一下C++语言,然后研究了一下MFC, 会使用MFC控制写一些小程序了。基于MIS的经验,所以把MFC中的ADO数据库开发看了一下, 基本上能熟练使用ADO开发基于MFC的MIS软件了吧。后来觉得网络比较好玩,就又学习了一下MFC Socket通讯方面的东西。
大三暑假的时候,学院安排去一家公司实习,我去面试了一下。因为有C#方面的经验,所以主管希望我用C#帮他们写一些程序。。但是,我去实习的主要目的想接触C++方面的,所以拒绝了。当然了,C++部门的人也没有要我。所以考研的空隙,我还是自己看了一下C++方面的知识。
考研完了后,已经到了大四的下学期,成绩太差(平时不好好学习的结果)没有考上。不得不去找工作。2009年啊, 金融危机啊,工作对我们这种非重点高校来说,确实不太好找。一般跑招聘会都是去别人学校,排N久的队,给了简历,别人一般也很少看的。我简历虽写了C# web的开发经历,但期望从事C/C++方向的开发。。所以找到合适的不太容易。后来去一家做GIS的公司去面试,演示了一下MFC的开发程序,就留下了。不过,主管安排的任务都是asp.net 方向的开发,我不太满意。。中途去了一家日企面试C语言开发的工作,后来面试通过后,就果断辞了这家GIS公司的实习工作。
接着就是做毕业设计了。在GIS的公司的时候,看到一个伙计使用extJS Ajax框架做的一个CRM系统,觉着不错。所以做毕设的时候,我就使用extJS改写了我本已经写好的code了。
至此,我大学的技术之路差不多走完了。
小结一下:这期间主要是web方面的比较多, html, div/css, j*vascript, ajax, c#.net , webservice, 还有就是MFC方面的东东了。
工作:
1. 第一家公司
2009.7月份就去了那家日企做C语言开发工程师的工作。这家日企有明显的日本人工作的素质,对细节要求比较高。。文档的标点符号不能错,大小写啊,MFC程序的窗口布局大小,位置摆放诸如等等细节要求得比较多。。另外,跟日本总部的人打交道的人时候,他们都很客气。即使职位比你高很多的人,也会说“x先生, 麻烦你了,这个问题我需要请你帮你一下忙。。。”。。这就是日企的文化吧。
公司主要是从事嵌入式wince开发及外围产品的开发。Wince使用win32 , 外围产品使用MFC. 接触到了 win32 api, 突然有种豁然开朗的感觉。。原来windows所提供的基本的窗口开发api是win32, 而MFC是基于win32写的。。 后来有看《深入浅出MFC》的书,作者讲了MFC的内部机制,并用win32 消息循环实现了MFC的基本框架。。这本书比较有名,做MFC的人都知道,所以我不用多说了。在这家公司,又学习到了消息传递和多线程, 进程同步(之前自学的时候,没有做过这玩意),并且学会了查看MSN帮助文档. 而Wince开发使用EVC6.0,跟VC6.0差不多的,连API函数都是一样,只是细节方面的有一点差异而已。我对windows开发又进了一步。当然你知道,这些玩意都是说来说去,都是对api调用而已,某个功能不能实现的话,在网上一搜索就可以了。写得多了,不觉得有多大的难度,只不过是用web 开发的api调用转成win32或MFC API调用而已,剩下的就是逻辑的分析了.
那应该怎么办呢?? 这里人要提供一个人物C君,他对我下一步技术之路影响的.
人物C:
生物专业出身,因为本身专业不太好找工作,所以转向IT. 先是搞网页美工设计搞了一年多,后来转向MFC开发. 他对操作系统理论比较熟悉,MFC, win32也玩得比较熟. 最让人吃惊的是: 他从来没有参加过培训机构的培训,全是自学的…有时,我就感叹,我自认为我自学能力算不错了吧,但我至少是一个科班出身的人,有平台有环境.. 人家连环境也没有竟然可以自学出师..了不起..
人物C跟我有相同的看法, 所以他平时有研究windows 驱动开发..我们觉得做底层应该有技术含量些。 所以受他影响,我也开始看一些windows底层的书。。看了一本<windows核心编程>,买了一本《windows驱动开发》的书,但是没有好好看。
后来觉得呆在这家日企没有前途,所以想换一份工作。
本来也跑去北京的,但在招聘网站有家在武汉刚成立的创业正在招人,而且招会windows驱动开发的软件工程师,要求还是比较高的。 我抱着无聊的心态,给这家公司投了一份简历。 没有写多花哨的东西,就简单写了几句话: “因为贵公司是一家创业公司, 所以对我来说一个机遇,也是一个挑战, 而我正在寻找这样的挑战”。
没想到,过两天打电话,让我过去去面试。我吓到了。因为他的招聘要求,我完全没有达到的情况下,竟然还让我去面试。
去之前,仔细研究了一下这家公司,好象是做高端的什么板卡设计的,我当时也不懂。。再仔细一看,是一家台企,顿时印象不太好了。面试时间是双休, 反正也没有事,就打算去看看。
双休到台企面试,感觉环境不错(事实上,到现在我面试了几家台企,办公环境相对于大陆一些企业都是不错的),首先是CEO宣讲会,然后是笔试。。笔试面很广,从基本的ANSI C, 到 基本的C++, 再到 计算机组成原理的东西,到操作系统, win32 api, unix shell, 计算机网络,windows driver, 我能做得都做了。然后第一个交卷。但却是最后一个面试,他们给的理由是:我比较住得比较近,其他人远,先让其他人面试。
面试不谈技术,就是扯了一些生活学习的事情. 记得第一个问题是:你觉得最值得你骄傲的事情是什么?我当时回答是:我学会了五笔打字。。五笔打字这玩意不难,但需要坚持,时间长了,就好了。现在想想,这种答案是受人BS的答案的啦。。没有人在乎五笔打字的这玩意,更何况台湾人不用五笔。后来又问我愿不愿意把期望薪水降低一些。我当然不愿意了。。你现在是一家刚创业的公司,我不指望我入职后你涨我薪水,所以开始的薪水需要要高一些才有保障。本来觉得没有戏了,没有想到,后来竟然给我offer了,不过降我期望薪水了。我想了想,还是答应了。一方面比我现有公司薪水高,另一方面,又是做windows驱动开发,符合自己的职业发展,也就同意了。向日企提出了离职,离开的时候,我总共在这家日企呆了8个月。
小结:主要接触了windows 平台方面的开发, win32, MFC, 消息传递,多线程,进程同步。。。
2. 第二家公司
2010.3 正式入职第二家公司。
去了,先是介绍了公司的产品,大概听了一些,但不懂。后来,主管有拿给我一块板卡,让我跟着说明做一些实验。我看了很新奇,这玩意能做实现什么功能呢。。看了一下板卡的用户手册,我X,全是英文的,没有中文的。。
从这家公司工作起,我以后基本上很少看见中文文档了。主要是公司的产品性质所决定的。公司的产品要卖向全球市场,所以平时要求大家写英文的说明。包括code的中comment也是如此。呵呵,不错,倒是应该能逼着好好学习一下英文了。以前除了看MSN中的英文,其他的基本上都是中文。
这是一块FPGA开发板,我也是弄了好久才知道FPGA是个什么东西。。毕竟我以前是全做上层应用软件了,对硬件接触比较少。。所以刚到这家公司的时候,对我来说,也是比较坚难的啦。我需要从头开始积累大量的硬件知识才地,最要命的是公司没有培训,什么玩意都要自己搞。所以平时也只有硬着头皮问一些懂硬件的同事了。。从基本的Clock学起,再到FPGA ,再到开发板上各个接口的特性。我花了好久,才慢慢熟悉了Quartus II + Nios II 这套 Altera FPGA 开发tool. 我的工作是使用SOPC 搭建硬件体系,然后再配合软件来编写板卡的驱动和验证板卡各种接口.
FPGA是个好东西,可以在上面放置一个CPU IP Core, 放置DDR, uart, Ethernet MAC, USB,等多种IP Corre, 你可以在上面实现自己的IP Core, 并挂到CPU的总线上去. 这对一个做软件的人来说,是开启是另外一个世界.. 你可以看到CPU的实现过程,你完全可以自己写仿写一个简单的CPU。你可以自己去实现一个DDR的控制器等。。
所有这些,在这个领域叫做IP Core, 相当于软件中的库。有公司专门写这种库,然后卖给需要这些库的公司。在FPGA中,开发语言是verilog/vhdl, 两个都是硬件描述语言。不过,在台湾大家用的比较多的是verilog, 一种类C的语言。写好code, 你下载到FPGA芯片中,就可以实现你想要的功能了。 一般我们写软件程序,是一步一步的执行的。。而FPGA芯片是并行执行的。。所以verilog的中代码中,可以写多个并行程序段,这些段是可以并行跑的,这就是FPGA强大的之处。
在类如分子运算这种需要耗时的运算,一般的PC机的CPU算的太慢。。业界一般需要使用FPGA并行运算的。FPGA上用verilog写得是硬件程序,跑得比一般的软件要快很多。 PC中所用的好多加速设备都是采用硬件加速的。比如显卡。上面也有verilog或VHDL硬件描述语言写得code,它们的核心件是ASIC芯片, 对PC机传过的数据(通过PCIe)进行运算,然后传递到显卡的VGA或HDMI接口给显示器显示。 日常消费类电子产品用到FPGA芯片的不多,主要还是ASIC芯片,比如,我们所用的手机的就有实现各种功能的ASIC 芯片。。ASIC芯片主要特点是量产,所以价格相对低廉。 而FPGA芯片实现的功能可以很灵活,你可以对芯片重编程实现你想要的功能,但是FPGA芯片比较贵。高阶的一颗芯片售价都是数万美金,普通的也需要几百RMB。
在这家公司学会了看电路图,能根据DataSheet芯片看编程配置芯片driver, 也知道常见芯片的接口。。也就是知道了一个板卡是怎么出来的了。其实类型的板卡应该也是差不多。拿PC主板为例, 应该是选一款CPU,然后研究CPU的接口特性,一般的CPU会支持DDR2或DDR3, SATA, PCIE, ,这些接口的IP Core控制器现在好象大都集成在了CPU内部,如果CPU内部没有的话,就可以集成在了北桥上了。。北桥也是一个IP Core的集成器,还有南桥之类的。。画好了电路图,再由PCB人员根据电路图步实体线和摆线,弄好后,把PCB图给PCB板厂生产出实际的基础板。。然后找打件厂,把CPU,Audio, 网口等各种组件打到基础板上去,再拿到工厂做主板测试,还有要烧录BIOS,为安装操作系统作准备。。
我是学计算机的,以前只是会装操作系统,并不会装电脑哈。。到了这家公司,有幸接触了硬件,就学会了自己装电脑了哈。。我一个同事曾经在网上买了电脑的各个部件,我们两个在家从CPU,风扇 到 硬盘,内存,电源,机箱,显示器全部自己组装起来了。。所以有时开玩笑说,哪天失业了,直接跑去电脑城给别人组装电脑得了。
我在公司也无聊地用画电路图的tool仿画了一个简单的电路图,更是无聊地拿着焊接工具焊接东西。。我曾照着网上的一个iphone充电路图的关键电路部分,把一个普通的手机充电器焊接改装成了可以给iphone充电的的充电器。。
当然,我上面所说的硬件玩意对于一个纯软件人员来说可能比较陌生,但对于学习过数字电路与模拟电路的相关课程的人来说,都是算基础知识啦。。
在这家公司,我的软件技能没有什么增长的。。平时开发也极少用到嵌入式操作系统的,更多的时候,是一种裸机的形式跑的。。类似于单片机。。比单片机有点好处就是可以自己实现要想的IP Core。。所以我有时会写一些verilog code,但仅是初级的水平而已。
说说台企的文化。。
首先,语言上台湾人是汉语夹杂着英语说,我在这家公司呆了2年多,所以这点对我影响还算比较深,从我的贴子偶尔带的英文单词可以看出来。我不排斥这个,觉得对学习英文不错。
另外,台湾人称呼人时,喜欢只叫名字,而不是带着姓的。。比如叫李开复的话,会直接叫开复,而不是像我们大陆这边习惯性叫李开复叫法的。。
另外,就是他们有自己的英文名字,平时大家称呼都是叫英文名的,即使是boss,你也可以大大方方地叫英文名字,不会显得不尊敬的。台湾人的在称呼上的叫法确实是显现出一种亲切感,显示没有那么强的等级差别。
另外,台湾地方小,所以行业竞争比较激烈,同事与同事之间也多有竞争的。。
另一方面的原因是,台湾仿日本的文化。。
小结:学习了FPGA, 硬件知识,软件裸机驱动写法, verilog, 软件技术未提高。。
3. 第三家公司
2012.7,我毕业正式三年了,由于在第二家公司接触太多的硬件,而软件技术未能长进,怕将来不利于个人的发展,所以打算跳槽。
这次跳槽,我比较尴尬。因为我目前的工作经验比较神奇,不能应聘纯硬件工程师的工作,也不能应聘纯软件工程师。有人会说,为什么不应聘嵌入式驱动呢??我也想啊,不过,我看了招聘要求,大部分是基于ARM,PowerPC等嵌入式处理器,写linux, vxworks driver,没有哪家公司要招FPGA 板卡软件验证的工程师。。再说,一般公司的FPGA板卡验证是使用verilog来验证的,但我并又不熟悉,所以我是相当尴尬。。好在有三年工作经验,还是有几份面试机会的。。
面试有些时候还是蛮好玩的。我去其中一家公司面试,负责技术面试的有两个人。一个是搞嵌入式软件的,一个是搞FPGA硬件的。。他们坐在一起,等面试完FPGA硬件后,他们觉得没有问题,另外一个又开始面试我嵌入式操作系统的知识。问我linux熟悉,我直接回答不熟悉。。然后他们说,建议我应聘公司的linux 内核裁剪工作。这样你的硬件知识会用到,并且加上你原来的软件,到公司来再接着学习一段时间的linux内核的东西就可以了。。不过,需要降我工程师的级别,因为linux内核需要半年以上才能熟悉。我不是太愿意。。然后。。就没有下文了。。
又去了另外一家做嵌入式应用的公司, 上来就是一张笔试题,我X,全是linux的,还有算法,我哪懂,所以笔试做得比较差。。然后技术主管过来面试,我讲我的FPGA,我讲我的硬件底层,这伙计完全不懂,最后倒是把我BS了一顿。。算了,我想了想,对纯搞软件的人讲我会的东西是不行的。。果断走人。。
所以我发觉我只能选择一些软件硬件都做的公司,才能明白我做的东西。后来几家,我确实是只投了这种半导体电子类公司。
最后面试了我目前的这家单位,我的主管是个软硬件都懂的人,所以谈得还算愉快。最后顺利拿到了offer, 从事了嵌入式驱动开发。。
前面说了,通常公司的嵌入式驱动开发职位都是基于ARM,POWERPC, MIPS这种处理器,linux,vxworks这种操作系统的,所以对我来说又是一个新的领域,重新开始学习了。。小有压力。。。。
开始就需要熟悉嵌入式操作系统,及处理器的常见register, 也要明白Memory Mapping, 知道 bootloader的启动过程。。。还需要知道怎么加载 嵌入式OS镜像。。做这些,需要看CPU core DataSheet, CPU DataSheet, 要学习GCC编译器,Makefile的用法。。要学习直接调试cpu, 要会看汇编。。一系列的东西等着我去熟悉啊。。好在多多少少有些基础,再加上主管耐心的培训,所以进步也比较快。
在这里也见识了CPU 的 debug, CPU所对应的指令是二进制码。。对于一个32-bit的 CPU来说,它的指令长度可能是32-bit, 所以看到的cpu指令码都是32 bit的数据,然后调试器可以把这些指令代码反汇编了。从这里看出来,应该是CPU 与汇编指令有一套对应码。。日常所见的反编译工具能把最终的二进制反编出汇编代码来,也就是靠这个对应表。每个CPU都应该提供二进制函数调用接口,这种接口可以实现汇编与C语言的相互调用。其实也就是CPU约定了一些通用register存储函数调用的参数和返回值。。如果调用参数过多,就使用堆栈来做就可以了。。
小结:要学习的东西还有很多,目前主要集中在嵌入式处理器与嵌入式OS上了。。努力中。。。
4. 反思:
(1) 个人接触编程也差不多7年了,中间也做了很多努力,但技术不能算达到精。这个是由于方向转得比较多吧。。从最初的web开发,转入wince开发, 再转FPFA, 再转嵌入式操作系统驱动。。每转一次,都需要重新学习。也因此,换工作的时候,谈薪水无法拿到更好的砝码,我不只一次听到用人单位这样说“你来后,我们要花半年的时候培训你,所以你不能提供你所期望的薪水”,我表示无语。。。我有同学做了三年的java,现在能很轻松拿到一份不错的薪水,但我不能。。。有压力。。
(2) 薪水的看法。。薪水这玩意很奇怪。。好象并不是说你能力越强,薪水也就越高( 当然这对技术大牛除外,我们就谈普通的研发人员)。除了能力,不得不考虑你的运气成份。。也就是你所在的公司情况。。 有些公司平台好赚钱多,所以研发人员薪水也就高,但另外一些公司,即使你累到死,也就那个薪水水平,因为公司的营收状态决定了你不可能多高的薪水。。所以在换工作的时候,在电话约谈面试的时候,我会直接开出我想要的薪水,问对方的HR能不能接受。。如果对方不能干脆地表示同意,那就意味着开这个薪水对他们来说,有些不能接受。。好多HR都会这样说“看你的能力而定”,一听这话,我就不感兴趣了。。我所面试的公司,都果断表示接受我开的薪水范围,我才考虑去面一下。。我们需要尽可能在自己能力范围之内,找到一家能开得起薪水的公司。
(3) 平台。。好的一个平台,除了让你工作得到不错的薪水外,更重要的是能够大幅度提升你的能力。。这个也是要靠一些运气的。。如果你有幸在一家技术比较很强的公司工作,并且有个很好的技术师父的话,你工作3年所掌握的技能就比其他运气不好的人多得多,所以你也就能拿到更多的报酬。。这就是差别。。
(4) 自学。。不管平台的好坏,主动地学习也很关键。。懒懒的,容易被淘汰掉的。我有同学三年都只在同一家公司工作。不是说,薪水福利有多好,而是3年的时间已经把他淘汰掉。。如果离开他所在的公司,他发现自己真得很难找到工作,因为他什么也不会。这也是得过且过的结果吧。 |