当前位置: 首页 > 编程日记 > 正文

InfoQ趋势报告:架构和设计领域技术演变详解

本文概述了我们对当前“架构和设计”领域的看法,这个领域侧重于基础设施模式、技术框架模式的实现,以及软件架构师必须掌握的设计流程和技能。

关键要点:

  • 我们看到了“演化式架构”设计需求的增长,这种架构建立在可替换性设计和关注“胶水”组件的基础之上。演化式架构支持功能性和跨功能性需求和约束的未来变化。

  • “微服务”架构可能会进入晚期大众阶段,但与“正确设计分布式系统”相关的主题以及反应式和容错式设计将越来越靠近采用曲线。

  • 我们预测有些架构主题永远不会转移到早期大众或晚期大众阶段,但它们当中有一些高效的针对特定用例的模式,如基于事件溯源/CQRS或基于Actor模型的系统。

  • 我们看到“架构师”这个角色越来越多地偏向于技术领导力、架构模式识别和框架意识以及横切关注点设计。

  • 虽然我们认为“serverless”这个术语有点含糊不清,但我们很欣赏serverless将重点放在设计事件驱动的系统以及自动消除某些平台问题的可能性上。

\"\"

InfoQ和QCon都关注处于“创新者、早期采用者和早期大众”阶段的主题。我们尝试找出符合Geoffrey Moore所谓的早期市场的想法。早期市场“客户群由技术爱好者和有远见的人组成,他们希望走在机遇前面,解决迫在眉睫的问题”。我们也在寻找可能会“跨越鸿沟”以便得到更广泛采用的想法。值得一提的是,技术在采用曲线上的确切位置可能会有所不同。例如,湾区公司目前广泛采用微服务架构,但在其他地方可能不是这种情况,而且对他们来说采用微服务也许不太合适。

本文概述了我们对当前“架构和设计”领域的看法,这个领域侧重于基础设施模式、技术框架模式的实现,以及软件架构师必须掌握的设计流程和技能。

从上次评审这个主题以来发生的显著变化是“微服务”已进入到后期大众。同时,根据我们内部的讨论,与“正确设计分布式系统”相关的主题以及反应式和容错式设计离采用曲线已经不远了。在Gartner炒作周期中,微服务可能正在接近“幻灭低谷”的底部。

我们预测,有些架构主题永远不会沿着采用曲线走向早期大众或晚期大众,但它们当中包含了几种高效的架构模式——例如基于事件溯源/CQRS或基于Actor模型的系统——可以为某些组织和业务问题提供高效的解决方案。

虽然我们认为“serverless”这个术语有点含糊不清,但我们很欣赏serverless将重点放在设计模块化、事件驱动的系统以及自动化一些底层操作平台的可能性上。我们还看到了围绕演化式架构的讨论,演化式架构将为需求和约束的未来变化提供支持

除了技术技能(如架构模式识别和框架意识)和处理横切关注点设计的能力,我们看到“架构师”这个角色正在变得更加专注于软技能,例如技术领导力

下图是2018年下半年的趋势图,2019版位于文章的开头。

\"\"

以下是InfoQ的三位架构和设计(AD)主题编辑之间的内部聊天记录(内容经过轻微的编辑),为图中的技术定位提供了更多相关信息。

Daniel Bryant,独立技术顾问、Datawire产品架构师、InfoQ新闻经理:

我认为HTTP2将进入早期采用者阶段,而HTTP3则进入创新者阶段。GraphQL(可能也包括gRPC)可能会进入早期采用者阶段(或创新者?)。我认为混沌工程应该加入DevOps的行列。微服务进入晚期大众,BDD、DDD和TDD也是。

我很想看到“演化式架构”出现在某个地方——可能是早期采用者?那么“架构师即技术领导者”(强调角色的非技术演变)呢?

我很想听听你们的想法,我们是否需要移动、添加或删除某些主题?

