过去这一年,SAP 技术圈里被讨论得最多的两个词,一个是 ABAP Cloud,一个是 Generative AI。恰好这两个话题,在 ABAP Development Days 2024 上被放到了一起,也逼着所有还在写 Classic ABAP 的老开发重新问自己一个问题:接下来到底学什么、怎么迁、如何在新旧技术栈之间平稳落地。这篇文章我想结合这次大会的关键信息和自己的实际经验,聊聊经典 ABAP 开发者在 ABAP Cloud 和生成式 AI 浪潮下的转型路径、实操要点,以及踩过的坑,希望能给正在做技术选型和团队能力升级的人一点参考。
1. 为什么ABAP开发者都在谈“上云”和“AI”
1.1 Classic ABAP的存量现实与升级痛点
先说一个无法回避的事实:目前全球范围内运行着的 SAP 系统中,绝大部分还是以 Classic ABAP 方式开发的存量代码。经典报表(Classic Report)、功能模块(Function Module)、隐式增强(Implicit Enhancement)、直接读取数据库表、跨客户端访问……这些在过去二十年里帮企业解决了大量业务问题的写法,在 S/4HANA 和云化趋势下,正在变成升级路上的主要阻力。
我自己参与过不少 S/4HANA 升级评估,最常见的场景是这样的:系统里攒了上千个 Z 开头的自定义对象,其中相当一部分是嵌套报表、批处理程序和早期遗留的功能模块。这些代码往往没有足够的文档,写的时候也没有考虑过“扩展性”和“未来兼容性”。到了升级验证阶段,光是把这些自定义代码在 S/4HANA 上的兼容性问题梳理清楚,就要消耗团队几个月的精力,更不要说有些代码用了不再支持的数据库表或废弃 API,直接导致无法编译和激活。
这也正是 Classic ABAP 转型的第一层痛点:技术债不是一天形成的,但它会在升级和云迁移的关口一次性爆发。传统开发模式允许你直接修改 SAP 标准对象、允许你跨应用服务器做全局数据共享,在传统 NetWeaver 环境里,这些能力是“便利”;但如果想把系统搬到云端,或者用云策略来治理架构,这些能力就变成了“风险”。
1.2 ABAP Cloud要解决什么问题
ABAP Cloud 不是一个新语言,严格来说是基于 ABAP 的一套云优先开发范式,它规定了你在云环境里应该如何写代码、能使用哪些 API、不能使用哪些 API,以及如何通过扩展而非修改来满足业务需求。第一次接触 ABAP Cloud 的人,最直观的感受往往是“限制变多了”。比如不再允许直接访问 SAP 标准表、很多传统语句被列为关键字不支持(如经典的 H 开头的直接内表访问需要改用新语法)、所有数据访问都要通过 CDS 或托管服务完成。
但换个角度想,这些“限制”其实是在帮开发团队建立护栏。SAP 提出的 Clean Core(清洁核心)理念,本质上就是希望企业尽量少改标准对象、多用标准扩展点。这样带来的直接好处是:升级成本大幅下降、系统稳定性更高、未来可以更平滑地迁移到云环境。ABAP Cloud 恰恰就是清洁核心的技术落地方式,它把“能不能这么做”从自觉约束变成了编译器和运行时层面的强制性规则。
另外,ABAP Cloud 的编程模型核心是 RAP(Robust Application Programming)。这个模型抽象出了业务对象、行为、服务暴露这几个层次,让开发者可以用一套相对统一的模式去开发 OData 服务、Fiori 应用和后端逻辑。和传统 ABAP 相比,RAP 更像是在“框架内写业务”,而不是“从零开始搭架子”,这一点对团队工程化能力的提升很有帮助。
1.3 2024年为什么是转折点
很多人问我,为什么不是 2020 年、2021 年谈转型,而是 2024 年显得格外重要?我的感受是,ABAP Cloud 的概念已经提出了几年,但此前一直面临“生态工具不成熟、参考案例少、团队有畏难情绪”的问题。而 2024 年前后,几个因素刚好叠加在一起:SAP S/4HANA Cloud 私有化版本在国内大客户中的渗透率明显提升,RAP 相关学习资源和工具链(ABAP Development Tools、Cloud Foundry 环境下的部署管线)趋于稳定,再加上生成式 AI 的爆发,让开发者可以用 AI 辅助完成不少以前需要花大量时间去查阅文档和样板的编码工作。
换句话说,ABAP Cloud 不再是一个“战略话题”,它已经变成很多项目里真实落地的主线任务。而生成式 AI 在这次变革里扮演的角色,不是替代开发者,而是降低转型初期的技术门槛和挫败感。所以 2024 年让我最明显的感觉是:一线开发者终于可以在一个相对完整的工具链里,去实践新范式下的 ABAP 开发,而不是只停留在 PPT 和概念验证阶段。
2. ABAP Cloud落地:从“能用”到“用得顺手”
2.1 清洁核心原则:分清“扩展”与“修改”
清洁核心这个概念,听起来很高大上,落到日常开发里其实就是一个很朴素的准则:能用扩充(Enhancement)解决的事,不要用修改(Modification)去实现。传统 ABAP 里开发人员习惯了直接修改 SAP 标准程序,比如在一个标准报表的 PAI 事件里塞一段自己的业务逻辑,或者直接给标准结构追加自定义字段并修改标准程序的处理流程。这种做法在升级的时候很容易出问题,因为 SAP 的标准对象一旦发生变化,你的改动位置很容易失效、丢失甚至引发运行时异常。
在 ABAP Cloud 的环境里,SAP 用技术手段把“修改标准对象”这条路堵上了。云环境下你根本无权修改 SAP 的核心对象,只能在预定义扩展点(Extension Point)、自定义表、CDS 视图和 RAP 业务对象等允许的维度进行扩展。我在实际项目里的建议是,哪怕现在还在做传统系统,也要尽早按照“优先扩展、绝不修改”的思路来管理自定义代码。具体可以从这几个动作开始:
- 定期盘点已修改的标准对象,评估去修改化(Unmodification)的可行性和迭代计划。
- 新增需求优先寻找标准配置和标准扩展点,只有确认没有现成能力时才考虑自定义开发。
- 自定义开发时,数据结构设计尽量与标准表解耦,通过关联(Association)而不是直接读表来获取标准数据。
这个过程不会立竿见影,但每一次新需求的落地方式选择,都在为未来可能的云迁移积累资产。
2.2 RAP编程模型实操拆解
RAP 是 ABAP Cloud 里绕不开的核心编程模型。我第一次用 RAP 做业务对象时,最大的感受是“它把 MVC 的思想从概念变成了产品化的工具”。RAP 里面一个业务对象由 CDS 根节点(Root View)、子节点(Child View)、行为定义(Behavior Definition)和服务定义(Service Definition)组成。开发思路非常清晰:先定义数据结构,再定义行为(如 create、update、delete、自定义操作),最后暴露成 OData 服务供 Fiori 或其他前端调用。
以一个简单的“订单管理”为例。第一步是定义 CDS 数据模型,把订单头和订单明细的关系建模出来:
@EndUserText.label: '订单根视图' @AccessControl.authorizationCheck: #NOT_REQUIRED define root view entity ZRAP_Order as select from ztb_order composition [0..*] _order_item { key order_id, tenant_id, order_date, customer_id, status } @EndUserText.label: '订单明细子视图' define view entity ZRAP_OrderItem as select from ztb_order_item { key item_id, parent.order_id, product_id, quantity }定义行为时,我习惯把核心的业务校验放在行为实现(Behavior Implementation)里,比如订单金额检查、状态流转合法性判断等。行为定义文件里声明了支持的创建、更新和自定义方法:
define behavior for ZRAP_Order alias Order persistent table ztb_order lock master authorization master ( instance ) { create; update; delete; action ( features : instance ) submit; }最后通过服务定义把 BO 暴露出去:
define service ZUI_Order_Service { expose ZRAP_Order as Order; expose ZRAP_OrderItem as OrderItem; }这个过程看起来简单,但实际写代码时要注意的细节不少。比如 CDS 视图里的 key 字段必须在所有节点中保持一致,组成关系必须清晰;行为定义中的持久化表必须与 CDS 依赖的数据来源匹配;服务暴露后还需要用 Service Binding 绑定到通信场景,才能被 OData 客户端调用。对习惯了 Classic ABAP 的人来说,这些步骤一开始会觉得有点繁琐,但熟悉之后就会发现它带来的项目规范性和代码可维护性确实是旧模式比不了的。
2.3 从经典报表到云就绪代码的改造实例
我见过很多团队对“改造存量代码”有种误解,以为就是把 OPEN SQL 的语法换成新的 CDS 语法就完事了。实际上,真正的改造核心是“业务逻辑的重新表达”。
举个例子,以前我们经常写这种交互式报表:用户通过 ALV 选择行,点击按钮后程序直接在内部表里计算汇总,然后更新自定义表。这种逻辑虽然用起来顺手,但对云环境很不友好,因为云环境里前后端分离,Fiori 应用更倾向于通过 OData 服务和 RAP 行为来处理交互。所以改造的时候,不能只把 ALV 控件换掉,而是要把“数据读取、逻辑处理、UI交互”重新分层。
我在一个订单状态调整的功能改造里,是这样做的:先把原来报表里的状态判断逻辑迁移到 RAP 行为实现类里,做成一个 submit 操作;然后把原来 ALV 展示的列表数据源改成 CDS 视图;最后 Fiori 前端通过 OData 调用 RAP 操作,并把业务校验的返回消息在前端展示。这样做了以后,业务逻辑完全沉淀在后端,前端只负责展示和触发,后续如果要换 UI 技术栈,后端几乎不用动。
这里也提醒大家,改造不是“一次重写”。比较稳妥的做法是:优先处理那些长期被业务依赖、改动风险高的核心对象,先做逻辑梳理和接口稳定化;而对于边角功能,可以在系统升级或功能调整时顺带迁移,避免一次性铺开造成业务中断。
3. 生成式AI进入ABAP开发过程的几条真实路径
3.1 AI辅助代码生成的实际体验
生成式 AI 这波浪潮起来以后,很多 ABAP 开发者第一个问的问题是:它能帮我写什么?以我自己的体验来看,目前在 AI 辅助 ABAP 开发这件事上,作用最明显的是“把样板代码和枯燥的结构化代码生成出来”。比如你让 AI 基于一个接口定义生成 RAP 的 CDS 视图骨架、创建 Behavior 定义的初始结构,或者生成一个标准 ABAP Unit 测试方法,这些任务过去需要手动敲很多模板代码,现在用自然语言描述清楚需求,AI 能给出七八成可用的代码。
我常用的做法是,在 IDE 的 AI 对话面板里输入类似这样的提示词:
请帮我生成一个 RAP 业务对象的 CDS 根视图和子视图,字段包括:订单号(订单表主键)、客户编号、订单日期、状态,以及订单明细(商品编号、数量、单价)。分别在根视图和子视图之间建立 composition 关系。得到结果后,我会马上做三件事:一查字段名和表名是否合理,二看关联关系符不符合业务语义,三跑一遍语法检查确保通过。也就是说,AI 可以当“初稿写手”,但不能当“背锅侠”。没有 ABAP 基础的人用 AI 写代码很容易陷入“看起来很对,跑起来全是错”的窘境,最终还是要靠自己的 ABAP 功底来兜底。
3.2 ABAP环境中的AI能力:不只是代码补全
很多人以为生成式 AI 在 ABAP 开发里就是“自动补全代码”,其实远不止如此。SAP 在 ABAP 云环境中正在逐步整合 AI 能力,包括 Business AI 场景的嵌入式服务、AI Foundation 上承载的机器学习功能等。落地到开发实践上,我能看到的几个方向:
- 自然语言生成 CDS 视图:通过描述业务需求,自动生成初步的数据模型,开发者再基于业务语义调整。
- 测试数据生成与测试脚本准备:AI 根据 CDS 和 Behavior 定义,生成 ABAP Unit 测试的数据条件和断言代码,这在做单元测试时能省很多事。
- 代码解释与文档生成:对一段遗留的 Classic ABAP 代码,AI 可以生成结构说明、参数解释和改进建议,帮助新接手的人更快理解存量逻辑。
这些能力在传统 IDE 和云 IDE 里已经开始逐步落地。不过要提醒一点,云环境中的数据安全和模型调用权限需要提前规划。企业引入 AI 辅助开发工具时,最好先确认代码样本上传到外部模型服务是否符合信息安全规范,必要时采用私有化部署或企业内部模型网关,避免把业务敏感数据直接暴露给公共模型。
3.3 用AI做代码评审与测试设计
代码生成之外,我觉得 AI 潜力最大的场景其实是代码评审和测试设计。传统 ABAP 代码评审非常依赖高级开发者的经验和精力,有了 AI 模型的帮助,我们可以把一部分机械性检查工作交给工具。
举个例子,把一段准备提交的 ABAP 代码粘贴给 AI,让它帮你检查:有没有使用过时的语法、有没有违反 Clean Core 规则的写法、有没有性能隐患(比如在循环里写 SQL、Nested Loop 查表等)。AI 通常能很快列出清单,并给出修改建议,虽然不一定 100% 准确,但它可以很好地“照出盲区”。尤其是对刚转型 ABAP Cloud 的团队,AI 的代码审查在一定程度上扮演了“导师”的角色,帮助开发者快速识别自己的旧编码习惯。
测试设计方面,我会让 AI 根据 RAP 行为的业务规则,生成场景化测试用例。比如:
根据以下业务规则设计 ABAP Unit 测试用例:当订单状态为已提交时不能重复提交;当客户信用额度不足时提交失败;提交成功后订单状态变为已提交。AI 生成的内容可以作为测试用例设计的初稿,再结合业务测试工程师的补充,能显著提升覆盖率。
4. ABAP Development Days 2024的关键信号与实战建议
4.1 大会释放的技术信号
ABAP Development Days 2024 给我最大的信息量在于,SAP 明确把 ABAP Cloud 定位成了 ABAP 开发的未来主线,而不是可选项。会上展示的所有新功能、工具链和最佳实践,几乎都围绕“云开发模型 + 高质量业务扩展”这两个关键词展开。对开发者来说,这意味着未来的样本代码、官方文档、社区讨论,都会优先以 ABAP Cloud 和 RAP 为准,Classic ABAP 相关的内容会逐渐从官方渠道淡出,只保留兼容性维护的范畴。
另一个明显信号是 AI 被整合进了整个 ABAP 开发工具链。不只是某个独立的 AI 插件,而是从代码仓库管理、构建、测试到部署的各个环节都开始出现 AI 辅助的影子。比如基于生成式 AI 的代码解释、基于 AI 的测试智能推荐等。虽然没有哪个功能在一夜之间改变所有人的工作方式,但方向已经很清楚了:未来的 ABAP 开发者必须学会和 AI 协作者共事。
最后,大会还透露出一个很重要的趋势:ABAP 开发者需要具备更强的“全栈意识”。过去我们可能只需要写好 ABAP 后端逻辑,现在 ABAP Cloud 场景下,至少要对 OData、Fiori、身份认证、部署管道有基础认识。这不是说每个 ABAP 开发都要变成全栈专家,但至少要对上下游环节有感知能力,否则连调试部署问题都会很费劲。
4.2 新老项目并存期的过渡策略
大多数企业的现实情况是:既有大量 Classic ABAP 存量系统,又开始有几个新项目试点 ABAP Cloud。这种新旧并存的局面最容易引发的混乱是“标准不统一”。有人用老方式加新功能,有人在新项目里推 RAP,时间一长,代码风格碎片化,团队矛盾也出来了。
我的建议是,过渡期要明确几条“硬规则”。第一,按系统边界划分标准:已经定义为核心业务系统的老系统,短期内仍以兼容稳定为主,但所有新增接口和数据模型优先使用 CDS 和 OData 的方式扩展,避免继续增加传统功能模块的数量。第二,新启动的项目,无论是 S/4HANA Cloud 还是基于 BTP 的扩展项目,一律采用 ABAP Cloud 开发模式,不再接受 Classic ABAP 的新代码。第三,允许一段过渡期内的“学习豁免”,比如前三个月允许团队在非生产场景用老方式交付原型,但准备上生产前必须完成向 RAP 的迁移。
这样做的核心逻辑是:既不让业务交付停摆,也不让新理念永远停留在口号阶段。通过项目边界的切割,团队可以在真实交付中逐步积累新范式下的经验,而不是特意安排“练手项目”。
4.3 开发者学习路径与团队能力升级
关于学习路径,我经常被问“会不会很难”。我的回答是:对成熟的 ABAP 开发者来说,最大的难点不是语法,而是思维模式的转换。从“写一段报表处理逻辑”切换到“定义一个业务对象并暴露服务”,这个认知跳跃需要时间。
具体来说,我比较推荐的学习顺序是这样的:先学 CDS 基础,能熟练用 CDS 定义视图和关联关系,建立“数据模型驱动开发”的意识;再学 RAP,重点理解行为定义、行为实现、BO 的完整生命周期;然后学服务暴露和 OData,搞清楚一个 Service 从定义到被 Fiori 消费的完整链路;最后补充云环境知识,包括部署方式、通信场景、身份认证等内容。
团队能力升级这件事,我的经验是不建议搞“大课堂式培训”,效果往往一般。更好的做法是选一个实际的小需求,让一两个骨干先行试点,做出样板后复盘,再由这些骨干带着项目组其他成员一起做类似需求。这种“师傅带徒弟 + 项目实战”的方式,我测试过很多次,比单纯看文档和视频有效得多。
5. 常见问题与避坑记录
5.1 云迁移中的兼容性陷阱
在从 Classic ABAP 往 ABAP Cloud 迁移时,最常见的坑是“数据字典对象的不兼容”。传统系统里我们喜欢用 ALV 控件直接操作内表并更新数据库,但 ABAP Cloud 中,很多传统表格操作被限制,数据库表的访问必须通过 CDS 或 RAP 的托管操作。有一个很典型的场景:旧代码直接使用 UPDATE ztable SET ...,在 ABAP Cloud 环境会被语法检查拒绝,必须把这部分逻辑改造成通过 RAP 行为实现类去修改数据。
另外要留意“跨客户端(Client)”相关逻辑。很多传统程序写死或依赖特定的客户端数据访问方式,在云环境里通常统一使用默认客户端,不再允许跨客户端读取。迁移前要专门排查代码中是否存在显式的 client 参数,以及所谓的“全局共享数据”设计,这些在云环境里基本都要重构。
5.2 AI生成代码的边界与审查
AI 生成的 ABAP 代码,最大的问题不是“写不出”,而是“看似专业实则错漏”。我遇到过 AI 生成了一个 CDS 视图,语法完全正确,但关联字段搞错了业务语义,结果数据查询出来口径不对,当时没发现,后来对账时才对出来问题。所以要给团队定一个原则:AI 生成内容只能作为初稿,任何人提交代码前必须做业务逻辑走查和字段级语义审查。
在 ABAP Cloud 场景下,还有个边界问题:AI 可能会建议你使用某些 API 或语句,这些语句在传统 ABAP 里可行,但在云环境被禁用了。因此审查时不要只盯着代码能不能激活,还要确认它符合 ABAP Cloud 的语言规则,必要的时候直接查官方兼容性清单或跑代码分析工具。
5.3 团队落地时的节奏控制
最后这个坑更多是管理层面的,但破坏力最强。我见过有的团队在转型初期太激进的,要求所有项目立即 ABAP Cloud,结果业务部门等着上线,团队却在忙着学新框架,交付一拖再拖。也见过另一种极端,因为担心风险,始终不敢在新项目里用 RAP,结果一年多过去团队整体水平和技术氛围都没有提升。
节奏控制的经验是“双速并行”:核心关键业务继续保守交付,但每两个迭代里至少安排一个小需求用新方式做,并做好复盘。这样团队压力可控,业务风险可控,又能保证学习曲线在稳步增长。我自己的体会是,技术转型本质上是一次团队心态的转型,给团队足够的安全感比技术本身更重要。碰到卡壳的问题,要允许大家公开讨论,尽早把困惑暴露出来,而不是藏着掖着自己憋到死。
从我个人的实战感受来看,Classic ABAP 的老经验并没有白费,相反,对业务逻辑的深刻理解恰恰是你在 ABAP Cloud 和 AI 辅助开发时代最大的护城河。工具会变,编程模型会变,但那双能看懂业务、能审核代码、能控制风险的眼睛,永远是项目里最稀缺的资源。最后再分享一个小技巧:别把 ABAP Cloud 和生成式 AI 当成两个并列的“新知识”去学,把 AI 当成你学习 ABAP Cloud 的加速器——用它生成样板、解释报错、设计测试,让新范式的学习曲线更平缓一些,同时也更快地完成你自己的角色升级。