别人的十年已过,我的十年该怎么过!

第一次在BLOG上发表文字,最想写的就是自己10多年来的软件经历,以及从事软件开发自己几点体会。(从小学到大学,语文考试我经常无法完成作文题目,可能是文字表达能力有限吧,所以这里只是记录一些文字,谈不上文章)

我从事软件的开发的时间不算久,经历也很平淡,没有到过很多和很大的软件公司。94年开始接触计算机,那时使用的好像是VAX终端机,只有键盘和显示器可,看不见主机,可以编写和调试PASCAL和BASIC程序。后来学习了C语言,教材的名字就是《C程序设计》,谭浩强先生的书,这本书学的很熟。96年的毕业设计开始接触完整的编程,那时设计的是一个试题库,操作系统是MS DOS 6.22,开发工具是DOS版的FoxPro2.5,中文显示借助UCDOS,软件的第一个界面参考的是WPS,屏幕上显示几个菜单,然后通过方向键选择不同的命令实现不同的功能等等。功能非常简单,现在看看很有意思,但是功能还是比较完整的,可以创建试题库,并且根据难度系数选择试卷。

96年毕业之后,由于所学专业不是计算机,所以进入一家国有大企业,从事柴油机测试和设计工作,但是经常自己学习TC2.0,在DOS下的C开发工具中,这是一个非常出色的了。由于刚刚毕业的原因,工作上没有太多的事情,经常试着编写一些打发时间的代码。97年开始的时候,试着用TC编写了一个类似DOS下的EDIT编辑器的程序,有菜单,可以通过键盘控制菜单,当时在DOS下通过绘图函数实现一些菜单的绘制,还是比较麻烦的,由于只是为了学习和打发时间,所以这个程序也没有做完。97初,我们几个刚刚从大学毕业不久的同事听说工程图书馆有计算机图书可以借,于是匆匆办了借书证,每人从图书馆借了3到4本,我借了一本《C/C++编程1001例》,很厚,900多页的样子,其中关于面向对象的编程,关于类的一些讲解,非常简单,最初接触面向对象的思维方式,让我兴奋了好几个月,感觉这种思想的的确确可以非常完美的描述现实世界,这本书也读了很长一段时间。97年年底,我到上海出差,记得是参加一个船用发动机国际展览会,对具体的内容没有什么特别印象,买了一本关于Windows程序设计的书《Windows实用编程指南》,讲的是Windows3.1下的Borland C++程序设计,这本书一直带在身边,我发现在Windows下实现一个菜单是那么容易,尽管当时必须通过编写代码创建一个窗口,但对我来讲,已经是非常幸福了,对比DOS下的菜单绘制代码,Windows编程绝对是一种享受。

在Windows3.1下我只编写了一个程序,柴油机增压和中冷系统的热力学计算,程序非常简单,输入一些参数得出计算结果,将原来手工计算的很多复杂的公式通过代码实现了。整个界面上的控件都是通过手工编写资源文件实现显示的,很麻烦,不像现在的对话框设计都是可视化的。

在从事柴油机设计的日子里,工作以外的时间都用来看编程的东西,对于本职工作倒是没有特别用心。99年上半年干脆主动要求调去从事计算机管理工作,从那时起,我正式开始了与软件打交道生活。

我的第一个网络版程序

ERP这种东西,现在从事软件相关工作的人可能都或多或少的听说过,通过Baidu或Google搜索一下,可以得到成千上万的结果,但是在99年开始的时候,互联网还不像现在这样普及,我那时也不知道ERP这三个字母的组合,只是单位领导希望编写一个管理程序,可以实现将AutoCAD绘制的生产明细,传递到车间,用于车间的生产管理,解决数据的重复录入问题。但是开发部门很多人都在使用DOS下的AutoCAD12,Win95,Win98也在使用。我们系统支持组的一位同事负责整个的开发过程,我当时的主要工作是学习一些大型软件的使用,进行有限元分析计算,后来我的那位同事因为要出国培训外语,领导临时安排我负责整个管理软件的开发,整个系统涉及到多个车间和科室,而每个车间的计算机配置不同,而且工厂连局域网都没有,所以我们只能通过Access97的数据库文件存储数据,然后将这些文件复制到软盘上,交到相关车间,每个车间都有自己的开发人员,根据自己的实际情况开发自己的应用程序,各个程序之间通过软盘传递数据,每个mdb文件的格式都是一样的,因此从开发部产生的mdb文件,每个车间都可以使用。我们当时开发的整个系统与产品开发,生产管理,采购,财务,库存都有关系,应该说具有ERP的性质,但是没有使用这个名字。