Jan Stenberg,IT顾问,在.Net/C#和JVM/Java方面拥有超过25年的经验:

我认为AD在某种程度上与InfoQ报道的其他主题不同。

在AD方面,我们没有新的或更新的架构常规基础。相反,由于新的工具、框架或智能架构的出现,已有的想法会再次流行起来,并且可能被包装和品牌化。

有一些领域可以被纳入到两个队列中。从高层面来看,它们可以被纳入到AD中,而技术性部分则应该被纳入到另一个队列。我认为serverless就是这样的一个例子,从高层面来看,它是AD的一个重要领域,而技术性部分则属于云队列。微前端和类似的技术则是另外一个例子,它应该属于AD还是HTML5和JavaScript?

我认为有一些领域或架构永远不会出现在早期大众或晚期大众阶段,但它们当中却有一些我最喜欢的架构,比如基于事件溯源/CQRS或基于Actor模型的系统。我认为,在可预见的未来,它们将是少数人使用的利基架构。我不确定我们应该如何看待这些主题,或许当架构师和开发人员不再谈论它们时,它们就会消失?

以下是我对AD未来的看法(或许我希望这样):

serverless。去年我听过这方面的演讲,它们给我的印象是这一领域将越来越自动化,底层基础设施的工作量将越来越少。

工作流平台(如Camunda)。我认为它们对于具有复杂业务逻辑的微服务或分布式系统来说非常重要。

事件溯源/CQRS。我希望它会变得更加主流,可能会进入早期采用者或早期大众阶段。

事件驱动的架构,进入早期采用者或早期大众阶段。

Actor模型/反应式。去年我和Vaughn Vernon讨论了这件事,他认为有一天它们会成为主流,但我对此持怀疑态度。

演化式架构很有趣,我认为它进入早期采用者阶段是对的。

混沌工程。是的,它应该属于DevOps,从AD角度讨论这个主题可能是一个例外。

GraphQL和类似的工具应该属于创新者或早期采用者,它将取代REST。

架构师即技术领导者。我在家中与各种各样的架构师会面,他们大部分人的主要工作是让商业/政府领域专家了解他们自己的领域,所以架构师更应该被纳入到敏捷队列中?

微服务进入晚期大众。我认为微服务很快将成为“今天的SOA”。很多人用对了,也有很多人将它实现成了分布式单体。

DDD进入晚期大众,但我希望它仍然会是InfoQ的一个有趣的主题。

BDD进入晚期大众,或“晚期少数派”。

关于TDD,仍然或多或少会有一些讨论。单元测试或黑盒测试或者其他,但至少会进入晚期大众。

当我在日常生活中(不是在技术大会和类似的活动中)遇到架构师、开发人员和领域专家时,我意识到,我们在这里讨论的很多概念对于他们来说是未知或非常弥散的,这也使得他们很难看到InfoQ的好处。大约两年前,我在开发者大会(应该是在加拿大)上听过一个演讲,Vaughn Vernon问有多少人对DDD有所了解,大约有一半的观众举起了手。

当我开始成为InfoQ编辑时,我写了一些有关框架和库的文章,我认为这些框架和库新增的功能可能会影响架构,但随着时间的推移,我写的东西越来越关注有趣的博文和演示文稿上,只有一小部分是关于与特定架构密切相关的框架,如Axon、Akka。

在QCon大会期间进行这种讨论会很棒。

Charles Humble,InfoQ主编:

我和Vaughn Vernon都认为Actor模型很可能会成为主流——无论是直接地还是通过消息传递来实现。在JVM领域,Akka在这方面做得很好,而在金融领域,基于消息传递的系统长期以来一直是实现Actor模型的一种流行的方式。

Actor似乎很容易掌握和理解,也是处理大规模并行工作的一种很好的方法。我希望看到在Pony之上构建基于Actor模型的现代系统,并成为一个榜样,但我不得不说,我个人认为这不太可能。

