OutSystemsは魔法じゃないと気付いたとある会社員の学び

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337041/3ae9d2c9-a2b4-9a73-a42d-957bac6da9f8.png)

---

# はじめに

* 本ページは[OutSystems愛知ユーザー会 #1](https://outsystems-chubu.connpass.com/event/137414/)のLT資料です
* connpassにこの資料へのリンクを貼っておきます
* タイトルはネタです

---

# OutSystemsとは？

[OutSystemsの超概要](https://qiita.com/shoji9x9/items/2dc78f75819e9dc79c7c)をご覧下さい。

---

# 言いたいこと

* OutSystemsは優れたツールです
* しかしながら、OutSystemsにもよくないところはあります
* それらを理解した上でOutSystemsを使わないと「思ってたんとちがう」となります

---

# これまでの経緯

* 2014年にOutSystemsをあるプロジェクトに導入
* 導入当初は自分でOutSystemsを使うよりも企画、マネジメント中心
* 2017年からシステム開発について真面目に勉強するように（DDD、クリーンアーキテクチャー、JavaScript、Python、C#、テストコード、Git、アジャイル・・・）
* この半年ほどは自分でもOutSystemsを利用するように

---

# するとどうなったか？

* PythonならできるxxxがOutSystemsではできんやん！
* Jasmineなら簡単に書けるテストコードがOutSystemsだと面倒臭い！

などと今更気付く（2014年に気付いていれば・・・）。みなさんに同じ思いをしてもらいたくないので、OutSystemsのイマイチと思うところを共有します。

---

# OutSystemsのイマイチなところ

* DBと密結合
* Actionの引数にActionを設定できない
* ビルド（Publish）が遅い
* 周辺ツールが充実していない
* IDEが弱い
* コードがテキストじゃない

---

# DBと密結合

* テストにDBが必須
* テストデータの分離ができない
    * 自動テストのデータとマニュアルテストのデータの分離
    * チーム間で利用するデータの分離

---

# Actionの引数にActionを設定できない

例えばActionを渡せると以下のように書ける（わかりやすくするためJavaScriptで書いています）。

``` テスト実行ユーティリティ.js
function testExecution(testScenario, fn) {
  var testResult = fn(testScenario);
  saveTestResult(testScenario, testResult);
}
```
``` 呼び出し処理.js
var testScenarios = getTestScenarios(getActionName(testAction));
for(var i = 0; i < testScenarios.length; i++) {
 testExecution(testScenarios[i], testAction);
}
```

Actionを渡せないと以下のように書くことになる。

``` 呼び出し処理.js
var testScenarios = getTestScenarios(getActionName(testAction));
for(var i = 0; i < testScenarios.length; i++) {
 // 自分でテストを実行し、結果を保存する必要がある
 var testResult = testAction(testScenarios[i]);
 saveTestResult(testScenarios[i], testResult);
}
```

---

# ビルド（Publish）が遅い

* 昔と比べて速くなった
* OutSystems11になってできたService eSpaceは特に速い
* それでもTDDする（レッド、グリーン、リファクタリングのループを回す）には遅い

---

# 周辺ツールが充実していない

* OutSystemsには[Forge](https://www.outsystems.com/forge/)というマーケットプレイスのようなものがあり、BSDライセンスモデルにもとづきソフトウェアが公開されている
* しかし、テストツールはあまり充実していない。カバレッジを取得するツールもない

---

# IDEが弱い

* JavaScriptのエディタには以下の機能がない
  * フォーマッター
  * リンティング
  * コード補完
* IDEはオープンソースでもなく、APIも公開されていないため、自分たちでは機能拡張できず、世の中のエディタとの格差は開いていく一方では？

---

# コードがテキストじゃない
* OutSystemsのコード（設計情報）はメタデータとしてDBMSに格納されている。これをXMLとして取り出すことはできる
* アイコンの座標なども格納しているためサイズが大きい。過去バージョンも全て保持するため、定期的に削除しないとパンクする（1つのeSpaceが1GBを超えることはよくある）
* 「StaffってEntityどこにあったっけ？」となっても簡単には探せない（ツールを作れば簡単に探せます）
* コードの共有が難しい
  * 「このActionでエラー出てるんですけど原因わかりますか？」といった問合せをStack OverflowにしようとしたときにeSpaceを添付するしかない（普通のプログラミング言語ならばテキストのコピー＆ペーストで済む）
  * その上、Intellectual Property Protection (IPP) という機構があるため、他人の（ライセンスの異なる）eSpaceは自分の環境にはPublishできない
  * GitHubのような「設計図共有サイト」もなくノウハウが貯まりづらいのでは？

---

# 最後に

* 色々とネガティブなことを書きましたが、ローコード開発の市場規模は急速に拡大しており、2022年には2兆円を超えると言われています
* その中でリーダーのポジションであるOutSystemsはシステム開発の有力な選択肢のひとつです
* OutSystemsはメリット、デメリットを理解した上で正しくお使い下さい

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337041/53e55720-40c5-d5c6-a743-c482962cb820.png)

https://nippori30.herokuapp.com/newgame/

---

# ボツロゴ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337041/7af48aee-cea6-f5f7-6b94-156ae06335ad.png) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337041/b093a395-d4c5-0f2a-e6e7-b42ff745aaff.png)

---