Skip to Content

This article was written for local SAP partners in China based on lots of casual discussions among us. As most of our local partners prefer to see article in their native language, I write it in Chinese as well. If you are also interested with this topic, please kindly read it via Google translator. Apologize for any inconvenience caused there.

ABAP和Java, 蛙泳和自由泳。前面的组合是Jerry用来挣钱养家的技术,后者是Jerry花了大量业余时间和金钱苦练的技能。或许有的朋友觉得这两组概念风马牛不相及,然而在Jerry眼中,ABAP之于Java, 相当于蛙泳之于自由泳。
文章目录

ABAP和Java的相同点

1. 语言特性

这个公众号有很多关注者是学生朋友,因此还是有必要简单介绍下ABAP。ABAP(Advanced Business Application Programming)是SAP设计,实现并维护的一门高级编程语言,其关键字和虚拟机(ABAP Runtime)基于C/C++实现。同Java一样,ABAP也是一门支持面向对象,强类型的静态语言。可以说SAP之所以过去40年能在企业管理软件领域里取得辉煌成就,ABAP功不可没,因为大多数SAP成功的传统产品,比如SAP ERP, SAP Business Suite, 还有2015年推出的S/4HANA, 都基于ABAP。
ABAP和Java并没有躺在过去的功劳簿上睡大觉,各自也都在不断进化着。
ABAP 从7.40版本开始,增加了很多新的关键字和语法,使得用ABAP写出来的代码更加紧凑和简洁。Table Expression,变量的内联声明,类型自动推断,更强大的链式调用等新的语言特性,使得实现同样的需求,用7.40后的ABAP编码,代码量通常是7.40之前的50%甚至更少。
ABAP也在不断吸收一些其他编程语言的特性。比如支持函数式编程思想的JavaScript和Clojure中的reduce操作,在ABAP 7.40之后也作为一个关键字得到支持了。具体例子可以看我的博客:
另一方面,我的很多同事戏称:Java 9的很多特性都没搞清楚,但在Java 9发布仅仅几个月后,Java 10又来了。这本身说明Java的进化速度非常快。和ABAP相比,网络上关于Java最新特性介绍的文章多得多,Jerry这里就不再重复了。

2. 开发框架,工具和生态圈

两种语言都有各自数目众多的开发框架和繁荣的生态圈。只是从生态圈的规模来说,ABAP生态圈内开发者的绝对数量不如Java开发者。
SAP有很多基于ABAP的开发框架,平台层面的框架有例如基于ABAP的MVC开发框架ABAP WebDynpro和WebClient UI,OData Service开发框架,Web Service开发框架,Business Object的开发框架BOPF等等。从应用层面来说,框架的数量就更多了。即使在其他公司的开发人员眼中一个很简单的需求,SAP也很可能采取了一个微型框架(Mini Framework)来实现。这种大量引入框架实现应用需求的思路,一方面体现了德国人考虑需求时追求严谨完备的习惯,另一方面,通过将实现需求的复杂度和工作量转移到SAP标准应用开发上来的方式,减少或者避免了Partner和客户进行二次开发的工作量,使得很多非标准功能仅仅通过在这些微型框架上做配置就能实现。
任何一个基于ABAP的SAP传统产品里,都隐藏了很多有用的工具,比如各种报表或者事务码,用于提供关于该产品的辅助功能,比如问题分析,日志查看,性能检测等等。我想即便大多数在一个产品里深耕了10年的SAP顾问,恐怕也无法能够100%肯定地说自己熟悉该产品里所有的工具。
除了这些SAP提供的标准工具外,也存在一些ABAP开源爱好者贡献的开源项目,比如ABAP Git客户端,用于不同系统间离线传输ABAP资源的SAP Link,还有用ABAP操作Excel的abap2xls项目等等。
Java这么多年一路走来,其层出不穷的开发框架更是早已深入人心。从早期经典的三驾马车SSH,到近些年来随着微服务火起来而流行开来的Spring Boot和Spring Cloud等等,可以说无论打开任何一个Java技术社区,都能看到它们的身影。
得益于全球数量庞大的Java开发人员,Java生态圈的开发工具,库文件也是数不胜数。在Maven的远程仓库http://repo1.maven.org/maven2里,我们能找到许许多多公司发布的库文件。
这是远程仓库上SAP库文件的根目录:
同样的,如果您对其他公司,比如Microsoft, Oracle,Salesforce发布的Java库文件感兴趣,那就到对应目录去看看吧:

蛙泳和自由泳的相同点

