第 17 章
三十年的遗产
2014年秋天,一位在SAP工作了十七年的资深架构师在内部技术评审会上打开了一份代码库分析报告。报告的结论只有一句话:“S/4HANA核心代码库当前规模约为四亿行,预计在正式发布时将超过五亿行。”会议室里没有人说话。四亿行代码意味着什么,在场的每一个人都清楚——这意味着任何一个模块的修改都可能触发数百个未知的依赖关系,意味着新功能的上线周期不得不从月拉长到季度,意味着整个系统已经复杂到没有任何一个人能够完整理解它的全部逻辑。这位架构师后来在一次非正式的内部讨论中说了一句被反复引用的话:“我们不是在构建软件,我们是在考古。”
这句话精确地概括了SAP在2010年代中期面临的深层困境。S/4HANA被寄予厚望——它是SAP对云计算时代的战略回答,是HANA内存数据库从技术突破走向商业成功的载体,是公司试图在不放弃既有客户基础的前提下完成技术代际跨越的核心武器。但这个产品的研发过程本身,正在成为SAP三十年成功模式的结构性代价的活体标本。
要理解这数亿行代码从何而来,必须回到SAP最引以为傲的基因:流程正统性。1972年公司创立时,五位IBM出身的创始人带来的核心洞察是——企业应用软件的本质不是编写代码,而是将最佳业务实践封装为标准化的流程模块。这个洞察在R/3时代得到了完美的验证。R/3的财务、物流、人力资源等模块覆盖了制造企业的几乎所有核心业务流程,每一模块内部都嵌入了SAP顾问们在全球数千家客户现场积累的行业经验。一家汽车零部件制造商购买R/3,得到的不仅是一套软件,也是一套被证明行之有效的业务流程模板。
这种“软件即管理咨询”的模式,使得SAP在1990年代迅速征服了全球大型企业市场,到2000年时,全球五百强企业中超过百分之八十都在使用SAP的系统。
但流程正统性范式的内置代价,从R/3成功的第一天起就开始累积。标准化的前提是抽象——要从无数具体企业的具体流程中提炼出一套通用模板,就必须做出取舍。SAP的选择是:尽可能多地覆盖行业变体。化工行业的成本核算逻辑与机械制造不同,零售业的库存管理逻辑与制药业不同,每一个行业都需要在标准模块上叠加特定的功能扩展。当SAP进入一个新行业时,最自然的做法不是重构底层架构,而是在现有代码基础上增加新的分支和配置选项。每一次增加都是合理的,每一个分支都对应着真实的客户需求,但三十年的累积叠加之后,代码库的复杂度已经超出了任何理性规划能够控制的范围。
一位参与过S/4HANA早期架构设计的工程师在行业会议上打过这样一个比方:R/3的代码库像一座持续扩建了二十年的老城,最初的城市规划只考虑了五万人口,但现在住着五百万人。每一条街道都曾经拓宽过,但拓宽的方式不是拆除重建,而是在原有路面上不断叠加新的沥青层。下水道系统被修补过上百次,电力线路的拓扑图已经没有人能画完整。当你试图在这座城市里修建一条地铁时,你永远不知道下一铲子会挖到什么——可能是中世纪的下水道,可能是二十年前的电缆,也可能是某个早已废弃但从未拆除的防空掩体。
这个困境在2010年SAP启动S/4HANA项目时达到了临界点。S/4HANA的使命是在HANA内存数据库上重建ERP核心,利用内存计算的速度优势简化数据模型——去掉传统关系型数据库中为了性能优化而不得不保留的聚合表、索引表和物化视图。理论上,这是一次架构层面的革命性简化。
但在工程实践中,问题远比预想的复杂:四亿行代码中,哪些是仍然活跃的业务逻辑,哪些是已经废弃但被其他模块意外依赖的遗留代码,哪些是某个特定客户在十五年前要求的定制功能而现在已经没有人记得当初为什么需要它?SAP的工程师团队花了大量时间不是在编写新代码,而是在理解旧代码。他们需要阅读1990年代的ABAP程序,需要弄懂那些早已离职的开发者留下的注释(如果还有注释的话),需要测试删除某段看似无用的代码是否会导致某个在巴西运行的财务模块突然崩溃。这不是技术能力的问题。
SAP拥有全球最优秀的企业软件工程师团队,他们完全有能力从头构建一套架构更简洁、代码更优雅的ERP系统。但问题在于,SAP不能从头构建。它的客户——那些在R/3上运行了二十年核心业务的全球制造业巨头——不会接受一个功能不完整的新系统。每一家客户都在R/3上积累了大量的定制化配置:特殊的审批流程、自开发的报表、与第三方系统的接口、为适应本地税务法规而修改的记账逻辑。
这些定制化是客户在二十年里投入了数千万甚至数亿美元建成的,它们不是系统的缺陷,而是系统对客户业务的深度适应。S/4HANA如果无法兼容这些定制,客户就不会迁移;但如果要兼容这些定制,代码库的简化就无从谈起。
这正是流程正统性范式的终极悖论:SAP之所以能够锁定全球最大的企业客户,恰恰是因为它的系统已经深度嵌入客户的业务流程,迁移成本高到几乎不可承受。但这种嵌入的另一面是,SAP自身也被客户的定制化需求锁定了。每一次版本升级都变成了一场艰难的谈判——客户要求新版本必须支持旧版本的所有定制功能,SAP则试图说服客户接受新的标准流程以替换那些昂贵的旧定制。在这场谈判中,天平越来越向客户倾斜。一家年营收数百亿美元的制造业巨头如果威胁说“我们不升级了”,SAP几乎没有任何筹码可以反制。
结果是,S/4HANA的代码库中包含了大量为了兼容旧版本而定制的“适配层”——这些代码的唯一功能就是让新系统能够模拟旧系统的行为,以便那些不愿意或无法修改定制逻辑的客户能够平滑过渡。到2015年S/4HANA正式发布时,其代码库规模已经让业界瞠目。作为参照,Linux内核的代码量当时约为一千五百万行,微软Windows操作系统的代码量估计在五千万行左右。一套企业应用软件的代码量超过操作系统一个数量级,这本身就是一个值得深思的信号。
它说明SAP的产品已经不是一套“软件”在通常意义上的概念——它更像是一套沉积了三十年企业业务知识的活体化石,每一行代码都对应着某个真实世界中的生产流程、财务规则或供应链逻辑。从人类知识积累的角度看,这是一座无与伦比的宝库;从软件工程的角度看,这是一个几乎无法维护的巨型单体。而在大西洋的另一边,Oracle正在为另一种范式付出同样沉重的代价。
2011年,Oracle的一位产品线副总裁在内部会议上提交了一份整合路线图。这份文件列出了Oracle在过去七年中通过并购获得的所有应用软件产品:PeopleSoft的人力资源管理系统、Siebel的客户关系管理系统、JD Edwards的中型企业ERP、Retek的零售管理软件、i-flex的银行核心系统,以及大大小小十几家专门领域软件公司的产品。这些产品加在一起,理论上构成了一套覆盖几乎所有行业和所有职能领域的完整企业软件矩阵。但在现实中,它们更像是被强行拼凑在一起的拼图——每一块都有自己的技术架构、自己的数据模型、自己的用户界面风格和自己的客户群体。
整合路线图的核心问题只有一个:如何将这些各自独立运行的产品融合成一套统一的云服务套件——也就是后来被命名为Fusion Cloud的项目。这份文件给出的时间表是:原计划2008年完成核心融合,推迟到2010年,再推迟到2012年,而目前看来2015年可能仍然无法完全交付。
每一次推迟的原因都不同:PeopleSoft的技术架构基于客户端-服务器模式,迁移到浏览器界面需要重写整个表现层;Siebel的数据模型与Oracle自有的CRM系统存在根本性的概念冲突——Siebel用“账户-联系人-机会”三级结构,Oracle CRM用“组织-人员-交易”的三级结构,两种模型在语义上近似但在技术实现上完全不可通约;JD Edwards的代码库中包含了大量为IBM AS/400小型机优化的RPG语言程序,这些程序在现代Java架构中没有直接对应物。这些技术层面的冲突只是表象。更深层的问题在于:每一套被收购的产品都带着自己的客户承诺。PeopleSoft的用户选择了它而不是SAP,是因为PeopleSoft的人力资源管理模块在处理复杂的薪酬福利规则方面被认为更灵活;
JD Edwards的用户选择了它而不是Oracle E-Business Suite,是因为JD Edwards在离散制造业的成本核算方面有独特的方法论;Siebel的用户选择了它,是因为Siebel在销售自动化领域的行业模板被认为是业界最细致的。如果Oracle将这些产品强行融合成一套标准化的云服务,它就必须在这些差异化的功能中做出取舍——保留一些,放弃另一些。但每放弃一项功能,就意味着可能会失去当初因为这项功能而选择该产品的客户。
Oracle的应对策略是典型的“数据霸权”思维:不追求应用层面的统一,而是追求数据层面的统一。Fusion Cloud的设计理念是——让所有应用共享同一个数据模型和同一套业务逻辑服务,但在表现层允许不同的“用户体验模板”来模拟旧产品的界面风格。这个思路在技术上是优雅的:PeopleSoft的用户看到的界面仍然像PeopleSoft,但底层的数据已经存入Oracle的统一数据库;
Siebel的用户操作习惯不变,但客户数据与Oracle CRM的数据合并到同一张表中。但这个策略的执行难度远超预期。数据模型的统一意味着要做出一系列不可逆的架构决策:客户的“地址”字段应该设计成几个字段?PeopleSoft用六个字段(街道、城市、州、邮编、国家、附加信息),Siebel用八个字段(增加了“地区”和“位置类型”),Oracle E-Business Suite用五个字段(把街道拆成两条,但不设附加信息)。统一数据模型时,选哪一种?选任何一种都意味着其他产品的客户在迁移时需要做数据转换,而数据转换是企业软件升级中最危险的操作——一旦转换出错,客户可能会丢失数十年的历史交易记录。一位参与过Fusion Cloud数据模型设计的工程师在行业论坛上描述过这个困境:“我们不是在写代码,我们是在做外交谈判。每一个字段定义背后都站着一群客户,他们用这个字段运行了十年的薪酬计算或库存盘点。
你不能告诉他们‘这个字段我们觉得没必要’,他们会反问‘那我们的十年历史数据怎么办?’”这种“数据外交”的结果是,Fusion Cloud的数据模型不得不设计得极度复杂——包含了所有被收购产品中出现的所有字段,外加大量的映射表和转换逻辑来确保不同来源的数据能够共存。到2014年时,Fusion Cloud的核心数据模型中仅“客户”这一个业务对象就包含了两百三十多个属性字段,其中至少有四十个字段只在特定行业或特定地区使用。整合成本的高昂不仅体现在研发端。Oracle的销售团队面临的挑战同样巨大。一个典型的Oracle销售代表在2010年代初需要维护的产品线包括:Oracle E-Business Suite(自有)、PeopleSoft(收购)、JD Edwards(收购)、Siebel(收购)、Hyperion(收购)以及正在开发中的Fusion Cloud。
这些产品中有相当一部分是互相竞争的关系:面对一个中型制造企业客户时,销售代表应该推荐JD Edwards还是Oracle E-Business Suite?面对一个人力资源管理需求为主的客户时,应该推荐PeopleSoft还是Fusion Cloud的HR模块?Oracle的管理层给出的官方口径是“根据客户需求推荐最合适的产品”,但这个口径在实际销售中意味着内部竞争和佣金冲突——销售代表有动力推荐佣金更高的产品而非最适合客户的产品。
更棘手的问题在于产品生命周期的管理承诺。Oracle在收购PeopleSoft和JD Edwards时,向这些产品的客户群体公开承诺将继续支持和升级这些产品线。这个承诺对于维持收购后的客户稳定至关重要——如果客户认为Oracle会立即终止对JD Edwards的支持,他们可能会在收购完成前就转向SAP或其他竞争对手。但长期维持多条并行的产品线意味着研发资源的分散和规模效应的丧失。
当Oracle投入数百名工程师维护JD Edwards的AS/400版本时,这些工程师就无法参与Fusion Cloud的开发;当客户询问“我们应该继续投资JD Edwards还是准备迁移到Fusion Cloud”时,Oracle的顾问们给出的答案常常含糊其辞——因为他们自己也不确定公司内部的优先级将在下一次预算周期中如何调整。这种混乱在2013年达到了一个标志性的节点。这一年,Oracle的一位大客户——一家跨国消费品公司——在内部IT审计中发现,他们同时运行着四套来自Oracle的不同的系统:财务部门使用Oracle E-Business Suite,人力资源部门使用PeopleSoft,销售部门使用Siebel,供应链部门使用JD Edwards。这四套系统之间的数据同步依赖着一百三十多个定制开发的接口程序,每年维护这些接口的成本超过五百万美元。
当这家公司向Oracle提出“能否帮我们整合成一套统一系统”的需求时,Oracle的咨询团队给出的方案是:迁移到Fusion Cloud。但Fusion Cloud当时还不支持这家公司所需的三项关键功能——PeopleSoft的全球薪酬计算引擎、Siebel的促销管理模块和JD Edwards的高级库存计划算法。解决方案是:等待Fusion Cloud的下一个版本。下一个版本承诺在2014年发布,后来推迟到2015年,再推迟到2016年。到2016年时,这家公司已经启动了向Workday迁移人力资源模块的评估——不是因为他们对Oracle的技术能力失去了信心,而是因为他们不能再等下去了。这两个镜像式的困境——SAP的代码臃肿和Oracle的整合混乱——常常被行业观察者分别归因于技术决策失误或管理执行不力。但这种解释停留在表面。
如果我们将视角拉远到产业结构演变的框架中,就会发现这两个困境不是偶然的管理失败,而是两种范式各自内在逻辑的必然产物。
SAP的流程正统性范式建立在这样一个核心假设之上:企业业务流程存在一套最优实践,软件的任务是将这套最优实践封装成标准化的模块,客户通过采用这些模块来提升自己的运营效率。这个假设在制造业主导的时代是成立的——财务记账的逻辑在全球范围内高度统一,供应链管理的基本原理不会因为国界而改变,生产计划的物料需求计算遵循的是数学规则而非文化习惯。但当企业软件从制造业扩展到服务业、从大型企业扩展到中型企业、从欧美市场扩展到全球市场时,“最优实践”的概念开始变得模糊。一家德国汽车零部件制造商的最优库存策略与一家中国零售连锁店的最优库存策略可能完全不同——不是因为谁更先进或谁更落后,而是因为它们面对的市场结构、物流基础设施和消费者行为模式完全不同。
SAP的回应是为每一种变体增加配置选项,而这些配置选项的累积最终导致了代码库的指数级膨胀。这不是工程师们犯了错误,而是范式本身的逻辑推演到极致后的必然结果:如果你相信软件应该封装最佳实践,而最佳实践因行业、地区和规模而异,那么你就必须封装所有这些变体。四亿行代码不是失败,而是成功——它意味着SAP确实覆盖了全球企业业务的几乎所有可以想象的变体。
Oracle的数据霸权范式建立在另一个核心假设之上:企业应用的本质是数据的采集、存储、处理和呈现,谁控制了数据层谁就控制了整个应用栈。这个假设在数据库技术主导的时代是成立的——当所有应用都必须依赖底层的关系型数据库来存储和查询数据时,数据库厂商确实拥有结构性的议价优势。Oracle通过连环并购获取客户和数据,然后通过数据库的紧耦合锁定这些客户,这个策略在2000年代被证明极为有效。但当云计算将基础设施层从应用层分离出来时,数据霸权的根基开始动摇。
亚马逊AWS、微软Azure和谷歌云提供的数据库服务在性能上迅速逼近甚至在某些场景下超越了Oracle,而它们的定价模式是按使用量付费而非按处理器核心数收取高昂的许可证费用。当客户可以选择将数据存储在云服务商的数据库上并通过API与SaaS应用连接时,Oracle“拥有数据库就拥有客户”的逻辑链条就断裂了。
Fusion Cloud的整合困境之所以如此痛苦,正是因为Oracle试图在一个已经不再由数据库主导的世界里,用数据库时代的工具来解决应用层的整合问题。这两种范式的代价在2015年前后开始以具体的财务数据显现。SAP在S/4HANA的研发上投入了据估计超过四十亿欧元的累计成本,但到2015年底,成功迁移到S/4HANA的客户数量远低于公司最初的预期。大多数客户选择了“等待观望”——他们继续运行着稳定的旧系统,每年支付维护费,但暂不启动迁移项目。
这意味着SAP投入的巨额研发成本无法在短期内通过新增收入来回收,而维护旧版本的持续成本并没有因为新版本的发布而减少。Oracle面临的是另一种财务压力:维持多条产品线的研发和支持团队导致运营成本居高不下,而Fusion Cloud的延迟推出意味着公司在云订阅收入方面落后于Salesforce和Workday等竞争对手。2015财年,Oracle的云业务收入虽然增长迅速,但与传统软件许可证收入的下降相比,总营收的增长几乎停滞。
然而,如果仅仅停留在批判两种范式的代价,就会错过这场三十年争霸真正重要的遗产。SAP和Oracle所塑造的竞争规则——标准化软件征服全球市场、资本并购作为获取客户和技术的常规武器、生态系统的构建和锁定——已经深刻地改变了企业软件行业的底层逻辑。今天任何一家企业软件创业公司,从第一天起就必须面对这样的问题:你的产品是否足够标准化以规模化销售?你是否有明确的并购或被并购策略?你的生态系统如何构建?
这些问题在1972年SAP创立时根本不存在,在1977年Oracle创立时也只是模糊的远景。是这两家公司用三十年的对抗和互相学习,将这些问题变成了行业的基本语法。
更重要的是,它们共同证明了企业软件行业的终极竞争壁垒不是技术领先性,而是客户的迁移成本。SAP的客户之所以忍受着复杂的升级过程和昂贵的维护费用仍然留在SAP的生态系统中,是因为他们的核心业务流程已经深度依赖SAP的软件——离开SAP意味着要重新设计财务部门的账目结构、重新培训数千名员工、重新建立与供应商和客户的数据接口。Oracle的客户之所以容忍着产品线的重叠混乱和整合进度的反复推迟,是因为他们的数据库里存储着数十年的交易记录、客户档案和供应链数据——这些数据的格式、完整性和上下文含义已经与Oracle的数据库技术深度绑定。迁移成本不是技术锁定的副产品,而是两家公司三十年战略选择的核心目标。
SAP通过流程嵌入提高迁移成本,Oracle通过数据绑定提高迁移成本,两者殊途同归。这种迁移成本的结构在云计算时代面临着根本性的挑战。云原生ERP厂商——Workday、Salesforce以及一批更年轻的创业公司——从一开始就设计了一套完全不同的锁定机制:它们的锁定不在技术和数据层面,而在网络效应和持续创新层面。Workday的人力资源管理系统之所以难以被替换,不是因为客户的数据被锁定在Workday的数据库中(事实上Workday提供标准的数据导出接口),而是因为Workday每季度推送的功能更新使得客户始终处于一个持续优化的轨道上——一旦离开这个轨道,客户的HR流程就会迅速落后于行业前沿。
Salesforce的CRM系统之所以难以被替换,不是因为技术架构的封闭性(Salesforce的平台对外开放了大量API),而是因为客户已经在Salesforce的AppExchange生态系统中集成了数十个第三方应用——这些应用之间的协同效应构成了新的迁移壁垒。当SAP和Oracle终于意识到竞争规则已经在悄然改变时,它们发现自己处于一个尴尬的位置:旧范式积累的迁移成本仍然强大,但这些成本正在随着客户新一代决策者的上任而加速折旧。一家制造企业的CIO如果在2015年已经五十五岁,他大概率会选择继续维护现有的SAP系统直到退休——他熟悉这套系统,他的团队熟悉这套系统,任何迁移风险都是他不愿意承担的。
但如果这家企业在2016年任命了一位四十岁的新CIO,她的计算方式完全不同:她看到的是每年支付给SAP的数百万美元维护费与Workday或Salesforce提供的订阅费之间的直接对比,她看到的是年轻一代员工对现代用户界面的期待与SAP传统界面之间的落差,她看到的是业务部门对IT响应速度的不满与云服务承诺的快速迭代之间的张力。每一年的代际更替都在削弱旧迁移成本的有效性。
截至2023年,SAP与Oracle合计仍占据全球ERP市场超过百分之四十的份额。这个数字本身是惊人的——两家公司在三十年里建立的市场地位至今没有被颠覆。但这个数字背后隐藏着另一个不那么令人安心的趋势:在新获得的ERP客户中,云原生厂商的份额正在快速上升。尤其是在中型企业市场,Workday和Salesforce的增速已经连续多年超过SAP和Oracle。
大型企业市场仍然是两大巨头的堡垒,但这个堡垒的城墙正在从内部被侵蚀——不是被竞争对手的攻击打破的,而是被客户自己的业务转型需求从内部撑裂的。当一家传统制造企业开始将业务重心从生产转向服务时,它对ERP系统的需求会自然地从以流程控制为核心转向以数据分析和客户交互为核心——而这恰恰是云原生厂商的主场。
回到2014年秋天的那间会议室。当SAP的那位资深架构师说出“我们不是在构建软件,我们是在考古”这句话时,他准确地捕捉到了流程正统性范式三十年演化的终极状态:一套承载了太多历史层积的系统,每一个层积都有其存在的充分理由,但当它们叠加在一起时,系统的演进速度已经跟不上市场变化的速度。而在大洋彼岸的Oracle办公室里,那位拿着整合路线图的产品线副总裁也在面对同样的困境——他的路线图之所以一再推迟,不是因为缺乏技术能力或管理决心,而是因为每一次整合都意味着要剪断某一条连接着真实客户业务的脐带。
这些脐带是Oracle在三十年里刻意培育的,它们是数据霸权战略最成功的证明,也是最沉重的遗产。三十年的争霸留下的不是胜利者和失败者,而是两套各自抵达其逻辑终点的范式,以及这两套范式为整个行业定下的竞争语法。这两家公司教会了世界如何构建企业软件市场,如何定义竞争规则,如何衡量成功。
但当新的语法开始在云原生的土壤上生长时,它们发现最难改变的不是技术架构或商业模式,而是那些曾经让它们成功到近乎不可战胜的东西——那些数亿行的代码,那些数十亿条客户数据,那些运行了十年以上的稳定系统,那些忠诚但也因此而被锁定的客户群体。在慕尼黑SAP总部的一间办公室里,一位参与了R/3最初版本开发的老工程师在退休前留下了一句话:“我们当年写下的每一行代码都是在解决一个真实的问题。三十年后,这些解决方案本身变成了新的问题。”这句话或许是对这场争霸最精确的墓志铭——不是讽刺,而是描述。
每一代技术的成功都会为下一代技术设置障碍,每一个范式的胜利都会埋下下一个范式革命的种子。SAP和Oracle的三十年争霸史,归根结底是这样一部历史:它们用各自的方式定义了企业软件的可能性边界,然后被自己定义的这个边界困住了。
而那个困扰着数千家企业CIO的问题——“什么时候迁移到云”——正在被时间本身回答。不是被某一家公司的技术突破回答的,也不是被某一次成功的产品发布回答的,而是被旧系统的老化、新一代决策者的上任和竞争对手的持续蚕食共同回答的。每一年的推迟都在改变天平两侧的重量配比:旧系统稳定性的分量在减轻,新系统功能完备性的分量在增加。当两条曲线最终相交时,那些等待了太久的CIO们会发现,决策的窗口已经比他们预想的要窄得多。这不是技术落后导致的惩罚,而是范式转型中先行者必须付出的时间代价——而这个代价的账单,正在以市场份额数字的缓慢但持续的重新分配的形式,一笔一笔地到期。