前言

  大家好,我是张飞洪,谢谢你阅读我的文章。

  自从土牛Halil ibrahim Kalkan的《Mastering ABP Framework》出版之后,我就开始马不停蹄进行学习阅读和翻译,目前基本保持一周两章的进度。

为什么要翻译?

  ABP的官方文档应该是比较全面了,但是有几个问题:

  1. 大部分文档中文版都不够完整和全面,目前的核心语言还是英文,这给那些想要深入学习ABP框架的同学带来困扰。
  2. Halil ibrahim Kalkan亲自写的最核心的两本《Implementing Domain Drive Design》(《实现领域驱动设计》,详见下图)、《Mastering ABP Framework》(《玩转ABP 框架》),目前也是英文版本,这两本相比较官网文档的混合编写模式,显然会更加可以近距离贴近ABP作者的真实世界和设计理念。
  3. 翻译的过程也是回顾-映证-再思考-再明确的一个迭代过程,可以不断加深自己对ABP的深入了解。
  4. 同时自己收益ABP开源,也希望能回报ABP社区。

书名叫什么

  我曾想过叫《精通ABP框架》,但是整本看完,距离精通其实还是很远,我理解的精通是能从0-1搭建ABP框架,至少熟练源码设计精髓,犹如庖丁解牛,别人看到的是牛的身体,而庖丁看到的是牛里面的骨架和纹理。

  如果直白翻译为《掌握ABP框架》、《ABP框架专家》,又感觉和整书的意境不一致,没有把整书的精髓拿捏住,因为框架是一种设计思想和理念,看不见摸不着,你怎么去掌,怎么去握呢?

  当然快速入门等之类的翻译肯定也不行,因为书还是很厚,内容很干,根本不可能走捷径。想来想去先叫《玩转ABP框架》,好比古诗词,你怎么去翻译床前明月光呢?要不要意境?先暂且这么叫吧,如果你有更好的命名方式,欢迎您提供宝贵意见。

全书简介

  大家可以浏览一下亚马逊整书目录,全书分成四个部分,十七课时,内容从简单到复杂,从整体架构到细节代码,从架构问题到最佳实践,从基础架构模块到DDD,从动态API到模块化设计到架构演化,最后还讲解了自动化测试等等,内容十分精彩,也非常全面。

  翻译是一次精神之旅,好比老牛吃草,需要咀嚼和消化再产出的过程。是典型的消费者到生产者的迭代循环模式。基本上要把书籍掰开揉碎,吃到肚子里回炉再造的一个过程。所以,翻译对个人的成长帮助很大,因为学习本身就是不断输入和输出的过程,通过输出倒逼自己不断输入,先把背包甩过墙体,再慢慢爬墙,直到翻过去为止。

全书目录

  翻译是一项苦力活,因为我既想保留原著的味道,又希望翻译后的内容是符合汉语的味道,不但在阅读顺畅,又能去除英文的部分啰嗦,可以说翻译整本书是不断输入和输出的迭代,是魔鬼细节的校对,也是措辞的反复咀嚼的过程。

  为了尊重原著,也为了对得起读者,我每翻译一章就Review两遍,有时候为了保持清醒的头脑,我一般会在第二天进行重新审查和校验,往往会发现很多语法和错别字等错误,所有的努力就是希望能回馈读者,我相信你在整个阅读过程一定能体验到我的用心。

  我的翻译方式是,翻译一章实时发布一章,一般是晚上翻译,睡一觉,第二天起来校对细节,这样确保脑袋是清醒,措辞和理解不会有大的偏颇,下面是全书目录,目前翻译了将近一半,大家可以先看看效果。【目录跳转

