ABAP on ExercismでABAPを学習してみる

本記事は [SAPアドベントカレンダー 2022](https://adventar.org/calendars/7484) 20日目の記事となります。また同時に[BeeXアドベントカレンダー 2022](https://qiita.com/advent-calendar/2022/beex)の20日目でもあります。

[wikipedia - ABAP en](https://en.wikipedia.org/wiki/ABAP)

`ABAP`は1983年に登場した`SAP`で利用される開発言語となり、歴史のある言語でかつエンタープライズな言語となっています。

歴史があって重厚？　なイメージかとは思いますが。

`ABAP`って、オブジェクトやテスト、[Clean ABAP](https://github.com/SAP/styleguides)。
近年導入された新しい構文だったり、言語として成長しており。

近年はAWSからまさかの`AWS SDK for SAP ABAP（プレビュー版）`が発表されたり、`SAP BTP`という文脈で出てきたり。

クラウドの文脈でも動きがあります。

[AWS SDK for SAP ABAP のプレビュー版をリリース](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-sdk-sap-abap-preview/)

`AWS SDK for SAP ABAP`については`ABAP`が`C++`,`Go`,`Java`,`JavaScript`,`Kotlin`,`.NET`,`Node.js`,`PHP`,`Python`,`Ruby`,`Rust`,`Swift`のリストの横に追加されると思うと、個人的に非常に予想外で驚きがありました。

- [AWS SDK for SAP ABAP](https://aws.amazon.com/jp/sdk-for-sap-abap/)
- [AWS re:Invent 2022 - Accelerate business process innovation with the AWS SDK for SAP ABAP (ENT235)](https://www.youtube.com/watch?v=Y09BkLgw5AM)

そんな`ABAP`ですが、学習するためのハードルが非常に高い言語になっているかと思います。

その要因としては実行環境を自前で用意するのが`SAP`に関わった事がない人が対応しようとすると厳しい点が多々あるかと思います。

以前はABAPの実行環境である`SAP ABAP Platform 1909, Developer Edition`　がDocker hubで提供されており、少しハードルが低くなったかとは思いましたが、色々とあって現在は提供中止になっています。

[SAP ABAP Platform 1909, Developer Edition（docker hub）が提供終了になっていた話](https://qiita.com/SAITO_Keita/items/818759241f5ad77df725)

そんな中、今年`Exercism`に`ABAP`が追加されました。

[ABAP on Exercism](https://blogs.sap.com/2022/03/30/abap-on-exercism/)

ちなみにブログ記事の投稿主である`Lars Hvam`さんは[abapGit](https://github.com/abapGit/abapGit)だったり、[abaplint/transpiler](https://github.com/abaplint/transpiler)だったり。

ABAP関連でなんか凄まじい事をしている……すごい！　みたいな事をいくつもやっているような人です。

というわけで2022年、オープンソースでオンライン学習できる`Exercism`に`ABAP`が追加されていますので、本記事ではこちらの紹介をしていきます。

## Exercismって？

[about Exercism](https://exercism.org/about)

Exercismはオープンソースのフリーコーディングプラットフォームで様々な言語の学習リソースが登録されています。

その一言語として`ABAP`が追加されています。

## Exercismを利用するためにユーザー登録

Exercismを利用するためにはユーザー登録が必要となります。

[Exercism](https://exercism.org/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/691f17f1-41f4-e646-aa31-e01f1bcf306a.png)

トップページにある`Sign up`からユーザー登録をします。

## TracksからABAPを選択する

ユーザ登録が完了したら学習したい`Tracks`を選択します。

`Tracks`をみると、2022年12月現在、62トラックがあるようです。

今回目的となる`ABAP`を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d69185b1-3267-290f-1f23-96a5606c9bde.png)


`ABAP`はAで始まるので、名前の順でソートされていると先頭にきますよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/6c0e3b6f-aa61-9ee7-c3d2-31e850786481.png)

`Join the ABAP Track`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/c8858154-fcac-6a7b-07d5-95fe7674be48.png)

[Track-specific abap](https://exercism.org/docs/tracks/abap)

2022年12月現在、`ABAP`には40個のコンテンツがあるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/45a8aa34-763d-cf86-b688-2750845292a2.png)

現在は何もやっていないので、最初のコンテンツだけアンロックされており、残りの39個はロック状態である事が確認できます。

`Go to The "Hello, World!" exercism`からhelloworldを実行してみます。

## Hello, World!

まず最初に古典的なHelloworldの演習について紹介されています。

`Execism`では`CLI`から回答を投稿する方法もあるようですが、ブラウザからコーディングして回答を投稿することができます。

`Stat in Editor`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e928d0e9-510f-2e7d-dff7-c9ca596b1dc5.png)

Editorが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/32122e92-a2ae-8801-a833-b34471380f94.png)

`Execism`の問題はABAPオブジェクトのクラスとして提供され、演習で指定された内容でメソッドを実装してテストを通過させるのが流れになります。

`Instructions`にあるように、今回は伝統的な`Hello, World!`を返すメソッドを実装します。

## EditorのTestsタブについて

ちなみにEditorの`Tests`タブを見ると通過させる必要があるテストが記述されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/c805cdcc-2398-ef30-8dec-2f34f94e2411.png)

これが何かと言えば[ABAP Unit](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abenabap_unit.htm)で記述されたテストとなります。

ここでは触れませんが、こういう書き方するんだと`ABAP Unit`の参考にはなるかと思います。

## Editor上でメソッドを書き換えてテスト実行

今回の演習では`Hello, World!`を返すメソッドにすればよいので。
`Goodbye, Mars!`を`Hello, World!`に書き換えて`Run Tests`を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/67bacb7c-62c1-286b-4974-fe228205c17b.png)

`Result`タブにテストの結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d28a3584-7c64-bb18-76a2-a4b0d4ecea16.png)

無事通過したので、`Submit`を押して`Hello , World!`を完了にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7580c4b1-3985-1712-9c2a-050e66aa9b45.png)

Overviewの画面に戻ります。

無事、`Hello, World!`が完了したので、`Mark as Complete`で演習を完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/c4eb5ad2-e944-eebd-5ed1-398a97a11fff.png)