关于演化式架构,Martin Fowler去年在播客上谈到了这个问题。我很期待Thoughtworks的这本书。

Thomas Betts,IHS Markit首席工程师和InfoQ Architecture Queue负责人:

从高层面来看,我同意Daniel的大部分观点。Jan是对的,一些架构模式顺着图中的趋势自然演进,而其他一些则可能永远不会超过早期采用者阶段,因为它们并不会被广泛采用。

有时候,我会对AD与InfoQ其他主题之间的重叠部分感到困惑,尤其是文化与方法论(CM)。我想这与康威定律有关。架构的很多内容都归结为通信——进入和离开系统的外部通信点是什么?内部服务是如何相互通信的?如何保存和访问数据?

在很多方面,公司解决这些问题的方式以及他们可以选择的选项将基于它们在AD和CM采用生命周期曲线上的位置。我认为AD是这个等式的技术端,而CM是非技术端,但这样的比喻似乎过于简单化了。此外,技术实现可能应该属于开发和/或语言队列。AD处于两者之间的软弱处,处理横切面关注点,为如何实现系统提供指导。

我想添加一些具体的讨论点。

serverless——虽然我个人不喜欢这个术语,因为它似乎没有任何特定的含义,它或许应该在早期采用者阶段。

反应式——可能应该属于早期采用者。我认为反应式架构会变得更加普遍,因为开发人员越来越熟悉反应式编程,特别是在使用JavaScript时。

DDD——虽然DDD本身可能会进入晚期大众,但仍然会有很多与DDD密切相关的衍生想法,这些想法会在创新者或早期采用者中。例如,事件溯源可以进入早期采用者或早期大众。但是,我不认为很多子主题应该被包含在AD主题图中。

微服务——与“serverless”一样,它是一个容易被滥用或误解的术语。我认为随着它被广泛采用,将进入晚期大众,但可能在分布式架构方面处于早期采用者阶段。

分布式系统——我认为把它放在主题图中并不合适,因为这个概念太宽泛了。但我希望我们在谈论系统设计时可以考虑到分布式。像反应式和容错这样的想法对于构建健壮的分布式系统来说至关重要,而它们在单体系统中可能没有那么重要。这就是为什么要在AD主题图中加入混沌工程。

我完全支持在QCon大会上讨论这些话题!

关于作者

Thomas Betts是IHS Markit的首席软件工程师,拥有20年的专业软件开发经验。他一直致力于提供令客户满意的软件解决方案。他曾在多个行业工作,包括零售、金融、医疗、国防和旅游。Thomas与妻子和儿子住在丹佛,他们喜欢徒步旅行,也喜欢探索美丽的科罗拉多州。

Daniel Bryant正在引领组织和技术变革。他目前的工作包括通过引入更好的需求收集和规划技术来实现组织敏捷性,重点关注敏捷开发中的架构相关性,以及促进持续集成/交付。Daniel目前专注于“DevOps”工具、云/容器平台和微服务实现。他还是伦敦Java社区(LJC)的负责人,为多个开源项目做出贡献,为InfoQ、DZone和Voxxed等知名技术网站撰写文章,并定期出席QCon、JavaOne和Devoxx等国际性会议。

Charles Humble于2014年3月接任InfoQ.com的主编,指导我们的内容创作,包括新闻、文章、书籍、视频演示和访谈。在担任InfoQ的全职工作之前,Charles负责我们的Java报道,并担任PRPi咨询公司的首席技术官,PRPi咨询公司是一家名誉研究公司,于2012年7月被普华永道收购。他全面负责PRPi公司内部使用的定制软件的开发。他在企业软件领域工作了大约20年,曾经是开发人员、架构师和开发经理。在业余时间,他为Twofish创作音乐,首张专辑于2014年2月发行,并尽可能多地与妻子和孩子在一起度过。

