阳途教育为您的考证保驾护航

关于我们|网站公告|广告服务|联系我们| 网站地图

搜索
软件行业分类 软件工程师 系统分析师 系统架构师

编程/系统架构中最重要的能力是什么,我会毫不犹豫回

日期:2022/04/12 17:13作者:佚名人气:

导读:所以具有演化式思维的架构师,能够在一开始设计时就考虑到后续架构的演化特性,并且将灵活应对变化的能力作为架构设计的主要考量。五、如何培养架构设计思维良好的架构设计思维的培养,离不开工作中大量高质量项目的实战锻炼,然后是平时的学习、思考和提炼总结。另外,基本的架构设计思维,其实在我们大学计算机课程(比如数据结构和算法)中可以找到影子,只不过当时以学习为主,问题域比较小和理想化。...

一、抽象思维

如果您要问软件开发/系统架构中最重要的能力是什么架构师,我会毫不犹豫地回答它是抽象能力。()这个词经常被听到,但真正理解并能解释什么是的人却很少。抽象实际上是这样定义的:

对事物进行简化表示或描述的过程,抽象让我们专注于本质并隐藏额外的细节。

例如,请参见下图:

你看见什么了?你看到的是一扇门,对吧?你看到的不是木头或碳原子,门是抽象的,木头或碳原子是细节。此外,您可以看到门上有一个门把手。你看到的不是铁,也不是铁原子。门把手是抽象的,铁和铁原子是细节。

在系统架构和设计中,抽象帮助我们了解大事和隐藏细节。抽象能力的强弱直接决定了我们能解决的问题的复杂程度和规模。

下图是我们小时候玩的积木。我发现我小时候喜欢玩积木,而且拼得又快又好的孩子,一般抽象能力很强。

上图右侧的积木城堡是抽象的。如果仔细观察,这座城堡实际上是由几个子模块组成的。这些模块是子抽象单元,左边各种形状的积木是细节。积木时,孩子首先在脑海中有城堡的大图(抽象),然后在他/她的大脑中会有一个初步的子模块分解(下意识地完成),然后用积木来构建每个子模块,最后组装最终的城堡。有自上而下的分而治之设计,然后是自下而上的组合过程。这种分而治之的思想非常重要,我们后面会讲到。

我认为软件系统架构设计和子积木没有本质区别,只是要解决的问题领域和规模不同。架构师首先要在大脑中形成一个抽象概念,然后分解子模块,然后依次实现子模块,最后组装子模块形成最终系统。因此,我经常说编程和架构设计是构建块。优秀的建筑师受职业习惯的影响,他们眼中的世界是模块化组装的。

抽象能力不仅对软件系统架构设计很重要,而且对其他领域的人类活动如构建、业务和管理也很重要。事实上,可以认为我们生活的世界是在抽象的基础上构建的,很难脱离抽象的人类。

顺便提一下,抽象级别的跳跃问题在开发中很常见。经验丰富的程序员编写的代码可以保持抽象级别的一致性。代码读起来像故事,比较清晰易懂;而没有经验的程序员会有明显的抽象层次跳跃问题,代码读起来会比较累。这是由于缺乏抽象能力造成的。例如:

电商网站在处理订单时,一般会经过以下流程:

更新库存()折扣计算()支付卡验证()支付(支付)运输()

上述流程中的抽象是同级的,比较清晰易懂,但是当没有经验的程序员实现这个流程时,代码层面会跳转,比如主流程到支付卡验证块,他的code 突然弹出一行远程调用某家银行API。这是一个抽象的跳跃。银行 API 调用是细节,应该封装在这个抽象中。

二、分层思维

除了抽象之外,分层也是我们处理和管理复杂性的基本思维武器。如下图所示,为了构建一个复杂的系统,我们将整个系统分成若干层,每一层重点解决某个领域的问题,向上提供服务。有些层是垂直的,它贯穿所有其他层,称为共享层。分层也可以被认为是一种抽象方式,将系统抽象分解为几个层次化的模块。

分层架构的案例很多。对于一个中小型的Web应用,我们一般会设计三层架构:

操作系统是经典的分层架构,如下图:

TCP/IP协议栈也是经典的分层架构,如下图:

如果你关注人类文明的进化史,你会发现,今天的人类世界也是层层构建和层层进化的。今天的互联网系统可以说是现代文明的一层,上面是基于互联网的现代商业,下面是现代电子工业基础设施,等等。

