OutSystemsは魔法じゃないと気付いたとあるエンジニアの学び（2023年）

# はじめに
* 2019年に[OutSystemsは魔法じゃないと気付いたとある会社員の学び](https://qiita.com/shoji9x9/items/0ebbc8acef1e92d9a709)を投稿してから3年半以上経ちました
* その間、自分の立場も変わり、直近のプロジェクトではOutSystemsのReactive Webも経験しましたので、それらを踏まえ上記内容をアップデートする形で書いていきます
* 現在はフリーランスのエンジニアをしていますので、面白そうな案件があればお声掛け下さい。React、コンポーネント駆動開発あたりに興味があります。なお、OutSystemsは一旦卒業のつもりです

# 2019年にあげたOutSystemsのイマイチなところのアップデート
## DBと密結合
これは変わっていないですね。せめてスキーマの切り替えなどによりテストデータの分離ができるようになると嬉しいです。

## Actionの引数にActionを設定できない
こちらはClient Actionでは実現できるようになりました。[[OutSystems]コールバック関数を渡すと自動的にログを取ってくれるClient Action作ってみた](https://qiita.com/shoji9x9/items/2ab694e5341b0f04b601)にその方法などを書いています。Server Actionでは未だに実現できません。

## ビルド（Publish）が遅い、周辺ツールが充実していない
このあたりも残念ながら変わっていません。[Testing Framework](https://www.outsystems.com/forge/component-overview/12754/testing-framework)というよさそうなツールは比較的最近リリースされました。テストにモックを使えるようで期待できます。

## IDEが弱い
コード補完やリンティング機能が追加されました。フォーマット機能も欲しいところです。

## コードがテキストじゃない
これもやはり変わっていません。テキストとOutSystemsのビジュアルなコードを双方向に変換できる仕組みがあるといいなと思いました。最近携わっている[Spring Cloud Data Flow](https://dataflow.spring.io/)ではこれが可能です（OutSystemsと比較すると単純なフローではありますが）。

# 今回追加するOutSystemsのイマイチなところ
## プログラミング言語としての機能が貧弱
これの一部に[Actionの引数にActionを設定できない](https://qiita.com/shoji9x9/items/c8534bd0e4d48648d10d#action%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%ABaction%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)が含まれますが、他にも以下の点がイマイチです。
* ジェネリクスが使えない
* 自分で定義した例外をPublicにできない、キャッチできない
* breakが使えない（returnは使える）
* Linqが使えない（一応、[Dynamic LINQ](https://www.outsystems.com/forge/component-overview/1293/dynamic-linq)というForge部品はある）
* Server Actionではテンプレート文字列が使えない（Client ActionのJavaScriptでは使えるようになった）

Client Action内にJavaScriptを自由に記述できるように、Server Action内にC#を自由に記述できるようになると嬉しいです（Extension開発は複数手順が必要で少し面倒なので）。

## 調査用のAPIが少ない
OutSystemsのFind Usageは便利な機能だと思いますが、結果のコピーが難しかったりするので（一応できますが）、これをAPIとして提供すると、より活用が広がると思います。「AbortTransactionがどこで使われているか？」を調べるためにOSSYS_ESPACE_REFERENCEを利用したりもしましたが、こういったテーブルの認知度を高めたり、APIとして簡単に利用できるようになるとよりよいと思います。

# OutSystemsのいいところ
最後の締めくくりがイマイチなところなのは気が引けますので、いいところも書いておきます。

## フレームワーク、ライブラリー、ツールがほぼ自動的に決まるところ（フルスタック）
OutSystemsを使わないプロジェクトではこれらに何を利用するのかを逐一考える必要がありますが、OutSystemsを使うプロジェクトではほぼ考える必要がありません。悪く言うと柔軟性に欠けるのですが、スキルや時間の制約によりこれらを選定できないプロジェクトにはOutSystemsは適していると考えます。

|No.|要素|OutSystemsでないプロジェクト|OutSystemsを使うプロジェクト|
|---|---|---|---|
|1|OS|Linux、Windowsなど|基本Windows|
|2|DBMS|RDBからNoSQL、NewSQLまで色々|基本はRDB（Forgeを考えるとSQL Serverがよい）|
|3|Webサーバー、アプリケーションサーバー|Apach、Nginx、IIS、Tomcat、Weblogicなど|IIS|
|4|メッセージブローカー|Kafka、RabbitMQなど|RabbitMQ|
|5|JavaScriptフレームワーク|Angular、React、Vueなど|React（Reactive Webの場合）|
|6|コンポーネントセット|Angular Material、MUIなど|OutSystems UI|
|7|サーバーサイドフレームワーク|Spring Frameworkなど|.NET Framework|
|8|ORマッパー|JPA、MyBatisなど|Entity Framework|

他にもOutSystemsでどう実現しているか不明なものもありますが、ソースコード管理、構成管理、デプロイ、ロギング、メール、Timer、Excel入出力、JSONなどなどOutSystemsをインストールするだけで色々な機能がついてきます。

## 開発環境を整えるのが簡単
上記とも関係しますが、OutSystemsを使う場合はWindows、DBMSをインストールした後にOutSystemsをインストールするくらいで開発サーバーの準備は整い、各開発者は自分の端末にはService Studioだけインストールすればいいです。

OutSystemsでないプロジェクトになるとフレームワーク、ライブラリー、ツールを別々にインストールすることになり、バージョンの互換性が合わなくて苦労することもあります。

## フロントエンド、バックエンドを同じ言語で記述できる（モバイルも）
これはOutSystemsならではの強みだと思いますが、例えばClient Actionをコピー＆ペーストして同じ機能を持つServer Actionを作成できたりします（モバイルの場合でも可能かは未把握）。他にもClient Actionを開発するUIとServer Actionを開発するUIは似ていますので片方の開発の仕方を覚えればもう片方もスムースに開発できます。Traditional WebとReactive Webはそれぞれできること、できないことがありますが、それでも一般的なサーバーサイドでHTMLを生成する方法（テンプレートエンジンを利用する方法）とSPAとの開発方法の差と比較すれば小さいと言えます。

## コードを結合する際に問題が発生するリスクが小さい
OutSystemsで開発すると、基本的にソースコードと実行ファイルはサーバーで一元管理されます。ブランチを作ることはできません。これはマージの衝突を避けるため、OutSystems社が意図的にこの仕様にしていると考えられます。個人的にはこの常時結合の考え方が好きです。小さな機能を素早く開発、リリースし、難度の高い並行開発は可能な限り避けるべきだと考えます。

なお、OutSystemsで並行開発する場合はフィーチャートグルを利用する方法があることが[大規模システムの開発とデリバリー](https://success.outsystems.com/ja-jp/documentation/best_practices/lifecycle/development_and_delivery_at_scale/)で紹介されています。ただ、やはり難度は高いため、どの部分に条件分岐を設けるのか、いつその条件分岐を解消するのかなどを十分検討する必要があると思います。

# おわりに
* [ローコード開発の市場規模は年々拡大しています](https://www.statista.com/statistics/1226179/low-code-development-platform-market-revenue-global/#:~:text=The%20global%20low%2Dcode%20platform,billion%20U.S.%20dollars%20in%202024.)
* また、近年自然言語処理も急速に発展しており、ChatGPTなども登場しました
* 今後、人によるプログラミングはより抽象度が高くなると思います。ビジュアルで表現するのか、自然言語で表現するのかまでは予想できませんが・・・
* いずれにせよ、この先10年間くらいは万能なツールは出てこず、そのツールの特徴を活かした使い方をする必要があると考えます（さらにその先の10年間はひょっとすると人がやることはほぼないかもしれませんが）
* ということで、OutSystemsはメリット、デメリットを理解した上で正しくお使い下さい。OutSystemsはWebアプリケーション（モバイルアプリケーション）を簡単に開発するためのツールでしかありませんので、Webアプリケーション（モバイルアプリケーション）開発に必要な基礎知識は当然必要です。この点もご注意下さい