Jerry作为一个过来人,说说我对这两种泳姿相同点的一些认识。
1. 都是游泳初学者的入门泳姿。稍稍不同的是,在国内,蛙泳是最受推荐的入门泳姿,而国外的朋友学游泳,通常都选择了自由泳作为入门泳姿。
2. 初学者都会遇到两个最大的瓶颈,即腿部动作和换气。
腿部动作:很多成年人初学蛙泳,在水里进行蛙泳腿部动作“收-翻-蹬夹”的“翻”这一步时,由于种种原因,无法将脚腕的翻腕动作做出来,这样无法确保脚掌以最大面积推水,导致泳者在水中感觉费了很大力气蹬腿,但是前进速度缓慢。
同样,自由泳初学者遇到的第一道坎就是打腿不前进。很多成年人初学打腿时,体会不到自由泳打腿的髋部发力(下图黄圈所示部位),大腿带动小腿,鞭状发力的打腿形式,陷入打腿时水花四溅,但就是不前进的窘境。
换气:这是很多游泳初学者几乎都会遇到的另一道坎。反正Jerry学蛙泳换气和自由泳换气时,都喝了足够多的水才学会的。游泳论坛里很多同病相怜的朋友们都说学换气就是一个将练习换气时喝下去水的容量换算成经验值的过程——当经验值满了后,自动解锁换气技能。Jerry想了想自己学会这两种泳姿换气的过程,好像还真是这样。
3. 两种泳姿都有各种各样的变式(Variant)。
像前面介绍过的ABAP和Java拥有五花八门的工具一样,蛙泳和自由泳也有着众多变式。

蛙泳的不同种类:平蛙和波蛙

平蛙和波蛙是蛙泳的两种主流姿势(本文不讨论抬头蛙)。
蛙泳初学者无一例外学的都是平蛙,因为比较简单,对泳者上肢力量要求不高。双手前伸时压水抬头即可换气,抬起换气的动作可以做得很慢。游泳馆里很多蛙泳都是平蛙,这种泳姿游起来轻松,省力,适合长游。我自己的感受是平蛙有一半的时间在水里都是处于完全放松状态,哪怕一口气游1公里,也不觉得累。
波蛙是蛙泳运动员采用的竞技泳姿,频率比休闲式平蛙快得多。比较一下:
平蛙:
波蛙:
波蛙为了减少蛙泳在高速前进过程中成倍增长的阻力,把整个上半身都提出水面,从空气中前进。波蛙换气和平蛙换气相比,一个显著的区别就是通过双肩拱起到几乎碰到耳朵的程度来减少阻力,看起来极具观赏性,非常霸气!
可惜对身体核心力量要求很高,不好学啊。。。

蛙泳早呼吸与晚呼吸

早呼吸:顾名思义,划手的时候,手刚开始外划就抬头换气。采用早呼吸可以给泳者提供充足的换气时间,适合初学者。看看知乎游泳大神易梦觉的早呼吸教学示范:
晚呼吸:外划时头部仍然注视池底,外划结束手臂开始内收时迅速抬头,双手快速前伸。晚呼吸要求泳者上肢有一定的爆发力,换来的收益就是游进速度快于早呼吸。
看下晚呼吸的动作:

蛙泳宽蹬腿与窄蹬腿

初学者和业余蛙泳一般都是宽蹬腿,运动员比赛时都是窄蹬腿。宽蹬腿膝盖张开的距离比窄蹬腿宽,蹬夹时划过的圆弧周长大于窄蹬腿。
宽蹬腿具有明显的蹬夹动作,如果在岸上观察很多蛙泳初学者的动作,能清晰看到先蹬水后夹水的顺序。而窄蹬腿,蹬夹几乎一气呵成而融为一体,很难严格区分开来。注意看这些运动员的窄蹬腿:
宽蹬腿由于横截面过大,所以承受的水阻也大于窄蹬腿,因此竞技比赛中的蛙泳都是窄蹬腿。然而窄蹬腿相对宽蹬腿对膝盖压力较大,如果您的膝盖柔韧性不足,那还是老老实实去练宽蹬腿吧,以免膝盖损伤。

自由泳划手的前交叉,中交叉和后交叉

下图右手露在水面即将入手开始自由泳的划水动作,此时如果左手与水平面的夹角保持在30度以内,称为前交叉。30度到60度范围内为中交叉,大于60度成为后交叉。
采用前交叉,则右臂入水时,左臂正处于开始下划阶段,此时整个身体非常舒展,带有一定的滑行速度,便于全身主要肌肉群发力。同时动作节奏相对较慢,适合业务爱好者和运动员长距离比赛使用。后交叉则是另一个极端,右手入水时,左手已经进入划水的后半阶段了。后交叉划水频率极高,需要泳者具有很强的爆发力,通常只有短距离游泳运动员才hold得住。
看看这个前交叉动作,是不是非常舒展?