当然我主要编写开发部的程序,从AutoCAD中读取明细到mdb数据库的代码是由同事开发的,我们工作就是通过编程管理这些mdb文件。我那时正在学习VC5.0,所以开发工具就选择了VC,数据库以共享目录的方式存储到NT Server服务器上(共享名称后面带$,通过网上邻居不能直接看见,然后设置权限),服务器端就是一个共享目录,此外没有别的操作,客户端实现将mdb文件归档,对文件内容进行检查,然后将某个车型的mdb文件导出到一个目录中,便于软盘拷贝到车间。不知这是不是一个CS程序。99年5月,开发部内部都实现了联网,所以编写一个网络版程序是可行的了。写完了这个程序之后,我对于VC和数据库有了一点了解。

我用VC写的这个程序使用了不到一年的时间,后来被升级掉了。原因是我又用VB+SQL Server编写了一个真正的CS结构的PDM程序。之所以编写这个PDM程序,主要由于99年的两件事情,第一件事情是我们工厂要购买上海一家公司的PDM软件,而且主要在另外一个开发部应用,我们开发部当然不能优先使用了,这使我有机会了解了什么是PDM,以及PDM数据库的设计思路,而且必须为我们开发部解决PDM的问题;第二件事情是微软在青岛举办了一次SQL Server7的巡回展活动,使我有机会知道世界上还有SQL Server这种东西。因为我们从98年开始的数据管理系统现在的确遇到了一些问题,程序不断的出现一些不好解决的问题,车间生产又急需我们开发部有一个比较好的管理软件,因此试着用VB和SQL Server编写自己的PDM,大约有几个月的时间,我完成了PDM的基本雏形,经过一段时间的测试之后,我将原来服务器上的mdb文件升级SQL Server数据库中,然后将VC写的那个程序给升级了。在这个过程中,每个开发部的设计师都成了PDM的测试人员,一年之后,这个PDM软件已经非常稳定的为开发部使用了,然而这是,另外一个开发部的PDM还没有实施,因为PDM厂家还在不断的修改用户提出的一些要求。所以,在信息化建设上我们部门的工作还是不错的,后来整个产品数据管理软件还在获得了市企业现代化管理二等奖。

PDM是我编写的一个比较成功的网络版程序,总共大约有100-150个客户端,到目前一直在使用,没有出现过问题。

不过在完成了这个PDM程序之后,大约2000年的3月份,我现在的公司老大通过网络找到了我。在此之前,我一直在完善PDM和学习VC和数据库。

(待续)

