电话:4000553856
关闭
您当前的位置:首页 > 职场资讯 > 薪酬行情

阿里玄难谈软件架构设计思考,软件发展历经哪些阶段?

来源:网络整理 时间:2025-10-14 作者:佚名 浏览量:

阿里妹导读:业务发展纷繁复杂,变化成了唯一不变之处。怎样保障基础设施安全、高可用性,同时提供高效创新支持?今日,阿里副总裁,业务平台事业部掌门人玄难,结合阿里巴巴业务平台建设,以及个人多年大型软件设计经验,提炼成几点思考,期望对大家的软件架构设计有所启发。

玄难

阿里副总裁

业务平台事业部掌门人

需要特别加以说明的是,在本文当中所提及的软件,全部都是用来指代面向最终用户的、偏向于业务方面的软件,并不涵盖操作系统、中间件等系统类软件。

1、软件发展的几个阶段

在软件形态发生变化的情况下,过去极为高效的那种系统架构遭受了全面挑战,那种组织形态也遭受了全面挑战。原因在于,我们身处的环境,已从量变发展到质变,已然突破了临界点,进而产生了本质上的不同 。

阿里巴巴乃是此过程里具有代表性的示例。源于过往单一方位的电商事务进化成了繁复的经济体,缺失了具备确定性的业务范畴界限,呈现出活力繁茂且不容易进行预先推测的业务态势。较为典型的特性便是:

从早年的区区一个淘宝开始,历经转变,发展成了几十个事业部,以及众多公司,其中涵盖新零售,云计算,文娱健康等几百种业务,并且这些业务仍在持续不断地以快速的态势演进着;

这个系统曾经是Denali,它从这里开始,通过分布式架构,演变为了上万个系统,这些系统形成了群落,各种业务逻辑相互交织,在众多系统中贯穿,难以说清,无法道明;

人数从曾经的几十个人协同,演变成了几万人协同,每个人情形就如同处于原始热带雨林,并不知晓业务的全部面貌像是盲人摸象一样 ,

从往昔的能停机发布蜕变成为不可中断,持续进化着的社会基础设施,既须系统稳定性,更得有业务连续性,怎样确保此基础设施的安全、具备高可用性,同时给予业务方高效无阻碍的创新支持,这便是我们务必去处理的核心问题。

针对这些问题,我们对软件设计产生了几点基本思考。

2、传统软件设计:外延的确定性

身为程序员,我们都清楚,软件若要契合预期,我们便需确定性,不确定性于程序设计而言是致命的,所以我们时常会听闻抱怨“需求又变了”,网上诸多段子皆是程序员对业务方和产品经理不断变更需求予以讨伐 。

软件于“工具和信息化”时代,其本质为将原本的人工工作,借助计算机软件予以模拟,达成电子化,故而存在一个典型特征,即业务领域、软件职责以及功能边界皆相对清晰,所以最经典的软件工程理论乃是瀑布模型,包括收集需求、画UserCase、确定功能集合、模型抽象、概要设计、详细设计、编码、单元测试、集成测试、用户测试、上线运行,之后投入下一个版本的迭代,并且传统的软件开发大多都是这种模式。这种模式特别强调文档质量和变更的全流程一致。

在互联网服务的时代之中,借助计算机软件达成了依靠人力所无法达成的能力,从而为人类社会供给了诸多崭新的服务能力,我们承袭了传统的软件工程理论,并且进行了适度的改进,为了缩减版本迭代的时间,较为迅速地验证产品想法以获取用户,大多数团队选用敏捷模型,其本质乃是将需求批发模式转变为零售模式,这种模式最大的益处就在于对于产品需求能够进行快速响应,然而致命之处在于每次的敏捷在大多数情形下都是在持续地打补丁,致使软件架构迅速腐化,不出两年,敏捷实际上就变成了蜗牛。煎熬持续两年,难以忍受之时,实行重构,然而所谓重构实际是彻底推翻重新开始,在这种模式情形下,几乎不存在可供使用的文档了。

在前面这两个阶段,软件设计理论存在一个基本假设,软件边界是确定的,我们借助归纳总结以及适度的预测,避免过度设计,以此来进行模型抽象,通过模型抽象,我们设计出各种可配置性,用以快速接入需求,提升效率,这也就是我们常提及的产品化,通过接口设计以及模块化设计,来开展组织分工协作,通过系统架构的开放性,来应对无法配置的变化,变化通常源自两个方面,

