让数据库应用开发不再裸奔 Test-Driven Database Development译
1993年,我从大学计算机专业毕业后,开启我的IT职业生涯的第一份工作,就是在一家国营单位,用dBase III做MIS系统的数据库应用开发。从那以后,我做了11年的程序员,先后开发和维护过内容管理系统(CM)、电信运营增值服务系统、通信设备网络管理系统、和电
1993年,我从大学计算机专业毕业后,开启我的IT职业生涯的第一份工作,就是在一家国营单位,用dBase III做MIS系统的数据库应用开发。从那以后,我做了11年的程序员,先后开发和维护过内容管理系统(CM)、电信运营增值服务系统、通信设备网络管理系统、和电子商务系统。这些系统,无一例外都使用了像Oracle和MySQL这样的数据库来保存持久化数据。
在这些系统中,有些系统甚至是以数据库的设计为核心来驱动应用程序代码的开发。即一旦客户的需求到了我们这些程序员手里,先找出需求中的实体(Entity),再分析这些实体之间的关系,并画出E-R图(Entity-Relationship Diagram,实体关系图),然后确定各个实体的属性,并找出主键,最后根据这份E-R图来在数据库中生成数据库表,之后就可以用像Java这样的编程语言来进行应用系统的开发了。
上面这样看似完美的开发过程,被印在20多年前我在大学修的“关系型数据库管理系统”的教科书上,并多年来一直指导着我来做数据库应用开发。但直到最近,我才意识到,这种方法无法解决实际数据库应用开发工作中的最大的难题:一套数据库应用系统当交付给相互之间具有不同需求的多个客户时,所出现的版本控制问题。回想我所工作的一家软件公司,曾为另一家在国内某领域领先的“巨无霸”甲方公司,开发一套以数据库为核心的应用系统。该系统陆续在这家甲方公司的国内八个省得到了部署。俗话说:“龙生九子,各有不同。”这八个省所部署的数据库应用系统,虽然都来自最初的那个系统,但是每个省的需求各不相同,这家软件公司只好成立八个庞大团队来维护这八个省的系统。在不堪重负地挣扎了很长一段时间后,最后这家软件公司下决心,要建立一个新系统,来统一这八个系统,以减少维护成本。但最后不幸的是,这个新系统最后也无奈地成为“龙的第九个儿子”。
所幸的是,本书作者Guernsey先生不仅在工作中解决了上述问题,还把解决方案条理清晰地写在了这本书中,功德无量!Guernsey先生洞察到导致上述问题的原因,是各个数据库实例的数据库结构因需求变化而发生变更时,数据库原先保存的数据的版本在此期间没有得到有效的管理。Guernsey先生敏锐地观察到,当发生变更时,面向对象编程中的“类”与数据库开发领域中的“数据库实例的结构”会表现出不同的特点。前者在变更时不需要管理历史信息,只要把服务停下来,把旧的“类”替换成新的“类”,再重新启动服务就好了。但是后者在发生变更时,不可能仅仅把数据库结构替换为新的,而把原有结构所在的数据库中以前所保存的数据全都清除掉。数据库实例的结构在发生变更时,需要保持以前存储的数据。毕竟,数据库的价值就体现在这些被保存的宝贵的历史数据中。
在洞察到数据库应用开发的上述特点之后,Guernsey先生开创性地把在面向对象编程中得到广泛应用的测试驱动开发(Test-Driven Development,TDD)的理念,引入到数据库应用开发——这个几乎还处于类似面向机器编码的“汇编语言”时代的——蛮荒之地,就像本书英文版封面所展示的那样,在一片广袤的沙漠中,赫然出现了一个环绕一眼清泉的生机勃勃的绿洲。TDD的理念与数据库应用开发保存历史数据的特点相结合后,就如同给以前无奈地进行“裸奔”的传统数据库应用开发的程序员们,穿上了“测试”这层坚实的铠甲。
Guernsey先生不仅讨论了传统关系型数据库的测试驱动开发的方法和技术,还在本书最后一章,将这些方法和技术运用到XML应用、文件系统及其他对象目录、和序列化数据对象之上。相信本书所阐述的测试驱动数据库开发的概念和原则,都能被广泛地应用于任何需要对数据进行各种形式的持久化的应用系统的测试驱动开发之上。
Guernsey先生的上述开创性的工作,使得我决定暂时中断写自己的《驯服烂代码》一书,而花费4个月中全部的空闲时间来翻译本书。我在翻译本书时,力求用通顺的语句来表达作者的原意,争取让自己阅读自己翻译的文字,就如同喜欢阅读原文一样。如有翻译不当之处,恳请在我的新浪微博“@伍斌_Ben”上给予指点,以求改进。我个人也会在我的CSDN博客“http://blog.csdn.net/wubinben28”上创建和维护本书中译版的勘误表,以方便读者。
本书300页的内容的翻译工作,得以在4个月内顺利完成,离不开我妻子薛静和儿子乐乐的理解和支持;离不开我20年前的大学同学杨光,从远在万里的大洋彼岸给我的有关美国“对冲基金”公司运作模式的专业介绍;离不开编辑杨海玲老师对我的信任;离不开我的微信、微博、和北京设计模式学习组(bjdp.org)这些圈子里各位亲友的关心;最后,离不开我的父母的养育之恩。
最后,希望Guernsey先生所带来的测试驱动数据库开发的理念,能为在中文世界里辛苦加班的程序员们,带来能够化解数据库应用开发的种种烦恼的一剂良药。
——伍斌,独立匠艺程序员,免费编程操练社区“bjdp.org北京设计模式学习组”创办者
下一篇: 批处理命令 BAT备份MySQL数据库