从开始学编程的高二到现在的大四,算起来编程的时间真的有六年了。从林锐老师在《软件工程思想》中提到的对程序员的定义 [注释] 来说,我还算不上一个真正的程序员,但相比身旁的一些人来说,说比他们会写程序应该还有一点儿井底青蛙的自信。如果以代码行技术来衡量,这六年中所写的所有程序的总和还不到十万行,最狂热的时候一天也就产生五百行左右的代码量,算是个写程序的熟手吧。这个时候来说一点自己在编程方面的见解,恐怕会贻笑大方。 只是看着身旁很多找工作的同学,想应聘程序员却一个冒泡排序程序也不知道怎么写,不能不为之感到痛心。因此写出下面的自己的一些经历,希望能给一些刚入门 的新手们一点有益的启示。
        和多数编程人员的一个相同经历,我的启蒙语言是VB。第一次接触VB的时候也是什么都不懂,就老老实实地听老师讲课,把老师给的所有小程序都照着抄到到机 子上去调试运行。不过抄程序的时候就有点不老实了,总喜欢凭着自己的理解改这改那的,哪怕是改一个更变量名也会让自己有点不安分的成就感,这种习惯慢慢发 展到后来就是老师给的题自己老喜欢作一些改动,或加一些条件,或弄得更有难度,这样收益真不小。就有一次不安分的成功,让我相信自己已经会独立编写程序 了。这个题目应该很多人都熟悉,就是写一个打印下面的图形的程序:
                              *
                            ***
                          *****
                        *******
当时老师给的参考程序没有循环,就是一行用一个打印语句打印出来,我当时就觉得这不够自动化,不能算是真正的程序,于是后来用了一个循环,把这个程序打印出来,但又觉得没有挑战性,于是想到了打印下面的图形:
                             *
                            * *
                           * * *
                          * * * *
                         * * * * *
                             …