首先呈现的是用户量出现增长的情况,一般而言是采用分布式加以解决,这里的分布式涉及数据库,还涵盖缓存,以及服务,存在多机房多单元的情况,另外还有CDN等等。在这一范畴之内阿里巴巴应当是做得极为出色。自从五彩石起步一直到现在,阿里巴巴的架构基本上都是这一指导思想实现落地施行以及进行优化完善的体现,并且依旧是应对用户量迅速增长的有效办法。

第二个发面,业务功能出现变化,这就是我们平常所说的系统可扩展性,借助传统数据库的大字段或者诺依斯扣尔,运用“元数据加键值存储”这种模式,去应对数据信息的不确定性并做出相应变化;要经由流程引擎,目的为满足工作流程能够更轻易且快速地做出反应;要利用规则引擎,来替换程序里数量众多的如果否则语句,依靠实现界面配置达成规则的转变与更新。得借助用户界面组建模块化,配合使用用户界面的编辑器,从而能够更便捷迅速地予以校正用户界面所产生的变化。借助插件技术,把容易出现变化以及相对较为繁杂棘手的逻辑关系,自业务主流程里分离出来,进而进行拓展。这样做是为了更好面对业务功能的变化,也就是我们常说的系统可扩展性。这当中要通过传统数据库的大字段或者诺依斯扣尔,采取“元数据加键值存储”的方式,去应对数据信息的不确定性;通过流程引擎,去满足工作流程的快速响应需求;通过规则引擎,代替程序里不少如果否则语句,借助实现界面配置达成规则的变化实施。依靠用户界面组建模块化,配合用户界面的编辑器快些改善用户界面的变动情况。借助快速转变且相对颇为复杂的逻辑关系,自业务主流程中剥离出来,利用插件技术去扩展。这就是第二个方面,是业务功能的变化呈现形式,即我们口中通常所说的系统可拓展性。通过传统数据库的大字段或者诺依斯扣尔,以“元数据以及键与值存储”这种架构措施对付数据层面里的信息不确定因素;通过流程引擎,让工作流程能够实现一种迅速且及时应对响应的能力;通过规则引擎,替代程序里那些数量较多的如果否则的语句,借助实现配置界面来实现规则的转变以及变更。通过用户界面所展开的组件模块化这种设定,配合用户界面里面的编辑器,从而能够更快速且灵活变通地对用户界面所产生的变化情况进行调整。通过插件以及技术手段,把那些容易出现变化的情况、又或者相对而言较为复杂的逻辑性条件,自流程主架构里面分离出来,进而进行展开扩展。 使用传统数据库的大字段或者诺依斯扣尔,采用一种组合方式也就是‘元数据加K值存储’以及逻辑架构来应对数据信息当中的不确定性;借助流程引擎来满足工作流程能够快速做出响应的要求;依靠规则引擎来替换程序中非常多的如果否则这一类语句,通过实现界面配置来达成规则的变化以及更新交替等等情况。通过用户界面组件化这种设定方式,配上提供用户界面的编辑器,从而能够更快速且灵敏有效地调整用户界面所出现的变化趋势。通过插件技术手段,把那些容易出现变化、并且相对来说较为复杂的逻辑关系,从主要流程结构当中剥离出来,进而进行拓展延伸。 借助传统数据库利用大字段又或者诺依斯扣尔,以“元数据加键值这类组合存储”的形式来面对和处理数据信息的不确定性;借助运用流程引擎满足工作流程能快速做出反应的需求;依靠规则引擎替换程序里大批的如果否则语句,利用实现界面配置实现规则的变化以及更新。通过用户界面组件实现程序化搭建,配合专门的UI编辑器来快速适应调整用户界面的变化。通过插件技术手段,把容易发生变化、且相互之间相对而言显得比较复杂的逻辑关系,从主流程当中分离出来进行拓展。 利用传统数据库的那种较为多样特点,大字段和不那么常规的诺依斯扣尔,采取“元数据再添加键值存储”的形式,去面对数据信息的那种难以捉摸、没办法确定因素;通过流程引擎,让工作流程能够实现尽量的快速响应;通过规则引擎,取代程序里数量不少的倘若不然语句,靠实现的界面配置来实现规则的变化以及交替情况。通过用户界面的组件能够实现相应模块化,配合用户界面的编辑器,从而相对能够跟得上快速调整用户界面所产生的变化程度。通过插件技术手段,把容易出现变化、而且相对来说更复杂的逻辑关系,从主要业务流程这一套结构中脱离出来,进而进行升级拓展。 借助传统数据库的大字段或者诺依斯扣尔,以“元数据加键值存储”这种较为特别的方式来解决应对数据信息的不确定性问题;依据流程引擎来满足工作流程的快速做出相应反应的要求;依靠规则引擎来替代程序里数量极大且类别众多的 If-Else 语句,通过实现界面配置来达成规则的转变以及更新。利用用户界面组件实施模块化,配合我们去看目前比较的套装优秀软件都大致如此。

