领域驱动设计,让程序员心中有码

 领域驱动设计的背后,需要开发者不能只专注于眼前功能的实现,而应该能够从全局去了解业务,并充分的将业务吃透,以可传承的知识的形式融入到开发过程中,只有这样才能促进产品更好的开发。



01



传统项目管理模式,让设计成为累赘

作为一名资深软件行业从业者,我以前一直从事项目开发。在项目执行过程中,往往会采用快速开发模式,按照软件工程的基本流程建立一套项目软件管理模式。这个流程大概是这样的:1,需求调研:大概花费合同周期的六分之一时间来进行需求调研,需求调研环节力求对用户需求进行全面的掌握,并整理成需求规格说明书。2,总体设计和详细设计:花合同周期六分之一的时间进行项目的总体设计和详细设计,详细设计必须覆盖所有需求,甚至需要精确到伪代码的编写。3.项目部署:剩下的时间进行项目的现场实施工作。项目的周期和项目的范围往往各不相同,为了保证软件的质量,上述每一个环节都非常重要,哪个环节的缺少都会对项目完成无法弥补的困难。

有时候,有的软件公司往往为了更快的完成项目,会把软件设计人员和开发人员分成两支不同的组织,一支专门进行软件的设计工作,完成甲项目设计后就快速的投入到乙项目的设计过程中。而研发任务留给研发团队来完成,如果遇到设计上的问题,再由设计团队对软件设计进行调整,由开发团队进行实现上的完善。某种意义上讲,这种模式已经成为软件工业上的主流模式,无数家软件公司正是靠这种方式实现了一个又一个的复杂项目的。

然而,这种模式并非完美无缺,他也造成了一系列问题,尤其是单纯从设计角度来说。例如,由于过份的重视设计,每个开发者只能从某个细节入手进行代码的实现,而可能不知道这个功能在整体项目中的位置,缺乏了对项目的整体思维。例如,由于设计人员本身知识面也好,技能也好,可能导致设计出来的成品根本不符合需求,后期需要花大把的时间进行调整,最终导致设计文档成为没用的负担。


02


敏捷开发,解放生产力,从抛弃文档开始


大型软件公司优先意识到这个问题,并对这个模式进行了深入研究,推出了新的理念,极限编程和敏捷开发。在敏捷开发模式中,1,首先要求要抛弃臃肿文档。2,冲刺,以一段时间作为一次冲刺,例如,以两周为一次迭代周期,发一次版本。3,建立里程碑。4,使用看板。5,建立用户故事和统一建模语言来表达一个项目。6,项目组的每一个成员都是团队不可或缺的部分,尽可能的在一个地方办公。7,每天一次例行站立会议。由于敏捷开发极限编程解决了许多现实问题,成为大家广泛使用的行业标准。

互联网公司将敏捷开发用到了极致,然后建立了一套自己的产品发布流程。这个流程有可能是以两周为一次迭代;产品开发周期为五个步骤,需求,原型设计,界面设计,功能开发,测试,发布;使用看板和站立会议,确保任务良好的执行。等等。

 对于互联网公司而言,时间就是生命,谁最先开发出优秀的产品,意味着最先抢占先机。从单纯的功能角度来看,互联网公司的产品往往功能点数量并不会很多,因此在短时间内会把每个功能做到极致。一方面,从需求层面来说,要做到满足百分之八十用户的普遍需求,要细化和固化需求,原型设计力求完美,界面设计力求精确到像素点,文案要经得起考验。功能开发层面,选择最成熟的技术方案,做最稳定的功能,确保更高的质量和更稳定的性能。由于前期准备工作充分,在研发阶段的工作量实际上已经越来越少了。于是,开发阶段的冲刺也意味着更侧重于单纯的应用实现,不再需要写方案,画流程,设计数据库,最后才实现功能。     

03