自由泳的各种变式:二次腿和六次腿

二次腿:左右划水各一次,划一次水,打一次腿。手臂刚入水时,打异侧腿。很多铁三长距离自由泳的朋友都用的二次腿,因为省力,便于长游。
六次腿:打腿产生的推进力大于二次腿。

ABAP(蛙泳)和Java(自由泳)的不同点

两门截然不同的编程语言,差异当然有很多了。这里只挑最显著的聊。

1.  “Java(自由泳)的环境搭建(游进)比ABAP(蛙泳)麻烦”

Jerry和SAP开发顾问朋友们聊天时,经常谈到这个话题。一个ABAP新手,只要在电脑上装个SAP GUI,连接上服务器就可以开工了。而一个Java开发新手,如果要做企业级应用开发的话,开发人员通常都会拿到一个很长的清单,注明了开发环境搭建所需的长长的步骤:装JRE和JDK,下载Maven,安装代码版本控制工具,配置环境变量,配置本地数据库等等。一般都会使用基于Java的各种框架比如Spring全家桶,那么为了提高开发效率,还得去下载这些框架基于某种IDE的插件并安装。如果工作内容包含微服务开发,又得安装一些基于命令行的微服务部署工具。
对于一个Java新手来说,在基于要求的开发环境内跑通一个Hello World应用之前,通常需要花大量的时间来捣鼓这些环境准备工作。更有可能发生的是在搭建过程中遇到各种各样的错误,导致搭建流程进行不下去。此时要么求助组内有经验的同事,要么根据错误消息到StackOverflow上去查找解决方案。
其实从ABAP开发的整个流程来看,仍然需要环境搭建这一步,即Netweaver服务器的安装和运维。只是因为ABAP和Java存在的两个差异,使得ABAP开发人员在环境搭建这个话题上,比Java开发人员轻松不少。
(1) 在绝大多数企业里,ABAP Netweaver的搭建是由专职人员,即SAP Basis去负责的,不需要ABAP应用开发人员介入。ABAP开发人员登录到Netweaver服务器上,在服务器上进行开发。Netweaver服务器既是ABAP开发环境,又是ABAP应用最终的运行环境,所以意味着ABAP代码一旦开发完毕,能立即在服务器上运行,省去了应用部署这一步骤。
而Java应用开发工作绝大多数情况都不会在服务器端进行,而是在各个开发人员本地搭建好的环境中进行,待开发完成单元测试通过后通过git等工具将源代码推送到远端代码仓库,同时通过持续集成等工具将构建好的应用部署到服务器上。
(2) Netweaver服务器的特色之一,就是对ABAP开发和ABAP运行时提供了全局而统一的支持。Netweaver自带了代码版本控制工具,因此ABAP开发不需要Git;Netweaver提供了类似Maven仓库的功能,在Netweaver里叫Repository Information System,ABAP开发人员在计划新写一段代码时,通常都会去RIS里检查是否已经有现成的类/函数实现了类似的功能。一个ABAP类要使用另一个ABAP类提供的API,可以直接调用,因为所有的类都存在于中央的RIS里,而ABAP不存在Java里的包访问权限的概念——一个类对服务器里的任何类都可访问,并且只提供唯一的版本供外界访问(ABAP里称为Active版本)。因此ABAP也不像Java那样需要通过Maven来进行项目依赖管理。ABAP提供了OPEN SQL,这些SQL语句通过Netweaver提供的数据库接口自动转换成Netweaver服务器连接的数据库提供商的原生SQL语句,所以ABAP开发也不需要自行安装服务器。
由此可见,很多Java开发人员需要在本地做的事情,其实在ABAP开发里已经通过Netweaver服务器统一提供了,因此从结果上看,显得Java开发人员的环境搭建比ABAP要麻烦一些。
当然针对Java这种环境搭建之痛也存在一些解决方案。比如SAP内部的很多培训,需要培训人员上机做练习,那么讲师会事先将环境搭好,然后做成一个虚拟机镜像,分发给学员。学员用虚拟机软件加载这些镜像,就能直接基于讲师准备好的环境进行上机练习,省去了每位学员搭环境的时间。Jerry还了解到SAP成都研究院的某些团队也在尝试用Docker来解决类似问题。
从上面的讨论看出Java的环境搭建确实比ABAP麻烦,那么自由泳游起来确实比蛙泳麻烦么?Jerry的个人意见:是!理由有四。
(1) 蛙泳时整个人俯卧于水中,双手双脚在任何时候都是呈左右对称地运动。而自由泳的手脚为非左右对称运动,在初学者还没形成身体本能时,开始划手时还要考虑应该打哪一侧的腿。
(2) 蛙泳游进时,蹬腿夹水结束后可以在水里滑行一两秒,身体得到充分休息。而自由泳行进过程中,手和脚都是不停地运动着,对初学者来说很难找到像蛙泳那样可以通过滑行来休息的感觉。
(3) 自由泳相比蛙泳,身体在前进过程中还多了个转体动作。
Jerry最开始学自由泳时,以为它和蛙泳一样,身体始终是俯卧在水中前进的。后来才从教练那里和网上的视频学到,游进过程中必须有一个转体动作,如下图所示。
(4) 自由泳的换气比蛙泳麻烦。
这个太令我刻骨铭心了,需要单独说。