到目前为止,我们所进行的软件研发,均是针对一个具有确定性的问题,它如同一个圆圈,存在需求边界,我们由四周往内汇聚,开展抽象工作,也就是进行业务抽象或者建模,它就如同我们的房子,被四个边角的承重墙划分出了边界,里面的装修能够依据主人的爱好以及阶段性诉求进行重构,然而却无法向外扩展,它的特性是框架结构,业务领域模型呈现抽象、组件化、版本化、外延向内的特点 。

3、思考角度的变化:内核的确定性

伴随移动互联网的发展,IOT的发展,人工智能的发展,软件成了社会的基础设施,我们每个人被软件紧紧地掌控着,整日黏附在手机和电脑上,人实际上是以终端的形式接入软件网络,社会形态没有边界,是持续变化的,是无法预测的,阿里当前的业务也不存在确定性的边界,不清楚明天会变成何种模样,它并非版本化的,而是在持续地生长与变异,就不存在确定性的软件外延,要是没有确定性的外延,而软件的运行却需要确定性,我们就只好去寻觅确定性的内核。

如何去理解这个变化呢,我们能够从机器学习的发展那儿作类比,传统的机器学习存在着诸多的算法模型,诸如线性回归模型,决策树模型、随机森林算法模型、逻辑回归模型、SVM模型、朴素贝叶斯模型、K最近邻算法模型、K均值算法模型等等,我们若要去解决问题,首先得试着对问题领域予以分析,才能够挑选出相匹配的算法模型,进而才可以获取到较好的结果,要是面临的是非线性问题,然而却将线性模型错误地选了,那就无法拿到结果,这种解决问题的思路是,得先寻觅到一个确定性的问题边界,才能够朝着内部去寻觅参数。然而深度学习的解决思路存在着本质性的变化,并非去定义问题域,而是仅定义稳定的结构,比如BP神经网络,它设有输入层,还有多个隐藏层以及输出层。要是我们将图像数据输入其中,那么就能构建起图像分类以及人脸识别的能力,若把语音输入进去,便会构建出语音识别的能力(诚然实际情况并非如此简单)。深度学习是一种由内部向外部进行自我学习与生长的方式 。

软件工程碰到同样问题,要从外沿确定性转成内核确定性,从逻辑推理角度讲,传统软件工程以归纳法为主,局部用演绎法,面对外延不确定性领域,要找稳定内核基础,再以演绎法为主,局部用归纳法,我们先去找内核,内核向外生长变异,原来确定性是找外沿确定,现在要找内核确定,原来用归纳法,现在要用演绎,找不变的,如同人由基因控制 。当然你也可以说这是一种跨业务领域的更高阶的抽象。

4、文档即代码

若全面审视计算机发展历程,会发现软件研发效率的提高,实则指的是填平现实世界与计算机二进制宇宙间的沟壑。初期是从二进制编码起步,而后演进至汇编,再到C言语,又到面向对象的C++以及JAVA。每一回的升级,皆是运用人类更易于领会的形式,对现实世界展开抽象化的表述,接着借助一个编译程序,毫无差别地译制成低阶形式,直至计算机能够直接运行的二进制形态。每一次升级,均带来软件研发效率呈指数级的增长,与此同时,使能够参与软件设计的人员数量也呈指数级攀升,进而给整个社会带来意义重大的进步。这当中最大的功臣绝对无疑是编译器,在编译之前的源代码是我们最为核心的资产,而非可以运行的编译之后的二进制代码,这是因为编译之后的代码难以理解,并且也无法通过逆向工程将源代码还原回来,要是丢掉了源代码,基本上就丧失了所有。

当回到当下所处的业务领域,我们言说自身从事业务,像业务平台宣称支持淘宝、天猫、拍卖、盒马生鲜、天猫超市、飞猪机票、火车票等诸多业务达上百种。然而,在我们的代码里完全无法找寻到这些核心业务概念。我们清楚电商最为核心的交易模式,例如担保交易、预售、团购、货到付款等同样不可能在代码中被发现。并且,我们也没有准确的文档去阐述这些内容。这是由传统的软件工程方法以及技术局限所致使的 。

我们开展所做的需求分析,进行概要设计,展开详细设计,直至最后的Java代码,实际上就是业务逻辑到计算机世界的一回编译过程。这当中最大的问题乃是人肉编译,而非机器无差别编译,此编译过程因不同人而存在差异。鉴于这种不确定性,致使所有的设计文档随着时间的推进,与实际运行的代码相互间产生无法弥合的鸿沟。一个业务系统的文档愈发没有用处,也就愈发没人去写了。要是无法达成文档即代码,我们便无法留存真实可用的文档。