三、分而治之的思维

分而治之(和或拆分并合并)也是处理和管理复杂性的一般方法。下图展示了一个分而治之的思维过程:

对于一个不能一次性解决的大问题,我们先把大问题分解成几个子问题。如果子问题不能直接解决,我们会继续分解成子子问题,直到可以直接解决。这是分解()的过程;然后将子子问题的解组合成子问题的解,再将子问题的解组合成原问题的解。这就是组合()的过程。

面试中,为了考察应聘者的分而治之思维,我经常遇到一个分而治之的问题:如果给你一台8G内存/500G磁盘空间的普通电脑,如何对100G的大文件进行排序?假设文件充满了字符串记录,每行大约 100 个字符。

这是一个典型的分而治之的问题。100G的大文件一次无法加载到内存中直接排序,所以需要分成几个小问题来解决。那么一台8G内存的电脑一次可以整理多少数据,在有限的时间内又可以整理多少呢?也就是100G的大文件怎么剪,多少份合适?这是考查考生的时间和空间复杂度估计能力,需要一定的计算机组织和算法能力,以及一定的实践经验和意识。事实上,如果内存是8G,操作系统会用掉一部分。如果排序程序是用Java开发的,JVM可以使用2~4G内存。根据一般经验值,一次整理1G左右的数据应该是没有问题的(我其实是在电脑上做的,1G以上的数据排序还可以)。所以一个100G的文件需要分成100个部分,每个1G,这样每个子文件就可以直接加载到内存中进行排序。对于1G数据量的字符串排序,使用Java提供的快速排序算法更为合适。

好吧,在有限的时间排序后(根据电脑性能,一天内可以排序),假设已经排序了100个1G的文件,相当于现在硬盘上有100个排序的文件,但是我们最终需要的是什么是一个排序的文件,下一步该做什么?这时候我们需要将已经解决的子问题进行合并,合并到我们需要的最终结果文件中。这个时候应该用什么算法?在这里,我们检查候选人对外部排序和归并排序算法的掌握程度。我们可以成对合并和排序 100 个已排序的文件。重复此操作,我们将得到 50 个已排序的文件,每个文件的大小为 2G。然后将它们两两合并,不断重复,直到最后两个文件合并成目标文件,即100G并排序。因为是外部排序+归并排序,每次只需要将当前索引指向的文件记录读入内存,并进行比较即可。较小的输出到目标文件,内存占用很小。另外,上述算法是双向归并,也可以采用多路归并,甚至采用堆排序进行优化,但整体分治思路没有改变。

总的来说,这是一个非常好的面试问题。除了考查考生的分治思维,还考查对各种排序算法(快速排序、外排序、归并排序、堆排序)的理解,计算时空复杂度估计,计算机内外存特点和组织、文件操作等。其实,能完全回答这个问题的考生很少。如果我有幸遇到一个,我会很幸运,因为这个人有潜力成长为一名优秀的建筑师。

此外,递归也是一种特殊的分治技术。掌握了递归技术的开发者,就等于掌握了一把强大的编程武器,可以解决一些普通开发者无法解决的问题。比如最近我的团队正在开发一个新的服务框架,包括契约解析器()、代码生成器(code)、序列化器()等组件,这需要大量的递归思维和技术,没有这种心态的开发者做不到做这个。所以我在面试应聘者时,通常会问一些与递归相关的编程问题,以考察应聘者的递归思维。

自然界中有很多递归结构,如下图,有兴趣的可以想一想,大自然通过递归给了我们什么样的启示?

四、进化思维

架构师_处理器架构x86架构_soa架构与oop架构的区别与联系

社区里经常有这样的讨论:架构设计好了吗?还是进化了?基于十多年的经验,我个人认为架构既是设计的,也是进化的。对于互联网系统来说,基本上可以说是三点设计和七点进化,在设计中进化,在进化中设计。,一个迭代过程。

在一个互联网软件系统的整个生命周期中,前期的设计和开发只占大约三分之一的时间,而在接下来的七点时间里,架构师需要对基于架构的架构进行不断的调整。关于用户反馈。我认为架构师不仅要利用自己的架构设计能力,还要学会利用用户反馈和进化的力量来推动架构的不断进化。这是进化的架构思维。

当然,一开始的建筑设计很重要,建筑体系基本形成,不能马虎。同时,优秀的架构师知道,能够持续响应环境变化的系统才是可行的系统。架构的质量很大程度上取决于其响应变化的灵活性。因此,具有进化思维的架构师可以在设计之初就考虑到后续架构的进化特性,将灵活应对变化的能力作为架构设计的主要考虑因素。