这个图形提出来后着实让自己折腾了好久,但最后终于让自己写出来时,那种喜悦和成就感就甭提了。从此我对自己和朋友宣告我已经会写程序了。
        可能是在学习方面我真的不够优秀,也可能真的是上天故意捉弄人,高考的时候自称为是自己的拳头产品的数学考砸了,结果未能如愿地考入计算机专业,学校把我调剂到了环境与科学专业。我的性格让我不可能选择复读,那肯定会把自己憋死,所以将就地就进来了,高中已经习惯了自学,大学自学相信自己也没啥问题。
        反正大学的开始我是不能如愿地进入的计算机专业了,于是就开始自学VB编程。然而并不知道该怎么发展自己的编程能力。非计算机专业当时也要上VB课,但那 时已经觉得上课的内容太简单了,根本满足不了自己的需要,如果不是当时还比较乖,我想早我就是一个逃课大王了。我到网上去查自己的需要的信息,觉得什么技术让自己感到好奇,就学什么,到书店去买书或到图书馆去找书,看上任何一本自己觉得有难度的书(当然是以VB为编程语言)绝对不会放过。看到网上说API很神奇,就找了 一些介绍VB如何使用Windows API的书,然后也背了不少API,看到有人说有C/C++制作ActiveX控件,然后在VB中使用的说法,找书的时候就不放过任何一本有 ActiveX字眼的书。当时有一段时间自己也有点黑客情结,一听说病毒有很一部分是用VB写的也就来了劲,先是看VBA程序,然后是VB脚本,再到后来借了一本VB网络编程的,其实眼睛就盯着那一些介绍如何写木马程序的内容。有一个机会看到论坛上有人招聘用VB进行数据库开发的程序员,下来就开始学VB+ACCESS编 程的技术。最后一年半左右下来,并没有真正的学到什么编程技术,不过知识倒了解了不少,足以让自己后来转到计算机专业(这是后话)后跟计算机专业的同学乱侃一通。真正让自己有点收获的就是有一个机会看了一本介绍软件工程的书,有了模块化的思想准备,后来实践的时候让自己相信自己能很熟练地运用事件驱动机 制来驾驭程序。一言以蔽之,就是当时的我渴望有个导师但没有,就像一只无头苍蝇到处撞,走了不少弯路,希望读者们能有幸不用再走这样的弯路。
        忘了在哪个网页上看到一则报道(有可能说法而已吧)说世界上真正的C++程序员不过30万,加上很多人都说C++是最难学的高级语言,因为喜欢挑战的性 格,我学起了C++,在完全没有底能不能把C++学懂的情况下,就报了全国二级C++等级考试。当时(2005年)C++等级考试是第一届,没有往届的试题可以参考。也可能就因为是第一届我才报,还是挑战心理。当然后来的情况比较顺利,因为当时的VB编程基础还算比较扎实吧,除了接受面向对象的思想花了 比较久(大概花了一个多月的时间学习和理解如何进行面向对象编程)之外,其他的都套搬VB的编程思维,花了三个月左右的时间就相信C++我已经入门了。所 谓入门就是能按照设计要求写程序,我当时就是这么想的。
        初学C++的时候,因为有了一点VB编程基础,照抄的比较少,但还是的把教科书上的所有例子或自己写或抄写到机子上去一个个调试通过,C++教科书上的例 子基本上写完后,就拿来C++的数据结构教程,里面的程序也是或自己写或抄写到机子进行调试,基本上数据结构教材(电子科技大学出版的)中的程序差不多有 一半左右都实际调试过。一直到现在,我都相信这为我后来在编程方面的长足发展打下了非常扎实的功底。曾经有人说,如果你能把的数据结构和算法这两本教材上 的例题和课后习题都一一调试通过,那么理论上你想写一个Word程序就不存在什么问题了,只要时间足够。是因为这句话的引导我才那么老实地调试程序。我很感谢说这句话的人。如果不是这句话,恐怕我现在的编程基础要降一个档次了。不过因为我没把所有程序都调试完,可能还不到一半,理论上没办法写出一个 Word程序也就不足为怪了。
        可能是后来上天觉得这她那样捉弄我太残忍,于是换了个玩法,大二开学不久,让我如愿地转到了计算机专业,然后在我来不及尝一下春风得意的喜悦时,让我梦中的她成为别人的拥有,尝了一下失恋和心痛的滋味。不过想想这缠绵的思情对自己的编程也添了不少的浪漫,我是个完美主义者。
        转到计算机专业之于我来说可是人生的一件大事,总的来说还是欢喜大过于悲伤。
        刚转到计算机专业时,同一个系的学生正在学数据结构,这可是一件大好事,毕竟转过来之前我已经把课本过一遍了。比较恼火的是汇编语言,在转过来之前听说过汇编语言,但巴根儿没有接触过它,当时他们已经上了一半不止的课程。当然事实又证明我是多虑了,有三点原因,让我只花了21天的时间就入门了X86汇编, 比入门C++花的时间还少。这三点原因就是:(1)我对编程有一股强烈的爱好;(2)和大家一样对程序的理解力没有天生的缺陷;(3)学习汇编时非常专注,基本上不做其他事情,除非有迫不得已要做的事。我曾经对很多人说过我相信自己有编程的天赋,其实天赋就在这里,然后再加上我是个完美主义者(我相信这点很重要,程序的质量离不开它)。
        从转专业到现在,总的来说,编程基本上是以项目为中心的。
        转到计算机专业一个月以后,学校组织了一批到巅峰参加实习的学生,我有幸被选拔上了。大二暑假就在巅峰进行了为期一个月的实习。
        在实习期间主要参加一些测试工作,并没有实际写代码,所以除了了解一些测试技术及测试工具外,没真正学到什么知识,所以主要收获不是在那里学到了什么知识,而是一些见识。在那里第一次接触了软件过程管理,还有就是同去的一个同学带去了的一本书,叫《C++程序设计》(哪个出版社的想不起来了,不过要买的话可能 要花160多块,如果想节约一点成本可以看电子书,网上有电子书下载),主要是讲用标准库进行泛型设计和模式设计的,看了以后受益颇多。是看了那本书我才发 现自己所知道的C++知识简直不堪一提,也是看了那本书才开始有代码质量的意识,也触了框架的概念。可以说,这本书也对自己产生了很大的影响。回来后我就开始学使用标准库,学模式设计。
        我的第一个项目也不算项目,因为没有申报。就自己在底下做。那是做人工智能的,说具体一点是中文自然语言理解方面的,当时想做个数据库的的自然语言查询接 口。不过后来的事实证明没成功,不符合自己的现实,条件也不允许,因为没有团队,只有自己一个人,没申报项目,什么工作都展不开。不过倒从中学到了不少知识。因为为准备这个项目收集的资料不下3个G(因为经济条件的限制,已经习惯了看电子资料),还专门花了一个月的时间学Visual Prolog语言,第一次使用第三方SDK。还有学习基于贝叶斯网络的模型和技术,至少重温了一遍数理统计的知识。基本上了解自然语言理解现状的概貌和流行的自然语言理解模型及技术。当时也正处于刚失恋的时节,心有点痛,编程时边想着她边想着未来也特别有劲,通宵编程是很经常的事,总是不知不觉天就亮 了。那个时候很象林锐老师在《软件工程思想》中提到的那首诗:
        我编程三日
        两耳不闻人声
        只有硬盘在歌唱
        在那段时间,也是第一次学习和使用C++线程,并了解了面向对象的多线程编程技术,还有安装和使用红帽的Linux系统,有点遗憾的是没来得及学Unix/Linux底下的C++编程。
        我的第一个团队是游戏团队,经朋友的介绍认识的。在那里我第一次接触DirectX,但当时没有真正的使用DirectX进行编程,因为我当时的兴趣在网 络方面,所以很快我投入到了网络编程的学习中去了。这段时间还学会了打大型游戏,先了打了一款《新绝代双骄》,然后就打起一款大型多人在线游戏《三国策 IV》,现在还在打,打游戏有三个目的,一个就是娱乐 ;一个是让自己了解游戏;一个是想在三国里施展一下自己的兵家策略,为将来创业作准备。
        我第一个参与并获得成功的项目是做一个网上OA系统,当时我做的是安全模块的设计和编程实现。在这段时间了解了加密解密及数字认证的基本手段及技术,第一 次使用C#语言编程。其实开始是用C++MFC开发的,后来为了集成的方便,原有程序全部抄成C#语言,因为用的是C++,所以转化成C#语言也很方便。如果单纯从外观来看,C#绝对称得上是美女型的语言。那时,用C#语言真的体会到了快感,一直到现在,都觉得使用C#语言编程简直是一种享受。
        现在自然而然地想到了网上关于使用什么语言好的争论,如果说点个人观点,我想这些争论是多余的,就要看你是要用作什么目的。如果是开发基于Web的应用程 序,用C#和JAVA语言应该是最合适的了,如果是作桌面应用程序,用VB和VC#应该是比较合适的,如果是写算法或者是偏向底层的编程,最好还是用 C/C++,甚至用汇编,毕竟这种层次上我们必须追求高效率。我个人还是比较喜欢用C++,尽管它长得真有点丑,不过如果你能体会到它的博大精深,你就不应该去计较这一点。Perl语言比C++可能还要丑,但他实用,很多程序员还津津乐用。说肤浅一点,如果你能熟练使用C++,学其它语言根本不会存在什么问 题。
       我大学做的最后一个项目是基于Internet的视频会议系统。 这段时间留给我的印象最深刻,也发现自己需要的知识还非常多。虽然接手这个项目之前,也知道一些软件工程方面的知识,但现在知道当时只是了解一些皮毛而已。所以当时软件定义还不够清楚就搭起了体系结构框架,然后进行粗糙的详细设计后就开始编码了。在遇到集成困难的时候,有个队友问了一声:“你告诉我这个 软件最后到底什么模样的!”我才发现我无言以对。是怎么一种场景的呢。我说我们采用面向对象开发方法,然而却没有画多少类图和用例图,状态转换图就更不用 说了,因为当时没意识到到表达系统的行为模型可以能通过状态转换图(是后来系统地看了UML才知道的),程序接口规范写得也不够详细,有的还有争议却没给出一个确定的结果,整得后来很多程序要重写。总结一下应该有这么点原因:心态不够端正,分析下来觉得最后的程序上不了五万行就大意起来,有软件过程的意识但没进行到底,急着写代码的老毛病重犯,没有深入的地对需求进行分析,特别是面向对象分析就匆忙上阵。
        总之,这个项目因此需要做很多的返工。
        要说学的知识倒也学了不少。因为视频捕获是用第三方SDK,就是Direct Show,第一次应用Direct Show进行编程开发,也是第一次应用COM进行编程开发。主要语言是用C#,写P2P程序时为了达到功能和界面的分离,学会了使用事件进行消息通信。实现打洞技术也花了不少的精力。视频传输是个实现要点,也学了不少MPEG方面的还有RTP和H26X/H323方面的知识。然后就是软件工程的实践,主要是实践失败的教训。项目还在进行中,希望能最后取得成功。
        六年的编程求索生涯应该告一段落了。编程技术上也见识过什么才是牛人,自己真有点井底青蛙之嫌,编程经验也就不敢谈了,作为一个生涯总结公诸于世希望大方之家不要见笑。如果你还是新手,希望上面的经历能对你有所帮助。
