ABAP on Exercism これから始めたい・効率よく進めたい人に見てほしいアドバイスとテクニック(Advices and Tips on "ABAP on Exercism")

こんにちは。
以前、ExercismでのABAPコース（ABAP on Exercism）についての[記事](https://qiita.com/Go_Ohta/items/3b76c746671214542b6f)を書きましたが、そこから3か月ほどかけて現時点での全42Exercises（この記事を書いた時点の40＋追加された2）を完了しました:thumbsup: 演習がどういう人向きであるのか、また演習をより効率的に行うことを観点に、知っておきたかった内容ををまとめました。これからExercismを始める方、効率よく進めたい方、そして研修・自習内容として導入を検討している企業の方にはぜひ読んでいただきたい記事になっていますので、ぜひご覧ください。

### ABAP on Exercismへのリンク
https://exercism.org/tracks/abap

## 演習はどういった人向けか
これからやってみようかな、ABAP研修に活用できるだろうか、と考えている方には有用な情報だと思います。

### ABAP未経験の方でも利用できるか
Exercismは、課題をプログラミングで解決するための演習を行うサイトであり、プログラミング言語の文法やコーディングの書き方や操作などを1から学習するサイトではありませんので、そういった方の利用には向いていません。
ABAP未経験の方は、Exercismの[How to learn ABAP](https://exercism.org/docs/tracks/abap/10-learning)にも記載がありますがSAP Learningの[Get Started with ABAP Programming](https://learning.sap.com/learning-journey/get-started-with-abap-programming-on-sap-btp)にてABAPの基礎、ADTの操作などひととおり学習してから、Exercismに取り組むのが良いと思います。

::: note warn
上記のGet Started~を利用するには、EclipseとADTだけではなく、BTP CockpitでABAP Environmentを利用できるようにする設定が必要です。BTPのフリーアカウントの取得とABAP Environmentのトライアルアカウント取得については、下記リンクを参照してください。そこでも述べられていますが、BTPフリーアカウント取得の際にリージョンを決める際、ABAP Environmentを利用する場合は、AWSのリージョンを選択してください。現時点ではABAP EnvironmentはAWSのリージョンでないと利用することができません。

[SAP BTP ABAP Environment: Create a Trial User](https://developers.sap.com/mission.abap-env-trial-user.html)
[Create an SAP BTP ABAP Environment Trial User](https://developers.sap.com/tutorials/abap-environment-trial-onboarding.html)

BTP CockpitのABAP environmentの説明（※Europeでの登録は登録時点ではできなくなっているようです）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/970e435e-44a9-f7cb-5189-35a55c1fc92b.png)
:::


### 業務用アドオンのコードを書けるようになるか
業務コードを作成するという目標で考えると、Exercismはその目標達成にマッチしない、というのが本当のところだと思います。以下の理由を挙げます。
* 演習内容が業務とマッチしていない
文字列編集およびデータの暗号化/復号化が多く、四則演算に加え、因数分解・平方根・べき乗の計算を行う場合があります。ABAPの計算の多くは金額や数量の四則演算なので、それ以外は使う機会が少ないと思います。

* 業務用アドオンでのデータソースとなるDBおよび外部ファイルへの読み書きができない
ABAP SQLによるDBに対する読み書きやローカル/サーバ上のファイルに対する読み書き処理ができません。当然ですが、伝票やマスタデータにもアクセスできません。また、これらを利用する標準汎用モジュールやクラスおよびメソッドの利用もできません。

こう書くと「業務で使えないコードなら書く意味ないかな」と思う方もいると思いますが、コードを書かずとも難易度の高い演習の設計だけをやってみるという使い方もあるかと思います。
私の場合、ABAPer時代にはなかった新しい記述方法を書いてみたかった、業務で書いたことのないような要件のコードが書ける、ということに興味が強かったこともあってExercismを楽しく取り組むことができました:smile:

## 演習の難易度について
各演習の難易度の確認の仕方や、演習に詰まってしまったときの対策について記載しました。

### 演習の実難易度の確認の仕方
Exercismの演習難易度をより確実に判断する方法について記載します。演習を上から順番に正直に実施するのは効率が悪いように思います。以下を参考にしてみてください。

現在のABAPコースには「Easy」と「Midium」の演習しかありませんが、「Easy」なのに結構難しいなと感じる演習もあります。以下の方法で、演習のより実際に即した難易度を実施前に確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/1866aaeb-fd3b-687f-06da-966ffb239fbe.png)

[ABAP演習のトップページ](https://exercism.org/tracks/abap)の[Build](https://exercism.org/tracks/abap/build)(下記赤枠内)を開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/693c89d4-ff05-d4fd-b74c-c00ef6110f5e.png)
上記ページの下部にある、Create Practice Exercises内の40 active practice execisesを展開します。
そこで、各演習のCompletionsが完了数（完了率）を確認することができます。完了率が高い演習は難易度が低い、逆に低い演習は難易度が高いと概ね言えます。この情報を以下のように活用し、より効率を重視した取り組みができるように思います。

* 難易度が低いものから開始する → 挫折防止
* 難易度ごとに時間制限を設けて実施する → 業務の納期(時間制限)を意識する
* 難易度が高いものだけを実施する → 自信がある方の力試し

「簡単すぎる」と放棄した人が多い演習や、多くの人にとっては簡単でも自分にはすごく難しい場合もあると思います（私にはありました）。統計結果ですので、そこはもう仕方ないとあきらめてください:grin:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/f12eee04-9ae3-61d6-796a-d0b325eca0d5.png)
なお、演習を実施していると未実施の演習に「Recommended」（次はこの演習をおススメ）と表示されますが、演習内容に関連性があるようには思えないので気にしなくて良いと思います。

### 演習に詰まってしまったら
演習がどうしてもこなせない…となった場合に用意されている救済措置について記載します。

各演習のトップ画面のタイトルの下の「Community Solutions」（下記画面赤線部分）ですが、これは本来、テストを全て完了させSUBMITさせた場合にほかの方のコードを見ることができる場所です。しかし、演習を開始し2日ほどが経過してからここにカーソルを合わせると、警告メッセージが表示され解放できるようになります（記憶があいまいなのですが、さらに日数が経過するとポップアップで自動的にメッセージが表示されたかもしれません）。

コピペしたコードを確認して演習を完了して先に進むことも場合によっては必要かと思いますので、時間制限がある場合などに活用してみてはいかがでしょうか。

なお私の場合、後述のABAPトランスパイラの不具合を確認するため、ほかの方のコードをコピペしてSUBMITしたうえでコピペしたコードをコメントアウトして自分のコードを載せなおし、「これ実機だとちゃんと動くのにExercism側の挙動がおかしくない？」とメンターに相談する荒業ｗも行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/907da239-eac3-8e4e-c3cb-be9f7a273efb.png)

## Tips
以下Tipsです。私は基本的にWebエディタで演習を進めたのですが、ADTを使って進めるほうが便利すぎるのでおススメです！

### Webブラウザ上からABAPコードを実行できる仕組みについて
ExercismがWebのみでできると聞き、大した疑問を覚えずに始めてしまいましたが、そういえばどうして実現できているんだろう？と疑問に思ったのは演習のかなり後でしたｗ。
Exercismは、記述したABAPコードを[トランスパイラ（トランスコンパイラ)](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9#:~:text=%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%EF%BC%88%E4%BB%96%E3%81%AB%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9,%E7%A8%AE%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82)にてJavaScriptに変換し、そのJavaScriptコードを実行し結果を返すことでABAPコードを実現可能としているとのことです。:laughing:

しかしABAPトランスパイラはABAPの挙動を完全再現、とまでには至っていないようです。ある演習で、SAP環境にコードを移植するとうまく動くがExercismでは動かないという状況が発生しました。メンターに相談したところ、トランスパイラの不具合であるということになりGitHubのABAP Transpilerのサイトでバグ報告を上げてくれた結果、2週間ほどで自分のコードが適切に動作するようになりました。

なお、以下サイトでABAPトランスパイラの挙動を確認することができます。左の列にABAPコードを入力すると真ん中の列でJavaScriptコードに変換され結果が右側の列に表示されます。

https://transpiler.abaplint.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/482c0523-2bc6-22dc-b28a-388f0972d352.png)

### テスト時に独自の結果を出力する
前回の記事にも記載しましたが、Exercismのエラーメッセージは、ABAP標準のエラーメッセージに比べると情報量が非常に少なくエラーの原因がわからないこともあります。これを補うために、変数などの内容を独自で表示する機能が実装されています。

https://exercism.org/docs/tracks/abap/30-tests

上記リンク先記事のDebugging and Loggingの段落にあるように、「console=>log()」のカッコ内に表示したい変数などの情報を設定すると、テスト実行時に合わせて表示されます（\nで内容の改行）。書いたコードが適切に動作しない場合の手助けになるかと思います。なお、リンク先のこの段落では上述のトランスパイラのことについても触れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/47f9d3d5-1097-8cc6-8894-e111b6727808.png)

