ローコード、ノーコード開発について思うこと


最近は主にSalesforceのみで遊んでいるので、ここでの事例はSalesforceに限らせてもらいます。

# これまでの経緯とか現状

私自身はApexでコーディングするのが大好きなので（好きというより、これしか分かりません）普段は迷わず自動化処理はAoexトリガやApexバッチで対応します。　まぁ、画面は凝ったものをつくろうと思うと全てをカスタムコンポーネントで作ります。単純な機能でよければクイックアクションからカスタムコンポーネントを呼び出すような標準画面 + カスタムコンポーネントというような構成になります。

しかしながら、時代はローコード、ノーコード開発にしたい（システム会社がしたいだけと思っていますが...私みたいなユーザ企業の管理者はそうは思ってないと思う。新たにお金がかかるのは非常に困る。教育も含めて...）ようです。

そのためなのか、質問の回答としてApexを使うと提案すればまず良い回答としては採用されません。
コーディングすること自体が悪として扱われる世界だなぁって感じます。私としては別に不正をしてコーディングスキルを得たわけでないですけど。世間の流れに乗らない悪と思われています。

そうそう、Apexについては初めてのSalesforceでのシステム開発の時に時間が３か月しかありませんでした。最初のレビューで標準機能だけで作ったシステムを見せたら大いに怒られてそこからフルスクラッチ開発することになりました。ああ時間が無いよということで本当に徹夜で１か月くらいでフルスクラッチ開発できるようになりました（昭和の技術者なんで気合しかないです。前職の会社はThe日本の企業というような現場重視の会社だったので、何でも現場で解決しないといけませんでしたから...）。まぁしかし、その程度の難しさだったと思います。私みたいにユーザ企業に勤めているプロでない似非開発者でもできる程度です。

実際には最初はカスタムコンポーネント（画面）を作っていましたが、ApexのコーディングよりもAuraコンポーネントの仕組みの方が難しかったです。これを理解するのに時間が掛かってしまいました。画面とデータベースの間をどうやってつなぐ？データのやり取りをするかが非常に理解しにくかったです。

+ [Aura フレームワーク](https://qiita.com/Keiji_otsubo/items/f28a2f8ee39b4ad1367d)

# 自動化処理での考察

現在、自動化処理にはローコード、ノーコード開発としてフローというツールを非常に推されているようです。私は普段から全く使わないのでよく理解できてないです。それになかなか学習意欲もわかないというのが正直なところです。何せApexで書けるので困ることがありません。必要に迫られていないのでなかなか覚えられません。何年勉強しても英語がさっぱり分からないのと同じです。別に英会話ができなくても問題なく暮らせるし、外国の方が日本語で会話してくれた方が私が英語で話すよりも確実に通じますからね。そうそう海外に旅行したいとも全く思わないので本当に困りません。

さて、ちょうどいいことに英語版の質問を覗いていると複雑そうなフローの絵があります。

いや、これってデバッグ面倒だろうって思うけど。
中身を見てないのでApexのコードで比較できないですが... (質問を読んだけど意味が分かりませんでした。英語のWEB翻訳の結果でも意味が分からん)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/416a3061-03b5-581d-37f8-bf16c7c5dd4f.png)

もうひとつの例として正規化されていない20個の繰り返しのフィールドをもったオブジェクトがあります。
Apexでコードを書いた場合は以下のようになります。ちょうど下の方のif文のところでこの繰り返しフィールドへ更新を掛けています。
まぁ、別に普通のコードでしょう。

