一个企业总有几个必备系统,如考勤,财务,订单管理,仓库管理。换工作,做过来做过去,一般就是这些基础的系统,把这几个系统研究透了,最好有可以出售的产品,办个公司养活自己不成问题。
28+的程序员,常常思考出路在哪里。我有一个朋友,花几年时间研究了一套考勤门禁系统,把软件和硬件琢磨透了,开了个公司,运作得还不错。单就技术方面来讲,我一直对软件+硬件的模式的软件赢利方案感兴趣,这种方式不容易被模仿,不是一两个小作坊就可以搞定的。它需要厂房和机器生产硬件,还需要软件团队研发配套的软件,可以把小作坊远远的甩在后面,当然还得在软件专业性,通用性方面下功夫。
最近对考勤系统感兴趣,先在网上找,看看现成的有哪些著名的系统。为避免广告嫌疑,我就不列出有那几家公司和那些考勤系统。我们公司的考勤系统是购买别人公司的成熟产品,除了每年要交纳软件维护费之外,还想在上面做些二次开发。我们的首先想到的是直接让他们自己开发,他们自己的系统,在系统上动点手脚,做点小应用开发相对容易很多。于是要求考勤系统的开发商把报价单发过来,老板看了几眼后拒绝二次开发的要求,报价太贵。于是就把二次开发任务转移到我们软件开发部门。
在没有任何源码和文档的情况下,如何对一个系统进行二次开发呢?
1 对于一些系统,它有专门的二次开发语言。比如UG,它的二次开发语言是GRIP,网上还有一本书,书名是《UG二次开发技术基础》,网址在http://www.china-pub.com/27775
2 对于用友,金碟这类系统,市场份额比较大。他们公司公布了二次开发的接口,可以在这个基础上做二次开发。以前手里有一份用友的数据库规范,很详细的介绍它的数据库的各个表的含义,各个字段的含义,有这个说明,二次开发相对容易很多。
3 Office 二次开发。在Outlook,Excel中开发个插件,快速完成一些与企业有关的计算。可以用成熟的VBA技术,或是.NET语言。现在这类API已经很完善了,开始是Interop操作,调用COM组件接口,后来又出品Visual Studio Tools for Office(VSTO), 到Office 2007,又出现Visual Studio Tools Application组件,相当的方便。
4 最后一类就是那些既没有源码,又没有文档说明的二次开发。刚参加工作时,遇到这样的任务总是一口回绝,认为这太不可思议了。后来陆续接触到这类任务,心态也慢慢好起来。在老板眼里,不就是在上面动点手脚吗,加个button或鼓捣个menu, 有什么难呢?
真是隔行如隔山,你如果给老板解释太多,他反而会认为你无能,没有负起责任。
如果换一种心态,即使有源代码,估计也读不懂或是读得晕头转向,不如不读。一个成熟的系统,业务处理时的各种分支判断,各种情况的考量,如果不知道当时为什么这样写的情景,通常都很不容易读懂。
有时直接从数据库入手,先分析表结构,也不容易看出名堂。根据我的经验,一个系统有十几个表,再加下比较复杂的业务处理逻辑,在没有源码调试的情况下,一般不容易从数据库结构中读懂系统。
任务转到我手里,先分析一下程序的执行过程。
现在是.NET 大行其道,在Win32时代,配置文件(Web.config,App.config)的做法相当多。Delphi中标准的做法是用INI文件(因为Delphi中有很方便的读写INI的类)。没做过VC++程序,下面这种做法令我大开眼界,也许这种方法在Win32时代很普通。
每一个程序都需要连接数据库,数据库连接信息又不好直接写到程序中。
扯点闲话,在.NET程序中,我见过有很多朋友把连接字符串是直接写到程序中的,不会放在appSettings中,更不会放到connectionStrings中。每次需要时,它总是改改程序中的连接字符串,重新编译一个可用的版本。这种做法一直令我相当惊讶。如果出于安全方面的考虑,配置文件可以被加密,Web中用户根本不会接触到配置文件,Win Forms程序中也可以直接把配置文件加密。
于是,我开始找连接字符串在哪里,是如何连接到数据库服务器的。找了很久都没有找到,安装程序也没有要求设置数据库服务器,只是在安装完成后,要主动加载一个文件,然后所有的初始化动作就完成了。我知道问题可能在这个文件。这个文件的扩展名很奇怪,我感觉就是作者为了防止别人识别这个文件,故意把扩展名改得很诡异。(我的一个朋友,为了不让别人查看他的配置文件信息,把配置文件的扩展名直接改成dll。呵呵,真聪明。对于一般的用户,很少有人会去想到对这个文件动手脚)
于是,用File Analysis打开安装完成后加载的文件,如下图
原来这就是这个配置文件,在网上找了下这个格式的文件说明,它是Access 97的数据库文件,只能用Access 97编辑,用最新版的Access 2000/2003/2007只能查看,不能编辑。
问题还没有结束,作者还把这个Access 97格式的文件进行了加密。在打开时,需要密码才能打开。
于是在网上找到这个软件,对文件进行解密
终于,在找到密码后,如下图,找开这个文件的内容大致如下
这里面有个特别之处在于,它的表对象都只是一个连接,连接到服务器的数据库(SQL Server)。
在它的config表中,存储了数据库连接字符串,至此,找到了数据库的位置和它的表。
这个文件是当时买这个系统时,软件供应商提供的。如果我的服务器要升级,换个机器名或改个IP,这个配置文件就不能继续使用,相当于.NET中连接字符串无效。这个小小的配置文件还扮演了版本保护功能。因为在网上找了很久,都找不到Accss 97这个软件,所以几乎不能编辑这个文件。也就无法任意改变数据库和服务器配置,只有软件供应商才能修改这个文件。
分析进到在这里,我有个体会,过时的技术会被大部分人抛弃,也会被少部分人利用,就看你能想多远。在招聘网站上,我还看到招聘VFP程序员,那个大学计算机考试的经典科目,你还记得吗?
就为这个原因,我赶紧去买了个320G的硬盘,把那些大众认为过时的软件。比如Visual Studio .NET 2003 保存一份。也许再过一两年,这些软件也快绝迹了。微软的网站已经撤下了Visual Stuidio 2005的试用版下载,一些古老的很好用的工具,也慢慢会消失。
下面的步骤就理所当然,打开SQL查询跟踪器(Profiler), 对照软件的操作手册,操作软件。看看数据是如何在程序和数据库服务器之间交互的,为写应用打基础。二次开发一般会做成小应用程序(EXE),方便,如果开发不当,也可以阻止问题扩大到原来的程序都无法使用。
写到这里,又令我想起另一种模式。在现有的成熟的软件基础上,做点应用或二次开发。比如在微软的Share Point的基础上,把公司现有的WCF服务器驻留在Share Point中;为淘宝网的网店进行装修,写些特效的脚本;或是在Office中写个插件,帮助员工快速制作数据报表。