我的第一个商品化软件。
2000年的春天,我在网上留了自己的简历,时间不久,我的传呼机响了,就是现在的老大打来的,他需要一个兼职的程序员,我的条件比较合适,约我过去谈谈。
我的简历中提到我做过一个图文管理系统(管理CAD文件的程序),而他正需要一个图文管理系统(管理图像文件的程序),给我介绍了之后,我觉得比较简单,就开始做了。这是我第一次做兼职程序员,周期大约一个月的时间,我可以得到2500元,这比我的月工资高多了,我当然很乐意。
实际上我一个月的时间按照老大的意思做了,拿去给他看,有些地方不太好用,需要修改,我感觉有道理就改了,后来断断续续的将近1年的时间,这个使用VB程序编写的程序终于在外面装机,而且打败了好几家竞争对手。我都觉得不可思议,因为这个程序真的不怎样,与我开始设想中的程序几乎不是一个样子,真的不是一个标准的Windows程序。我从书本上学习到的关于Windows程序开发的例子,都不是这样的,按钮就是执行一个命令的东西,点击鼠标左键可以执行一个命令,在这个程序中,按钮可以用于装饰,可以只是右键点击和左键点击,而且功能不同,还有其他一些特点,我当时都羞于将这个程序交给老大,因为总觉得不好。然而,感觉归感觉,这个程序在市场上买的很好,后来再看这个程序,发现其尽管不好看,不是我所谓的那种“标准的”windows程序,但是操作非常简单,所有的用户一看就会,几乎不需要培训,用户可以点击一次鼠标实现的功能,绝对不需要点击两次鼠标,一个按钮能够实现的功能,绝对不增加两个按钮,通过鼠标点击词库和模板可以实现的,绝对不需要用户动键盘。逐渐感觉到,设计软件,不一定遵循已有的规则,易用性和稳定性就是为用户着想,为用户着想的程序就是好程序,就会得到用户的欢迎,而不管你的算法多么优秀,你的函数写得多么完美,只要用户觉得不好用,用户不买你的帐,一切都是零。这第一个程序给我的经历,对外后来的产品设计影响很大,在后来的软件设计中都继承了这种风格。
这第一个商品化软件,并不是这么简单的就结束了,更复杂的事情是后期的维护工作。安装的用户越多,维护的工作量也就越大,而且每次更改都要修改程序的源代码,而且还有保存已经安装的用户的程序版本,这个程序大约产生了30到40个版本,幸好是VB编写的,改写比较容易,我也乐的维护。然而时间久了,我也感觉有点烦,因为这种改动非常无聊:无非是字体的改动,字段标题的改动,字段数量的改动,报表格式的改动,文字颜色的改动,诸如此类。从公司到我的住处大约需要40分钟的路程,我经常坐晚上最后一班车回家,因此经常在车上琢磨这些改动,于是决定使用VC编写一个新的程序,可以通过程序设置界面调整字段的标题,颜色,可以自己设计报表,而且更好的支持词库和模板。也就是完全解决VB版本的程序所遇到的所有的问题,这就是我们的第三版程序(第一版是一个完全使用Access开发的图像采集和管理软件,不是我设计的,第二版就是我设计的那个VB程序)。只所以选择VC编写这样的一个数据库程序+图像的程序,同时支持单机和网络两个版本,主要是因为VB无法实现多线程,而且对图像,尤其是视频的处理,VB几乎无能为力。
对于新的第三版程序,完全是出于我的兴趣,而老大也很高兴。我从2001年底,开始设计这个程序,其中集成了数据库,视频采集和报表,但是由于我自己有正式的工作,兼职编写程序的时间不多,因此进展不是很大,后来2002年8月又一个新同事加盟公司,专门负责图像,而又增加一个兼职程序员,负责报表,进度加快了不少,大约在2002年的11月份,这个第三版程序也面市了,而且在一家招标会上,新的词库模板给人耳目一新的感觉,又一次在多家公司的竞争中胜出。
这个版本的程序完全解决了第二版遇到的问题,同时可以支持网络版。单机版选择Access的数据库,网络版选择SQL Server数据库,界面的信息保存在数据表中,修改这个数据表就可以修改界面,可以很增加字段,删除字段,修改字段标题,排列字段的位置等等,报表程序是使用C#设计的,内置了一个报表设计器,所有,无论用户的需要什么样式的报表,都可以现场解决。而安装第二版程序的能力,工程人员需要多次往用户的城市跑,因为第一次要看看是什么问题,然后反馈给开发人员,开发人员修改之后,工程人员再跑到用户处升级。
目前经过的第三版程序仍然在升级和改进,在行业中已经是非常不错的软件产品了。整个产品应该说比较成功,我现在已经是这个公司的正式员工了。
不过这个产品在网络版上,只能限于部门级使用,还不能是一个企业级产品,因为在设计结构上,第三版存在局限性,它无法解决流程改变的问题,因此我们正在开发第四版软件,这个软件将保护第三版的所有特征,但是可以非常好的解决流程变化的问题。
在这个不但改进软件产品设计的过程中,我们的产品不断的创新,不断的升级,感触最深的不是开发人员有多么的聪明,而是用户需要的不断变化,作为一种强大的推动了,促使我们不断的改进设计,不断的创新,不断的优化我的服务,从而保证我们的公司不断的前进。

