DDD实战(1):从需求到代码实现生鲜电商系统
缘起
目标读者和预期收获
精通java开发,尤其需要熟悉spring-boot的开发; 精通1~2个以上关系数据库和非关系数据库技术,如:mysql/oracle、redis/mongodb等; 有过3年以上应用软件的实际coding经验、有过带领3人以上程序员小组的开发经验; 对常见的设计模式比较熟悉,在实际项目的coding中 ,至少熟练使用过3种以上设计模式; 对架构分析模式有所了解,在实际需求分析中,至少使用过1种以上分析模式; 最后一条,也是最关键的,作为工程师,对学习新技术新方法有足够的动力,认可“加班就应该加在提升自身的稀缺性上”(这个理念来自于刘润老师)的理念,迫切希望成为架构师、或更优秀的架构师,有志于朝着技术线的资深专家(非管理线)发展;
能够理解DDD从需求分析、到架构设计、到编码实现的整个过程,以及其中的工作方法和实用技巧。我们这里所说的 “理解” ,指的是你能够在自己的团队内部分享、培训、甚至引导团队在项目中使用DDD。 本专题还将实实在在建立一个全开源的“群买菜”生鲜电商系统,这个电商系统你将可以通过github或gitee获得全部源代码。你可以将这些源代码用于自己的任何用途,只需要遵守Apache开源许可证协议即可。
注(内容会随着专题进展而逐步完善):
DDD能解决什么,不能解决什么?
频繁的业务需求变更导致对系统稳定性的影响不可控 。需求修改频繁,而感觉每次修改涉及的范围千头万绪,不透明、不可控,经常因为需求给原来的功能带来不可预测的BUG。这个问题,其实可能代表着两类需求(视软件产品化程度而不同): 对于项目定制化软件,希望随着业务的发展,业务需求变更只会引起可控的、小范围的变更;
对于产品化程度较高的软件,希望随着软件产品的发展,每个产品组件可相对独立地演进;
30人以上大项目团队职责划分很纠结。 项目很大,团队怎么划分,感觉没有科学依据,凭直觉划分后,总发现一些不可控的耦合或重复开发;
微服务怎么切分很纠结。 云原生技术的发展,微服务切分的粒度无法把控。太粗没有意义,太细了又导致运维复杂失控;
DDD不能帮助团队决策如何更好的 技术栈 ;
DDD不能解决系统的 性能相关 的瓶颈问题;
DDD几乎 不涉及前端UI的设计 方面;
DDD不能帮助产品经理提升 产品设计水平 (虽然产品经理了解点DDD也有帮助),更不能代替产品经理做产品设计。因为产品设计更多是牵涉到心理、商业等非工程化思维,而DDD仅能解决软件在工程化方面的问题;
DDD不会手把手的教你如何提升 需求分析相关软技能 ,包括:如何和客户沟通需求、如何画业务流程图、如何识别业务用例、如何学习新的业务知识等。虽然它确实给出了一套相对有参考价值的“硬性”方法框架,但未给出任何关于个人如何提升这些“软”性技能的实际建议,它假设你自己去建立和发展这些技能;
DDD不会手把手的教你如何提升 软件架构设计相关基础知识和软技能 ,包括:如何区分哪些逻辑应该放前端实现、哪些放后端实现、前端目前主流技术框架有哪些、后端主要开发技术栈有哪些等等。虽然它确实有一套相对有参考价值的“硬性”方法框架,但同样未给出任何关于个人如何提升这些“软性”基础知识的实际建议,它假设你自己去建立和发展这些技能;
DDD不能解决程序员个人自身的 代码质量和规范性问题。 虽然它确实能够很大程度上解决代码目录结构、模块划分的规范性问题,但解决不了程序员自身编程水平问题;
能用一句话解释DDD核心理念吗?
本专题解答什么?
本专题编写风格
我会尽可能的将 理论体系浓缩和简化 ; 我会结合 实际的软件实现案例 (并且该软件的开源代码实现一定是可运行的)来讲解。在案例中贯穿DDD相关的方法、原则和技巧,而几乎很少大篇幅的介绍理论本身; 我可能会写得比较啰嗦,尤其是一些技术实现细节方面比较抠,希望您能够有耐心。因为我自己是个很笨的人,学习一个东西的速度很慢,而且我一向希望自己能够“ 但求甚解 ”,而不是“不求甚解”。我个人一直秉承“ 慢就是快 ”的理念,所以还请您稍微忍受这一点; 我会每周更新一篇,整个专题可能会有20~30篇。除了第一篇的大量没有太多技术含量的“废话”外,后面的每一篇,可能需要您 每周花费2小时 左右去阅读(1小时)和理解(1小时)。所以,还是上一句话说的:需要您有点耐心。