1、初试牛刀
那年还是1993年。我刚上高中一年级,就在第一个学期里,学校设了计算机课,使用的计算机还是中华学习机,苹果机和IBM PC机,那时候开机特别麻烦,老师叮嘱了N遍,一定先开显示器,再开主机,否则会损坏机器,关机刚好要倒过来,我在那年课程学会了BASIC语言,并对树立提到的数学问题一个一个的编写程序解决,我记得最清楚的一道题就是百鸡问题,如下:
张邱建《算经》中提出“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一,百钱买百鸡,问鸡翁,母,雏各几何?
这是一个不定方程组,如果人工计算,血药不断的尝试,需要话费不少的时间。从那时起,我就觉得计算机是一个很神奇的东西,心里就喜欢上计算机了。
1996年我考上了大学,接触计算机也比较高级一点,虽然还是286的机器,但开始学习操作DOS操作系统了,还知道计算机不但可以计算数学问题,还可以玩很多游戏,可以做很多的管理工作,比如说帮老师打印试卷,
在这学期,我也有过一次最深刻的计算机教育体验课,内容也是别开生面的,不是真正的去实验室做实验,而是带我们去他的工作室里,打开uitai当时算是比较高级的计算机,可能是486吧?打开计算机并且启动那个化学软件,输入一些参数就开始运行了,老师就开始给我们介绍怎样计算,而那台计算机足足计算了两小时,才把一个简单的分子式计算完成,这时才知道什么是计算机性能,为什么需要大型机器。
同年,我也开始学习计算机文化基础,主要练习快速的键盘打字,还常常跟同学比赛打字,开水打得快,还蛮有趣的。同时,我也更加系统的学习了计算机的历史,了解到计算机更加广泛的应用,
2、开始学习编程
1997年,我开始学习C语言编程了,在这之前的大学课程都是学习FORTRAN或PASCAL的,从那年看开始C语言越来越流行,不管是系统开发,还是应用软件开发都是C语言的天下,因为UNIX是使用C语言能编写的。所以UNIX下的软件,大多数都是C语言写的,当然DOS下的引用软件也越来越多是C语言写的。记得当时使用的C语言编译器是TC2.0,
它是集成开发环境,也就是说把编写的代码和调试代码放在一起,这样大大提高了软件的开发速度,算计一次软件开发的历史突破。
1998年,我开始接触网络,当时网络才刚刚兴起,上网也不知道能做什么,只是知道可以手法E-mail,发出去别人立即就能收到,这是一种速度效率,当时上网的机会也是来之不易,是同学天天打电话去电台里答问题,得到的机会。同时,我在这一年里就开始学习微机原理,了解计算机具体是由什么组成,怎样运行的。
接着,我开始学习使用汇编语言控制8255A编程,了解CPU的基本指令,也慢慢开始学习C++编程,使用VC5.0开始编写程序,刚开始发觉使用VC5.0编写的windows的程序非常困难,基本搞不懂从哪里开始。
到了1999年,我开始学习多种编程语言,为此,我还购买了一台K6-2的电脑,这样学习编程,就更加方便和容易了。
当时开发windows程序,还是使用VB比较容易一点,因此我变转向学习VB编程,搞了几个月,也能使用他编程;但后来发现使用VB编写一个扑克牌由此都非常慢,便放弃了VB 的学习,现在回想起来,应该是自己的基本功不过关,而不是VB不好,接着又
学习了Delphi,并钻研了几个月,使用他来开发扑克牌有还比较快,但当我到图书馆看到linux时,发现全是C语言编写的,又重新回到了C语言和C++的平台,接着为了看懂linux的源程序,我还专门打印了一本linux的源码,一行一行的看。
同时,这一年里也是C和C++技术能力突飞猛进的一年。
3、入行的开始
2000年毕业后,我就直接进入了嵌入式软件开发。这一年里,学习makefile文件的编写,并开始看一万行以上的工程代码。毕竟以前看过linux代码,座椅看那个嵌入式系统代码,接显得比较小了,接受的速度非常快,两星期就完全搞懂,可以进入功能阶段开发。开发这个嵌入式软件,不是从头做起,而是从原来别人的基础上进行修改开发,那么看懂别人
没有注释的代码,就变成一种比较高了要求了。不过,这个系统是印度人开发的,毕竟文档写的比较全,答题的程序架构是写的非常清晰的。从这个项目里我学习病人是到文档的重要性。
在2001年这一年,我开始转向PC的软件开发,也从一家大公司转到一家小公司进行软件开发。
记得那个小公司,我刚到的时候还没有成立,我是公司的第一个员工,算上经理才3个人,公司的办公地就是一套三室一厅的房子,在这样的小公司里,经理主管销售和策划,我负责设计产品和产品开发,既当软件开发工程师,
又当软件测试人员,还当软件培训人员。为了适合多种角色,我开始每天晚上都看书,以便学习到多种技能。也是在那时,我开始每月买一到两本书,并且都是晚上把书看完,白天起来就是写代码。
这段时间里,我的编程技术提高了不少,比如COM、C++模版、STL的使用,还接触到当时最时髦的XML技术。以及进行DOM解析技术。
由于当时主要开发网络通讯工具,所以对网络研究得比较深入:从TCP到UDP都是非常熟悉;使用到的P2P技术也需要最先进的技术,比如突破局域网的防火墙技术,就要有好几种;
文字通讯,语音通讯,视频通讯一样不少,为了快速地实现语音通讯,还得研究ADPCM编码,要学习的技术也太多了,我将全部精力都用在了学习和工作上。
4、跳槽
在2002年到2004年这三年里,我又从一家小公司转到一家大公司去开发软件。在那个公司里,主要开发银行的信用卡软件。这类软件对稳定性和质量的要求都是非常高的。在这家公司,软件开打人员应算不少了,
C++开发人员就有7个人,测试人员有3个人,系统分析人员有3个人,数据库设计有两个人,Web开发人员有五个人,项目经理有5个人。
这25人的软件开发团队,使用的是一种全新的软件开发方法,整个软件开发过程都可以项目制进行的,也就是说项目经理对业务非常的了解,经过三个月左右时间写出一分详细的分析的功能书,然后再把整个功能书分成若干块,模块的功能定义非常清晰,把这些模块功能说明书发到相关软件开发人员手上,
让软件开发人员有三天左右的时间来设计整个模块。比如血一个C++的模块时,软件开发人员需要把整个C++模块画出框架流程图,并且把界面布局描述清楚,还要所有软件开发人员在项目经理面前把自己的设计计划和时间写在会议室的白板上,并且要求让所有参加会议的人都看得懂。
这样下来,就会把编写的代码计划全部定出来,决定所有估计的时间。然后根据所有工作的人员的计划生成进度图,把进度图发给所有相关的开发人员。
虽然测试人员只有三个人,但他们全部跟踪整个开发流程,比如让他们写测试程序,写构造测试数据的程序,还要为巨大量数据测试作准备,为异常数据测试作准备等等。测试人员可以把界面上的每个功能都测试的很仔细,还需要对业务流程也进行测试,测试出来的bug实在是太多了,每一次改进都会稳定很多,在这几年里,我深刻体会到了项目管理和测试的重要性。
2005年春天,我又转到了一个相当大的软件公司工作,在这公司里,总共有300多左右,仅C语言和C++开发人员就有50人。
这么多开发人员,也是分成几个小组的,每组10个人,比如网络服务器组,客户端组、IM客户端组、数据库服务器组、基础组建等。
大公司一般把工作分得相当细,比如VSS版本管理器就有一个人专门管理,并且只有这个人才可以发布软件的版本和制作安装程序。当然这个人还需要管理所有开发的文档,并且维护文档的完整性以及源程序的安全性工作,
比如每个星期就要被跟一次源程序和文档等。。
开发人员比较多,因此交流的成本也比较高,还好在这个公司里可以使用先进的IM工具,比如像QQ、MSN等进行人员交流和通讯,像一个10人的工作组里,开会经常是在QQ或者MSN上就解决,这样节省了大量的时间,比如去定会议室 还需要等安排,在QQ上所有会议记录都会备案到历史会议记录里,使用QQ可以让所有公司员工之间进行平等交流,无论是项目经理、还是老板都随时交流,提出所偶建议,一经采纳都是有奖励的。
对于一个有100多人的大办公室,居然一天里听不到几个人在说话,全是听到键盘的声音。如果使用qq这样的即时工具,每个人都起来说一句话,就像一天街道了,这样对于深入思考工作的人员来说都是一种极坏的工作环境
会打断深入工作的意境。这样也是为什么编程人员在夜深人静的时候可以快速写出代码的原因,对于软件开发公司来说,保持安静的环境是非常重要的。我从这个公司里学习到大小公司小组化的软件开发,对于整个团队的技术提高非常快速的。
在企业里开发软件也是一向持续的工程,任何项目都是从以前的东西改造过来的,而不是从头做起,为什么要这样做呢?因为那些项目都投入了不少的资金如果放弃它们,就相当于把一个公司的资产放弃了;更何况,立即开发一个产品出来不一定就是满足客户的需求。
在企业里,做软件工程师,重要的不是天天去发明东西,而是天天改进产品,完善产品,提高产品的竞争力。
另外,团队也不是越大越好,当打到一定数量后,交流成本就急剧上升,这是就需要使用更多辅组软件来管理项目了,比如需求分析,源码版本控制、测试管理等等。2006年以后,开发软件进入了一个心的天地。
我一直在思考,怎么样才可以开发更经济,更稳定的软件?怎么样才可以开发出满足客户需求的软件?面对这客户各种各的需求,不得不去满足他们,客户提出来的修改就是订单的到来。
进来开发软件,都是以市场为向导,一客户为中心,尽可能的满足客户的需求,实现销售的突破。当然,我也理解到软件的是以质量为中心的,如果一个软件的没有可靠的质量,根本没有使用价值。
由于软件的需求越来越多,单打独斗的开发方式越来越难以适应软件的需求,其实,最简单的方法就是组建团队,但团队的组建也不是呢们容易。要组建一个好的团队,关键是人才的搜寻。