坚定推动 DDD 一年后,去哪儿网如今怎么样了?
微服务盛行之后 DDD 又再次回到我们的视野之中,并一度成为各大公司竞相投入的重地。DDD 指的是领域驱动设计,是一种架构设计方法论,帮助我们拆解业务、划分业务、确定业务边界,继而可以更好地实现技术架构的演进。
DDD 一般包含两个方面:战略设计和战术设计;战略设计一般从业务视角出发,战术设计则从技术角度出发。一个完整的 DDD 首先会在战略设计部分建立领域模型,在战术设计部分进行技术实现和落地。那如何才能设计一个和业务匹配度更高的领域模型,如何更好地推动技术实现落地呢?
当下 DDD 的热度不减,各大公司纷纷进场,那它是实现技术架构演进的万能解药吗?究竟什么样的业务适合 DDD,如何避免盲目推进呢?当前成功落地案例少之又少,哪里去寻找合适的落地参考呢?
出于对以上问题的好奇,我们特地采访了去哪儿网机票目的地事业群技术总监郑吉敏老师,他是去哪儿网的技术委员会委员、业务架构 SIG 负责人,负责酒店报价中心团队和业务架构组。在 2020 年金项奖评选中主导的“对内 DDD 对外 API 驱动的酒店报价业务重塑”项目获得了 CEO 特别奖,也曾在多个业内顶尖技术大会进行分享。郑吉敏老师也在积极地推动技术品牌的建设,关于如何推广技术品牌的问题我们也可以得到一些启发。
同时,郑吉敏老师也是 3 月初上线的 QCon+ 案例研习社「去哪儿网 DDD 落地实践」专题的出品人,带队来分享去哪儿网内部多业务 DDD 落地的最佳实践。因此我们针对 DDD 落地和技术品牌的建设推广相关问题对郑吉敏老师进行了采访,一起来看看他的实践和思考吧。
郑吉敏:我目前的工作主要由两部分组成:
第一是负责酒店报价中心团队和业务架构组。
当大家使用“去哪儿旅行 App”预定国内酒店时,会看到酒店售卖房型及对应的价格和优惠,这部分对应的后端技术团队就是我负责的,我们主要完成国内酒店定价业务和营销业务的技术承接。同时,我还会结合业务变化对整体架构进行把控和优化,通过这些来做产研提效的工作;
第二是技术委员会相关的事情,包括业务架构兴趣小组的日常运营、业务线重点项目的技术方案评审、技术品牌建设等。
最近我牵头将 2021 年公司内部几个不错的 DDD 落地案例在“极客时间 App”的 QCon+ 案例研习社上进行了分享,希望能给大家带来启发。同时大家也可以关注 B 站上“Qunar 技术大本营”,那里有我作为出品人在公司内部出品的多门技术系列课,比如“DDD 领域驱动设计”、“高并发解决方案”等。
这两部分工作相得益彰,前者为后者提供了大量的理论实践素材,后者能很好地展现前者的价值,并反过来指导前者更好地开展业务。
郑吉敏:去哪儿网内部推广 DDD 其实是高层自上而下推进的,要说困难,我感觉比较深刻的是一定要有团队能成功落地 DDD 并能输出成功经验,才能保证整体推广的顺利进行。
从我的角度上看,我认为要推广 DDD 有两个关键点:
公司层面的支持和重视
对一个核心业务进行 DDD 实践,如果想要做得彻底,通常需要几十人日甚至更多资源投入。这么大力度的成本投入,如果没有公司层面的支持和重视,是很难开展的,甚至可能开展过程中被强制叫停。
有成功经验的指导
2020 年我主导的酒店报价 DDD 重构项目中,我们就花了很大精力完成战略设计阶段、战术设计阶段、系统实现阶段的关键经验总结及思考。在公司内外部大会分享时,每次都能吸引很多听众,有一部分人想学习 DDD 思想,其余的大部分人都希望能在更多的成功经验指导下实际落地 DDD。DDD 失败的例子太多了,有成功经验指导,很多人才敢放开手脚去做,这样也更容易成功。公司内部也是有了多种 DDD 实践经验分享之后,更多的业务团队才开始去落地,这也是我们公司内部在 2021 年有多个团队能成功落地 DDD 的主要原因。
实际落地 DDD 会遇到各种各样的困难,以我自己负责的自下而上的业务重塑的案例,给大家具体分享一下系统实现阶段遇到的问题及应对方案:
新产品需求的应对
首先我们需要明确,新模型的上线必须要保证过程中发布的需求都能跟着上线,因此本质上在新模型上做重复开发是必须的。新模型理论上有很大优势,正好可以借助新需求去验证是否能达到提效的目的,这样开发团队可以提前看到新模型的适应性,也可以在系统实现阶段提前明确新模型上线后的效果(实际对比发现提效明显),这样反而可以在过程中提升开发团队的士气,树立一定能成功的信念,而不是强制把一些需求直接压下去。
额外产生需求的应对
这个主要根据价值、优先级、工时等多方面因素,来决定是否在本次需求里做。比如,本次重写导致之前的自动化 case 都用不了了,由于自动化 case 对我们系统重构后的验证有关键作用,因此就需要按照新模型的设计完全重写自动化 case。再比如,我们发现有很多过滤逻辑需要从不同的服务及流程里取数据,较好的做法是搭建一个酒店禁售系统来汇总,但是这个属于重要不紧急的任务,于是我们就计划在当前项目上线后再单独跟进。
计划投入的人力被其他需求抢走的应对
这是个最难的挑战。进入系统实现阶段从计划投入 6 人到只能投入 4 人,于是加班就变成必然,这里需要额外做很多协调工作。首先开发团队和测试团队达成共识,测试团队提前进入,优先测试已经开发及自测完成的内容;开发团队根据优先级进行开发,对于优先级低或者工具类型的功能点,可以放到提测之后开发,不需要完全保证在提测日全部开发完成。这样一来,大家心理压力会小很多。同时,整个过程中要让团队不断认可这个项目的价值,这样大家才有动力全力去推进完成项目。最终,整个项目提前一天完成全量且没有出现故障,我们整个团队的士气也得到了空前的高涨。
郑吉敏:DDD 落地核心包含三个过程,战略设计阶段、战术设计阶段、系统实现阶段。系统实现阶段主要偏向于实现已确定的方案,重点做好项目管理;战术设计阶段更多偏向于基于近乎确定的需求制定模型和方案,掌握好 DDD 的一些基本概念(域、聚合等)及规则,问题也不大;战略设计阶段是整个落地的基础,只有战略设计阶段做到位、做彻底,后面两个阶段才有意义。
DDD 战略设计
这里我们总结了做好战略设计阶段的一些必要条件,可以概括为【两个前提】、【一个原则】和【一个方法】,具体为:
两个前提:这个主要是对领域专家角色的要求,本质上是为了明确现状并能规划未来。
a. 对核心业务运营的逻辑有深刻的了解。能输出核心业务玩法和未来的规划,这样对业务玩法的讨论才会有明确的方向,最终制定的模型才能满足当前业务的诉求和未来调整的规划。有了这个前提,就不会讨论出一些大家谁都不知道会不会发生、也没人敢拍板的场景。
b. 对现有业务需求的来龙去脉有所了解。明确核心业务诉求及限于当前架构等各种因素采用的业务玩法,这样就可以有目的地进行改善。
一个原则:业务原子原则。
基于业务原子,容易划清业务边界避免业务职责重叠、过耦合。从根本上说,业务的划分应该到业务原子级别。做到了上面说到的两个前提,业务原子其实并不是难事。
一个方法:通过业务本质保证业务原子。
寻找业务本质的方法,可以基于业务开展的目的。任何明确的业务都有属于自己的玩法,开展这项业务也一定是有实际的目的,玩法根本上是要为目的服务的,目的是玩法最终希望表现的结果。只有抓住业务开展的目的,从根本上了解业务的本质和玩法,才能保证最终业务边界是基于业务原子划分的。
在明确上面提到的这些必要条件后,加上充足的讨论,才能最终完成这个阶段目标:对业务理解达成共识。这些会让沟通变得更容易,目标变得更明确,落地执行更有效率,后续迭代更有规划,团队也更容易创造出更多价值。
郑吉敏:公司在 2020 年开始大力推进 DDD,我自己主导的 DDD 项目在 2020 年的金项奖评选中获得了 CEO 特别奖,之后我们在公司内部尝试以技术系列课的形式去分享 DDD 的落地经验。2021 年多个业务线借助 DDD 落地也都取得了不错的业务成果,典型的比如酒店订单交易、酒店基础数据、机票主站、服务平台业务、公共会员卡业务等,这些具体的实践过程都已经分享在了 QCon+ 案例研习社中,大家可以去看看。
去年我们的 DDD 落地经验也登上了多个业界顶尖技术大会,一些公司看到我们的 DDD 成果还主动邀请我们去他们公司内部做 DDD 落地的分享。2021 年金项奖评选中 Qunar 的技术委员会获得了 CEO 特别奖,这里面 DDD 的成果及基于 DDD 做的分享为去哪儿技术品牌影响力提升做出了突出贡献。
当然 DDD 不是万能的,它主要用来解决复杂领域的问题,建议核心业务使用,非核心业务并不建议。如果没有明确的领域专家(领域专家可以由多个团队的核心人员组成),那么也不建议去直接进行 DDD 落地。实际开展 DDD 时,建议以业务重塑为主、系统重构为辅,避免纯技术重构。
郑吉敏:技术影响力对公司非常重要,我结合去哪儿网从对内和对外两方面来说一下:
对内:随着公司技术影响力的提升,我们内部有越来越多的技术人员站出来去打造影响力。内部分享是很容易搞起来的,技术同学们愿意去分享自己的经验和总结,这对于提升一线开发同学的技术能力、提升公司的综合技术水平都非常有效,也能间接地支持业务的发展,提升技术人员的幸福感。去年我们公司一共组织了 282 次主题分享,包括各类内部技术分享、外部输出、应届生课程、行业大会、在线直播、B 站视频、文章输出等,总计涉及人次超过 30 万。
对外:公司不断在业界发声,可以获得更多和外界交流及交换资源的机会,也推动更多外部开发人员认识去哪儿网。目前,很多技术大会都能看到我们公司的分享,我们也会主动做一些直播分享并上传到 B 站“Qunar 技术大本营”供大家长期观看学习。得益于这些,也有多家公司邀请去哪儿网技术人员来交换分享,大家拿出各自擅长的话题去对方公司交流,互相学习、共同进步,这种效果非常好。公司间也可以联合创立类似 ITCP 联盟这样的组织促进合作持续进行。
郑吉敏:对于管理层而言,我认为需要有这些能力:
·积极开放的心态
·敏锐的行业洞察力
·坚韧的性格
·不拘一格降人才的识人用人格局
这里主要是保持开放的心态,积极地关注行业变化、技术革新,敢于引入潮流的思想和技术;遇到困难和挑战很正常,要坚定地去解决,并能在这个过程中,识人用人,借助这些事情去历练团队,最后也要做好总结和经验分享。
提升公司的技术影响力,我们是这样做的:
微信公众号技术文章分享:尽量定期发表,遇到文章产出少时,可以基于一些分享邀请相关分享人输出文章
内外部技术大会分享:举办内部技术嘉年华、出品内部技术系列课以及报名参加业界技术大会分享等
公司间技术交流:包括互访做技术分享、搭建 ITCP 联盟定期举办分享活动等
做影响力是有马太效应的,做得好和不做的差距会越来越大,持续地去做,也许当前较为棘手的问题很有可能在不久的未来变成自己的优势。
郑吉敏:初入管理或者刚做管理,确实有一些需要注意的地方,简单分享一下:
心态准备
初入管理,首先要调整自己的心态,将个人产出转变为领导团队产出。很多初级管理者,尤其是技术人员初做管理,很容易和之前的工作状态一样专注个人的产出。
不断学习
初级管理者需要不断地学习基础管理理论,同时持续丰富个人管理工具方面的储备。这个过程中可以获得很多解决问题的方法,看待问题的视角也会不断变化和提升,很多管理方面的问题自然就容易解决了。
内外兼修
初级管理者依旧需要关注技术方面的不断提高,同时持续加强对业务的深入理解,这些对于团队方向的把握和日常的决策都很重要。
郑吉敏
去哪儿网 机票目的地事业群技术总监
2019 年 8 月入职去哪儿网,机票目的地事业群技术总监、技术委员会委员、业务架构 SIG 负责人,负责酒店报价中心团队、业务架构组。2020 年金项奖评选中主导的“对内 DDD 对外 API 驱动的酒店报价业务重塑”项目获得了 CEO 特别奖。2021 年获得技术品牌最佳贡献奖,曾在 QCon、Top100、CSDI、SACC、MPD 等大会做过技术分享。
点个在看少个 bug 👇