注释:林锐《软件工程思想》关于程序员的定义:
2.1 了 解 程 序 员
早 期的程序员干活能从软件直通硬件,个个生猛无比。又因他们的作息时间、言行举止与常人不太一样,久而久之就给人们留下了“神秘”、“孤僻”的印象。如今软 件行业被炒得热火朝天,有能耐的程序员即便躲在大山岙的军工厂里也能被挖出来。而更多原本不是程序员的人操起几本“速成”、“二十一天通”等书籍也加入了 这个行业。现在国内号称有上百万程序员,这支大军鱼龙混杂,已搞不清那些是正规军,那些是民兵游击队了。
真正的程序员都有如下秉性:
一、诚实
程序员在学习与工作期间几乎天天与机器打交道,压根就没有受欺骗或欺骗人的机会。勤奋的程序员在调试无穷多的程序Bug时,已经深深地接受了“诚实”的教育。不诚实的人,他肯定不想做、也做不好程序员。
有一名市场营销员和一名程序员都在新闻发布会上发言,将一项新技术的消息公布于众。
市场营销员说:“这项技术比电话、晶体管和原子弹三项发明加起来对世界文明的影响都要大。”
程序员说:“这项技术在有限的领域内,在有限的程度上,解决了一些技术性的问题。”
看来为了让我们的民族更加诚实,学电脑真的要从娃娃抓起。
二、简单——实用主义
有人问一个数学家,一个物理学家和一名程序员:“一个盒子有几个面?”
数学家回答说:“有六个面,因为盒子是长方体。”
物理学家回答说:“有12个面,分为6个外表面和6个内表面 。”
程序员回答说:“只有两个面,里面放电路板和硬盘,外面放显示器和键盘。”
目前即使最先进的计算机也不具备智能,程序员的基本工作就是把复杂的问题转化为计算机能处理的简单的程序。如果一个问题复杂到连程序员自己都不能理解,他就无法编出程序让更笨的计算机来处理。所以程序员信奉“简单——实用”主义。
也有不少做计算机“学问”的人颠倒行事。本来几句话、几行程序就能说明白的事,非得要抬高到理论创新的程度,写成玄乎的文章去评教授或者弄个博士学位。所幸在第一线工作的程序员大多是实干的。
三、爱憎分明
程序员大都喜欢技术挑战,不喜欢搞测试与维护。高水平的程序员喜欢与高水平的程序员一起工作,因为他们怕“与臭棋佬下棋,棋越下越臭”。程序员大都厌恶拉帮结派、耍政治手腕。不信,数一数你认识的程序员,有几个是党派人士?
四、工作单调但不乏味
有人问编程大师:“程序设计的真正含义是什么 ?”
大师回答说:“饿了的时候就吃,困的时候就睡,只要时机恰当就进行程序设计。”
其实程序员的生活和工作已融为一体,尽管单调却不乏味,还能独享孤独。有诗为证:
我编程三日
两耳不闻人声
只有硬盘在歌唱
结论:优秀的程序员没有理由不让人喜欢,他们远比怪僻来得可爱。  

更多推荐

六年编程求索的生涯