转眼工作已经四年多了,一直想找个时间总结一下,却迟迟懒得动手。今天一定要强迫自己写出来,不光是为了工作过的四年,也是为了和同样作技术的朋友和即将工作的学友一起共勉。
2000年从大学毕业,之前也想过考研,由于缺乏对国内教育的信心,所以选择了工作。工作虽然难找,但是那是的我却对工作十分的挑剔,瞄准的都是好公司的软件开发的职位,这些信心源于大学时无数的逃课在图书管钻研计算机技术(虽然在没有指导的情况下,很多东西都看不懂,但是强迫自己即使看不懂也要看完,当时由于条件所限养成的这个习惯至今还影响着我的学习方式),下课寝室一通电就编程序(不过更多的是打星际争霸)。凭着阿Q的自信和运气,还有当年计算机技术的火热,我进入了一个还不错的软件公司。不过遗憾的是不做软件开发,而是做测试。但是出于对技术的好奇和不错的薪水,进入了这家公司。
从此不再睡懒觉,每天啃着协议资料,如饥似渇的学习着一切不懂的知识。当发现产品第一个BUG那一刻,终于打开了测试之门。于是开始一个破坏者的历程,从各种角度摧残着开发人员的成果。那时公司的代码管理还不是很严格,通过说服上司把开发的产品代码搞了一份过来,从此每天多了一项功课就是早上一到公司先读半小时代码。对于大学里写过少许VC程序的我来说,投入到上百万行的产品代码中,如同进入了一片汪洋大海。不过大学里方法又派上了用场,看不懂也看。从刚开始的一天读懂几行到后来一天读懂一个函数,再后来就是天马行空了。大约7-8个月后,终于能把代码在头脑里跑了起来。于是,开始学习黑客思维,从代码中寻找系统的缺陷和漏洞,于是我成了产品杀手,无尽的问题在我手下暴露了出来。这期间最大的收获就是加强了逆向思维能力和代码阅读能力。现在,很多搞计算机的人都把重点放到看一本好书或者学习某个工具,如果这些都对你没有问题,那么需要做的最重要的一件事就是读代码。找到该领域最优秀代表的源代码,然后开始像读书或者看小说一样去读。刚开始可能发现什么都看不懂,没关系,一句一句的去读。再复杂的代码都是由基本语法构成的。每天坚持,一开始一天读10行,然后100行,然后1000行,然后10000行。一定要坚持,把读代码看作是自己每天必做的功课,你会发现你的编程和思维能力不知不觉中提高。在读过了上百万的代码之后,代码在眼里会比任何文档都清晰。就如同Neo在刹那间可以看到数字组成的世界。这是我的切身体会,希望能够对仍然处于学习阶段的XDJM们有所帮助。不过这期间对技术的钻研过多,忽略了沟通和交流能力的培养,有得就有失,看你如何取舍罢了。在这过程中,看的最多的书就是TCP/IP协议详解卷1 (互联网原理), TCP/IP协议详解卷二(代码实现),这两本书到现在还随时放在我的手边。
给初学者的建议:
1. 不管是主攻计算机的哪个领域,一定要看该领域内最权威的学习资料,不要浪费时间到无价值的所谓介绍各种新技术的泛滥手册中。
2. 作为一个程序员,代码是另一种沟通的语言。一定要练就阅读代码的能力和习惯,从代码中学习和进步。
测试的日子过得很快,但是终究埋没不了对写程序的热爱,通过打报告,到抱怨,到准备离职,终于调到了开发部分从事软件开发,从此开始一个真正程序员的生涯。由于读代码和测试积累的经验,以及对写程序的强烈兴趣,在软件维护的过程中,如鱼得水,对系统得理解能力上升到一个新得高度。除了软件维护,大部分的时间进行了新项目的软件开发。从一个新手,到理解软件开发流程,到项目经理,一切的过渡都是自然而然。开发期间,读了Linxu内核源代码,FreeBSD内核源代码,GateD代码,Snort代码等等,我的开发领域从TCP/IP协议栈,到上层协议,到安全。两年间写了超过10万行的C程序代码,这些可都是用在网络设备中的代码。使用过的开发平台有Win,pSOS,Vxworks,RtLinux,BSD等,其实不管在哪个平台开发,只要有一个好的代码编辑工具,效率都是一样的。我使用的SourceInsight,编辑和浏览代码非常好用。随着开发经验的增长,调试的时间越来越少,因为代码调试前就在头脑走跑了一遍。这和在学校的时候边调试边写代码完全不同。这里举个例子,我指导过几个刚毕业的学生做项目。开发时间过半了还没有让他们调试代码,而是每天相互走读各自的代码。最后集成所有的代码调试时间非常短(不到整个项目进度的1/10),这几个学生都不敢相信自己的代码跑起来这么顺畅和稳定。
给初学者的建议:
软件开发中,不要养成靠调试器去发现错误的习性。编写代码时一定要检查再检查,在头脑中运行没有问题,再进行编译调试。
这期间也走过弯路,写出来和大家一起探讨。这两年来,国内很多公司在学习印度的CMM软件开发流程。开发时我也深受其影响,如果真的按照其业界的开发能力基线水平,我觉得Linux永远无法完成。为何微软不需要CMM,思科不需要CMM。作为一个做软件外包型的公司,使用CMM没有任何问题。但是作为一个创新的技术型公司,没有任何必要。为了验证到底可以超出所谓的业界基线每天几十行的开发能力,我在项目开发中不断突破自己的能力,最高记录一天写了2000行正式代码,整个项目过程中平均每天达到300行以上,后来的缺陷率也是远远低于公司平均水平。再举个例子,我曾经3个月完成的一个功能,后来使用另外的人在另外一个平台开发,花了两年的时间还没有完成。举这些例子,并不是想说明我有多牛,只是想让大家明白实际开发中程序员的差距。看看一个公司的程序员,就知道这个公司有多牛。
给初学者的建议:
不要受教条的影响,不断提高自己的能力,超越自己,才是最重要的。
在开发期间,看过很多关于代码的书,有比较烂的,也有好的,现在把看过的觉得不错的书籍列出来,供大家选择。
《编程精粹》——很老的一本书,非常好,但一直不明白在国内为何还没有一些非常烂的所谓高手写的书流行。
《代码大全(Code Complete)》——结构化编程中的经典。
上面这两本书是进入我项目组新员工的必修功课。作为一个程序员,必须要求对代码向和自己母语一样的熟练,我认为国内的技术水平低下,和优秀程序员太少有密切关系。当然,这样的结果和国内流行的把写代码看成低级工作的恶劣风气是密不可分的。为何我们写的代码这么多错误需要去修改,如果让大家去写作文,肯定没有这么多错误,最多也是风格和语调的问题。把计算机语言练成和母语一样的熟练,就不会产生那么多的错误,但是国内又有几个公司能够做到这点呢?为了所谓的节约成本,使用初级的程序员,而后续无穷无尽的痛苦维护却无人关心,国外公司在这点上就非常的明智,很多都使用编程超过五年的优秀程序员。要达到一个真正程序员,只有靠自己,平和的心态和清晰的目标。
给初学者的建议:
程序员的大部分时间都在和机器交流,要求自己使用计算机语言和使用母语一样熟练。
不管在哪个领域,写代码完成的只是实现每个功能,作为一个程序员,了解本领域的最新动向和技术,也是必修功课之一。不管是不是岗位的需要,都要试着去分析本领域内的优秀产品实现,扩大自己的技术视野。如果你在实现一个模块,就要去关注和整个系统的关系。另外就是和业界的高手交流,不要说你的周围没有高手。找到自己领域内知名的技术论坛,加入感兴趣的邮件列表,获取新的知识,不要成了井底之蛙。
虽然我工作中使用C语言写程序,但是我学过Java,C++,Perl等语言,并且尝试过在结构化语言中使用面向对象的思想设计。作为一名技术工作者,我认为要保持开放的心态,接受一切新技术的优秀特征,才能保持进步。常看到这样的信息:计算机领域技术进步太快,需要不断学习新技术,这句话不要太信以为真。世界最先进的产品和软件,都在使用大量二三十年前的技术。学习任何一种新技术,一定要花点时间追溯其源,否则很容易就乱花渐欲迷人眼了。
在软件开发过程中,随着经验的丰富,不知不觉中就到了项目管理和系统设计的层次。和其他人不同,我并没有迷恋于非技术的管理,而是关注于真正的技术。因为我看到周围太多的人,做完一个项目,就开始往上升,做项目经理,并迷恋于管人的工作,不再编程。我几次做项目经理,又都主动要求去做程序员,去写程序,我觉得自己的技术能力还需要锻炼。这些在短期看来,是有所失的,但是从长期的职业道路来看,每一步都打扎实,是最大的收获。项目经理,系统工程师这些在我看来都是空有的头衔,至始至终,我就认为要做好一个程序员。今年我主持开发了产品,从系统设计,到软件设计到实现,从技术到管理,工作起来游刃有余,我这真正体会到几年的努力没有白费。如果过早的离开技术路线,今天就不会有这么高的能力。
给初学者的建议:
看准目标,就要一步一个脚印去实现,不要太看重眼前的得失。今天的失去,在明天看来或许就是宝贵的财富。
四年不多也不长,从测试,到维护,到实现一个模块,到做产品设计;做过测试工程师,软件工程师,项目经理,系统工程师,技术专家,现在回想起来,路线十分清晰。但是当初在若干个选择点都有过犹豫,现在庆幸都坚持了下来。现在,别人问我的工作,我会毫不犹豫的回答:我是一个程序员。
后记
断断续续写了三天,才写完这篇文章,其实还有很多东西无法表达,已经融入到平时的习惯中。我现在的目标就是做世界最好的产品,写优秀的代码。写下这些文字,希望对初学者有所帮助,同时也鞭策自己永不言弃。