自分の書いた回答を共有するか聞かれるので、お好きな方を選んで`Confirm`。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e206635f-0ef1-4918-617f-c70ca136220a.png)

`Completed!`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/0b23ee2f-6b1f-c870-d52c-67b4be585ed2.png)

`Hello, World!`の演習を完了した事で、他の演習がアンロックされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/899a1740-8f5b-78f5-9b48-70d780fceb4e.png)

気になる演習を実施して、ABAPの理解を深めましょう！

## デバッグについて

[Testing on the ABAP track](https://exercism.org/docs/tracks/abap/30-tests)

Exercismのブラウザ上ではデバッガはないので、`Debugging and Logging`にデバッグするためのログについての記述があるので、見ておくと参考になるかと思います。

`console=>log()`を利用することで色々と捗りそうな気はしますが、どうやら最近追加された機能のようです。

https://twitter.com/marcfbe/status/1603872625712779264

## 裏ではabaplint transpilerが動いている

[Testing on the ABAP track](https://exercism.org/docs/tracks/abap/30-tests)に記載がありますが、`Exercism`では`ABAP`が`SAP`基盤上で実行されているのではなく、[abaplint/transpiler](https://github.com/abaplint/transpiler)で`ABAP`を`JavaScript`にトランスパイルして実行されています。

このため[abaplint/transpiler](https://github.com/abaplint/transpiler)が対応しておらず、厳密には実機と違う動きをするケースもあるかと思います。

[abaplint/transpiler](https://github.com/abaplint/transpiler)を体験してみたい場合は、[Playground](https://transpiler.abaplint.org/)が提供されており、こちらから動作を試すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/90887fa0-4cd5-2112-ca66-27c65a040204.png)

左側に`ABAP`を記載すると、`JavaScript`へtranspileされて右側に実行結果が表示されています。

## Exercismで提供されている問題は実機でも試せるようです

[exercism/abap](https://github.com/exercism/abap)

[abapGit](https://github.com/exercism/abap/issues ) を使用して、上記リポジトリを各自のSAPシステムにインポートすることで、`Exercism`で提供されている問題を実機で試すこともできるようです。

## 総評

`ABAP`がブラウザ上で手軽に学習できるコンテンツが出てくるのは、想像しておらず驚きがあります。

たしか[My solution to the ABAP Community Coding Challenge](https://blogs.sap.com/2020/09/13/my-solution-to-the-abap-community-coding-challenge/)らへんの記事で`ABAP`をトランスパイルしてブラウザ上で実行？　なにそれ！　と愕然として記憶がありますが。

それが更にこのような学習コンテンツにつながってくるとは時代ですね。

ただ、`ABAP`の学習と一口にいっても普段、普段`ABAP Object`に触れてなかったり。
昔ながらの書き方とはギャップがあったり、人によっては戸惑うかもしれません。

`Exercism`では今どきの`ABAP`が学べるといったほうが正確なのかもしれません。