Jan Stenberg在瑞典北部的一名IT顾问,工作超过25年,在.Net/C#和JVM/Java方面有着丰富的经验。他的经验范围从大型分布式和基于服务的系统到基于Web和富客户端应用程序,再到硬件相关的软件。

查看英文原文:https://www.infoq.com/articles/architecture-trends-2019

活动推荐:

2019年7月12-13日,ArchSummit全球架构师峰会将在深圳举办。针对华南地区的技术氛围和技术人群的关注点,设置了金融技术、小程序、中台战略技术选型、AI技术落地、数据平台建设等专题,邀请Apple、Google、阿里等企业专家来分享最新的技术成果。点击 archsummit.com 查看官网。

相关文章:

白盒测试之基本路径覆盖测试

基本路径覆盖测试 概念独立路径测试用例分析设计自己再试试总结概念 要学习基本路径测试前还需要弄清楚一个概念独立路径。 独立路径是指该路径至少引入一系列新的处理语句或条件的路径。在流程图中从程序入口出发,一条边一条边地往下走,一直走到程序的一个出口,这些边构成…

hdu3321

Problem Description Professor Brute is not good at algorithm design. Once he was asked to solve a path finding problem. He worked on it for several days and finally came up with the following algorithm: Any fool but Brute knows that the function “funny” …

[leedcode 118] Pascal's Triangle

Given numRows, generate the first numRows of Pascals triangle. For example, given numRows 5,Return [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ] public class Solution {public List<List<Integer>> generate(int numRows) {//杨辉三角形&#xff0c;把每…

bzoj 4025 二分图——线段树分治+LCT

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4025 线段树分治&#xff0c;用 LCT 维护链的长度即可。不过很慢。 正常&#xff08;更快&#xff09;的方法应该是线段树分治并查集&#xff08;按秩合并&#xff0c;链长可以暴力爬&#xff09;或者 LCT 维…

黑盒测试之功能分解法

功能分解法前言概念需求示例测试用例分析设计总结前言 首先和各位道个歉&#xff0c;最近事情比较多&#xff0c;本来计划的一周一更推迟了这么久。今天咱们继续&#xff0c;开始黑盒测试方法部分的分享。 概念 在学习软件测试的时候经常听到功能分解法&#xff0c;很多人项…

java中Class.forName与new

一、使用Class.forName 1、装载类 Class clazz Class.forName("xx.xx.xx"); 2、初始化对象 clazz.newInstance() 二、使用 new new Object(); 使用Class.forName的好处&#xff0c; 比如加载数据库驱动&#xff0c;若更换数据库&#xff0c;则需要更换驱动。 如果使…

UVA 10041 Vito's Family

UVA_10041这个题目是一个贪心的题目。如果设按升序排列的si的数组为s[]&#xff0c;那么Vito的位置一定为s[(r-1)/2]。对于这一点&#xff0c;我们分两种情况进行讨论&#xff1a;①如果si的数量为奇数&#xff0c;那么Vito的位置一定取数组s[]中间的那个值s[(r-1)/2]。因为如果…

数据结构杂题集

Codechef SD ER • 给出一棵树&#xff0c;维护点集 ?&#xff08;加点删点&#xff09; • 如果 ? 的大小是偶数&#xff0c;输出&#xff1a;如果将 ? 中的点两两连上边权为树上距离的边&#xff0c;那么 ? 里的最小权完美匹配是多少• ?, ? ≤ 10^6 考虑边的贡献 交叉…

黑盒测试方法之等价类划分法

等价类划分法 概念需求示例测试用例分析设计总结概念 等价类是指某个输入域的子集,在该子集中每个输入数据的作用是等效的,也就是该子集中每个输入数据的揭错概率是一样的。等价类分为有效等价类和无效等价类。 等价类划分法是将输入数据分成若干个子集,从每个子集选取一个…

JSEL 表达式

JSTL标签库的使用是为类弥补html表的不足&#xff0c;规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后&#xff0c;人们开始注重软件的分层设计&#xff0c;不希望在jsp页面中出现java逻辑代码&#xff0c;同时也由于自定义标签的开发难度较大和不利于技术标准化…

JavaEE程序员必读图书大推荐 .

下面是我根据多年的阅读和实践经验&#xff0c;给您推荐的一些图书&#xff1a; 第一部分&#xff1a; Java语言篇 1 《Java编程规范》 星级&#xff1a; 适合对象&#xff1a;初级&#xff0c;中级 介绍&#xff1a;作者James Gosling&#xff08;Java之父&#xff09;&#x…

10 个深恶痛绝的 Java 异常。。

异常是 Java 程序中经常遇到的问题&#xff0c;我想每一个 Java 程序员都讨厌异常&#xff0c;一 个异常就是一个 BUG&#xff0c;就要花很多时间来定位异常问题。 什么是异常及异常的分类请看这篇文章&#xff1a;一张图搞清楚 Java 异常机制。今天&#xff0c;栈长来列一下 J…

黑盒测试方法之边界值分析法

边界值分析法 概念需求示例1测试用例分析设计1需求示例2测试用例分析设计2总结概念 很多错误发生在输入或输出范围的边界上,因此针对各种边界情况设置测试用例,可以更有效地发现缺陷。 边界值分析法测试用例设计方法:1)确定边界情况(输入或输出等价类的边界);2)选取正…