有了ABP,还要学其他的框架?

  我有时候在想在JAVA领域,Spring基本一统天下,新手也好,高手也罢都在学习、研究和项目实战。也就是说其实对与应用开发,Spring已经是绕不开的框架,不管是单体还是微服务都可以轻松胜任,学了Spring在JAVA开发层面,其实你可以完全不需要去学习其他的任何知识点,也能参加工作(当然不包括数据库和前端,我这里指的是JAVA语言本身)。

  那么在.NET有没有类似Spring的框架,让.NET学员学完之后也可以胜任任何.NET工作,甚至能胜任架构师的角色,我觉得对于开源的ABP vNext来说,是完全可以做到的。因为它足够简单,上手非常容易,只要入门之后持续一段时间,我们就可以不断地在实战中逐步深入,重要的是开源的信息量足够一个架构师去模仿和学习,不管内部的模块化设计理念,还是模块化安装和删除的方式,都是一个理念活生生的落地代码,看得见摸得着,甚至我有时候觉得,只要学好ABP其他的框架可学可不学,不学是因为其他的框架从综合素质来说,目前还没有看到一个框架在应用层面可以和ABP媲美(.NET领域),没有夸张地说没有之一。学是因为不管是任何开源的框架都可以被ABP吸收并蓄,只要我们自己懂得ABP的框架规则,我们的集成是分分钟的事情。  

  所以,我的结论是,如果你们公司的业务是垂直产品的,可以用ABP没问题,因为它可以从模块到单体到微服务兼容,到微服务做到快速而高效的演化;如果你们公司的业务是项目型的交付,也可以重复利用ABP的模块化来降低开发的成本;如果你们公司是外包型的项目,面对交付各种各样,ABP一样可以通过排列组合来快速交付成果。我这里不是故意夸大,也不是为了宣传而宣传,而是真的觉得这玩意儿真的是很方便,谁用谁知道。

ABP难吗?

  当然ABP入门容易,进阶困难,毕竟他是基础设施,里面有很深厚的技术深度,如果你只是停留在使用的角度,那么问题不大,可以很快入门,请相信我,对于有点.NET基础的人,可能一天就上手了,但是一旦遇到问题或者需要定制,那么你一定会遇到困难,这个时候你会迷失在碎片化的模块海洋,而且每个模块之间又有网状般的依赖关系,模块化是非常灵活的,一个解决方案你要分4层还是7层,甚至更多都是很有讲究的,因为你要深入理解DDD分层模型和业务需求。所以,当你需要深入学习的时候,你会觉得ABP不容易。

ABP存在的意义?

  问这个问题就好比问我们有了Java,为什么还要有Spring。ABP存在真正的意义是让开发人员早点下班,做一个幸福的程序员。不要觉得这个要求很低,这非常困难。因为项目从开发到运维没有一个环节是容易的。项目初期,我们会为了进度加班加点,虽然累但不感觉疲惫,因为项目一直在推进。项目后期,你不断修改代码也可以接受,因为都是你自己写的代码,你指导怎么修改。项目运维阶段,你离职了,新人一边修改你的代码一边摇头骂娘,项目开始慢慢变质。随着一波又一波的新人不断折腾和累积屎山,你的项目遍体鳞伤、伤痕累累确又无法推倒重来,代码开始慢慢腐朽。

  所有的这些都是因为团队缺乏规范,人员层次不齐,因为你没有一个行业最佳实践的地图。如果说ABP能帮助我们解决以上这些问题,那么它的价值自然不低。从事.NET开发人员如果您跳槽频繁的话,我相信你一定接手过很多遗留系统,很多系统从构建的第一天可能有了遗留系统的痕迹,所以如果我们要进行整体迁移,那就是一场噩梦,我干了10来年的.NET,真的还没见过成功的案例,要么团队能力不够,要么成本太高,要么风险太大……总之,一切问题都在第一天就定了基调。

  除了项目管理和软件工程方面,在技术方面我们一样可以从开源的ABP身上学到不少经典代码、架构设计、测试规范、最佳实践。我举一个简单的多租户的例子,如果你有在用多租户,你一定能对它的多租户印象深刻,因为你好像感觉不到多租户的存在,也许这就是多租户的优雅之处。至于DDD就更不用说了,你跟着它的规范走一遍,你对DDD会有更加深入的了解,原来我们以前一直在用的贫血模式开发就觉得自己懂得了DDD。

  ABP的意义真的不是三言两语能说的完的,毕竟它自己也不断与时俱进中,它本身从开源身上吸收的能量也在间接展示给我们看。我到现在都觉得自己不能精通ABP,因为它上手容易,精通真的不是那么容易,因为这意味着你曾经花费很大的时间从0到1重构了一次ABP,否则你怎么敢说自己精通ABP呢?

