一个计算机爱好者的不完整回忆(二十二)完美软件
2002年的时候,我所在城市的人事局搞了一个人才杯计算机大赛,包括4大项:1、打字;2、编程;3、网页(其实算是WEB开发);4、计算机知识大赛。
我报了第2项和第4项,第4项我在不完整回忆的外传(三)中说了,这里不说了。打字的冠军是我所在论坛的网友,每分钟151字,100%正确,关于这个我认为很难得,即便是每分钟200字99%正确我也不佩服,我后来做过一个测试打字速度的软件,要求就是必须100%正确,很多打字软件都是给出速度同时给出正确率,这种设定是没办法比较谁打字更厉害的。WEB开发的冠军也是我所在论坛的网友,同时她也是我高中同年级的同学。
我参加的编程比赛要求很简单,就给了选手两张报表,一张是求职者信息登记表,一张是用人单位需求登记表,根据这两张表做一个windows的程序,完成人才市场信息的登记、管理和输出功能。
我不是职业程序员,我做程序喜欢做到我自己满意的程度,所以对于这个需求我觉得太简单了,决定按我自己的想法做一个“完美的”。整个程序给了一个月的时间来做,做完后都刻成光盘交给组织者,组织者先运行测试,然后再进行“答辩”。在我跟那些开发者等待“答辩”的时候,大家没事聊天,听我用VB做的,多少都有点略显奇怪的表情。那时候我已经经过了CSDN上VB和Delphi之间口水战,所以对歧视也好惊讶也好都无所谓了,只是说这个程序太简单了,就是一个数据库程序而已,用什么语言都可以做出来。用VB的话建好数据库后3分钟就可以自动生成一个满足功能的软件,然后再花半个小时做一个报表就可以了,不过这样的程序肯定是不行的,细节决定一切。
我做的很多程序都很用心,不过这个取得的效果和成绩最好。
首先就是考虑界面,正常的windows界面太过普通,于是找到了一个皮肤控件,大概是叫ActiveSkin?选择了一个自认为还算可以的界面。不过光靠界面绚丽一点肯定是不行的,这绝对不会成为程序好坏的标准,但这表明了一个态度。所有控件的布局、按钮的快捷键、菜单的快捷键都是经过精心设置的,尽量符合大家常用的习惯。当时其实好多人都不太注意这个问题(主要是个人开发者),比如确定按钮都不带“&O”,文件菜单不带“&F”等等。应该说我的美工很差,所以界面的布局只能说是比较整齐,并不好看。不过比较符合操作习惯,记得有人说过好的界面应该可以取代使用说明书,虽然这个说法有点绝对,但是表达的意思我倒是觉得正确的,很多功能不是很复杂的软件应该设计得让人上手就可以用,知道先干什么后干什么。
我做了很多数据库相关的程序,从来不用控件绑定的方式录入数据。也就是说所有的数据都是通过我自己的代码写入到数据库,控件绑定最多用来显示数据用(主要是DataGrid控件)。因为我觉得只有数据经过我的过滤后再进入数据库才让我放心,通过绑定控件直接写到数据库不好做检查。应该说我这个检查做得非常仔细,不是简单的判断数据类型和长度,而是对很多常识类错误都会检查。比如身份证,我就很奇怪,身份证号码录入正确与否的验证不复杂啊,为什么即便是现在大部分程序都不做呢?当时刚有18位号码的身份证不久,正好知道了18位身份证号码的最后检验位的算法,所以我做的验证也支持18位号码,仅仅验证18位号码的身份证还是不够的,15位的也要校验,校验什么呢?比如出生年月日,年龄超过70岁了肯定会提示有问题,年龄小于16也会提示人才市场不接受童工;比如录入的性别与身份证是否对应(15位号码是最后一位判断,18位号码是倒数第二位判断),比如用户录入的出生年月日是否与身份证对应等等。对身高体重的录入也有校验,很显然体重超过150公斤的录入就极有可能是输入错误,低于40公斤的也有可能是录入错误。为了好看一点,所有的录入错误提示都是通过自己做的气球提示框定位在错误数据所在录入文本框的上面完成的,而没有使用标准对话框,让用户对错误位置一目了然。几乎所有通过文本框输入的数据都做了数据校验,区别只在于详细或者简单,家庭住址啥的就校验一下是否有特殊字符和长度是否超过字段限制就行了,而身份证相对就比较复杂一些,电话号码则介于两者之间(如果这个程序用到现在就有问题了,15X号段的手机号码肯定就会被提示错误了)。
另外就是拼音字首的查询,这是我做几乎任何软件都会加入的功能(指的是有可能的话,不至于做一个小游戏也加入),因为我个人觉得这个功能很方便很实用。当时直接导出的全拼的编码库好像,但是错误很多,因为当时的全拼好像考虑了很多南方或者常犯错误读音,所以很多字明明不是多音字但在导出的编码库中都变成了多音字,拼音的声母也就不完全正确了。而且当时技术水平不高,所以是这样实现的:用户点提交按钮后,我从对应表中找到拼音字首,然后保存到数据表中的一个字段中,用户查询输入英文的话直接就查找这个字段。关于拼音字首后来我又自己一个字一个字的校验出了一个自己的版本,去掉了错误的和不常用的拼音字首,这是后话了,是用Delphi后才做的这项工作。
在报表上面,很简单了,这个比赛有要求,就是要输出那两张表。不过我做得很仔细,在“答辩”的时候关于这项我只对评委说了一句我输出的表格与你们提供的表格误差不会超过0.5毫米。
最后我提供了一个自动匹配功能,这个是比赛要求中没有的。因为我觉得既然是人才市场,有求职者信息,有用人单位需求信息,那么我为什么不做一个自动匹配功能呢,打开用人单位信息的时候在旁边给一个满足该用人单位要求的人才列表,打开求职者信息的时候旁边提示可以考虑的单位,这多好。计算机应该发挥自动化的作用,只是用来存储数据太浪费了。这个功能是我见到比赛要求的时候就想到应该有的功能,不明白出题者为什么不提这个要求。
做完后,我又找两个跟我一起参加第四项比赛的MM帮我做测试,她们俩找出了好几个bug,还提出了很多关于操作上的建议,都是方便使用的。测试期间,我开始编写帮助文件,当时我特别喜欢老式的.hlp帮助,不过这个帮助做起来真的很复杂,先要编写.rtf文件,光写这个.rtf文件就很费力,然后还要用专门的软件编译,似乎是两个可执行文件,最后才能生成.hlp文件和.cnt文件。全部完后,打包,压盘,还特意做了光盘自动执行——因为当时的光盘都是这样的。每一步都很精心的去做,包括打包程序,也都是尽量模仿正规软件去做,绝对不使用VB默认的那种。之后写软件使用说明书,写得也很详细,还好有帮助文件,基本上差不多。做完这个后,开始设计光盘盒的封皮,虽然是黑白的,但是做得也挺漂亮。
答辩抽签的时候,我抽到了第一号,那帮兄弟都投来一副同情的目光,因为谁都不愿意第一个去答辩,不过我倒是无所谓啦。“答辩”的时候,我先花了一段时间讲了我这个程序的功能,那个主评委很满意,然后开始问我其它问题。第一个问题就是,你用的是Access数据库,考虑到数据备份以及误操作问题了吗?我说我是这样做的,在程序启动后,我自动备份了当前数据库保存在当前文件夹了,并且每一步对数据库的操作我都记录到一个数据日志文件中了,如果发现数据被修改或者有人误删除等等,可以打开我这个日志文件手工找到操作记录然后修改回去。我也说了,因为时间比较紧急,一共就一个月时间,我还只能晚上进行开发,所以只做了这个日志功能,保证数据可以恢复,但是使用很不方便,因为实际上就等于是文本格式的记录,只是用来以防万一的。那个评委又问了一些技术上实现以及一些安全啊之类的问题,这就好回答了,因为是自己做的,所以技术细节没问题。而对于一些是否有某些功能的问题,实际上我考虑的比他全面,虽然有些功能没实现,但是当时我心里也都是有想法的,所以他一问我就说因为时间问题没有做,但是我是这么想的,然后把自己的想法和方案讲出来。
我的答辩进行了45分钟,答完我就回家了,而后来据网友说,我后面的人答辩时间一般也就10分钟,最长不超过15分钟。有时候第一个出场也未必就是坏事。
在还没提交软件的时候,我的一个人事局的网友跟我说这个比赛估计你拿不到第一的,但前几名有希望。因为当时我市计算机水平最高的单位是地税局,他们几乎囊括所有计算机比赛的冠军,已经称霸多少年了。这次又是最重要的比赛,他们比赛前就给人事局送来了7台新电脑……因为当时比赛的奖品是第一名是一台电脑,一共三个单项奖,一个团体奖三个人,一共六台电脑,等于地税局赞助了这次比赛,剩下一台么,自然是送给人事局了。地税局对拿到几个冠军那是很有把握的,所以出几台电脑也都是要拿回来的,无所谓么。
比赛结果出来了,我是第一名,当天晚上人事局的一个组织者,也是这次大赛的主要执行人和我那个网友请我吃饭,很奇怪吧,我拿第一他们请吃饭,同时还有好几个网友。那个组织者后来成了我哥们,他叫wenbo,也是一个酷爱计算机的高手(后来放弃了公务员去投身IT业了),他跟我讲了评奖的经过。我们城市当时没有大学(当时只有一个大专的学校),所以wenbo去一所大学请了那里计算机系的主任过来当评委,据说这个主任对我们城市很是不屑一顾,说就你们还能开发出什么像样的程序?很是鄙视我们。不过在看完我的程序后,很是震撼。在所有人都评完后,wenbo问他意见,他说如果让我来评的话,第一名就是XXX(我),剩下的你们爱怎么排就怎么排。最后我那哥们wenbo也是顶住了压力把我定成第一名,第二名是地税的。wenbo之所以请客就是因为当时他觉得我帮他在那个系主任赢得了面子,往大了说是给我们市赢得了面子。我的大舅哥当时也参加了比赛,不过那时候我还没追我老婆呢,刚认识我老婆没多久,他排名第九还是第十我忘记了,当时他觉得这种比赛都是内定的,不过我能拿第一很是奇怪。当时我给我老婆和另一个MM每人一张我这个程序的光盘,我老婆就把这张光盘给了我大舅哥,大舅哥用完后就服了。其实这种软件,技术都不是问题,甚至大部分软件技术都不是问题,看是否用心。
当时我还是很得意我这个软件的,但过了一段时间后,随着自己了解的技术越来越多,对这个软件并不是很满意,从架构到界面,都觉得还可以做到更好。但我一直都很满意我当时做软件的态度和思路,在当时那就是我能做到的最好程度,在当时的时间和条件下,我做到了我能做到的完美。
做完这个软件后,很多软件公司都来找我加盟,不过我有很稳定的工作,虽然赚钱不多,但在工厂里面我觉得很安稳,所以都没考虑。那段时间在我市整个专利技术园区我也算是一个名人了,呵呵。让我比较惊讶的是那个大学的计算机系主任给我打电话了,问我是否愿意去他那里,给我三个选择,可以去念研究生,或者当老师,也可以到他们学校下属的一个软件公司从一个技术头目(没问太细)开始干……说实话,我还真有点心动了。征求了一些人的意见,很多人都说这是一个机会,可以去,父母则表示不反对,可是我还是犹豫。我的高中老师跟我说你不是计算机系毕业的,当老师肯定不太好,将来评职称必然会受到影响,至少会比较麻烦,而其它两条路么,自己决定。当时我工资一个月1.1K,跳不跳槽呢,很是纠结,不过纠结本身其实就给了答案了,不太想动。人生没有假设,我不知道当时跳出去会什么样,所以现在也不后悔,也许跳出去中国多了一个普通的程序员,全国能排名几十万都不好说,但至少留下来中国多了一个某专业的人才,全国排名怎么也能在几十名以内吧,虽然工资不算高,但还算比较稳定,生活还过得去,更何况当初就是为了父母我才回我的家乡的。
其实当时无法下定决心走还有一个原因,就是对程序员那种没日没夜工作的恐惧。虽然这么多年我正常都是晚上12点半到凌晨1点睡觉,早上6点20起床,几乎大部分时间都用来编程或者了解计算机信息了,但那是爱好,有动力,真要是累了我可以随时停。以前给别人开发过软件,感觉不一样,有工期的要求,累。
总的来说,这次第一名最终对我影响还是挺大的,奖品最后没发电脑,改发4000块钱。通过这次比赛还认识了一群朋友,还为我拿到一个省级的第一铺了一条路。还有一个就是有了一个吹嘘的资本了,至少俺可以说俺是XXX市编程第一,嘿嘿,不信?俺有证!俺编程为了啥,不就是为了向朋友显摆一下,换取一下被赞扬被崇拜的虚荣么。