领域驱动,让程序员心中有码,一剂良方?

     从上述过程可以看出来,现有的产品研发模式,实际上已经抛弃了研发设计过程,而更专注于功能实现,开发者的唯一目标就是最快的时间完成任务,不需要太多的想法,不需要过度的设计,纯粹的功能实现而已。问题是,功能设计真的可以丢弃吗?

    在互联网公司飞速发展的背后,往往需要更加职能化,专业化的团队,产品开发的背后,实际上是分工明确小团队集体智慧的结晶。但是,由于缺失了研发设计环节,就可能导致研发过程中,功能的开发全凭开发者的个人经验。对于简单的业务,尚且能够掌控,稍微复杂一点的业务就可能需要付出一定的代价才能勉强应付了。由于功能开发取决于个人经验,就可能导致模块的开发,从短期来看满足了眼前的应用指标,但是却为后期的发展留下了弊端。随着原有开发者工作职责的调整,或者离职,将最终导致凭经验开发的功能模块成为无人能维护的神之领域。

      在这样的背景下,领域驱动设计成为普遍的选择。实施领域驱动,往往需要由领域专家对系统进行分析,将系统抽象化,然后建立相应的领域模型。实际上领域驱动设计,领域建模同样是非常重要的部分。即团队应使用统一的语言建立软件领域模型,并根据模型来指导开发,其模型应该是能够自我解释,让人通过模型可以理解开发者的意图。通过领域驱动设计,让不同的开发者根据应用场景进行模型设计之后,再按照一致性的规范实现功能,最终可以有效的保证产品研发质量的提升。领域驱动设计的背后,需要开发者不能只专注于眼前功能的实现,而应该能够从全局去了解业务,并充分的将业务吃透,以可传承的知识的形式融入到开发过程中,只有这样才能促进产品更好的开发。然而,领域驱动真的是一剂万能的良方吗?

原文地址: https://www.cnblogs.com/xiyuanMore/p/10028574.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker最全教程——从理论到实战(二)

容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右,只是为了大家更好地了解、理解和消化这个技术,能够搭上这波车。你可以关注我们的公众号“magiccode…

图论模板详解:存图

