相对于系统软件而言,企业软件往往是面向应用场景、业务逻辑。虽然很多工程师、架构师会面带严峻表情的告诉你,软件项目所要保障的高可用性、鲁棒性、可扩展性、高并发性、低延迟性、安全性、可测试性、灵活性,是如何如何的重要,仿佛一套只有几个部门三五十人用的软件系统,其架构也得是多么科学、严谨、隆重的经历一系列的设计、论证、测试,姿势拉好、仪式感满满。
但现实中,多少企业的软件系统是由代码屎山堆成,多少IT运维人员是每天沉浸在救火中,多少开发工程师被业务部门的需求逼迫的996也依然人仰马翻,多少业务人员则是被“提新需求如油盐不进、讨旧债务似老鼠拉龟”不见效果的系统折磨出焦虑症。
今天面向业务逻辑、应用场景的软件系统,其底层或者说基础技术层(例如网络连接、多线程、内存管理等等)早就被封装成成熟的组件了,最难、最硬核部分的技术工作,可能九成以上被某些开源项目或者商业组件解决了,企业软件系统的开发工程师,需要编写代码解决的主要问题,都是业务应用问题 - UI编程、表单处理、数据存取、增删改查、消息队列、任务调度、领域建模、接口集成、服务封装、信息同步、批处理... 有多少技术含量?如果你问一个三十年前的C++程序员,手工搓网络代码、手工写线程管理、手工打造应用框架、然后手工建对象模型开发应用逻辑... 今天的这种企业应用开发,对他而言可能就是裱糊匠的工作...
那么为什么这些系统的开发、扩展、维护还是这么痛苦?其最根本原因,如果只选一个的话,那就是:紧耦合。代码屎山就是因为代码写成一坨,环环相扣,牵一发动全身,历史代码谁都不敢乱改乱动,在“意大利面条”般的条件判断语句和无穷无尽的打补丁中堆成。“敏捷”大部分情况下是一种口号或者自嗨,从来没有让业务部门承认过信服过...
企业应用软件架构,扯更多的“性”没用。极端一点的说,如果只选择一个企业软件架构设计原则彻底奉行,那只有是:坚持“分而治之”的原则,建立高内聚、低耦合的技术架构。
甚至可以说,一个企业软件系统的架构师,其终生职业所做的事情,不过是设计低耦合技术架构 - 不断的梳理问题、解耦千丝万缕的关系,对问题分而治之,各个击破,必要时则又对集中统一与解耦分离作出一定的折衷取舍,仅此而已。
分治算法,对于每一个计算机科学系毕业的学生,都是入门级的“数据结构与算法”必修课里的基本内容。“高内聚低耦合”的技术架构,可以算是分而治之的算法精神的一个体现。事实上,在软件世界分治算法无处不在,以下是大家熟悉的例子。
MapReduce 是一种编程模型和处理大规模数据集的计算框架。它在分布式计算环境中实现了“分而治之”的思想,将大规模数据处理任务分解为可并行处理的小任务。
MapReduce 的优势在于它能够高效地处理大规模数据,并通过分阶段的操作实现了任务的拆分与聚合。
ETL 是一种用于将数据从一个地方提取、进行转换,然后加载到另一个地方的数据处理过程。ETL 过程同样遵循“分治算法”的思想,将复杂的数据处理任务拆分成几个独立的步骤。
ETL 的分而治之体现在每个阶段的独立性,每个步骤都专注于特定的任务,通过将复杂的数据处理流程拆解为简单的步骤,提高了可维护性和扩展性。
微服务(Microservices)。微服务架构是一种软件设计方法,将一个大型应用程序拆分成一组小型、相对独立的服务。每个服务都负责一个特定的业务功能,可以独立开发、部署和扩展。微服务体现了“分而治之”的思想,通过将整个系统分解为小而自治的服务,降低了系统的复杂性,使得每个服务可以独立演化和扩展:
Docker 容器技术:?是一种轻量级的容器技术,通过将应用程序和其依赖项封装到容器中,实现了跨平台、一致性和可移植性。Docker 的设计理念与“分而治之”相符,通过容器化应用,将大型系统分解为小而可管理的单元:
Kubernetes 技术:?是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它体现了“分而治之”的思想,通过将应用程序部署为多个容器,并提供自动化的管理工具,实现了系统的高效、弹性的运维:
通过微服务、Docker 容器技术和 Kubernetes 技术的结合使用,系统的复杂性得以降低,每个组件都可以独立演化和部署,实现了系统的分而治之。这样的设计思想有助于构建更灵活、可维护和可扩展的分布式系统。
神经网络:?神经网络是一种由多个神经元组成的模型,它们分层组织,通过学习从输入到输出的映射关系来完成任务。在神经网络中,分治算法的思想体现在网络的分层结构和层级特征提取上:
Mixture of Experts 模式:?Mixture of Experts 是一种神经网络结构,其中包含多个专家(experts),每个专家负责处理特定类型的输入或任务。这种结构体现了“分而治之”的思想,通过将整个问题拆解为多个专家负责的子问题,每个专家独立学习和处理局部信息。传说中OpenAI的大语言模型实质上以MOE构成,而在开源大语言模型领域表现突出的Mistral则发布了Mixtral 8x7B,在多项指标超越GPT 3.5和Llamma2 70B
大语言模型的 Multi-Agent 多智能体:大语言模型中的 Multi-Agent 多智能体结构是一种通过协同工作的多个智能体(agents)来解决复杂问题的方法。每个智能体负责学习和处理特定方面的知识,整体上体现了分治算法的思想。每个智能体都可以独立地思考、决策和行动,同时与其他智能体进行交互。多智能体系统可以用于解决许多复杂的问题,例如协作、博弈、规划、控制、优化等等:
神经网络、Mixture of Experts 模式和 Multi-Agent 多智能体都体现了分治算法的思想,通过分解问题、分层学习、任务分配和协同工作,实现了对复杂问题的高效处理。这种分而治之的设计理念使得模型更具有可扩展性、可维护性,并有助于提高系统的整体性能。
软件的插件机制、应用商店和小程序技术在架构设计理念和运作模式上具有以下共性,都体现了“分而治之”的思想:
这三种技术作为典型的体现机制,都验证了基于“分而治之”的低耦合组件化设计,是构建灵活、易扩展、协同创新的软件系统的有效模型。这为企业软件架构提供了可资借鉴的设计模式。
管道-过滤器架构和面向服务架构(SOA)都体现了“分而治之”的思想,主要体现在:
管道-过滤器架构将一个处理流程分解为一个一个的过滤器组件,每一个过滤器实现某一个步骤的处理功能。这些过滤器之间松耦合,通过管道(如流)串联起来,实现流水线式的并行处理,大大提高了效率。过滤器和服务内部是高内聚的模块,具有单一职责;而它们之间通过管道或标准化接口进行松耦合,降低了依赖,提高了灵活性。通过配置和编排框架,可以复用和灵活调度这些可组合的服务或过滤器构建流水线,以满足不同的业务处理需求。实现了可重用性和业务流程的敏捷配置。
SOA是一种软件架构风格,它将应用程序中的功能模块封装成服务,每个服务实现一组内聚统一的业务能力,服务之间通过定义良好的接口契约进行通信与交互。这种方法可以实现应用程序的快速开发和部署,同时也可以方便用户获取应用程序。SOA体现了分治算法的精神,将一个大问题分解成若干个小问题,然后逐个解决这些小问题,最后将结果合并起来得到大问题的解。
在上述众多体现“分治”精神的软件架构模式下,对于企业来说,“商店模式”最为值得借鉴,这是数字化时代任何企业在数字化转型过程中最为有用的企业技术架构。
企业IT思维从扮演“集成商”角色转变为扮演“平台运营商”角色。过去企业IT的开发人员最主要做的事情是充当裱糊匠,调用、粘合第三方系统,没完没了的“集成” 。是时候提高“平台”意识,由IT基于企业诉求搭建框架、技术平台,制定标准,让开发商、技术供应商遵循这些标准来提供“插件”、“乐高”。即使是IT自己,内部的很多开发团队实际上也是这类“插件”的提供者。
“插件”应聚焦业务应用,而不是底层技术,业务插件实际上是一种“轻应用”。轻应用型的“插件”机制是高层技术载体,让开发者无需了解插件的“母体”软件系统或者说“宿主”,即可开发、调试业务内容。且开发者之间无关联关系,互相不影响,可以(1)并行开发互无干扰,(2)无上限的扩展开发小组/团队的数量。让每个业务部门的数字化业务内容得以平行进行。
“插件”的上下架、审核、审计、搜索发现、升级更新、分发出版,均应在企业内统一管理。这个管理的技术载体,就是“应用商店” - 也可以称之为“插件商店”、“乐高商店”。这类的“应用”,不是手机上的App,更有可能是基于HTML5或在其基础上扩展的DSL(Domain Specific Language)开发的业务逻辑代码模块。
走向开放与连接。传统企业IT思维是,强烈假设一个软件系统的内容必然由IT开发或集成,由内而外的输出。但在数字化时代,这个假设未必再成立,数字企业需要在安全可控的基础上更加开放,其中包括如何允许业务部门引入第三方合作伙伴或业务内容供应商的源代码运行在己方的系统(例如App)中,或者说,如何让第三方而不仅是IT自己提供插件,从而形成自己的数字化合作生态,起到借力打力的效果。从某种角度看,数字生态与连接是数字化企业无法绕开的。拥有一个插件“商店”并开放,就拥有一个数字生态。
有想法有能力的企业IT,采用“商店模式”自主研发一个内部的“插件商店”、软件模块的“零部件仓库”,说难不难,但要让其有生命力、长期可持续发展,则是一件相当挑战的事情。
例如,在移动互联网发展中后期,不少技术团队也探索出用HTML5实现业务逻辑导向的、变更相对频繁的模块并支持热更新,降低对手机上原生App的变更所产生的成本,提高开发测试和发版的敏捷度。
但是这种做法有几个不足之处:
说到底,自我发明“插件”机制、自我定义“轻应用”规范,最大的问题是:缺乏工业标准。没有标准就没有开放性,也就没有技术生态、内容生态可言。技术供应商、系统集成商等乙方需要根据不同的甲方客户的技术要求,把相同的技术内容作重复开发。因为给每一家客户都是做人力密集型的“外包”,实施成本高并且因客户而异,所以乙方也不得不把成本转嫁于甲方。简单的说,甲方乙方的对接成本都非常高。
那么,对于传统企业IT而言,是否足够大的企业就有资格去制定某个行业内的“轻应用”标准,从而约束业内软件供应商、开发商、集成商去共同遵循,达到整个行业的降本增效?答案恐怕也是否定的,因为被某个行业共同接受的标准,不仅制定周期长、涉及众多同业机构的协商和扯皮,更往往同样没有生命力,终究要被互联网标准、市场约定俗成的“既成事实”标准所替代。
鉴于这样的观点和认知,市场上出现了以凡泰极客FinClip引领的“小程序容器”技术,它专为企业软件系统建设而生,背后的设计逻辑是:
PWA(Progressive Web App)、.Net以及众多JavaScript Meta Framework(诸如Next.js、Nuxt.js、SvelteKit、Astro、Vite、Remix... 以及涉及Hydration、SSR等诸多技巧与概念),在移动互联网高度繁荣、人机交互体验领先全球的中国市场,从来都没有取得过成功或者成为主流。相比之下,小程序技术是最符合国情的轻应用技术。凡泰极客把这种技术重新发明为企业应用软件的基础平台,有非常合理的市场基础。
小程序技术可以说是把高内聚低耦合的架构设计思想发挥到极致。
从业务功能解耦的角度看,任何业务场景、应用逻辑,都可以独立在某个小程序中实现,而小程序之间互无关系、互不影响。
从开发团队解耦的角度看,任何开发小组、开发团队仅负责自己的小程序,彼此无依赖关系。运行在小程序容器中的代码,彼此之间有安全隔离、资源隔离,所以小程序代码库及知识产权均独立维护。
从规模效应(Economy of Scale)的角度,任何拥有小程序容器技术的企业,均可以像某些互联网巨头一样,引入、运行无上限的小程序内容 - 注意这是“数字化转型”的关键,当企业可以低成本甚至接近零成本的引入极其丰富的小程序化业务内容时,即可让其客户、员工、合作伙伴“不离线”的在平台上获得一切的数字服务,所谓数字化就达到“从量变到质变”。
从敏捷触达市场(Time to market)的角度看,任何小程序化的业务场景、应用逻辑,均可以“小程序粒度”发布或回收。以银行为例,通过这样的技术,在其App中,每天可以由各业务线、各区域分支行灰度发布和上下架小程序内容百千次,谁都不用等候谁,功能上架没有在IT枢纽排期一说。内容发布变成一个以IT、法务、合规、风控等部门联合管控的运营事务。
从数字内容生命周期的角度看,小程序化的业务数字内容,其开发、测试、灰度发布、审核、审计、上架、下架等全生命周期的管理,完全由“业主”部门自主负责,和它所运行的软件系统“宿主”环境(例如某个App)无关。
从生态化的角度看,拥有小程序技术平台的企业,技术上也拥有了自己的“小程序商店”,具备了自主打造合作生态、发展合作伙伴的可能性。数字化转型的焦点,从建设基础技术平台,转移为运营数字化生态。生态建设的成功,不再受技术掣肘,全在于企业的线上开放合作的营销推广能力。
企业应用软件系统的小程序化,可以说是“分治算法”精神下一种极致的低耦合技术架构,企业软件的“可测试性”、“可扩展性”、“灵活性”、“鲁棒性”等等,会随之而来。