leetcode381. Insert Delete GetRandom O(1) - Duplicates allowed

题目要求 Design a data structure that supports all following operations in average O(1) time.Note: Duplicate elements are allowed. insert(val): Inserts an item val to the collection. remove(val): Removes an item val from the collection if present. getRando…

js 判断 是否为android

引用&#xff1a;http://www.oschina.net/code/snippet_163910_6094 [代码] JavaScript判断方法 view source print?1if(navigator.userAgent.match(/Android/i)) {2 // Do something!3 // Redirect to Android-site?4 window.location http://android.davidwalsh.nam…

B - Networking - poj 1287

有一些地方需要铺盖电缆&#xff0c;这些地方两点间的路可能不止一条&#xff0c;需要求出来至少需要多少电缆才能让所有的点都连接起来&#xff0c;当然&#xff0c;间接连接也算。/#include<iostream>#include<cstring>#include<cstdio>#include<queue&…

因果图方法中的基本符号

因果图方法中的基本符号 前言基本符号1、恒等2、非3、或4、与5、互斥6、包含7、唯一8、要求9、屏蔽总结前言 经过了春节假期,我们重新回到工作学习中。在学习因果图法前首先要学习因果图方法中的基本符号,今天我们就先解决这些基本符合。 基本符号 1、恒等 恒等:表示原因与…

BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )

假设C君为(0, 0), 则右上方为(n - 1, n - 1). 一个点(x, y) 能被看到的前提是gcd(x, y) 1, 所以 answer ∑ phi(i) * 2 2 - 1 ∑phi(i) * 2 1 ( 1 < i < n ). 2是因为(1, 0), (0, 1) 两个点, -1是因为(1, 1)重复计算了--------------------------------------------…

JavaScript数据结构与算法——字典

1.字典数据结构 在字典中&#xff0c;存储的是【键&#xff0c;值】对&#xff0c;其中键名是用来查询特定元素的。字典和集合很相似&#xff0c;集合以【值&#xff0c;值】的形式存储&#xff0c;字典则是用【键&#xff0c;值】对的形式存储。字典也称作映射。 2.创建字典 f…

ArcObjects编程方法(七):.NET中继承ArcGIS COM类

要符合作为基类的要求&#xff0c;coclass必须满足&#xff1a; 定义为元数据可创建聚合然而在ArcGIS中&#xff0c;ArcGIS COM类不能在.NET环境中作为基类。如果要想方便的创建ArcGIS组件&#xff0c;可以使用ESRI.ArcGIS.ADF.Local程序集中提供的类&#xff0c;这些类是托管类…

