领域驱动开发实践
过去的三年中,快塑网的技术团队,围绕着B2B电商的业务,做了很多的项目,产品,也尝试过很多的东西,包括:
- 编程语言。我们最早使用Java,基于最为标准的Spring + iBatis。然后我们尝试了scala,并使用自研的scala-sql库。这里面反应了我们对服务开发中,我们应用拥抱sql,而不是强行将sql从服务中独立出去,作为单独一层的必要性。
- 引入了Design By Contract的思想,强化了 Invariants(不变量)这一概念。事实上,在电商平台或者其他的领域服务中,所谓的业务逻辑的复杂在很大的因素上是因为领域拆分后,领域之间数据的一致性的复杂性。Invariants是最本质的需要解决的问题。明确将Invariants清晰建模,对领域服务开发是十分重要的。
- 团队从最早的基于Thrift的RPC服务模型,过渡到基于自研的SOA框架,目前已经开源(github.com/isuwang/isuwang-soa)。这个框架是在我之前设计的构建的SOA平台((已服务与国内某前三的电商平台))的一次cleanroom实现,目前还只是完成最基本的功能,后续还有任重而道远的改进任务。dapeng中会包括对异步处理、消息处理、任务调度、服务治理等的一些新的思考。
- 函数式编程的引入。从使用C++编写电商服务(腾讯电商)、到使用PHP编写电商服务(VIP),再到使用Java编写电商服务(VIP、ISUWANG),都没有让我有赏心悦目的感觉。总感觉大部分的服务逻辑:冗长不简洁,复杂难自证,写得辛苦,测得艰辛,难以review,更谈不上太多的审美情结。事实上,大部分的服务代码都没有非常复杂的数据结构、复杂的算法,但却拥有极度时间轴易变(新规则、新玩法)、公司轴易变(新模式)的特性,大部分的代码都在How的维度上挣扎,却很难清晰的表述完成的是什么(What)。在这个不满意过程中,我们尝试使用使用scala,尝试使用函数式编程,感觉还是有很多收获的。
- DDD。虽然很早就听说了DDD,也翻阅了基本经典的教程。不过之前并没有真实的理解,也没有有意识的在我们的开发中应用。等到实施了几个产品之后,回过头来,再学习DDD的书籍,突然发现,很多的内容,和我们思考的问题,是相似的,有的解决方式是相似的,也有很多的解决方式是不同的。其中固然不乏我们走错了的方式(如果早些应用大师的方式,可能就更好了),但也有些觉得采用我们的模式,会更为合适(这算是野蛮成长的好处吧)
当然,这些年,一直就在需求-设计-开发-测试-上线的循环之中,就在写代码-调试代码-重构代码的循环之中,似乎少了很多的总结、整理、提炼,这固然有时间不够用的原因,但更多的还是懒惰,对程序员来说,写一段代码比写一篇文章容易多了。不过,没有这些总结、提炼,总感觉我们就在更多的绕圈子,对后续的开发,很难形成有效的模式、方法。
于是,我们决定,在gitbook上开这个栏目,尝试着,把我们的实践,总结下来,希望能够起到沉淀的作用,更希望帮助我们形成更好的领域服务开发的方法论,让我们后续可以开发出更高质量的服务。