译者序
2013年秋天的某个周末,我在公司翻译本书。对面一个刚入职的大学毕业生向我问起一个关于软件建模的问题,我给她讲到了实体、领域服务和限界上下文等概念。语毕,我立即有两点感触:第一,我已经被DDD深深影响了;第二,即便是对于那些小的软件项目,DDD依然有用武之地。
通常的看法是,DDD更适合于大型的软件系统,这也使很多软件开发者对DDD敬而远之。其实不然,DDD首先作为一种思想而存在着,它无关系统大小,而是教我们如何做好软件。像实体、值对象这样的概念,我相信大家都在自己的项目中或多或少地用到,这些概念并不只存在于大型系统中,而是对任何系统皆然,因为它们体现了软件模型的本质所在。
曾经有一段时间,我希望在软件开发技能上有另一个层次的提高,于是我选择了DDD。在看完Eric Evans那本DDD开山之作之后,我了解了不少,也迷茫了许多。和其他人一样,我更希望看到一些实际的DDD例子。在网上搜索一番,我发现了本书;读完示例章节,我便爱不释手了。
在我看来,DDD绝非是什么标新立异之物,我更倾向于将其看成是软件发展的自然结果。就像在20世纪六七十年代出现了软件危机之后,面向对象成为了人们的救赎;瀑布式开发过程遇到瓶颈时,敏捷被搬上了舞台;而DDD则是对传统的以数据为中心的建模方式的反思结果。另外,我们还有“OO Done Right”的说法,即DDD是以正确的方式来使用面向对象的。
我很看重事物发展过程的“自然”面。你把一组随机数交给一个中学生排序,估计她/他也是能琢磨出一种排序算法的,此时的排序算法很可能就是我们在大学里才学到的直接排序法。我想很多人也都在程序中创建过一些服务类,并且将事务边界放在这些类的方法上,那么此时,我们所创建的便是DDD所称为的应用服务(Application Service)。于是我们看到,很多知识都可以通过我们自己的自然逻辑思考而获得。但是,我们和那些大牛的区别在于,他们有能力将这些知识概念化、理论化、抽象化和系统化。对于本书的作者Vaughn Vernon来说,也是如此。
如果说Eric Evans的《领域驱动设计》为我们提出了一些高屋建瓴的思想,那么本书便把这些思想落到了实处。而在本书中,作者也多次引用了《领域驱动设计》的相关章节。除此之外,本书还大量地引用了Gamma等人的《设计模式》和Martin Fowler的《企业应用架构模式》。所以,本书不只是关于软件建模的,而是正如本书的赞美者之一Randy Stafford所说,它还可以用于更加宽阔的软件架构领域。
在收到电子工业出版社的张春雨编辑寄来的英文原著时,我便开始盘算:一本600页的书,每天翻译一页,我需要将近两年;每天翻译两页,也得十个月……一次次的组合之后,我已经厌倦了。于是不管三七二十一,白天工作,晚上翻译,平时工作,假期翻译。结果,四个月完工。
退却的时候也是有的,并且总会有这样或那样的借口:“今天不在状态”、“明天再翻译也不迟”,诸如此类,凡此种种。每当此时,我便想起在故乡的山坡上顶着烈日当午、弯腰锄地汗流滴土的父亲,于是再次打开已经合上的笔记本电脑……
感谢我的父母赋予我的精神动力,使我得以顺利地完成本书的翻译。
在翻译的过程中,我得到了我的同事,在DDD方面颇有建树的张逸[1]的大力帮助。忘不了的,是那些在下班路上和他一起探讨聚合、CQRS的日子。
感谢郑晔[2]和格茸扎西在我还没有开始翻译本书时便主动提出帮我审校。另外,还要感谢澳大利亚的Mark Ryall和加拿大的Rick Harcus向我提供的有关英语语言文化上的帮助。
2013年10月成都
[1]张逸,ThoughtWorks咨询师,著有《软件设计精要与模式》,译有《恰如其分的软件架构》 等书。
[2]郑晔,ThoughtWorks咨询师,2013年OracleDuke选择奖得主,译有《Scala程序设计》和《Clojure编程乐趣》等书。