一个还算是简单的兼职小项目的经历(2)
还好这给了我一定的时间喘息,下一步就是考虑,什么Windoz操作系统,什么开发工具,什么数据库系统了!由于考虑到他们这个系统的用户特点,以及对稳定性的要求(最好别让用户能在上面装游戏玩),最重要的是最终都要实现支持网络的统一集中管理,我就准备采取WInnt系列的操作系统,可是讨厌的4.0对硬件的驱动程序支持的不是很好!更重要得是要是我用MS SQL SErver 7.0还得在上面打Service Pack,所以我就决定采用Win2k了(我没有那么多盗版盘,U盘和移动硬盘也不盛行,notebook就更是没有了)!这里说到数据库系统的选取,考虑到将来要很好的支持网络,数据量也就是千万左右的条级,我决定选取MS SQL server,而不是桌面的文件形式(可以利用现成的设计呀),单机数据库系统Access,Fox x etc,更没必要采用Oracle,DB2,Informix,Sybase etc;没办法M$的东西就是做的适合fool,这样从后期的维护管理也是一个很值得Prefer!最后考虑到该系统的具体实现要解决的问题,
我其实应该选Visual C作开发工具,可是我怵于有些人对其的定论性评判,还是决定投向对数据库开发持的比较好的上手又快的CBuilder了,当然这里能较好支持网络WEb应用开发的Java也就派不上用场了;虽然这些东西我在本科时候的课业设计小学期作业过程中都有接触,但是只是掌握个皮毛而已半斤八两,连很多基本的概念都没搞明白!但是事到如此也只好硬着头皮上了,接着要搭建开发用的软硬件环境,
模拟的运行试验环境!我才发现自己连基本的攒机器都不会(虽然也没什么,可是大家眼里的牛人就一定是会这些的呀)!内存条PCI与ISA的分别,数据线正反标识,IDE硬盘与CD-ROm的Master&Slave关系短接子,以及BIOs的设置等等这些我好像都不是很熟,(:)别见笑哦)先fdisk /MBR然后再Format每一个分区,当然最好要用引导的光盘进行这些操作,很方便!还有就是后来的组建局域网,要选HuB,要自己作网线,接水晶头,要注意直连与级连的线序不同!
好了到这里断断续续的花去了我将近一个月的时间,现在可以助手签合同开发了,至于需求分析,是用不到我的,两个老板都在这个行业里从业将近十年了,也因此而积累起了大笔的财富,早就对具体的市场和用户使用需求了如指掌了,但是最后他们也只是拿出来了一个很粗略的开发要求(为以后的扯皮埋下了足够的空间);我对这个行业也只是知道为什么这个系统卖的这么好有这样的需求,因为随着在端局交换机上软件可编程的能力的提高,PBX正逐渐的被虚拟网业务所代替,但是各个集团电话用户还是有很强列的本内部话费清单需求,因此这套需求就应运而生了!
之后我就勉勉强强地与他们签了合同(出于对我的不信任以及我自己的没信心没底),我们把时间订的比较宽,一些具体的技术细节可以等我碰到了协商解决!这时候通过对业务的进一步熟悉,加之那一纸粗略的开发要求,还有痛苦地读那些shabby的Dos版本OP代码,我对整个系统的框架有了初步的把握,我就着手开始进行设计,包括功能模块(包括分几个程序配合实现具体的功能要求),数据库字典等,当然这些过程中也就形成了一些简单的文档,但是我没有用Project 和Visio,更没用Rose,所以文档很不充分就全图快了,大的逻辑流程还是要继续沿用他们原有版本的,说实话这就大大降低了我得设计工作量(其实如果后期他们适可而止的话也还是很好的一个框架)!
这样我就开始进行初步的开发工作,先给用户界面定一个统一的风格,然后就是一个单元一个单元的进行开发测试,然后到一定阶段进行一下集成测试(这完全靠一个人的能力把握);而当我开始真正进行核心部分的开发以后发觉有一个很大的问题,那就是WInnt不允许直接的对硬件操作,包括内存具体地址的直接访问,而这又是该系统的基础所在,怎么办?我就在网上找各种能突破ring o的简单办法,但是都不好使,不稳定,发觉绝大多数对于段页式可用的API对线性地址都不在可用,或者只对WIn9x可用!通过嵌入ASM和文件映射也不奏效!后来找来着去发觉有个New zealand的程序员开发了一个可在Delphi和CBuilder下可用的叫Winsoft组件,能够支持Winnt下对内存的直接操作,而且很好使很稳定,基本原理就是WDM!到这里可以说基本的难题都解决了,于是在十月一前我把所有的功能模块都基本实现了,所以他们又付给了我一笔钱,我兴奋的承诺十月一回来之后一个星期我们就可以搞定!!!
可谁知道回来后恶梦才刚刚开始,测试过程中出现了各种各样的问题,想都没想到!一个是因为性能不能很好的保证,采用线程技术,一个进程最多16个线程,而每个线程处理的任务又不能太多,这样就必须对处理的流程进行大刀阔斧的调整,逻辑精简加之采取被动推的机制,后来实时性终于有了大的提高!可是更头痛的是我一个人开发,而他们公司四五个人测试,不按照开发要求去作,弄得有时候你很郁闷!说实话我已经很尽力了,每天早晨九点多就到那间封闭式的宾馆房间里去,带上一点香蕉和几袋酸奶,边吃边干有时一天都不动,晚上块十一点了才回宿舍休息!
美国人在那里紧张的对付911,我就在这里痛苦地挣扎;一方面由于那两个老奸巨猾的家伙频频的更换需求(一有员工从外的回来的反馈就会要求你或加或改),弄得到后来本来感觉很好的设计需要修来补去,更主要的是因为他们两个经常意见不一致,对同一个需求解释不同的离谱!其实关键问题出在我没有在签合同时扣死需求,让他们钻了孔子!唉,谁让我当时那么缺钱呢!想想痛苦的时候我曾经两次到图书馆阅览室去查合同法和劳动法的书籍资料,真的很想毁约,但是最终还是坚持下来了,难得呀!
好了,再回到具体的开发中来,对于数据库连接的选择我还是选择了ADO而不是ODBC,这样可以保证较快的访问速度,另外就是针对CBuilder的数据库开发组件做了一些文章!后期在测试阶段发现了一个很大的问题,那就是要做到多机的时钟同步才能完完全全的保证计费的准确,因为计费,优惠和折扣都是以时间为基础的!而我们这个方案中他们明确要求各个机器没有明确的依赖关系,可以随时关机,这样就不能设立时钟服务机器用SyncIt软件了,只能是采用一种抽象分离的办法将时钟剥离出来,加序号!再后来就是要对打印机编程了,因为是采用的那种针式打印机,还要连续的任意格式打,很难呀!我尝试了,并口用AT指令,windoz API,或者用CBuilder的Printer组件效果都不是很理想,或者说是因为Win9x与Winnt的大不同在对于硬件的操作上!然后他们需要给他们的系统加上一个自动叫醒服务,这涉及到Modem的编程,我先后试了串口的AT指令以及TAPI,最终也用TAPI搞定了!另外,由于他们为了节省开支,对于网络或者前后台的方案希望能减少不必要的显示器,通过在远端的一个机器上的软件来监控,实施管理,我就先后尝试了PcAnywhere,Terminal service
和Netmeeting,但是他们还对开关机有一些特殊的操作要求,于是我就选定了TS,但要服务器至少是 2k Server!而且对于相距比较远的局域网要用Repeater对信号进行维持!
终于挺过了极点,眼看着程序越来越稳定bug越来越少,那四五头苍蝇再也不那么烦了!闲下来就用Installshield作安装版本,记得环境变量由Debug到Release,遇到的一个问题就是对于那个组件所要求的特定目录要学会用环境变量表达式!在用Html help Workshop作chm的时候遇到一个问题就是尽量不要让html在不同的目录下面,然后写上下文的帮助也很容易,可以在里面集成进行测试!
---to be continued