Hacker News热文:请停止学习框架,学习领域驱动设计(DDD)(获500个点赞)

在 Hacker News 上获得接近 500 个点赞的一篇名为《停止学习框架》的文章称:

我们是程序员,每天都在了解最新的技术,每天都在学习编程语言、框架和库,因为我们知道的现代编程工具越多越好,对吧?

不停地追随 Angular、React、Vue、Riot、Ember、Knockout 的脚步还真是一件有意思的事情呢。(译注:反话)但这其实是在浪费时间!

时间是人类最宝贵的资源。时间是有限的、不可再生的,你可以用钱买任何东西,却买不了时间。技术,就像时尚,在以光速在变化着。为了赶上它,我们需要跑的非常快。但是这个跑道上没有终点,所以没有赢家。

将你的黄金时间用于学习通用技能,那些不会过时的技能。

  • 不要学习微服务框架,学习演进式架构(Evolutionary Architecture)。

  • 不要学习新的编程语言,学习代码整洁之道、设计模式、领域驱动设计(DDD)

  • 不要学习 LeSS 和规模化敏捷框架(SAFe),学习精益生产原则。

  • 不要学习 Hystrix,学习容错模式。

  • 不要学习 Docker,学成持续交付。

  • 不要学习 Angular、React 和 Vue,学习 Web、HTTP 和 REST。

为什么要使用领域驱动设计?

从Eric Evans的《领域驱动设计:软件核心复杂性应对之道》一书的书名就可以看出这一方法论是为了解决软件核心复杂性的。也就是说软件业务越来越复杂了,领域驱动设计可以让事情变得简单。而实际情况是:领域驱动设计的门槛很高,没有很深厚的面向对象编码能力几乎不可能实践成功。

这一说法是否自相矛盾呢?Martin Fowler在PoEAA一书中给了一个有力的解释:

我们把三层架构等除了领域驱动之外的架构方式都可以归纳为以数据为中心的架构方式,在图中是黑色的粗实线;领域驱动设计在图中是绿色的粗实线。

  • 当软件在开发初期,以数据驱动的架构方式非常容易上手,但是随着业务的增长和项目的推进,软件开发和维护难度急剧升高。

  • 领域驱动设计则在项目初期就处在一个比较难以上手的位置,但是随着业务的增长和项目的推进,软件开发和维护难度平滑上升。

这幅图形象的解释了领域驱动设计和传统的软件架构模式两者在软件开发过程中解决复杂性之间的差异。

领域驱动设计的核心是什么?

战略设计:

说到战略设计,我们要站在一个比较高的视角来看待这个问题,战略设计要解决的就是某个领域的问题,所以战略设计时,我们要构建好领域模型,保证我们的大方向是不会错的

战略设计主要从业务视角出发,建立业务领域模型,划分领域边界,建立通用语言的限界上下文,限界上下文可以作为微服务设计的参考边界。

以数据为中心的架构模式

战术设计 :

战术设计则是要求我们从业务模型转向微服务落地 我们会将领域模型中的领域对象与代码模型中的代码对象建立映射关系,将业务架构和系统架构进行绑定。当我们去响应业务变化调整业务架构和领域模型时,系统架构也会同时发生调整,并同步建立新的映射关系。也有演进式架构的含义在里面。

说到这里,大家可能对DDD有了一个粗略的,大体的认识,我们可以理解到,DDD能够帮助我们更好的在微服务的架构中进行合理的拆分,由于DDD要求我们建立标准的业务领域模型,所以DDD也能够很好地帮助我们设计企业的中台,DDD是一把利器,帮助我们解决架构中遇到的问题和挑战。

领域模型

DDD的优势及未来

DDD是一套完整而系统的设计方法,并非一种架构。它能带给你从战略设计到战术设计的标准设计过程,使得你的设计思路能够更加清晰,设计过程更加规范,有助于提高技术人的架构设计能力。无论是在新项目中设计微服务,还是将系统从单体架构演进到微服务,DDD 都大有助力。

倘若能一直保持DDD的开放性,保持DDD的独立性,我觉得在未来的五年乃至十年,DDD仍将焕发生命力,只是它的面貌会更加多姿多彩,甚至超过Eric Evans对DDD的原初定义。毕竟,软件系统的核心只有两个:领域和算法。

为了帮助大家更快的了解和熟悉DDD驱动领域设计,这里给大家推荐一门高级架构师Zilor的在线直播课程~从原理到代码实战,全程干货,带你完整走一遍 DDD+ 微服务设计的全流程,重点讲解其中的技术要点、设计原则和注意事项。希望能给对微服务、中台等分布式架构感兴趣的朋友,带来实质性帮助~

如扫码添加失败

请加微信号:ruanmounetzry

超值福利免费送!!

扫码获取以上福利

仅限前200名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#跨平台开源项目实战(WPF/Android/IOS/Blazor)

个人介绍由于本人从业WPF开发, 考虑到国内的WPF开发环境并不是很好, 资源少、项目案例少, 所以导致很多初学者就已经断了念头。所以我作为WPF的从业者, 就在2019年,开始了发布自己的WPF相关的免费教学视频。发布开源的项目实践, WPF的基础视频、项目实践视频, 包括WPF UI设计视…

[开源] .Net 使用 ORM 访问 神舟通用数据库(神通)

前言天津神舟通用数据技术有限公司(简称“神舟通用公司”),隶属于中国航天科技集团(CASC)。是国内从事数据库、大数据解决方案和数据挖掘分析产品研发的专业公司。公司获得了国家核高基科技重大专项重点支持&#xff0…

