ABAP vs Java, 蛙泳 vs 自由泳

去年7月定下的一年以內學會自由泳的目標終於實現了,特來還願。javascript

ABAPJava蛙泳自由泳。前面的組合是Jerry用來掙錢養家的技術,後者是Jerry花了大量業餘時間和金錢苦練的技能。或許有的朋友以爲這兩組概念風馬牛不相及,然而在Jerry眼中,ABAP之於Java, 至關於蛙泳之於自由泳。java

文章目錄git

  • ABAP和Java的相同點數據庫

    1. 語言特性編程

    2. 開發框架,工具和生態圈服務器

  • 蛙泳和自由泳的相同點網絡

  • ABAP(蛙泳)和Java(自由泳)的不一樣點框架

    ****1.  "Java(自由泳)的環境搭建(遊進)比ABAP(蛙泳)麻煩"****運維

    ******2.  "ABAP(蛙泳)的調試(換氣)比Java(自由泳)簡單"******socket

    ******3.  "ABAP(蛙泳)和Java(自由泳)哪個上手更容易?"******


ABAP和Java的相同點

1. 語言特性

這個公衆號有不少關注者是學生朋友,所以仍是有必要簡單介紹下ABAP。ABAP(Advanced BusinessApplication 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以後也做爲一個關鍵字獲得支持了。具體例子能夠看個人博客:

Functional Programming – Try Reduce in JavaScript and in ABAP

https://blogs.sap.com/2017/02/27/functional-programming-try-reduce-in-javascript-and-in-abap/

另外一方面,個人不少同事戲稱: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=

而後在本地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開發人員入門以後,接下來的漫漫長路,就在於如何精進可以基於本身所學,去實現真實場景下客戶需求的技藝。而每一位真正的游泳愛好者,想必心中都有下面這個心願:個人打腿像孫楊。

編程與游泳,路漫漫其修遠兮,讓咱們上下而求索。

更多閱讀

要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼:

相關文章
相關標籤/搜索