ABP会臃肿吗?

  我经常听到有些人会说ABP很臃肿,我不知道他是指的哪一方面,如果只是泛泛而谈,我感觉是很不专业的,甚至我可以说对方根本没有深入研究过ABP。是Dll文件过多,还是启动很慢,还是吃内存,除非你能拿出证据来。

真正的臃肿是什么?

  模块化是根据业务或者功能的一种拆分,目的是为了重用。拆分多了,你可能学习了会有点困难,因为那么多块块,如果你不够熟悉,身边没有一份说明书,你根本就无从下手。所以,那不是叫臃肿,我们有人会评价乐高很臃肿吗?相反,我们会觉得乐高很强大,很灵活,可以实现各种可能,除非你缺乏想象力,不要用自己想象力的缺乏来说乐高是臃肿的。

  管理复杂系统必然要求我们对系统进行分类拆分,否则一块打单体岂不是更加臃肿?我理解的臃肿是,代码耦合度非常高,进行二次开发很困难,剪不断理还乱。另外开发完了,要进行运维修改很困难,甚至出现改到后面,改不动只能从新推倒重来,在旧业务online情况下,新框架要重新开发,变开飞机变换引擎,中间还要做数据库迁移,对于一般的小公司只是非常危险的,严重的会直接宣告项目死刑,因为改不动了,然后新进的人员也只想贴膏药,公司必然存在离职率高的问题。所以,我的结论是代码耦合高是臃肿,二开困难是臃肿,运维低效是臃肿。当然臃肿还有很多内涵,比如编译缓慢、部署麻烦、性能低下等等。

  我像请教那些说ABP臃肿的人,你到底在说什么?模块化后,团队各自编译会缓慢吗?模块化后,模块可以单独部署也可以集成部署是臃肿吗?你使用ABP跑功能会很慢吗,所有的模块都在启动时候就预先加载到我们的内存里了,哪儿慢了?无非多耗费一点内存,多用一点空间换取的不是更快的性能是什么?

  所以,请那些说ABP臃肿的人,不要泛泛而谈,请你在臃肿前面加个定语,然后用真实的案例来和大家交流。

结尾

  因为ABP很优秀,所以我花了很大的精力对ABP进行了深耕,不敢说精通,但是不止一次在深夜探索ABP源码,也阅读了许许多多的文档资料,ABP入门真的很容易,但是如果你一想进一步窥探它的神秘面纱,也许我的这个系列翻译应该可以帮你更快、更深入地学习它,祝你学有所得,学得快乐。

  如果你也在学习ABP,也有遇到问题需要讨论,欢迎你加入我们的Q群:

版权问题

  因为我不知道如何对接版权问题,所以目前对原著会有版权上的问题,这块目前还在了解当中,如果有侵犯到版权问题,请立刻和我联系删除。