```
trigger xxxxxTrigger on Account (Before insert,Before update) {

   Set<Id> AccountSetId = new Set<Id>();

   for (Account acc : Trigger.new){
      AccountSetId.add(acc.Id);
   }
   List<Contact> conList =[SELECT Id,AccountId FROM Contact WHERE AccountId =: AccountSetId Order by AccountId,Id];
   String key_Id = '';
   Integr I = 0;
   Map<Id,List<Id>> conMap = new Map<Id,List<Id>>();
   for (Contact con : conList){
     if (I == 0 ) {
          key_Id = con.AccountId;
          List<Id> conIdList = new List<Id>();
     }
     if ( ke_Id == c.AccountId) {
        conIdList.add(con.Id);
     } else {
        conMap.put(con.AccountId,conIdList);
        key_Id = con.AccountId;
        List<Id> conIdList = new List<Id>();
        conIdList.add(con.Id);
     } 
     I = I + 1;
   }
   conMap.put(con.AccountId,conIdList);
  
   for (Account acc : Trigger.new){
      List<Id> IdList = (List<Id>)conMap.get(acc.Id);
      if (IdList !=null) {
         Integer max = IdList.size();
         for (Integer i = 0, i < max; i++) {
           if (i ==0) acc.1件目 = IdList[i];
           if (i ==1) acc.2件目 = IdList[i];
           if (i ==2) acc.3件目 = IdList[i];
           if (i ==3) acc.4件目 = IdList[i];
           if (i ==4) acc.5件目 = IdList[i];
           if (i ==5) acc.6件目 = IdList[i];
           if (i ==6) acc.7件目 = IdList[i];
           if (i ==7) acc.8件目 = IdList[i];
           if (i ==8) acc.9件目 = IdList[i];
           if (i ==9) acc.10件目 = IdList[i];
           if (i ==10) acc.11件目 = IdList[i];
           if (i ==11) acc.12件目 = IdList[i];
           if (i ==12) acc.13件目 = IdList[i];
           if (i ==13) acc.14件目 = IdList[i];
           if (i ==14) acc.15件目 = IdList[i];
           if (i ==15) acc.16件目 = IdList[i];
           if (i ==16) acc.17件目 = IdList[i];
           if (i ==17) acc.18件目 = IdList[i];
           if (i ==18) acc.19件目 = IdList[i];
           if (i ==19) acc.20件目 = IdList[i];
         }
      }
   }

}
   
}
```

同じことをローコード、ノーコード開発（フロー）で行うと以下のようになるとのことです。
Apexでも20個のフィールドはif文で20個分岐させていますが、フローでも同じようです。しかしこれって設定だけでも大変だと思うのは私だけでしょうか？

当然ですが、Apexのコードではフィールド名に数値が入っていてループ変数で簡単に指定できればIFを使わず20回回して対応できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/61f47d00-ae8e-7036-bba2-1c58ccc546e6.png)



# カスタム画面での考察

ローコード、ノーコード開発の画面でのツールとしては動的フォームになるのかと思うのですが、これって普通に表示しているフィールドを条件で見せる見せないとやっているだけで、標準画面の使い勝手を良くよくするものでないと思っています。

例えば業務でよく使う画面は残念ながらSalesforceの標準画面では使いにくいと思います。
検索機能が正直使いにくいです。指定した複数のフィールド検索できないんですよね。普通の業務向けのシステムなら必須だと思うけどどうも私とは感覚が全く違うようです。　ということで私のイメージでカスタムコンポーネントを作ることが多いです。残念がらこれをツールで行うことはできないですね。（私が知らないだけの可能性もありますが...）

普通に考えてもこんなような感じで検索できるのは当たり前だと思います。基幹系の仕組みなら当たり前でしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8e5bf358-8629-f322-2989-3de2043a953a.png)

標準機能だと詳細画面も無駄に間隔が広くてぱっと見ることができる情報量が少ないんですよ。

ちょっと工夫すればこのようなカスタムコンポーネントを作ることができます。タグをクリックすることで画面遷移しないで情報を切り替えることができます。　この画面はフルスクラッチで開発していますが、個々の部品は予めSalesforceで用意されている部品を使っています。見栄えのいいように並べているだけのプログラムですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bbc2b304-d127-6761-3c34-55db7d02d347.png)

結局画面の使い勝手をよくするにはローコード、ノーコード開発ではできないと思います。

# 最終的に

以上説明したような開発をしていると、邪道だと色々と非難されます。しかし簡単に便利な機能を実装できるし、そもそも他のクラウドでもこれくらいは標準で対応しているだろうって思います。　まあ私はSFの社員でないので競合他社さんがどうだとかは知りませんが、普通に考えると競合さんももっと便利な仕組みを開発していると思いますよね。　今はシェアも高くて売れているかもしれませんが、それに胡坐をかいて潜在能力はあるのにApexでの開発行為を貶めるのは考え物ではないかと思います。競合他社さんの仕組みも進歩していることを忘れてはいけないと思います。しかしSFさんが儲かっても私には何の得もないせめてライセンス料を安くしていただければ嬉しい限りです。ちょっとコーディングすれば普通のシステム並みには使いやすくなるのに　開発するのは悪だというのは驚きでしかありません。

ローコード、ノーコード開発だけというのは私にとってははっきりって？でしかありません。
Excelのマクロだけで組んだシステムもお守りをしたことがありますが、大変でした。そのまま保守するのは面倒だったので全てVBAで書き直したこともありますが、マクロの時よりも早く動いたと思います。それと同じだなって感じます。

ローコード、ノーコード開発の何がいいのかはよく理解できません。コーディングを覚えた方が応用が利くし、処理スピードも早い。