图论千万条,存图第一条 1.邻接矩阵 用一个矩阵x[i][j]表示i到j的路径 优点:代码方便,易于去重 缺点:空间复杂度爆炸 优化:二维vector(但是会变慢) 2.链式前向星 (抄资料毫不掩饰&a…

eShopOnContainers 知多少[4]:Catalog microservice

引言Catalog microservice(目录微服务)维护着所有产品信息,包括库存、价格。所以该微服务的核心业务为:产品信息的维护库存的更新价格的维护架构模式如上图所示,本微服务采用简单的数据驱动的CRUD微服务架构&#xff0…

2021牛客暑期多校训练营3 I-Kuriyama Mirai and Exclusive Or(异或+差分)

I-Kuriyama Mirai and Exclusive Or KeHe题解 diabolusexnihil题解 不过diabolusexnihil大佬的题解有一部分写错了应该是:每次分裂标记bl,ib_{l,i}bl,i​需要给数组[l2i−1,l2i)⊕2i−1[l2^{i-1},l2^i)\oplus2^{i-1}[l2i−1,l2i)⊕2i−1然后标记分裂成bl,i−1,bl2…

P5748-集合划分计数【EGF,多项式exp】

正题 题目链接:https://www.luogu.com.cn/problem/P5748 题目大意 求将nnn的排列分成若干个无序非空集合的方案。 输出答案对998244353998244353998244353取模。 1≤n≤105,1≤T≤10001\leq n\leq 10^5,1\leq T\leq 10001≤n≤105,1≤T≤1000 解题思路 就是求划分数 分成ii…

ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1

一、前言最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知识目前也没有任何的进展,嗯,罪过罪过。看了…

2021牛客暑期多校训练营4 B-Sample Game(概率DP)

B-Sample Game ding_ning123大佬题解 注&#xff1a;上述题解图片来自ding_ning123大佬题解 Code #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!isdigit(ch)) {if(ch-…

OrchardCore 如何实现模块化( Modular )和 Multi-Tenancy

一、概述通常我们会在 Startup 类通过 void ConfigureServices(IServiceCollection services) 配置应用的服务。常见的形如 AddXXX 的方法&#xff0c;实际上调用的都是 IServiceCollection 或直接说是 ServiceCollection 的 AddSingleton 等方法。调用ApplicationBuilder 的 R…

牛客题霸 [ 最长回文子串] C++题解/答案

牛客题霸 [ 最长回文子串] C题解/答案 题目描述 对于一个字符串&#xff0c;请设计一个高效算法&#xff0c;计算其中最长回文子串的长度。 给定字符串A以及它的长度n&#xff0c;请返回最长回文子串的长度。 题解&#xff1a; 两个方法&#xff1a; 一个是经典暴力&#…

【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

上篇文章我介绍了如何在网关上实现客户端自定义限流功能&#xff0c;基本完成了关于网关的一些自定义扩展需求&#xff0c;后面几篇将介绍基于IdentityServer4&#xff08;后面简称Ids4&#xff09;的认证相关知识&#xff0c;在具体介绍ids4实现我们统一认证的相关功能前&…

T183637-变异距离(2021 CoE III C)【单调栈】

正题 题目链接:https://www.luogu.com.cn/problem/T183637 题目大意 给出nnn个二元组(xi,yi)(x_i,y_i)(xi​,yi​)&#xff0c;求最大的 ∣xi−xj∣min{∣yi∣,∣yj∣}|x_i-x_j|\times min\{|y_i|,|y_j|\}∣xi​−xj​∣min{∣yi​∣,∣yj​∣} 1≤n≤2106,−106≤xi≤106,−…

dfs剪枝:洛谷P2809 hzwer爱折纸

传送门 解析 dfs暴力枚举即可 这题的重点是如何剪枝 不难发现&#xff0c;随着不断处理&#xff0c;纸条只会越来越短&#xff0c;且所有数字总加和不变 我一开始想到了2个条件&#xff1a; 1.当前长度比理想纸条小&#xff0c;return&#xff1b; 2.总加和与理想纸条不等&a…

[译]聊聊C#中的泛型的使用

写在前面今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章&#xff0c;因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译&#xff0c;当然在翻译的过程中发现了一些问题&#xff0c;因此也进行了纠正&#xff0c;当然&#xff0c;原文的地址我放在最…

P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】

前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1/2/31/2/31/2/3的概率权重分别是px,1/2/3p_{x,1/2/3}px,1/2/3​&#xff0c;然后按照权值每次获得一张未获得的卡&#xff0c;然后…

模板:线段树

文章目录引言思想模板建树单点修改 / 查询区间修改/查询总结练习引言 有一类题目:要求在区间上维护信息&#xff0c;比如带修改区间求和问题。考虑到枚举求和肯定会超时&#xff0c;我们可以通过一些数据结构来维护信息&#xff0c;例如线段树。 它功能强大&#xff0c;支持区…

Docker最全教程——从理论到实战(三)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右&#xff0c;只是为了大家更好地了解、理解和消化这个技术&#xff0c;能够搭上这波车。你可以关注我们的公众号“magiccode…

高并发、低延迟之C#玩转CPU高速缓存(附示例)

写在前面好久没有写博客了&#xff0c;一直在不断地探索响应式DDD&#xff0c;又get到了很多新知识&#xff0c;解惑了很多老问题&#xff0c;最近读了Martin Fowler大师一篇非常精彩的博客The LMAX Architecture&#xff0c;里面有一个术语Mechanical Sympathy&#xff0c;姑且…

RMQ问题:与众不同(st表的高端应用)

解析 预处理 用pre[i]表示以i结尾的最长完美序列起始点&#xff0c;用last[i]表示数字i最后出现的位置 那么可以得到递推式&#xff1a; pre[i]max(pre[i-1],last[x[i]]1);也就是说这个pre要么是受前一位一样的限制&#xff0c;要么是受自己的限制 用f[i]表示以i结尾的最长完…

Docker最全教程——从理论到实战(四)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右并且一直在完善、补充具体的细节和实践&#xff0c;预计全部完成需要1到2个月的时间。由于编写的过程中极其费时&#xff0c…

动态规划:openjudge 2.6-3532 最大上升子序列和 解题心得

传送门 题目描述 一个数的序列bi&#xff0c;当b1 < b2 < … < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1, a2, …,aN)&#xff0c;我们可以得到一些上升的子序列(ai1, ai2, …, aiK)&#xff0c;这里1 < i1 < i2 < … < iK…