翻译《Mastering ABP Framework》的更多相关文章

  1. 《OVN Logical Flows and ovn-trace》翻译

    在本篇文章中,我将解释什么是Logical Flow以及如何使用ovn-trace去更好地理解它们.同时,我也会用一些例子来解释,为什么使用Logical Flow这种抽象模型能让新特性的添加变得出乎 ...

  2. OVN实战---《The OVN Load Balancer》翻译

    Overview 基于前面几篇文章的基础之上,我们接下来将要探索OVN中的load balancingz这一特性.但是在开始之前,我们先来回顾一下上一个lab中创建好的拓扑结构. The lab ne ...

  3. OVN实战---《The OVN Gateway Router》翻译

    Overview 在本文中我将在前文的基础上添加一个OVN gateway router.gateway router将使得lab network能访问我们的overlay network The l ...

  4. ovs ovn 学习资料

    0.A Primer on OVN http://blog.spinhirne.com/2016/09/a-primer-on-ovn.html 1.Open Virtual Networking W ...

  5. OVN实战---《OVN and Containers》翻译

    Overview 在本篇文章中,我们要讨论的是OVN和容器的集成.到本次实验中,我们将会创建一个包含有一对容器的“虚拟机”,这些容器会直接和OVN logical switch相连,并且可以供逻辑网络 ...

  6. OVN实战---《A Primer on OVN》翻译

    overview 在本文中,我们将在三个host之间创建一个简单的二层overlay network.首先,我们来简单看一下,整个系统是怎么工作的.OVN基于分布式的control plane,其中各 ...

  7. OVN架构翻译

    概述 ovn-controller是OVN在虚拟机上的agent,北向连接OVN的南向数据库,学习OVN的配置和状态,并使用虚拟机的状态来填充PN表以及Binding表的Chassis列:南向连接op ...

  8. OVN架构

    原文地址 OVN架构 1.简介 OVN,即Open Virtual Network,是一个支持虚拟网络抽象的系统. OVN补充了OVS的现有功能,增加了对虚拟网络抽象的原生(native)支持,比如虚 ...

  9. 如何借助 OVN 来提高 OVS 在云计算环境中的性能

    众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...

  10. OVN入门

    参考链接 如何借助 OVN 来提高 OVS 在云计算环境中的性能 OVN简介 Open vSwitch Documentation OVSDB介绍及在OpenDaylight中的调用 OpenDayl ...

随机推荐

  1. 如何使用docker制作开发集成环境

    1. 编写最基本的Dockerfile 内容:touch 一个Dockerfile FROM ubuntu 2. 创建基本的docker镜像 docker build  -t ubuntu:v1 . ...

  2. Java 线程池中 submit() 和 execute()方法有什么区别?

    两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在 Executor 接口中. 而 submit()方法可以返回持有计算结果的 Future 对象,它定义在 Exe ...

  3. java-流式编程

    流式编程 流的一个核心好处是,它使得程序更加短小并且更易理解. public class Demo1 { public static void main(String[] args) { new Ra ...

  4. GC日志浅析

    //java 开发环境,使用HotSpot的虚拟机,64位,windows 开发环境 Java HotSpot(TM) 64-Bit Server VM (25.151-b12) for window ...

  5. spark 写csv文件出现乱码 以及写文件读文件总结

    参考链接:https://blog.csdn.net/qq_56870570/article/details/118492373 result_with_newipad.write.mode(&quo ...

  6. Leetcode刷题之矩阵中的指针用法

    矩阵中的指针用法 1 快慢指针 ​ Leetcode27移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度.不要使用额外的数组 ...

  7. 攻防世界supersqli

    supersqli 补充知识点 rename 命令格式: rename table 原表名 to 新表名 例如,在表myclass名字更改为youclass: mysql>rename tabl ...

  8. docker 容器简单使用

    文章目录 docker简介 docker容器简单使用 1.HelloWorld 2.运行交互式的容器 3.启动容器(后台模式) 安装docker容器的博文有很多这里就不做过多赘述了,另外如果不想安装d ...

  9. Altium Designer 原理图的绘制前导

    元件库.封装库设计 部分元器件厂商或者经销商不提供元件库和封装库,只给了元器件尺寸图,所以需要自行设计元件库文件或是封装库文件 元件库设计: 新建  .SchLib 文件:File  ->  N ...

  10. 技能篇:linux服务性能问题排查及jvm调优思路

    只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求.最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的.如果你是负责中间件或 ...