待续

 经常遇到做软件设计的朋友抱怨用户的需求老是变化,自己不断的修改自己的设计,结构搞得自己疲惫不堪,而且软件的应用效果也不理想。其实类似的问题每个人都会遇到,关键是我们应该如何对待,如果我们总是不断的修改代码以适应用户的要求,这时候我们应该考虑软件是否具备足够的让软件开发人员自己比较舒适的适应能力,如果不具备这种能力,则改进设计,甚至具备足够的适应能力,否则,软件设计真的就成了苦差事。
    软件设计师不应该害怕需求的变化,更不应该为需求的变化而烦恼,任何需求的变化都可能蕴藏着巨大的机会,这种机会就是创新,这种创新就是未来的市场机遇,就是企业的进步的推动力。创新源于需求的不断变化。这是多年来从事软件开发工作的一点非常深刻的体会,这种变化包括各个方面的,可能是硬件的变化,可能是操作系统的变化,可能是用户群的变统统可以归结为用户需求的变化。我们的软件产品就是在需求不断的变化之中发展的。
    如果我们为用户编写了一个软件,不管具体实现的功能如何,只要上述的几种变化出现,我们都不得不不对软件的设计进行调整,有时可能需要对系统的整体框架进行调,甚至重写部分或全部的源代码。刚开始学习编程的时,总是希望一条语句表达尽可能多的含义,梦想一个算法解决所有的问题,一个程序满足所有用户的要求,但这是不可能的,因为我们周围的世界处于不断的变化之中,今天你写的程序完全满足用户要求,一段时间之后,用户的系统升级了,你的程序在新的系统上运行就会产生错误,所以你必须更新程序以适应这种变化。这种变化还包括机器主板的变化引起硬件的冲突,某种型号板卡的停产或改型,用户特别指定的硬件设备等等。另外,我们的头脑不可能聪明到完全可以预览未来发生的事情,所有很难设计一个一劳永逸的软件,另外市场的选择,竞争对手的压力,也逼着我们不断的修改设计。
    需求的变化是一个客观存在的事实,软件设计人员必须正确的面对这样的事实,不要指望你辛辛苦苦编写了一年的代码之后,你就可以高枕无忧,尽管你对软件的架构、算法处理的非常好,甚至可以说是完美,然而所有的你所津津乐道的那些完美的设计,都是相对的,当用户 的需求开始发生变化的时候,他们可能提出要增加一个新的功能,那么你很可能要改进设计。 除非你设计的东西没有人使用,否则对设计的更改总是不可避免的。
    2000年底的时候,我的第一个商品化软件完成,尽管我不觉得多么好,但是在同其他厂商的竞争中赢得了用户的青睐,听到从市场上反馈的信息,我当时的感觉非常好,然而,很快我不得不修改我的代码,除了程序中存在的一些BUG之外,在用户群不到增加的情况下,用户的要求开始发生变化了,例如:A用户希望整个界面的字体采用楷体比较好,B用户50多岁的人比较多,希望字体能够大一些,可以看得清楚,C用户希望界面上的“医生”改为“医师”,D用户希望界面上的字段数量少一些,等等诸如此类的。关键是有些用户的需求是存在冲突 的,如果程序满足了张三的要求,而张三所要求的东西恰恰是李四要极力避免的,所以对于使用VB时间不长,经验不多的我来说,只能靠保留多个版本来解决这样的问题,我为每个用户保留一个备份,这样每个用户的要求都可以满足了,但是后期的代码的维护几乎让我陷入绝望的境地,试想一下,一个存在问题的函数,需要你在10个甚至更多的版本上同时修改,是一种什么样的感觉,而且每个版本的程序都多少有点区别,任何一次修改,你都必须小心翼翼,一不留神就会产生一个新的BUG,这种更改让人精神紧张。或许,我应该使用VSS之类的工具管理代码,但是我当时根本不知道世界上有这样的一种工具。所以在万般无奈之下,我必须想办法拯救自己,可不能陷入到需求变化和版本层出不穷的深渊,于是我开始构思下一版的软件,这个软必须能够解决现有版本的程序所面临的一切问题,同时可以支持网络版的功能。
    在2002年,与后来的两个同时鼎力合作,终于在11月份完成的这个新版本的程序,整个程序界面上的控件都是在程序启动时动态创建,可以直接编辑,编辑完成之后将界面信息保存到数据库中,下次启动应用程序时再从数据库中动态加载界面,界面上的字体,颜色,甚至整个界面的风格都可以由用户自己选择。当这个软件第一次推出的时候,用户也比较喜欢,很多设计非常新颖。直到今天,这个版本的程序还在不断的完善,但是程序的样子与2002年11月相比,已经大不相同了,现在的程序更加美观,看起来更加专业,使用更为方便,也更稳定。但是这个程序比较庞大,因为它要同时支持Access和SQL Server数据库。这个程序也就成了我们的产品由单机版向网络版过度的一个桥梁。这就是我们的第三版软件。
    可以说第三版软件彻底解决了第二版软件面临的问题,但是在网络方面遇到了挑战,那就是所有的网络版软件都面临的问题:流程的变更和业务规则的变更。第三版的设计初衷就是为了解决第二版遇到的问题,不过为了节约工作量,同时兼顾了网络版的功能,这就导致了第三版代码比较多,其中经常出现是单击版还是网络版的判断。对于网络版的用户需求的适应能力,第三版显得有点吃力了,我们不得不在程序中专门为某个用户增加一些特殊的处理,当网络版的用户快接近10家的时候,我们的噩梦又开始了,当然比第二版要乐观一点,因为VC中可以使用预编译条件解决了不少的问题,例如一个对话框资源可以根据不同的条件显示不同的外观等等。由于针对多家用户添加的那些if else实在是太多了,修改一个地方,一不小心就会影响其他的功能。当然这也与第三版程序结构的设计不太合理有关系,因为这个版本的程序我依然是在现蒸现卖,卖到2005年底的时候,我对于VC才有了点感觉,什么是面向对象的设计,什么是设计模式,系统架构等等的概念开始接触和学习。
    在2003年非典刚刚开始的时候,我们的第一个网络版用户开始装机,从那时起第三版软件开始了网络版的考验,从第三个网络用户开始我就不得不规划第四版软件了,这个新版本的软件必须同时解决第二版和第三版所遇到的所有问题,同时可以非常方便的解决流程的变更和业务规则的变更问题。2004年2月,我正式开始设计第四版软件,这个软件可以设计界面,设计流程,增加和编辑业务规则,而且支持脚本和二次开发,到2005年11月,我们的BUG管理器通过第四版软件配置完成了,现在用得很好,到元旦前,估计我们得计划管理器也可以配置出来。这个版本的软件就像一个平台,可以搭建起几乎所有的数据库管理软件实现的功能,从而开发人员可以自如的面对用户需求 的变化。当然,并不是所有的需求都可以在不改变程序代码的情况下实现,但是相对于第三版软件,新版本的软件已经很优秀了,至少我们不需要为了实现每个用户的要求而修改程序的代码。另外,同第三版软件相比,该版软件的系统架构好多了,尽可能采用面向对象的设计,关于设计模式的很多规则也应用了不少。
    软件设计师就是为了解决麻烦而存在的,既要解决用户的麻烦,也要解决自己的麻烦,在这样的过程中不断的进步。抱着这样的一种心态,我们可以从容面对用户需求的变化,如果我们设计的软件不能够做到随需应变,那么很可能软件的结构和设计上遇到了问题,我们必须考虑如何改进设计以适应这种变化,如果你绞尽脑汁之后发现修改代码将会把一切搞得更糟,那么我们应该考虑是否重新设计一个新的产品。

阅读更多
个人分类: 这个社会
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