DDD实施经验分享―价值导向、从上往下进行圈内第一个吃螃蟹DDD实施方案

阅读目录:

  • 1.背景

  • 2.从业务开始

  • 3.从战略到战术

  • 4.借助外力推动研发(QA、领导、自动化测试)

  • 5.领域模型与SAAS平台的内核(价值最大化)

  • 6.最后

1.背景

DDD本身的技术就不介绍了,本篇文章要分享下我在推广DDD或者说实施DDD的过程中的心得和宝贵的经验。事实证明,这是可行的方案。用好DDD是一回事,推广DDD是另外一回事。也许已经有一套客观理性的推广技术的方案,但是我只能说DDD非常特殊。

我们都知道自己用好DDD问题不大,让一两个人用好DDD也问题不大。你也许代码控制能力很强,也或者你的组员对DDD都有兴趣,在你的领导下,你让他们编写DDD模式的代码,问题也不大。但是作为一名架构师我们的职责是要推广或引进适合本公司业务模式的某种技术或者最佳实践。你或许推广性能优化、界面设计等等,这都没问题。但是让你推广一些有着很强主观意识在里面的东西其实很难。因为每个人的思维模式不同,对问题的理解和抽象的方式也不同。那你如何让大家就DDD能达成一致的抽象理解呢。

你可能觉得我在吹牛B,你们公司能实施DDD。实话告诉你,我们实施了DDD了,而且效果很明显,非常成功,有图有真相。我用一种方式让我们的最高领导人都一致赞成这个价值。如果你推广DDD的角度是从技术出发,那么我可以很肯定的告诉你行不通,在任何一家公司实施都不可能成功,除非老板是你爸。要想成功,你得让不懂技术的领导者能感觉到它的价值,解决了某个痛点,这样你就成功了一半。

在强调下,作为架构师,在我们的脑子里每天装的不是具体的一个技术,而是全局。你要把控的是一个面,是需要全面考虑。你可以自己回去研究某个技术,就比如我自己最近在学习JAVA、GO。技术人员每天都要学习的,懂得越多发现要学的东西越多,这是合理正常的。但是你要知道作为架构师的职责是什么,要搞清楚你本职工作的的目标是什么,这是我现在的良师益友给我最多的提醒和指导(借此真心的感谢我的领导)。

所以,我文章的标题里有价值导向,这符合企业运营规则,也符合我们人的思考方式。技术导向,是技术人员的思考习惯。这没错,但是如果我们要影响别人就要跳出来思考问题。

wKiom1ZiVmHTP54zAACWwIMknos234.png

第一版是我亲手设计的,感觉还不错。

2.从业务开始

实施DDD得有个前提,它是解决业务问题的,不是解决某个技术问题的。或者准确点讲,它是解决业务系统问题,不是解决非功能性技术问题的。这点要认识清楚。然后你要考虑你从哪个层面切入到整个研发流程中,让DDD的东西在某个环节发挥一定的作用,短期不要太急,不要一口气全部推广出去。这会让人觉得你是一个技术偏执人员,不是一个理性的架构师。切忌。

如何从业务开始就为其创造价值。这里有一个痛点就是业务术语、业务模型不统一,沟通成本太大。如果你能减少产品和技术的沟通成本,其实你就创造了价值,而且价值是巨大的。你可以引入DDD的知识来解决。有一个小窍门就是你刚开始不要提及什么DDD等一些专业的技术词汇,你要引导往这个方面去走。你可以说我们需要一个手册,里面包含了专业的业务术语解释,如果可以的话在包含点基本的业务结构。引导和合作的方式让产品整理出来,你在加以修改和整理,因为你是知道DDD的整个路径的。

这个时候其实你已经在实施DDD了,千万不要觉得DDD就是那些代码。

当业务手册逐渐成形,就会顺其自然的引导到技术人员那里。然后你在找个痛点将战术设计引入研发team中。还是那句话,不要太强调DDD的战术。从头到外如果你都不提DDD的概念让DDD落地才是最理想的。

慢慢的从OO的角度引入高内聚低耦合,然后通过DDD的战术帮助研发去理解。

wKioL1ZiWBTBWClyAACwpcUo_qE317.jpg

wKiom1ZiWBnyMVVQAADITUQwa6c069.jpg

wKioL1ZiWJmBxp_yAAIBdZbY-OI772.jpg

wKioL1ZiWJqgKXcmAAFxKXXy8H8378.jpg

wKioL1ZiWJzjSZnjAAHg14zniZE453.jpg

wKiom1ZiWDKx3csGAAGzjoCQRqA415.jpg

3.从战略到战术

解决了业务问题,带来了价值。这是一个好的切入点,我们继续前行。慢慢开始引入DDD的战略概念,前提是你要得到大家的信任,要负责任。

引入战略设计模式,开始用专业的DDD战略术语进行交流和引导。当然如果你们的交流和讨论是敏捷的最好,借助白板快速达成一致。经过一段时间再通过现在正式的会议进行一个概念巩固。此阶段需要借助大量的分享和培训让这个氛围起来。先达成共识。

到目前为止我们已经全面开始DDD的推广,好几个研发部都看见了它的价值。好东西不要你多说,群众的眼睛是雪亮的。我们还实施了单元测试,这是何等的骄傲。核心的业务对象我们慢慢开始引入单元测试,手把手的教研发怎么写。

wKioL1ZiWN2SL0NpAAA3-MdxnPQ640.png

wKiom1ZiWHSjaoLTAAF3a0CLRT0711.png

wKioL1ZiWOGxx7RgAAFmUMiJBlc062.png

4. 借助外力推动研发(QA、领导、自动化测试)

有时候需要借助一些外力来帮助我们实施推广一些东西,这应该是通用的方式方法。那么DDD需要借助哪些力量来让推广更加的容易点。

可以借助QA来强调质量,比如引入codereview、同时把你的DDD包含在里面引入。要记住你的目标。

还可以借助你的领导来推广,当然有领导帮忙推广是幸福的,但是你要做好售前售后工作。别强推,适得其反。

还可以借助自动化测试的实施来推广你的领域模型提炼。通过单元测试让研发慢慢的重视领域模型的高内聚低耦合。

5.领域模型与SAAS平台的内核(价值最大化)

其实,到最后企业的SAAS平台创建首先需要的就是业务模型。你可以借助这个价值让DDD的价值最大化。而且事实也是确实如此。研究SAAS的人都了解,核心业务模型基本上是很少变化的。外围的个性化都是基于核心模型在扩展。

6.最后

其实仅凭一篇博文很难说清楚细节。我只是给热爱DDD的同志们分享点我自己的可行方案和心得。其实这里面还有很多宝贵的东西值得分享,我会在我的下本书中详细的分享出来。(《B2B电商平台系统架构设计》,一本讲解B2B业务模式的系统架构设计,里面将包含DDD、SOA、SAAS、GRASP等重要的技术概念。在此先打个小广告推广下。)

最后还想说一句,作为一名架构师要知道“价值导向”、“风险驱动”。要为企业创造价值,要为企业规避风险。你只要做好这两点就已经是相当的厉害了。要有耐性,要负责任,要做到良师益友,很多时候技术是要引导的,架构是在不断的演化中,所以不要急。目的是要做成,而不是我试过没成功。

作者:王清培

出处:http://wangqingpei557.blog.51cto.com/

本文版权归作者和51CTO共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结