目前,社区中正在出现一种新的架构方法论——进化架构。微服务架构是典型的演进式架构,能够快速响应市场用户需求的变化,而单体架构则缺乏这种灵活性。 曾经在他的博客[附录8.2]上给出了微服务架构的演进路线图,可以用来解释设计思维和进化思维的区别,如下图所示:

上面的路线是从一开始就直奔微服务架构。事实上,它体现了设计架构的思想,认为架构师可以完全设计整个系统及其演进方向。马丁认为这种做法风险很大。一是成本高,二是架构师一开始对业务领域没有深入的了解,无法清晰的划定领域边界。开发的系统可能无法满足用户的需求。

以下路线从单体架构开始。随着架构师对业务领域理解的不断深入,以及业务和团队规模的不断扩大,逐步将单体架构拆分为微服务架构的想法。这是进化架构的思想。如果你观察现实世界中一些互联网公司(如eBay、阿里等)的系统架构,它们大多走的是进化架构的路线。

下图是建筑的演变历史。在每个阶段,都可以看到设计的影子,但如果时间线拉得足够长,进化的特征就会显现出来。

五、如何培养建筑设计思维

处理器架构x86架构_架构师_soa架构与oop架构的区别与联系

良好的建筑设计思维的培养,离不开在工作中大量优质项目的实践训练,然后是平时的学习、思考和提炼。

另外,基本的建筑设计思维其实可以在我们大学的计算机课程中找到(比如数据结构和算法),但当时主要是学习,问题领域比较小,比较理想。所以,大学教育其实很重要。那时基本的建筑设计思想已经种下,在以后的工程实践中会进一步消化和应用。随着经验的积累,我们可以解决的问题域的复杂性和规模逐渐变大。但基本武器是抽象的、分层的、分而治之的思维。

我认为建筑师的成长高度与他大学时期的思维习惯密切相关。我知道世界级的互联网公司,比如谷歌等,在招聘新工程师的时候,对数据结构和算法的要求可谓苛刻。这是可以理解的。谷歌级别的公司要解决的问题是超级复杂和基础的思维。基础薄弱根本应付不过来。

对于工作经验

我自学了CS61B 2006秋季版课程,上图是课程Logo

对于进化设计思维,现在的大学教育其实训练的很少。相反,目前的大学教育大多采用脱离现实场景的简化理想模式,有的采用固定答案的应试教学。进化设计思维。从我个人的经验来看,进化设计思维在实际工作中更多是被实践和培养的。

结束语 架构的本质是管理复杂性,抽​​象、分层、分治和进化思维是架构师征服复杂性的四大基本武器。掌握了抽象、分层、分治、进化四大基本武器,你可以设计小到一个类、一个模块、一个子系统、一个中型系统,大到一个公司的基础平台架构。微服务架构、技术架构架构师,甚至组织架构、业务架构等。架构设计不是静态的,而是动态演进的。只有能够持续响应环境变化的系统才是可行的系统。所以即使你已经掌握了抽象、分层和分治这三种基本思维,你仍然需要进化思维。在设计的同时,利用反馈和进化的力量来推动架构的不断进化。架构师在关注技术、开发应用的同时,需要定期梳理自己的架构设计思维。随着时间的推移,你看待世界事物的方式会发生根本性的变化,你会发现我们生活的世界其实是抽象的。、分层、分而治之、进化。此外,架构设计思维的形成会对你的系统架构设计能力产生重大影响。可以说,对抽象、分层、分治、演化的掌握程度以及灵活应用的程度,直接决定了架构师所能解决的问题域的复杂程度和规模。建筑师的分水岭时刻。参考 CS61B 单块优先级

我在Geek Time开的《微服务架构实践160讲》视频课程进入最后四天优惠期。立即订阅,享受双重福利:

福利一:限时优惠价¥199,原价¥299(5月19日恢复原价)。

福利二:每次邀请好友购买可获36元返现,好友可获15元返现。邀请越多获得越多,置顶不封顶,可立即提现(提现流程:极客时代公众号-我的-现金奖励提现)

关于我们|网站公告|广告服务|联系我们| 网站地图

Copyright © 2002-2022 阳途网 版权所有 | 备案号:湘ICP备2022018839号-1

声明: 本站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告