2. “ABAP(蛙泳)的调试(换气)比Java(自由泳)简单

做软件开发(游泳)而不需要调试(换气),几乎是一件不可能的事情。
前面已经说过,对于ABAP来说,因为Netweaver服务器既是ABAP开发环境,又是ABAP应用的执行环境。因此任何时候,需要调试,直接在源代码上设断点,启动应用,断点即触发。
Java的服务器端调试就没这么轻松了。首先需要给远程服务器的JVM加上debug参数来启动服务器:
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=<debug port>
然后在本地IDE比如Eclipse里做配置,通过jdwp(Java Debug Wire Protocol)连接远程服务器打开的监听端口,本地调试进程和远程服务器进程之间通过socket实现数据传输。
蛙泳的换气,因为整个游进过程中身体始终保持俯卧状态,因此动作非常自然,和人在陆地上的举动几乎没有区别,从水中抬起头来即可换气。具体动图参看前文早呼吸和晚呼吸部分。
自由泳的换气,Jerry为了学会它是喝饱了水。作为陆地上生活的动物,人在水中换气时,把头抬高让嘴远离水面进行换气是一种本能。然而学习自由泳的换气,需要克服人的这种本能,正确的方式是靠行进时头的推进、身体的翻转在头部形成的充满空气的小凹槽里换气。国外的教学视频里称为Breathe into the air pocket。初学者练习这个动作,要么由于害怕换不了气头抬得太高变为蛙泳换气,要么转头一张嘴,一大口水就喝进去了。
看清楚下图里的air pocket了么?
从空气袋里换气的标准姿势:

3.  “ABAP(蛙泳)和Java(自由泳)哪一个上手更容易?”

ABAP和Java,蛙泳和自由泳,到底谁比谁更容易学?
先说游泳。国内的游泳业余培训班大多是以10或12节课的速成班为主,在这种课时限制下,也只有蛙泳这种最易上手的泳姿可供选择了.其他三种对身体素质和水性的要求比蛙泳高。并且蛙泳学会后,踩水也就自然会了,踩水技能比较实用。
为什么国外更多以自由泳作为入门泳姿?因为国外的游泳教学多以长训为主。参考知乎易梦觉大神的解答:
因此,Jerry认为,这个话题的准确回答应为:以10节课速成班为例,对大多数人来说,蛙泳比自由泳更容易学会。
ABAP和Java哪种语言更容易上手?如果不考虑本地搭建Netweaver服务器的难度,那么学会这两门语言的基本语法难度差不多。然而学完了ABAP标准教程BC401等等并不意味着就具有了用ABAP开发SAP应用程序的能力。比如要开发CRM应用,还得去学CR100标准课程,掌握SAP CRM开发框架的用法。如果想用ABAP开发OData服务,还得学标准课程GW100以了解如何在SAP Gateway上做ABAP开发,以此类推。
同样,在Eclipse里打印出Hello World只是万里长征走完了第一步。前面已经说过,根据您具体工作内容的不同,您还需要学习各种Java框架,库文件的使用。
从这个角度来说,ABAP和Java入门的难度差不多。能用这两门语言写一些简单的小工具,就好比能用蛙泳和自由泳的姿势游个二三十米。ABAP和Java开发人员入门之后,接下来的漫漫长路,就在于如何精进能够基于自己所学,去实现真实场景下客户需求的技艺。而每一位真正的游泳爱好者,想必心中都有下面这个心愿:
编程与游泳,路漫漫其修远兮,让我们上下而求索。
To report this post you need to login first.

1 Comment

You must be Logged on to comment or reply to a post.

Leave a Reply