OutSystemsの新試験、Web Developer Specialization (ODC) は、ODCで行うWebアプリケーション開発について、Associateよりも踏み込んだ知識を確認する。
受験の前提がAssociate Developer (ODC) 。
Architecture Specializationと共にODCを対象とするProfessional認定条件の1つ。この2つに、2024/12時点では未発表の残り1試験を合格すると、Professional Web Developerとして認定される。
以前リリースされた試験では、サンプル問題はzipファイルの中にpdfファイルとして含まれていたが、この試験では、オンラインのコース上の1ページとして配置されている。
https://learn.outsystems.com/training/journeys/web-developer-exam-2993/sample-exam/odc/2990
全部で10問で、この記事では1問目-5問目が対象。
6問目-10問目
サンプル問題は英語しかなかったので、この解説は英語版を見ながら書いている。
選択肢には番号が振られていないので、こちらで上から順に1,2,3,4をふっている。
1 Exception/Transaction Handling
Entityを操作(レコード作成)するメインの処理実行後に、Service Actionで監査ログを記録している。そのService Actionは、メイン処理で作成したレコードの存在チェックをし、見つからなければ例外をRaiseする。
問題文の設定では、Service Action実行時に例外が発生しているが、この時トランザクションはどうなるだろうか? という問題。
まず、「メイン処理とService Actionは別トランザクションになる」点に注意。これはService ActionがHTTPS経由で呼び出される処理であるため、同じ RDBトランザクション管理下にないため。
また、メイン処理ではレコード作成が行われているが、問題文に添付されたActionフローにはCommitTransaction呼び出しが配置されていない。この場合、メイン処理のEndに到達した段階でコミットされる。よって、「Service Action実行時点では、メイン処理はコミットされていない」。
もちろん、Service Action中で例外が発生しているので、その処理はコミットされていない。
まとめると、メイン処理から呼ばれるTransferFundsも、Service Action AuditLogTransactionもコミットされない。この説明に合致する選択肢2が正解。
2 Best Practices - Data
Entityの参照属性が持つDelete Ruleについての問題。
問題文の画像を見ると、ProductImage EntityでProduct Entityを参照するProductId属性のDelete Rule=Protect。つまり、あるProductレコードを参照するProductImageレコードが1つでもあると、そのProductレコードは削除できない。
この説明に合致する選択肢3が正解。
ちなみに、Productレコードと一緒に参照するProductImageレコードが消えるとする選択肢1はDeleteの場合の説明。
3 Asynchronous Processes
各選択肢を見ていく。
- ×:OutSystems system requirements for ODC > Platform Limits - ODC Documentationによると、1 Appあたりの同時Events数上限は10でなく100
- ○:マイクロサービス(App)間で非同期・疎う結合にやり取りをするのはEventの重要な性質
- ×:Publicであるかどうかに関わらず、Eventは定義したApp自体もSubscribe可能
- ×:エラー時には間隔を広げながら10回までリトライする
4 Work in Teams
複数の開発者が同じAppの同じ場所に開発を行った場合、後から行ったPublishで何が起きるか、という問題。
先に行ったPublishと競合が発生すると、競合が検知され、その内容を確認してマージを行うダイアログが表示される。マージを行って競合を解決するとPublishを実施できる。
よって、Publishするには競合の解決が必要、とする選択肢2が正解。
5 Best Practices - Data
バイナリデータを持つEntityをどう設計するか、という問題。
OutSystems 11の頃からのベストプラクティスがあり、当時からよく問題が出題されていた。
今検索してみると、ODC向けにもベストプラクティスが最近公開されており、同じベストプラクティスがあった。
バイナリデータや大きなText型を属性に持つEntityはパフォーマンスが劣化する。そのため、ベストプラクティスは、バイナリデータや大きなText型は別のEntityに分離する。
この問題の場合、従業員の写真であるから、親Entityのレコードと写真Entityのレコードの多純度は1:1。よって、写真EntityのIdは親EntityのIdとする。
この内容を説明している選択肢4が正解。