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!