翻译《Mastering ABP Framework》
前言
大家好,我是张飞洪,谢谢你阅读我的文章。
自从土牛Halil ibrahim Kalkan的《Mastering ABP Framework》出版之后,我就开始马不停蹄进行学习阅读和翻译,目前基本保持一周两章的进度。
为什么要翻译?
ABP的官方文档应该是比较全面了,但是有几个问题:
- 大部分文档中文版都不够完整和全面,目前的核心语言还是英文,这给那些想要深入学习ABP框架的同学带来困扰。
- Halil ibrahim Kalkan亲自写的最核心的两本《Implementing Domain Drive Design》(《实现领域驱动设计》,详见下图)、《Mastering ABP Framework》(《玩转ABP 框架》),目前也是英文版本,这两本相比较官网文档的混合编写模式,显然会更加可以近距离贴近ABP作者的真实世界和设计理念。
- 翻译的过程也是回顾-映证-再思考-再明确的一个迭代过程,可以不断加深自己对ABP的深入了解。
- 同时自己收益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》的更多相关文章
- 《OVN Logical Flows and ovn-trace》翻译
在本篇文章中,我将解释什么是Logical Flow以及如何使用ovn-trace去更好地理解它们.同时,我也会用一些例子来解释,为什么使用Logical Flow这种抽象模型能让新特性的添加变得出乎 ...
- OVN实战---《The OVN Load Balancer》翻译
Overview 基于前面几篇文章的基础之上,我们接下来将要探索OVN中的load balancingz这一特性.但是在开始之前,我们先来回顾一下上一个lab中创建好的拓扑结构. The lab ne ...
- OVN实战---《The OVN Gateway Router》翻译
Overview 在本文中我将在前文的基础上添加一个OVN gateway router.gateway router将使得lab network能访问我们的overlay network The l ...
- ovs ovn 学习资料
0.A Primer on OVN http://blog.spinhirne.com/2016/09/a-primer-on-ovn.html 1.Open Virtual Networking W ...
- OVN实战---《OVN and Containers》翻译
Overview 在本篇文章中,我们要讨论的是OVN和容器的集成.到本次实验中,我们将会创建一个包含有一对容器的“虚拟机”,这些容器会直接和OVN logical switch相连,并且可以供逻辑网络 ...
- OVN实战---《A Primer on OVN》翻译
overview 在本文中,我们将在三个host之间创建一个简单的二层overlay network.首先,我们来简单看一下,整个系统是怎么工作的.OVN基于分布式的control plane,其中各 ...
- OVN架构翻译
概述 ovn-controller是OVN在虚拟机上的agent,北向连接OVN的南向数据库,学习OVN的配置和状态,并使用虚拟机的状态来填充PN表以及Binding表的Chassis列:南向连接op ...
- OVN架构
原文地址 OVN架构 1.简介 OVN,即Open Virtual Network,是一个支持虚拟网络抽象的系统. OVN补充了OVS的现有功能,增加了对虚拟网络抽象的原生(native)支持,比如虚 ...
- 如何借助 OVN 来提高 OVS 在云计算环境中的性能
众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...
- OVN入门
参考链接 如何借助 OVN 来提高 OVS 在云计算环境中的性能 OVN简介 Open vSwitch Documentation OVSDB介绍及在OpenDaylight中的调用 OpenDayl ...
随机推荐
- 如何使用docker制作开发集成环境
1. 编写最基本的Dockerfile 内容:touch 一个Dockerfile FROM ubuntu 2. 创建基本的docker镜像 docker build -t ubuntu:v1 . ...
- Java 线程池中 submit() 和 execute()方法有什么区别?
两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在 Executor 接口中. 而 submit()方法可以返回持有计算结果的 Future 对象,它定义在 Exe ...
- java-流式编程
流式编程 流的一个核心好处是,它使得程序更加短小并且更易理解. public class Demo1 { public static void main(String[] args) { new Ra ...
- GC日志浅析
//java 开发环境,使用HotSpot的虚拟机,64位,windows 开发环境 Java HotSpot(TM) 64-Bit Server VM (25.151-b12) for window ...
- spark 写csv文件出现乱码 以及写文件读文件总结
参考链接:https://blog.csdn.net/qq_56870570/article/details/118492373 result_with_newipad.write.mode(&quo ...
- Leetcode刷题之矩阵中的指针用法
矩阵中的指针用法 1 快慢指针 Leetcode27移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度.不要使用额外的数组 ...
- 攻防世界supersqli
supersqli 补充知识点 rename 命令格式: rename table 原表名 to 新表名 例如,在表myclass名字更改为youclass: mysql>rename tabl ...
- docker 容器简单使用
文章目录 docker简介 docker容器简单使用 1.HelloWorld 2.运行交互式的容器 3.启动容器(后台模式) 安装docker容器的博文有很多这里就不做过多赘述了,另外如果不想安装d ...
- Altium Designer 原理图的绘制前导
元件库.封装库设计 部分元器件厂商或者经销商不提供元件库和封装库,只给了元器件尺寸图,所以需要自行设计元件库文件或是封装库文件 元件库设计: 新建 .SchLib 文件:File -> N ...
- 技能篇:linux服务性能问题排查及jvm调优思路
只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求.最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的.如果你是负责中间件或 ...