## コードをSAP環境に移植してテスト実行する（おすすめ）
ExercismのコードをSAP環境に移植し、テストを実行する手順について記載します。Webブラウザ上ではデバッグがわかりづらい、コードが適切に動いているのかを確認したいと言う場合、デバッグモードによる詳細な情報が欲しい場合が出てくると思います。デバッグの情報がわかりやすくなる上にそのままテストクラスの実行もできますので、WEBエディタを使用するよりも効率的に演習を勧めることができますのでおススメです。
なお、私はレポートプログラムを作成してコードを移植して動作を確認していましたが、移植時や実行データの記述修正など手間がかかり煩雑でした。演習も終盤にさしかかった頃になってADT上でテストを実行できることがわかりました…:confounded:

### ABAP Environmentでのテスト実行方法

1. クラスを作成する
プロジェクトエクスプローラーで対象プロジェクトまたはパッケージを右クリックして、「New」>「ABAP Class」でクラスを作成してください。今回はパッケージ：Z_EXERCISM内にクラス：ZCL_RAINDROPSを作成しました。パッケージはローカルオブジェクト（$tmp）でもOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/9d00d4b4-b4c3-4348-c79d-0d43584bfe3d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/a75a7c22-acaf-6588-2b2b-0ca5bcc43df9.png)

