國慶大假立刻就要來臨了,咱們聊點輕鬆的話題,關於假期。程序員
Jerry的成都同事李貝寧(Li Ben), 《SAP成都研究院李三郎:SCP Application Router簡介》的做者,有一次11月份的時候和Jerry一塊兒去德國出差,不解地問到:德國好歹也有八千多萬人口,怎麼街上冷冷清清的幾乎看不到人呢?算法
對於這個問題Jerry也沒有答案。並且這種現象在德國的法定節假日裏更加突出。數據庫
Jerry的文章《Jerry 2017年的五一小長假:8種經典排序算法的ABAP實現》曾經提到,去年我在德國待了三個月,最難熬的就是德國幾乎每月都有那麼幾天的法定節假日,由於既然放假,SAP總部的員工食堂就不開了,並且商店也所有關門,得提早一天備好乾糧。微信
SAP德國總部員工食堂的伙食是很是很是好的,就在Jerry寫這段文字時,彷彿又聞到了中午餐點時走近食堂,從裏面散發出食物的香味。編輯器
總部員工食堂菜的味道有甜有酸,有些湯的味道稍稍帶着苦味,沒有辣味,正好Jerry討厭吃辣,因此口味很是適合我,我一連吃了90天也不以爲膩。ide
葷素搭配很合理,並且肉和菜吃不夠隨便加,管飽,對於Jerry這種飯量大的程序猿來講簡直是天堂。函數
這些食物太美味了,每頓飯結束後我都是這個狀態:工具
然而到了德國法定節假日和星期日,這一切都消失了。德國商店的營業時間一直按照20世紀50年代的規定執行的:商店在工做日最晚開到下午六點半,週六最晚下午2點關閉,週日全天不營業。性能
因而,2017年五一小長假,4月29日~5月1日三天,Jerry只好靠這些乾糧充飢,三天一共只花了9歐元。區塊鏈
Jerry是一個程序猿,對吃的不挑剔,Zopf很經餓。什麼是Zopf?
我住在德國鄉下,平時也可貴見到人,更別提節假日了。街上全是這種風格:
要不是耳邊傳來偶爾駛過的汽車和德國小朋友在本身花園裏嬉戲的聲音,Jerry還覺得本身來到了科幻電影《我是傳奇》裏的世界。
五一小長假的最後一天,個人同事Liang Simon(梁亞舒)邀請我到他的家中,吃了一頓地道的德國烤肉。在此以前啃了兩天Zopf的我,以爲這是我這輩子吃過的最美味的烤肉!烤肉一掃光後,Simon的老婆又端出一個本身動手作的巧克力蛋糕。
Jerry吃完以後,內心遺憾地想:當初這個蛋糕製做的時候,半徑再大幾釐米就更完美了。
在這種狀況下,做爲一個程序猿,娛樂的方式就只剩擼代碼了。因此本文提到的這些東西都是Jerry在德國節假日裏無聊的產物,對於ABAP顧問的實際工做可能幫助不大。不過由於是過節,你們當看看小說消遣好了。
1. Jerry 2017年的五一小長假:8種經典排序算法的ABAP實現
把本科學過的八種排序算法用ABAP逐一實現了一次。
SAP社區上有一位網友Sinai可能以爲我是吃飽了撐着沒事幹(這卻是事實),畢竟在ABAP裏要排序直接使用關鍵字SORT便可。
不過幸虧還有另外的網友跳出來爲我辯護,中心思想就四個字:開心就好。
2. 不用四則運算符比較兩個整數的大小
看文字描述就能感受到這又是一個讓程序猿感受很囧的需求。
使用位操做,JavaScript能夠很優雅地實現:
Java也沒問題:
輪到ABAP就麻煩了。由於ABAP的BIT-XOR這種位操做不支持整型類型。
既然語言層面不支持,就只好本身動手模擬了。
我用一個尺寸爲32的ABAP內表存儲一個32位整數的每個bit的值,而後基於這個內表模擬了整數的與或非以及異或操做,還有按位左移,右移。
讓ABAP整數也能像上圖JavaScript和Java那樣支持按位邏輯操做的模擬實現代碼在個人博客裏:
Bitwise operation ( OR, AND, XOR ) on ABAP Integer
用這種模擬方式實現的ABAP代碼比JavaScript和Java足足長了一倍。雖然醜陋,但好歹實現了題目的需求。
3. 給出儘量多的計算兩個整數和的方案
下面的答案能夠概括爲:
普通程序員的答案
2B程序員的答案
文藝程序員的答案
閒得蛋疼的程序員的答案
。。。
最後一種解法實際就是本科計算機原理裏介紹的加法器:經過按位邏輯與運算(&)判斷當前位操做是否有進位產生,用按位邏輯或運算(|)保存當前位進位的值。
最後一種解決方案的ABAP版本:
下面就是一些小工具了。
1. 若是您是一位ABAP顧問,您知道每月,哪一個SAP事務碼被本身使用最屢次數麼?
只需寫一個簡單的ABAP報表,執行就能知道答案。報表的源代碼能夠經過點擊文末"閱讀原文"得到。下圖是Jerry在SAP內部的開發系統執行該報表後的結果,排在第一位的SE24,一個月使用了713次不奇怪,令我吃驚的是SAT竟然使用了692次。不用說,這個月必定在和各類與性能相關的incident進行苦戰。
2. 加強的ABAP代碼版本管理功能。
打個比方, 若是我想查找一行註釋"* Wave 12 Schema version is 7"最先是在哪個ABAP代碼改動版本引入的,最後發現是第45個版本引入的。
在實際工做中,SAP的開發人員常常須要作相似的事情,好比分析一個bug,最後定位到是引入了某一行代碼引發的,而後就須要找到是哪個請求號對應的版本引入的這行有問題的代碼。
可是,這個方法一共有77個版本,難道我要從第一個版本開始,將其和當前版本比較,一直比較到最後一個版本?
這個是純粹的體力活,時間複雜度o(n)。咱們也能夠用二分查找的思路,把77個版本中間的版本即版本39和當前版本比較,若是版本39沒有出現咱們要查找的代碼,就對版本40和77這個區間段再次使用二分查找。
這種查找辦法只是把時間複雜度降成了對數級別,這種體力活仍然讓我心煩意亂。有沒有o(1)的解決方案?
固然有。就是把這個方法每一個版本的源代碼所有下載到本地保存成一個txt文件,裏面的版本內容從低到高排序,而後直接按照要查找的關鍵字進行搜索,瞬間便可得出答案。
有了這個本地文件,我能夠用文本編輯器同時打開它兩次,而後能夠經過鼠標滑動的方式,快捷地比較任意兩個版本的差別,而不須要SAPGUI"選擇待比較的版本->點擊比較按鈕->查看比較結果->點回退按鈕->選擇下一組要比較的版本"這種笨拙的操做,工做效率獲得質的提高。
在我心中,重複的鼠標點擊對於程序猿來講就是萬惡之源。
這個工具的源代碼能夠經過點擊"閱讀原文"得到。
3. 加強的SAT功能。
SAP成都研究院CRM開發團隊曾經接到一個CRM On HANA的測試項目,就是在兩個系統上同時運行一系列相同的ABAP代碼,這兩個系統底層的數據庫分別是非HANA數據庫和HANA數據庫,經過這種方式評測SAP CRM運行在HANA數據庫上的性能。一旦發現某些代碼在HANA數據庫上運行的性能還不如非HANA數據庫,就找出緣由,對相應代碼作優化。
當時,德國同事給咱們的要求就是,在兩個系統分別用SAT運行應用,而後手動分析SAT結果,把在數據庫爲HANA的系統上運行速度慢於非HANA系統的點都找出來,寫成文檔。
我當時一接到這個項目,內心暗暗叫苦:這不又是純體力活麼。若是待測試的一段代碼調用了很是多的API,那豈不是要把這些API在兩個系統上執行的時間一個一個找出來手動比較麼?就算用雙屏,腦殼也要像波浪鼓同樣左右晃動,這又不是在練習自由泳的轉頭換氣。
後來Jerry就寫了一個工具自動進行比較。下圖是工具界面,HN1和Q2U是這兩個系統的代號,其中HN1系統後臺數據庫是HANA,而Q2U後臺是非HANA。
Green Threashold指定成50,意思是若是同一個方法,HN1的執行速度比Q2U快50%,則這個方法的比較結果顯示成綠燈;Yello Threshold則表明HN1比Q2U快,但只快了20%到50%。若是HN1比Q2U還慢,這就比較糟糕了,是咱們須要採起措施的場景。
工具的輸出是一個ALV,能夠直接導出成excel。
有了這個工具,本來須要填幾個小時的excel,如今十秒就能完成。節省下來的時間能夠花費到亮紅燈的那些結果,即真正須要進行HANA數據庫調優的那些代碼中去。
後來Jerry把這個工具秀給了德國的項目主管,他很喜歡這個工具,讓我在一個內部會議上給SAP全球其餘地區的同事講講工具怎麼用。這也是Jerry在這篇文章裏介紹的衆多用ABAP搞出來的無聊的東西里惟一被SAP官方承認的工具,囧。
這個工具的完整代碼經過點擊"閱讀原文"得到。
4. 直接用excel執行SAPGUI裏的事務碼或者函數。
做爲一個SAP ABAP開發人員,SAPGUI上的系統清單老是很長很長,這仍是我清理過屢次,刪除了若干不多使用系統以後的清單。有些系統我天天登錄上去只是爲了看幾個簡單的事務碼,好比SM04,ST22,SE10這些。爲此,天天我都要在SAPGUI裏選中某個系統,雙擊以後進行登陸,而後在鍵盤上輸入事務碼。
很快個人懶癌又犯了,由於我在這些系統上並不會進行開發工做,那麼有沒有辦法不用SAPGUI登陸系統,也能執行事務碼並查看結果呢?有,用excel。在excel裏作幾個按鈕,每一個按鈕的事件處理函數用VB硬編碼成對應系統的地址,系統編號,用戶名和密碼,以及指望執行的函數或者事務碼的名稱。
這樣之前繁瑣的操做,如今雙擊打開excel點幾個按鈕,而後切去作其餘事情,等一會再切回excel查看結果便可。節省下來的時間能夠作其餘更有意義的事情。
這種VB代碼像下面這樣寫:
5. 直接在SAPGUI裏給同系統其餘在線用戶打招呼。
執行這個工具,會看到當前系統在線用戶列表和每一個用戶正在使用的事務碼。
雙擊某個用戶名稱,他/她的SAPGUI裏就會出現一個彈出框,上面顯示一條預先指定好的文本,好比:
這個惡做劇其實就是經過函數TH_POPUP給指定的用戶發送一條文本消息,以彈出框的形式顯示出來:
6. 項目經理可使用的查崗工具。
好比項目經理想查看名叫WANGJER的顧問從2017年3月1日到3月25日這些天到底在系統裏作了哪些開發,只須要執行這個工具就能獲得清單。
其實寫這個工具的初衷是爲了方便我快速得回憶起任何一個時間段,好比一個月或者一年之前到底作了哪些開發工做。程序猿上了年紀後記憶力就衰減了,必需要經過工具的輔助。
最後一個是惡做劇。
一天我正在上班的時候,微信上一位partner向我求助,說是這根紅色標註的分割線能夠往左拖拽。
一旦把它拖到最左邊的極限位置後,將沒法再調整其位置了。以下圖這樣,由於左邊對象列表的寬度實在太窄,此時SE80其實已經沒有辦法使用了。
當時Jerry看了這位朋友微信上發過來的截圖,半信半疑,還有這種操做?
照着試了一下,結果我也杯具了。
好在我知道有這張表的存在:
一行代碼便可讓SE80的設置回覆到初始設置:
DELETE FROM rseumod WHERE uname = 'WANGJER'.
感謝你們耐心聽完個人嘮叨,提早祝你們2018年國慶節快樂。
更多閱讀
要獲取更多Jerry的原創文章,請關注公衆號"汪子熙":