阿里玄难:面向不确定性的软件设计几点思考

640x_fmt=jpeg

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

640x_fmt=jpeg

 

玄难

阿里副总裁

业务平台事业部掌门人

 

特别说明:本文中所说的软件都指代面向最终用户的偏业务的软件,不包含操作系统、中间件等系统软件。

 

1、软件发展的几个阶段

 

  • 软件工具和信息化阶段:软件最早是为了数值计算,以工具的形态出现的。包括PC时代我们非常熟悉的Excel,Word这些好东西。以及典型的企业内部管理的信息系统,例如:企业流程审批、进销存管理系统等等。

  • 互联网服务阶段:随着PC互联网兴起,淘宝、QQ、Google、新浪这些全新的互联网服务逐步进入了我们的日常生活。

  • 社会基础设施阶段:随着移动互联网、IOT、人工智能的出现和高速发展,各种各样的软件进入社会经济生活的方方面面,软件之间相互连接,构成了一个纷繁复杂的生态系统,变成了不可或缺的社会基础设施。

 

随着软件形态的变化,过去非常高效的系统架构和组织形态遇到了全面的挑战。因为我们所处的环境已经从量变到质变,突破临界点,产生了本质的不同。

 

阿里巴巴就是这个过程中的典型代表。从过去单一的电商业务演变成了复杂的经济体,没有了确定性的业务边界,蓬勃发展的业务不可预测。比较典型的特征就是:

  1. 从过去的一个淘宝演变成了几十个事业部和公司,新零售、云计算、文娱健康等等几百种业务,还在不断地快速演进;

  2. 从曾经的一个Denali系统,通过分布式架构演变成了上万个系统的群落,各种业务逻辑交织在一起横贯众多系统,说不清道不明;

  3. 从曾经几十个人的协同演变成了几万人的协同,每个人都像在原始热带雨林,不知业务全貌,盲人摸象;

  4. 从曾经的可停机发布演变成了不可中断,连续进化的社会基础设施,不仅要系统稳定性,更要业务连续性。如何确保这个基础设施的安全、高可用性,同时提供给业务方高效无障碍的创新支持,就是我们必须去解决的核心问题。

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

 

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

 

作为程序员,我们都知道:软件要能符合预期,我们需要确定性。不确定性对程序设计来说是致命的。所以我们经常会听到抱怨“需求又变了”,网上很多段子都是程序员讨伐业务方和产品经理不停变更需求。

 

软件在“工具和信息化”时代,本质上是把原来的人工工作,用计算机软件来模拟,实现电子化,因此有个典型的特征:业务领域、软件职责和功能边界都相对清晰。因此最经典软件工程理论是瀑布模型:收集需求、画UserCase、确定功能集合、模型抽象、概要设计、详细设计、编码、单元测试、集成测试、用户测试、上线运行。然后投入下一个版本的迭代。传统的软件开发大多数都是这种模式。这种模式特别强调文档质量和变更的全流程一致。

 

在互联网服务时代,用计算机软件实现了靠人肉无法完成的能力,为人类社会提供了很多全新的服务能力。我们继承了传统的软件工程理论,也做了适度的改良。为了缩短版本迭代的时间,更快地验证产品想法获取用户,大多数团队采用敏捷模型。本质上是把需求批发模式变成了零售模式。这种模式最大的好处就是对产品需求的快速响应,但致命的是每次敏捷大多数情况下是在不断地打补丁,软件架构快速腐化。要不了两年,敏捷事实上变成了蜗牛。再熬两年,受不了了,就重构。但所谓的重构事实上是推倒重来。这种模式下几乎没有可用的文档了。

 

在前面这两个阶段的软件设计理论都有一个基本假设:软件边界是确定的,我们通过归纳总结和适度的预测(避免过度设计)来进行模型抽象。通过模型抽象,我们设计了各种可配置性来快速接入需求,提升效率,也就是我们常说的产品化。通过接口设计和模块化设计来进行组织分工协作。通过系统架构的开放性来应对不能配置的变化。变化一般来自两个方面:

 

首先是用户量增长,通常是用分布式来解决,分布式数据库,分布式缓存、分布式服务,多机房多单元,CDN等等。在这方面阿里巴巴应该是做的非常优秀。从五彩石开始至今,阿里巴巴的架构基本上都是这一指导思想的落地实施和优化完善,也仍是应对用户量快速增长的良方。

 

第二个方面业务功能的变化,我们通常说的系统可扩展性。通过传统数据库的大字段或者NoSQL,用“元数据+K-V存储”的方式来应对数据信息的不确定性;通过流程引擎来满足工作流程的快速响应;通过规则引擎来代替程序中的大量If-Else,实现界面配置来实现规则的变化。通过UI组件化,配合UI的编辑器来快速调整用户界面的变化。通过插件技术来将容易变化,且相对复杂的逻辑从主流程中剥离出来进行扩展。我们去看目前比较的套装优秀软件都大致如此。

 

截止目前,我们的软件研发,都是面向一个确定性的问题,类似一个圆圈,他是有需求边界的,我们从四周向内聚,做抽象,就是我们的业务抽象或者建模;它就是我们的房子,被四个边角承重墙划清了边界,里面的装修可以根据主人的爱好和阶段性诉求重构,但没法向外延展;它的特点是框架结构,业务领域模型抽象、组件化、版本化、外延向内;

 

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

 

随着移动互联网,IOT,人工智能的发展,软件变成了社会的基础设施,我们每个人被软件牢牢地控制了,一天黏在手机和电脑上。人其实是作为终端接入软件网络。社会形态是没有边界的,是连续变化的,不可预测的。阿里目前的业务也是没有确定性边界的,不知道明天会变成什么样,它不是版本化的,是在不断在生长和变异。就没有确定性的软件外延。如果没有确定性的外延,而软件的运行又是需要确定性的,我们就只能去寻找确定性的内核。

 

如何理解这个变化。我们可以从机器学习的发展来类比。传统的机器学习有很多的算法模型,线性回归、决策树、随机森林算法、逻辑回归、SVM、朴素贝叶斯、K最近邻算法、K均值算法等等。我们要解决,首先要尝试分析问题领域,才能选择匹配的算法模型,才能得到好的结果。如果是个非线性问题,但错误的选择了线性模型,就拿不到结果。这种解决问题的思路,就是要先寻找一个确定性的问题边界,才能向内寻找参数。但深度学习的解决思路有个本质变化,不定义问题域,只定义稳定的结构,BP神经网络,有输入层,多个隐藏层和输出层。如果我们把图像数据输入进去,就构建图像分类和人脸识别的能力,语音输入进去,就构建出语音识别的能力(当然没有说的这么简单)。深度学习是由内而外的自我学习和生长的。

 

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

 

640x_fmt=png

 

阿里巴巴业务平台的演进:以功能为中心以商业能力为中心以业务为中心,我们在路上。

640x_fmt=jpeg

阿里玄难:藏经阁计划首次在阿里应用落地

640x_fmt=jpeg

首次公开!2018双11技术数字全记录

640x_fmt=jpeg

关注「阿里技术」

把握前沿技术脉搏

来源:阿里技术_

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年11月9日
下一篇 2018年11月9日

相关推荐