3年前,大四,虽然即将踏入社会,但是对于自己能干什么是非常没有信心的。4年的CS课程,没有让我真正学会编程,在面对一些稍难的编程问题时,我总是一筹莫展,而我也一直没有找到如何提高编程水平的方法。我曾经去请教过班导师:“如何才能提高编程水平,比如可以独立写一个俄罗斯方块的游戏?”,他的“回答”令我至今还记忆犹新:“啊,你怎么能不会呢,像我大二大三的时候就会了呀。。。”。我真正的导师是后来来学校做广告的培训机构推销员,当时他来学校做推广,他告诉我,“如果你要学习JAVA,你要先学习Java core,然后Tomcat,Sevlet, HTML, Struts, Spring, Hibernate等等一长串,这么多东西你来我们中心,1年包你学会”,说实话,当时是有些心动,虽然最后没去,但是他的这一串学习路线我是记住了,于是就开始在网上搜索学习这些东西的方法,知道了学java要看thinking in java,学java web是看的视频教程。

    至此,我觉得我已经掌握了一个程序员所应该有的学习能力和一套适合自己的学习方法。也是凭借这几个月的突击学习JAVA,成功面试进了一家不错的日企。

    进公司的第一个项目是一个读卡器项目,当时进组的时候,他们已经做完大半,剩下的工作基本就是调试和修改代码。于是一个老同事带着我,每天测试,修BUG。这虽然谈不上是一个有挑战的工作,但是作为刚工作的我来说,却是一个极好的适应过程。在这个过程中,我学习了如何使用SVN,如何和不同的程序员交流意见,如何编写更规范的JAVA代码等等。但是要说其中对我影响最大的,还要数那位老同事的口头禅“有问题就看源码!”(后来我知道这也是linus的名言)。以前在学校读书时候,从来都是自己写代码,从来不知道还通过阅读别人写的代码来学习。这个观点给了我很大启发。

    第二个项目的时候,组长已经把编写单元测试的任务交了给我。在编写单元测试的过程中,我抽空把Junit的源码看了一遍,并同时学习了设计模式,然后根据将Junit中使用的设计模式分析了一下,写了一篇心得放了公司的文档库里。可以说Junit源码给我带来的时候比做单元测试的收获还要大。

    之后又断断续续做了一些JAVA小项目,之后,由于JAVA项目过于臃肿,公司上层做出重大决策,抛弃JAVA而重新转向C项目。这对于原先很多开发者来说是一个比较大的打击,用了多年JAVA的程序员都不太愿意转向一门新的语言,所以陆陆续续走了许多开发者。幸好,我留下了。转C的过程是“痛并快乐着”的。当时我的C只停留在大学课程水平,为了巩固和提高C的能力,我重新翻出了严蔚敏的《数据结构C实现》,把里面那些糟糕的代码用C实现了一下。在这个过程中,我碰到许多问题,指针这个东西无数次把我逼到崩溃的边缘。我写的代码,从没有一次是编译完直接跑通的(还不是跑正确),每次都有段错误。就是在这一次次调试中,我慢慢地开始对C有了感觉。在整本书的代码全部实现以后,对于C的基础语法,我觉得我已经过关了,但是C的世界的大门只是刚刚向我敞开。

    如果说JAVA的世界是一个现代社会的话,那C的世界一定就是原始社会了。在JAVA里,有丰富的类库可以使用,你要做的只是把他们组合一下完成你的工作。而在C的世界里,物资是贫乏的,没有ArrayList,没有HashMap,更要命的是,C里面连内存管理都要你来做,需要什么都得动手实现(也有些第三方库可以用,但是你体会到“编译”的苦楚)。但是就是这样一个世界,你可以体会作为造物主的快乐。编写各式各样的代码,会让你对计算机底层有更深刻的理解。所以如果说Java是一棵茂密大树的树干的话,C就是它的树根,虽然丑陋,但是却吸收着丰富的养分。

    在公司经过一段时间的调整期以后,我们迎来了第一个C项目,这个项目是做一个互联网协议解析的库,难度非常大。项目准备的时候,大家疯狂的学习该协议相关的领域知识。组长每天都开讨论会,对大家所学知识进行提问。刚开始做项目原型的时候,是最辛苦的,因为需要不断摸索做法,而日方客户又要催着你出成果。那时候加班到8点回去已经是早回去了。我的任务就是先和组长讨论想法,之后编码实现,最后和日方客户进行review。和日方客户review压力是最大的,因为日本人对于项目要求非常严格,曾经有一次,我因为对于一个函数的某个参数没有把握准确,导致代码被日方全部推翻。奋战了一个多月以后,我们终于交出一个令日方满意的原型,至此,我们的项目的后续部分得以继续。

    做过嵌入式C的朋友应该知道,这个领域最麻烦的事情之一就是交叉编译,当时我们的代码要在不同CPU和操作系统上运行,需要做交叉编译。为了整这个MAKEFILE都写了好几千行了,也在这些平台上调试了无数次。这个时候,我怀念JAVA,一次编译到处运行(其实JVM也需要进行交叉编译,只不过这个苦的不是你,是SUN的程序员)。

    做C最怕出的错是内存错误,包括指针越界,重复释放内存等等。这些错误几乎很难用调试器发现,当时为了解决这些错误花去了很多时间。总结下来的经验就是,在操作指针的时候要慎之又慎。

    这个项目后期维护就相对轻松,就这样前期开发加后期维护总共花去了1年的时候,人月数大概是5*12人月。

    至此,我的三年经历也就到此为止,to be continued...(谢谢阅读)

【博客话题】“2011-2012跨年度征文:项目回忆录”正在进行,欢迎大家参与分享讨论~详情查看:http://51ctotopic.blog.51cto.com/2009463/742668