DDD(Domain Driven Design 领域驱动设计)本质上是管理和维护软件复杂性的一种方法,设计作为软件工程领域不可或缺的一个环节,其本身是重要的,但并不是全部,要想做出真正能用的产品,软件工程领域的其他要素都是不可或缺的。
在领域设计之初,要牢记"软件作为一个产品,其优雅来源于系统简约的设计;软件实现的过程本身是一个工程过程,它的的完整依赖于工程理论及工艺流程的完整"。与其他全部设计方式一样,DDD仅仅是一种可行的手段,软件及其工程的本质,依然是对软件自身概念完整性的把握以及在流程中每一个环节上的一丝不苟。
在这里谨慎的提醒那些对于软件及工程的某些侧面倍加推崇的人们,在软件开发领域从没出现过万能的良药,即使某些技术或领域曾经倍受推崇,甚至短暂的大放异彩,但到目前为止,还没有任何单一的手段能够彻底的解决软件开发领域的根本问题,这是由软件的本质与人的素质之间的根本矛盾决定的,多年前,我看到《人月神话》中关于这一问题的探究,一直在反复验证,至今依然没有发现反例,姑且将此作为软件工程领域的第一定律,写在开篇之初,用以时时自省。
领域是在计算世界中基于自然属性的一种提炼和抽象,是现实世界的另一种表达方式。领域模型是现实世界在计算领域的完整映射而不是一个抽象简化或残缺的版本, 领域是完整的,所以由领域对象构成的系统自然也应当是完整的。
在抽象到计算世界的领域模型中,从工程的角度考虑, 由于受到物理条件的约束,我们不应当在有限的计算资源中,去过多关注那些目前的计算资源所无法承受的领域对象, 我们更应当关注的是可计算的领域子集以及这些子集间的交互影响。也就是说,受计算资源的限制,我们应当严格控制每个领域自身对计算资源的需要,并对必要的领域间交互进行仔细的规划,避免开放式的领域和无限制交互充斥在系统中。每一个领域模型的设计都必须遵循领域自身的约束,和高效交互的要求。
关于领域的交互与边界。
1. 软件和人的组织形式。在数字化办公及管理流程出现之前,在人类社会已经存在了大量优秀的管理案例,可见软件对于管理和自动化流程而言,并不是必须的,其本质上仅仅是以一种新的介质来实现人们曾经实现的各种交互过程,这个过程中,有些影响交互的次要问题的解决,推动了部分新的沟通形式及管理形式的兴起,但软件体系结构最终反映的是软件过程的组织形式这一定律依然有效。因此,在软件工程领域,想要做出优秀的软件,首先应解决的是团队的组织形式及沟通方式等影响软件概念完整性的主要问题。团队的组织形式和沟通方式应持续的向更有益于解决根本问题的形式逐步改进和优化。从长期来讲,团队组织的整体优化和过程改进是所有工作的重中之重。软件本质上是软件团队组织形式的一种反映。在所有的软件工程过程中,人及人的组织形式几乎代表了一切,一个优秀的软件本身就是软件设计师哲学的现实中的体现。
2. 软件实现中的一些独特的约束。软件作为一种独特的形式,其自身有其独特的约束,比如耦合性的约束,为了保持软件各个领域自身的独立性和领域间交互的简洁,我们通常要避免多维度的领域间对等交互,这与现实世界在本质上是一致的,但在软件作为工程的组织形式上,需要一些来自架构上的技巧。这应当是属于程序员相对于其他领域的工程师所独有的荣耀。同样,在这里我们需要前人留下的杰出的成果,团队成员集体的智慧和来自领域专家经验。
关于领域模型的实现的一些思路。
1. 领域的设计总结成一句话:山的那一边,依然还是山。在完整的领域建模中不可以出现开放式领域,也就是说,系统的每一个部分,都应当是自我聚合的,每当我们的系统中出现开放式领域,当工程放大到一定规模,整个系统就会在领域中未收敛的部分最终崩溃。这听起来有些悲观,但也正是这种残酷的现实和严苛的要求推动了设计师们不断的寻求自我的完整和命运的救赎,在我身边的人中已经发现了部分人走在自我救赎的路上,但依然没有到达终点。
在这里要强调一次,基于领域的工程应当是自我封闭的,领域对象的集合必须依赖于自身的驱动而非外部的触发来实现自我状态的迁移。进而推导出以下结论:作为用户和设计者的人,也必须纳入系统,视为其不可或缺的一部分,并定义其对交互对象驱动的规则,规格和范围。这也体现了,软件是介质,人和思想的整体的理念。可见领域驱动设计之所以成为一种可行的方案,是因为其自身在其所承担的职责范围内,暗合了标准软件设计方法所应具备的全部要素,这也反向证明了领域驱动设计自身的科学性和完整性。因此,在设计的阶段,将全部要素纳入领域系统的可控范围,对设计进行持续迭代,是领域驱动过程的第一要义,它保证了领域驱动设计过程及其结果在概念工艺上的完整性。
2. 领域设计第二要素:交织在山峦间的是那无尽的碧水。基于分层隔离的设计思路,领域不应当对领域的外部进行干涉,所以我们需要一弯碧水,作为领域间的纽带,连接在不同的领域之间。山间的景色因地制宜,因时而不同,水涨潮落,山间景色自应不同。横亘成岭,侧目成峰,仅仅是视角和心境,便带来诸般的变化,水有回环婉转,山有岁岁枯荣,一切都在变化着,包括我们游山戏水的心境。在变化中拥抱变化,跟随自然,心随风而动,这是领域交互的动力。
3. 一切离不开的是无时不在的体验。领域随性而动,领域间的交互也因时,因地,因人,因物而异。懵懂的青年男女因偶然的邂逅,就出现了剪不断理还乱的彼此胶着,他们的生活因此而不断的擦出各种火花;久恋的女友终于熬成了孩子她妈,于是日子里就多了几个本本,少了几张银行卡。终于有一天,马拉松跑道的情侣终于散尽了曾经的热情,眷恋不再,面对新的诱惑,他和她都难再纠缠,如奔跑着的阿甘,蓦然回首,于是就有了称为分手的仪式,也有了两份曾经的紧密相连而再分彼此,系统的设计,应当体现属于自然的亲近远疏。
编程,其实亦是在谱写人生。做事先做人,修行先修心。正如当前社会的纷扰混乱体现的是众人为钱所蒙蔽的双眼。放弃对单一要素的执着,让生活返回自然,是编程的一种自然而然的结果,是属于我作为程序员,来自职业的由衷的快乐。
What you do not understand, you do not possess.
And what is the most important:“Passing the Word!"