阅读目录:

  • 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。技术人员每天都要学习的,懂得越多发现要学的东西越多,这是合理正常的。但是你要知道作为架构师的职责是什么,要搞清楚你本职工作的的目标是什么,这是我现在的良师益友给我最多的提醒和指导(借此真心的感谢我的领导)。

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

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

2.从业务开始

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

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

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

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

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

3.从战略到战术

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

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

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

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

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

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

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

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

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

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

6.最后

其实仅凭一篇博文很难说清楚细节。我只是给热爱DDD的同志们分享点我自己的可行方案和心得。其实这里面还有很多宝贵的东西值得分享。

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

本章内容我会在我的下本书中详细的总结出来(《B2B电商平台系统架构设计》,一本讲解B2B业务模式的系统架构设计,里面将包含DDD、SOA、SAAS、GRASP等重要的技术概念。在此先打个小广告推广下。)

作者:王清培

出处:http://www.cnblogs.com/wangiqngpei557/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

DDD实施经验分享—价值导向、从上往下进行(圈内第一个吃螃蟹DDD实施方案)的更多相关文章

  1. 领域驱动设计(DDD)的实践经验分享之ORM的思考

    原文:领域驱动设计(DDD)的实践经验分享之ORM的思考 最近一直对DDD(Domain Driven Design)很感兴趣,于是去网上找了一些文章来看看,发现它确实是个好东西.于是我去买了两本关于 ...

  2. 领域驱动设计(DDD)的实践经验分享之持久化透明

    原文:领域驱动设计(DDD)的实践经验分享之持久化透明 前一篇文章中,我谈到了领域驱动设计中,关于ORM工具该如何使用的问题.谈了很多我心里的想法,大家也对我的观点做了一些回复,或多或少让我深深感觉到 ...

  3. 线上Linux服务器运维安全策略经验分享

    线上Linux服务器运维安全策略经验分享 https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&a ...

  4. 【经验分享】如何搭建本地MQTT服务器(Windows ),并进行上下行调测

    网上查了很多资料,实际动手的时候踩了很多坑,现在把我的经验分享给大家: 一.安装和启动 使用EMQTT,下载完直接到bin目录下执行emqttd start就可以了,简单方便 下载地址:https:/ ...

  5. 【微学堂】线上Linux服务器运维安全策略经验分享

      技术转载:https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&sn=6d403ab4 ...

  6. 项目经验分享[转自min.jiang]

        最近三个月,我非常荣幸的做为TeamLeader带领几个小组成员做了一个国外项目,这里想为大家分享一些小经验,尽管我佣有六年多的项目经验,但我一直的方向是架构师.大家知道架构师一般情况是偏向技 ...

  7. 新东方APP技术架构演进, 分布式系统架构经验分享

    今天的演讲题目是"新东方APP技术架构演进, C端技术经验分享" 作者:张建鑫, 曾任IBM高级软件架构师, 滴滴高级技术专家, 现任新东方集团高级技术总监 古代东西方的思想家都产 ...

  8. 在单体应用的一些DDD实践经验

    阅读此文需要一定的DDD基础,如果你是第一次接触DDD读者,建议先去阅读一些DDD相关的书籍或者文章之后再来阅读本文. 背景 自从我在团队中推行DDD以来,我们团队经历了一系列的磨难--先是把核心项目 ...

  9. 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)

    简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...

随机推荐

  1. JS实现动态显示当前时间

    效果图: 代码实现: <script language="JavaScript"> var timerID = null; var timerRunning = fal ...

  2. git切换到远程分支

    远程仓库 git clone 下来,当你执行 git branch,你只会看到 * master 并不会看到其他分支,即便远程仓库上有其他分支,使用 git branch -va 可以查看本地+远程分 ...

  3. 浅谈 C#委托

    看了<CLR via C#>的17章委托后,为自己做一点浅显的总结,也分享给需要的人. .NET通过委托来提供一种回调函数机制,.NET委托提供了很多功能,例如确保回调方法是类型安全的(C ...

  4. Unity3D 5.x 简单实例 - 脚本编写

    1,Vector3 类型变量存储向量坐标值 Vector3.forward Vector3(0,0,1) Vector3.up Vector3(0,1,0) Vector3.right Vector3 ...

  5. Python爬取代理ip

    # -*- coding:utf-8 -*- #author : willowj import urllib import urllib2 from bs4 import BeautifulSoup ...

  6. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

  7. 《数据结构与算法Python语言描述》习题第二章第二题(python版)

    ADT Date: #定义日期对象的抽象数据类型 Date(self, int year, int month, int day) #构造表示year/month/day的对象 difference( ...

  8. 一个过滤特殊字符的JS

    <script language="javascript"> function checkForms() { var iu, iuu, regArray=new Arr ...

  9. CSS实现弹出导航菜单

    查看实际效果:http://keleyi.com/a/bjac/vksd7321.htm 完整代码,保存在html文件打开也可看到效果: <!DOCTYPE html PUBLIC " ...

  10. Oracle常用SQL查询

    一.ORACLE的启动和关闭 1.在单机环境下要想启动或关闭oracle系统必须首先切换到oracle用户,如下: su - oracle a.启动Oracle系统 oracle>svrmgrl ...