草庐IT

戏说领域驱动设计(三)——困境

SKevin 2023-03-28 原文

  我第一次捧起老艾那本《领域驱动设计》,惊为天人。吾辈上下求索数年,这不正是终极之大道吗?结果只三天热乎劲儿,“什么玩意儿”是对这本书的最好评价。好好的一本书让我“弃之如敝履”,差点就“小舟从此逝,江海寄余生”了。几年过后读了网上一些老baby写的吐槽DDD的文章,几乎视其为知音啊,那概括的真是精辟,绝对是个性情爽快的真汉子。借他的花我也献献佛,也说说DDD这点事儿,好好的一门儿学问怎么现在变得神乎其神上升到哲学、玄学的地步,不得不感慨“江山代有才人出”。

 

   上面的图展示了使用DDD的六个困境,相信每一个学习者都会遇到其中的一个两个或多个。

   第一层:“本末倒置”,技术人员喜欢将精力放在战术部分而忽略了战略,喜欢讨论各类设计模式、框架,部分个体系统设计的相当不错,整个系统确是千疮百孔。这种抓不住重点的情况,造成你虽然使用了DDD,确看不到成效。再加上ODD这种设计方式做起来也挺复杂,上下怨气冲天。最终给你的结论就是“DDD不行”。此外,过度关注技术使得你的系统的好坏完全依赖于程序员的个人素质,问题是好的程序员全干管理去了。上有屁股下有脸,他也没时间从细节上把握系统建设。DDD的带头大哥“Vaughn Vernon”在其名著“实现领域驱动”一书中开端便写“战略”,那就是告诉您这是需要第一时间关注的部分。您在读书的同时也得猜测作者为什么这样安排章节,为什么与老艾那本开山之作组织方式不同,这得细心品味一下才行。

  第二层:“门槛高”,即便是DDD的战术部分,对于研发人员也有较高的要求,如:数据库设计、代码规范、全局系统理解度、设计模式、系统优化策略……。过去您搞面向过程,要考虑数据库的优化;现在您搞DDD除了数据库那点活儿,您还得考虑模型的设计,比如有哪些模型?它们间的关系是什么?,里外里实现难度增加了一倍以上。再者,DDD还鼓吹头脑风暴(其实就是开会)呢?您作为一个高级工程师或者团队扛把子,不得参加参加?而实际情况,一天已经800个会了,谁还有时间、有精力去做模型设计。好不容易有个喝口水儿的时间,想来还有一个千字周报没写。

  第三层:“晦涩”,网上DDD相关文章中很喜欢使用晦涩语言。大部分文章作者的分享精神值得赞扬,可就是有些大师喜欢搞玄学,本来一个事情可以用简单的语言表达出来,咱必须得上升到哲学层次。写文章的目的不是“传道、授业和解惑”, 是为了欣赏你们一副无知的样子。DDD里就那点东西,说白了就是建设前先把大系统拆分一下,再对小系统按其情况选择一个编程模型,再稍微注意一点服务间的交互,这事儿就齐了。那些专家级文章再多写一点就开始指点人生了,这臣妾消化不了啊。

  第四层:“无案例参考”。比如微服务,你可以找到大量的落地方案,对于DDD有价值的参考非常少,大部分的案例都脱离了实际的业务,离开领域谈设计也不能说没意义,现实中您计划使用DDD的业务场景可能非常复杂,一个小细节都可能阻碍工作的进展。所以只有实际参与过DDD项目才能了解系统从分解到建模再到落地的一系列流程中所应注意的东西。片面的案例对于有经验的工程师可以说明问题,对于小白则造成了不小的困扰,从内心深处排斥学习。可话说回了,也不太可能把自己公司的项目全摆出来让您看,这涉及到法律及安全的责任。这种情况基本无解,比较好的方式是找个不重要的模块背着领导自己搞一把,万一成了呢?

  第五层:“过度吹嘘”,部分文章和书籍作者过分的夸大某些战术架构的优势而忽略了其缺点,甚至对于DDD本身也做了夸大,造成开发与运维成本的成倍增长及至于系统无法快速扩容甚于不得不重写,比如CQRS、ES就特别容易被滥用。此话羞于开口,我知道ES的编程模型可从来都没在实际系统中搞过,一是有代替方案二是害怕(代码都是写给自己的,出了问题您也得自己维护,除非您打算写完就直接跑路)。在座的您各位也包括我自己应该是很喜欢技术的,面对花花世界中那些亮眼的、高大上各类技术和名词,很容易被其诱惑。到不是说多学点技术不好,而是要学会如何控制自己去选择最为合适的技术方案,这是您对公司的责任。请对技术保持敬畏之心,那东西是双刃剑可以成全你也可以逼你挥刀自宫。

  第六层:“营销绑架”,软件行业喜欢把简单的东西搞复杂,主要的目的就是让人觉得很高大上,越晦涩越好。让人听上去感觉很牛掰,但是听不懂。如中台、低代码、DDD。这样的系统具备极高的营销价值,但落地非常困难,尤其是在资源方面无法与理论对齐的时候。销售拉项目时通常会竖立各种Flag,可只要项目一到手就由不得客户了。至此,DDD就沦落为一个拉项目的口号,可怜那!

  面对上面的六种困难,的确是没什么好的解决方案,即使说出来也不过是纸上谈兵。家家过日子,家家有本难念的经。“尽人事,知天命”:前一句告诉您需要加强自身的修养,需要时时报有一种客观、务实乃至对于技术敬畏的态度;后一句告诉您世上很多事情本身就是无解的,您上面有领导,领导上面还有领导。那就学会聪明一点换个思路解决问题。咱都是搞技术的,技术是朴素的,千万别天天夸夸其谈。您个人是爽了,但活总得有人干,让下属天天后面骂着您也不好不是吗 ?

  另外,假如您在组织内有一定的权力,DDD可以帮你打通任督二脉,至少在战略上还是可以有效的指导系统建设的。假如您空有一身抱负却摊上了一个不懂还要装懂的领导,那就熬他,看看谁最终笑在最后。最后一点,请把战术设计部分的责任放在您的团队最靠谱的那个人(技术好还听话)身上或干脆自己来,尤其是涉及需要使用ODD的业务时,千万别天真的组织一堆人坐在一起聊设计。人一多就众口难调,七嘴八舌的一会儿就把您带歪了,还头脑风暴?整个就一喷空沙龙。家有千口主是一人,如果你敢拉会那就需要保证这里有一个人敢拍板儿做决定。最后,请务必不要忽略人性中的自私,同水平技术人员讨论的时候最终往往就对人不对事儿了,容易让团队产生矛盾,万事以合为贵嘛。

  如果您下面有几个比较有能力的大哥,放到不同的业务中。服务拆分(拆分阶段尽量让骨干参加,后续这帮大哥还得负责各子系统建设呢,不过得有个主事儿人能拍板儿)的好,实施阶段好一点差一点也太不影响什么(严肃来讲:是因为好的拆分能够明确子系统间的边界,这种天然的隔离机制会消除部分不良设计所带来的影响),用户又不知道,反正只要功能对就行。好的系统也不是设计出来,是迭代出来的。再说了,有生之年我估计也没机会参与火箭、航天飞机的软件设计了(这类系统不允许BUG的存在,需要采用非常严谨的软件开发流程进行管控),让我们拥抱迭代吧!!!

  本节谈了DDD的困境,也说了一点团队管理的事儿。公司不同,文化不同,按需采用合适的、适应您团队的管理办法和系统实施技术方案。另外,心急的爷们不要着急想看代码,先修炼内功,高手都需要内外兼修的。下次咱们聊聊DDD都说了点什么东西,怎么也得有个大概的感性认识吧。您就算再不愿意看到那些晦涩难懂的词我也得说(主要是不说我也不知道用什么词代替,我也在是在DDD的路上挣扎呢,回头没岸了),万一和同行聊的时候您满嘴大白话,不专业。

 

有关戏说领域驱动设计(三)——困境的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  4. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  5. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  8. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

  9. ruby-on-rails - Rails 5,公寓和设计 : sign in with subdomains are not working - 2

    我已经使用Apartment设置了一个Rails5应用程序(1.2.0)和Devise(4.2.0)。由于某些DDNS问题,应用只能在app.myapp.com下访问(请注意子域app)。myapp.com重定向到app.myapp.com。我的用例是每个注册该应用的用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。用户不应限定在其子域内。基本上应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。根据Devise标准,登录页面位于app.myapp.com/users/sign_in。这就是问题开始的

  10. ruby-on-rails - 设计中的 ArgumentError::RegistrationsController#new 错误的参数数量(2 代表 0..1) - 2

    我在关注RyanbatesRailsCast的devise和omniauth(第235集-devise-and-omniauth-revised)。当我尝试使用Twitter登录时,标题中不断出现错误。defself.new_with_session(params,session)ifsession["devise.user_attributes"]new(session["devise.user_attributes"],without_protection:true)do|user|user.attributes=paramsuser.valid?end完整跟踪:C:/Ruby20

随机推荐