我们要将设计与实现融合,我们观察自然世界,所有设计文档图纸实则就是DNA,DNA在生命体的每个细胞里都有存在,DNA的传承即生命的传承,所有外化的文档最终都易于消失,恰似秦始皇一把火就把人类多年的沉淀与传承给毁掉了,然而DNA里生物的本能传承却是一代又一代地获得了传承与优化。

目标是,不存在那种独立于可执行系统之外的文档,所有的信息都蕴含在系统当中,只是借助一些工具来进行可视化,以此增强可读性,所有的信息都不可以凭空存在,都必然属于一个业务对象 。

5、面向功能的组件化设计到面向业务的对象化设计

这个充满我们的世界,能够依据熵改变的方向,划分出了熵呈现增加态势的无机体,以及熵呈现减弱趋向的生命体。

无机体借助设计、图纸,通过自顶而下这样不断地层层分解细化设计,之后以组件化方式拼装而成,其典型特征体现为依据标准组件化设计以及批量生产来达成协同与提效。

生命体,存在着由内而向外面的生长以及与之前不一致的变化情况。尽管从外观上看呈现出组件化的样子,然而由于基因并非相同,实际上不同的生命体是不能够彼此进行替换的,而且会引发出相互排斥抗拒的种种反应表现。生命体的所有构成部分,都是在基因的操控之下,实现同步生长的状态。生命体的生长以及其出现的和原来不一样的变化,是具有连贯性的。

凡由组件化构建而成的无机体,若欲发生质变,皆需推倒重来。类似于我们的城市,总是于持续拆迁期间实现膨胀那般。又如我们的7号楼,在设计告终之时,便已确定其仅能为6楼,或许借助冗余能加盖至8楼,然而倘若增至20楼,它必定会崩溃。若要盖到20层,唯有推倒重来。

因此按照抽象进行归纳,软件系统采用组件化设计,伴随业务不断发展,补丁变得越来越多,运转几年后就会被推翻重新构建,这是它注定的命运。

单个个体的有机体复杂度是有限的,靠群体协作形成巨大规模和力量,群体进化靠单体变异和自然选择演进,生命进化不可预测,如同父亲对儿子成长和未来不可预测。

现在,我们的业务系统,是由组件化系统构成,比如购物车、店铺、详情、库存,交易、营销、资金、支付、结算、财务体系。所有业务实现,是数据于这些组件系统里流动才实现的。在这个运行系统中,我们看不到天猫、淘宝、以及盒马、天猫超市、担保交易、预售、团购这些我们常听闻已熟悉的事物。它们都体现在一个个分散的数据字段及IfElse中。

我们设计的思路是,回归至业务的本质,运用对象化设计以使业务得以生长、继承以及变异。最基本的思路为:整个系统的根基乃是业务。你将会看见一个实实在在的Class称作淘宝,天猫,它们存在一个父亲名为市场,天猫超市是独立存在的Class,它是天猫的儿子。所有继承了其父亲基因的,拥有独立品牌心智的业务都会在运行期于真实中存在。借助对象来解除兄弟之间彼此的影响。核心控制性的基因是不可以改变的,然而新能力的创造,就脱离父亲的影响能够独立有所发展,并且还能够创造出新颖的子业务。

与此同时,我们还需构建出一桩业务对象协作的机制,天猫以及淘宝彼此协同动作,大麦跟飞猪是能够协同配合的,促使业务与业务之间形成连接,共同搭建起一个作动态繁衍态势的生态体系。假令我们能够将 Alibaba 整个商业体系利用图示的方式呈现出来,买家与卖家进入淘宝尚有天猫那一刻恰似融入游戏一样的状态,进入天猫那种有着超市特色的场所近似真实地进入一回超市,开展拍卖活动恰似模拟真正要敲击锤子那样予以实施,营造出虚拟世界的真实氛围 。

阿里巴巴业务平台,经历了从其关注重点为以功能当作中心,到以商业能力作为中心来考量,再到以业务作为核心要点的这样一种演进过程,而我们正行进在这条不断变化发展的道路之上。

你可能还喜欢

点击下方图片即可阅读

关注「阿里技术」

把握前沿技术脉搏

分享到:
相关推荐
暂无相关推荐
客服服务热线
4000553856
24小时服务
微信公众号
手机浏览

2020 All Rights Reserved 版权所有 芜湖招聘网 皖ICP备2024035723号-1

地址:芜湖市弋江区金鹰财富广场 EMAIL:admin@whzp.cc

Powered by PHPYun.

用微信扫一扫