ABAP vs Java, 蛙泳 vs 自由泳
去年7月定下的一年之內學會自由泳的目標終於實現了,特來還願。
ABAP 和 Java , 蛙泳 和 自由泳 。前面的組合是Jerry用來掙錢養家的技術,後者是Jerry花了大量業餘時間和金錢苦練的技能。或許有的朋友覺得這兩組概念風馬牛不相及,然而在Jerry眼中,ABAP之於Java, 相當於蛙泳之於自由泳。
文章目錄
-
ABAP和Java的相同點
1. 語言特性
2. 開發框架,工具和生態圈
-
蛙泳和自由泳的相同點
-
ABAP(蛙泳)和Java(自由泳)的不同點
****1. "Java(自由泳)的環境搭建(遊進)比ABAP(蛙泳)麻煩"****
******2. "ABAP(蛙泳)的除錯(換氣)比Java(自由泳)簡單"******
******3. "ABAP(蛙泳)和Java(自由泳)哪一個上手更容易?"******
ABAP和Java的相同點
1. 語言特性
這個公眾號有很多關注者是學生朋友,因此還是有必要簡單介紹下ABAP。ABAP( A dvanced B usiness A pplication P rogramming)是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=<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開發人員入門之後,接下來的漫漫長路,就在於如何精進能夠基於自己所學,去實現真實場景下客戶需求的技藝。而每一位真正的游泳愛好者,想必心中都有下面這個心願:我的打腿像孫楊。
程式設計與游泳,路漫漫其修遠兮,讓我們上下而求索。
更多閱讀
要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2157865/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ABAP正規表示式 vs SPLIT INTO
- 如何實現 “defer”:Go vs Java vs C/CPPGoJava
- Go vs Java vs C# 語法對比GoJavaC#
- Go Internals: Go 反射 vs Java 泛型 vs cpp 模板Go反射Java泛型
- Playwright VS Selenium VS Puppeteer VS Cypress
- vs 2017 vs code
- Airflow vs. Luigi vs. Argo vs. MLFlow vs. KubeFlowAIUIGo
- Axum vs Actix vs Rocket
- RDBMS VS XML VS NoSQLXMLSQL
- 如何解除安裝VS 2017之前版本比如VS 2013、VS2015、 VS vNext?
- [譯]await VS return VS return awaitAI
- The SQL vs NoSQL Difference: MySQL vs MongoDBMySqlMongoDB
- HashSet vs. TreeSet vs. LinkedHashSet
- Redux vs Mobx系列(-):immutable vs mutableRedux
- spring vs yii2 vs LaravelSpringLaravel
- coca 搭配 in vs on vs at | page1
- coca 搭配 in vs on vs at | page3
- JavaScript 的 4 種陣列遍歷方法: for VS forEach() VS for/in VS for/ofJavaScript陣列
- When to use var vs let vs const in JavaScriptJavaScript
- Tomcat vs Jetty vs Undertow效能對比TomcatJetty
- 【spring】迴圈依賴 Java Vs SpringSpringJava
- 微軟常用執行庫合集下載(vs2008(sp)/vs2010(sp)/vs2012/vs2013/vs2015/vs2017)包含32位/64位微軟
- 測試速度比較:Selenium vs Playwright vs Cypress vs Puppeteer vs TestCafe
- javascript — == vs ===JavaScript
- vs 2017
- 別人的蛙泳,不是我的蛙泳
- PostgreSQL DBA(6) - SeqScan vs IndexScan vs Bit...SQLIndex
- PostgreSQL DBA(131) - Develop(numeric vs float vs int)SQLdev
- 「譯」Java Thread vs AsyncTask:該用哪個?Javathread
- VS Code 配置 Java 開發環境(qbit)Java開發環境
- 計數排序vs基數排序vs桶排序排序
- iOS:原生應用 VS Flutter VS GICXMLLayout 比較iOSFlutterXML
- PostgreSQL DBA(121) - pgAdmin(HA:PAF vs repmgr vs Patroni)SQL
- Flutter VS React Native VS Native,誰才是效能之王FlutterReact Native
- 資料湖 vs 倉庫 vs 資料庫資料庫
- 我將從VS Code切換到VS Codium
- 資料質量管理工具預研——Griffin VS Deequ VS Great expectations VS Qualitis
- computed vs watch