黑盒测试方法之因果图法

因果图法 因果图法步骤软件需求示例测试用例分析设计总结因果图法步骤 1)赋标识符。分析软件需求规格说明,找出哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符; 2)画因果图。分析软件需求规格说明,找出原因与…

Git指南-基础篇

一&#xff0c;Git简介 对于一个刚接触Git的同学来说&#xff0c;Git是一个新鲜的东西&#xff0c;为了对Git有更深的了解&#xff0c;强烈推荐一篇博文&#xff1a;Git与Repo入门 它介绍了版本控制的历史&#xff0c;从原始的版本控制&#xff08;即原型-备份-复制-修改-备份-…

silverlight与javascript交互操作

C#端代码&#xff1a; String text "lenny";string text2 "dou";HtmlPage.Window.Invoke("calledBySL2", new object[] { text, text2 }); Html端代码&#xff1a; function calledBySL2(obj, obj2) { alert("Hello: " obj …

JS异步编程之callback

为什么 JS 是单线程&#xff1f; 众所周知&#xff0c;Javascript 语言的执行环境是"单线程"&#xff08;single thread&#xff09;。 所谓"单线程"&#xff0c;就是指一次只能完成一件任务。如果有多个任务&#xff0c;就必须排队&#xff0c;前面一个任…

黑盒测试之两两组合方法

两两组合方法 概念需求示例测试用例分析设计总结概念 所有测试数据两两配对,每一对数据至少出现一次,这个是两两组合测试的基本原理,两两组合测试也称结对测试(Pairwise Testing)。大部分缺陷是在进行两个变量取值冲突的测试时被发现的,不仅仅是在所有的组合情况下才会被…

用JavaScript获取一个超链接的绝对URL地址

对于Web程序员来说&#xff0c;处理简单的URL格式也许会成为一场噩梦。试想一下&#xff0c;一个网址里有很多组成部分都会影响你对它的解析方法&#xff1a; 是否以/字符开头是否以//开头是否以?号开头是否以#号开头…等等当你想要这个地址的绝对地址时&#xff0c;如何判断处…

Docker学习笔记_安装ActiveMQ

一、实验环境 1、宿主机OS:Win10 64位 2、虚拟机OS:Ubuntu18.04,虚拟机名称&#xff1a;Ubuntu18VM1&#xff0c;虚拟机IP:192.168.8.25 3、操作账号 &#xff1a;Docker 4、在虚拟机上已安装Docker 二、安装 简要步骤&#xff1a; 1.搜索镜像 sudo …

Ubuntu下配置Nginx HTTPS

HTTPS(全称&#xff1a;Hypertext Transfer Protocol over Secure Socket Layer)&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础是SSL。 它是一个URI scheme(抽象标识符体系)&#xff0c;句法类同http:…

因0x764fb11c的错误状态_《最强大脑》国际赛王易木又被质疑作弊,因背反答案露出了马脚?...

《最强大脑之燃烧吧大脑》第二季国际赛最后一场&#xff0c;中国战队和国际战队在3V3的团战当中以绝对优胜的姿态拿下了本场比赛。在观众为郑林楷、宋一骜以及王易木的成功感到高兴之际&#xff0c;有部分吃瓜群众跳出来指出&#xff0c;之前因作弊而饱受质疑的王易木此次又有了…

[PyQt4]项目开发中遇到的错误与解决办法

1假如将ui文件py化以后产生的关于界面的类是继承object的ui_dialog&#xff0c;方法是setupui,则在主程序中应&#xff1a; app QtGui.QApplication(sys.argv)dialogQtGui.QWidget()ud Ui_Dialog()ud.setupUi(dialog)dialog.show()sys.exit(app.exec_()) 2自建槽checklog_slo…