2. クラスコードをコピペする
クラス部分のコードをすべてコピーし、ADTのクラスの「Global Class」タブ（エディタ部の下側で確認できます）にペーストします。ペースト後は有効化（Ctrl+F3）します。
※エラーを発生させるため、IMPLEMENTATIONの一部内容をコメントアウトしています。
![スクリーンショット 2023-01-13 222012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/73d321ee-5b74-2ddc-9c78-7f3fcd5ac3da.png)
※有効化時にエラーが発生した場合、記述したコードにエラーがあるか、ExercismのABAPコードで記載されているコードが実行環境より新しいバージョンでの記述方法を用いていることが原因だと思われますのでエラーメッセージに従って修正してください。

3. テストコードをコピペする
上記と同様に今度はテストクラスのコードをコピーし「Test Classes」タブにペーストして有効化します。
![スクリーンショット 2023-01-13 223321.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/04646af9-6a98-b47f-d76a-5717f24ce345.png)

4. ABAP Unit Testを実行する
Ctrl+Shift+F10 または、画面の「Run As」から以下のようにたどって実行します。今回は6つのテストのうち上2つが成功（明るい緑のアイコン）、4つが失敗（濃い緑のアイコン）と判断されました。失敗したテストについてはどこで失敗したのか、期待される結果値と実際に返された結果値の情報が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/5eb00077-32f1-8f94-c04d-4cf95ee867c3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/e351176a-38bf-71fc-b26c-8a4936f564b9.png)
Global Classにてコメントアウトを除外して有効化し、再度ABAP Unit Testを実行すると、今度は6つのテストケースすべてが成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/ef1b2f9a-3aa0-07e0-1923-43b4b82508db.png)

### まとめ
ABAP on Exercismを完了してみてのアドバイスやTipsの内容をまとめました。目標によってはExercismの学習があまり効果的ではない事例についても触れていますので、Exercismでの演習をより有意義かつ、効率的に進めていただければと思います。最後までお読みいただき、ありがとうございました。