在 Xunit 中使用依赖注入

在 Xunit 中使用依赖注入Intro之前写过一篇 xunit 的依赖注入相关的文章,但是实际使用起来不是那么方便今天介绍一个基于xunit和微软依赖注入框架的“真正”的依赖注入使用方式 ——— Xunit.DependencyInjection, 来自大师的作品,让你在测试代码里使用依…

C#由转换二进制所引起的思考,了解下?

【导读】最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时,非常开心,收到再一次连任MVP的邮件&#xff0c…

.Net Core In Docker 在容器内编译并发布

Docker可以说是现在微服务,DevOps的基础,咱们.Net Core自然也得上Docker。.Net Core发布到Docker容器的教程网上也有不少,但是今天还是想来写一写。你搜.Net core程序发布到Docker网上一般常见的有两种方案:1、在本地编译成Dll文件…

带你深入探究云原生时代的分布式操作系统 Kubernetes

过去几年,以 docker、kubernetes 为代表的容器技术已发展为一项通用技术,BAT、滴滴、京东、头条等大厂,都争相把容器和 k8s 项目作为技术重心,试图“放长线钓大鱼”。就说腾讯吧,目前基本所有业务都跑在云上&#xff0…

C# 9.0 新特性之 Lambda 弃元参数

阅读本文大概需要不到 1 分钟。弃元(Discards) 是在 C# 7.0 的时候开始支持的,它是一种人为丢弃不使用的临时虚拟变量。语法上它是用来赋值的,但它却不被分配存储空间,即没有值,所以不能从中读取值。弃元用…

应用交付老兵眼中的Envoy, 云原生时代下的思考

Envoy 是云原生时代的明星,其本质是反向代理负载均衡类软件,领域上归于应用交付,那么作为应用交付领域的老兵如何看待 Envoy,Envoy 又引发了哪些关于传统应用交付领域的思考?关于作者林静,F5 软件方向解决方…

asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!

背景最近一段时间,陆陆续续的把手里头项目都迁移到了k8s中,期间遇到很多的坑,并且也学到了许多k8s的知识(从0-1),大家都知道k8s中的一大特性是自动扩容,对此结合自己的业务发现很是有“用武之地…

如何优雅做系统错误提示?

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「149」篇原创敬上大家好,我是Z哥。不管是日常的工作中还是生活中,我们每天会用到很多软件系统。不知道你有没有过这样的感受,当…

搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目

前言伴随着随着微服务概念的不断盛行,与之对应的各种解决方案也层出不穷。这毕竟是一个信息大爆发的时代,各种编程语言大行其道,各有各的优势。但是有一点未曾改变,那就是他们服务的方式,工作的时候各司其职&#xff0…

如何在ASP.NET Core中集成ElasticSearch

本文来自:https://www.blexin.com/en-US/Article/Blog/How-to-integrate-ElasticSearch-in-ASPNET-Core-70图片我敢打赌,您肯定会被要求向Web应用程序中添加高级搜索功能,而且通常是全文的类似Google的搜索。在技术电子商务的开发过程中&…

了解下C#由转换二进制所引起的思考

【导读】最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时,非常开心,收到再一次连任MVP的邮件&#xff0c…

如何利用.NETCore向Azure EventHubs准实时批量发送数据?

最近在做一个基于Azure云的物联网分析项目:.netcore采集程序向Azure事件中心(EventHubs)发送数据,通过Azure EventHubs Capture转储到Azure BlogStorage,供数据科学团队分析。为什么使用Azure事件中心?Azure事件中心是一种Azure上…

C++实现二叉树

代码如下: #include<iostream> #include <queue> #include <stack> using namespace std;class BinTree { private:class TreeNode{public:int data;TreeNode *left;TreeNode *right;TreeNode ():data(0),left(nullptr),right(nullptr){}TreeNode(int e):da…

MySql :Could not create connection to database server.

错误&#xff1a; Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:Error querying database. Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. The error …

Vue 3拖更,尤雨溪介绍最新进展

Vue.js 作者尤雨溪近日介绍了 Vue 3 的最新进展。尤雨溪表示&#xff0c;由于在 Vue 3 上花费的大部分时间都投入到了设计和构建稳定的内核上&#xff0c;不过要让整个框架处于"ready"状态&#xff0c;不仅仅是内核的问题&#xff0c;还需要有兼容版本的支持库 &…

Mysql@和@@符号的详细使用说明

一、概述 是用户变量&#xff0c;是系统变量。 二、使用语法及实践 用户自定义变量 1、用户定义变量语法 SET var_name expr [, var_name expr] 如&#xff1a;set t1 100; 2、获取用户定义变量值方式&#xff0c;如&#xff1a; select t1 from dual; 如下图 系统变…

探讨NET Core数据进行3DES加密或解密弱密钥问题

【导读】之前写过一篇《探讨.NET Core数据进行3DES加密和解密问题》&#xff0c;最近看到有人提出弱密钥问题&#xff0c;换个强密钥不就完了吗&#xff0c;猜测可能是与第三方对接导致很无奈不能更换密钥&#xff0c;所以产生本文解决.NET Core中3DES弱密钥问题&#xff0c;写…

C++实现表达式树

代码如下: #include <iostream> #include <string> #include <stack> #include <queue> using namespace std;class Tree { private:class Node{public:char val;Node * left;Node *right;Node(char val):val(val),left(nullptr),right(nullptr){}Nod…