Node-REDはどこまでが簡単なのか?

2年くらい前にNode-REDとラズパイを使って少し本格的なシステムを構築する機会がありました。色々と思うことがあったのですぐに書き留めたかったのですが億劫だったので、つらつらと今更書こうかなと思います。
問題として挙げていることは、Node-REDに対する私の理解が浅かったせいもあるでしょうし、今はバージョンが上がって改善されていたりするところもあると思いますので、参考程度にご覧下さい。

システムの概要

さて、Node-REDとラズパイを使って作ったシステムの概要をざっくりと説明しますと、センサーを使って工業製品の生産状況を把握するシステムで、センサーからのデータをDBに入れてそのデータを見やすくグラフなどでブラウザ上に表示するという比較的簡単なシステムでした。仕様書がとても質の良いものだったので、Webシステムの構築経験とマイコンとかの組み込み制御をしたことがあれば3人で3ヶ月もかからずに実装できるな、というものでした。

詳しくない人にも分かりやすい実装

Node-REDでの実装では、「あまりプログラムに詳しくない人でも分かる実装」をしたいということで、実装の詳細設計は特にせず要求仕様書をなぞるようにノードを繋げる実装を行いました。品質を守るための工夫や後のメンテナンスや問題発生時にすぐ対処できるようにしておく基本的な設計などはされていません。
ノードを繋げる開発だしそういうものなのかしらね、などとそのときは思ってましたが、実装の基本を無視した結果、手間ばかり増えてしまいました。例えばすぐに分かるのが、同じようなコードがたくさん混在してしまうこと。普通のフレームワークで組んでいれば3秒ぐらいで修正が終わるものも普通に十分とか、かかってしまいました。

やはり簡単と言えど普通の大きさのシステムをNode-REDを使って作るには、実装時に必要な考え方やアンチパターンの知識や経験は必要になります。Node-REDの場合はノードを繋げたフローを書くので、そのフロー?というかノード?の修正のしやすさだとか運用のしやすさだとかを織り込んだ詳細設計が必要だと思いました。また、Webアプリケーションの仕組みや非同期処理についてもきちんと理解した方が良いでしょう。

資料が少ないということ

実際に開発がはじまると誰も今どきのwebアプリケーションの基本的な構成が解っていないので、node.jsやAngularをベースに利用しているNode-REDの内部的なバグが発生すれば1人で対応しなければならず大変でした。Node-REDの開発自体もどんどん進んでいるので、一次情報を積極的に取りに行って欲しかった。公式のドキュメントやお知らせを見ること、issueの確認や問題部分のNode-RED自体のソースコードの確認すること。どれが今必要な情報なのかを取捨選択するベースの知識や経験も必要になってきます。

個人的にとても負荷が高かったのですが、多分誰も気付いてないですよね。オープンソースで開発したいなら自分でやってもらいたいところです。

画面の実装について

Node-REDはローコード開発なので既に提供されている部品を利用してモノを作るわけですが、その部品にはない既存のよく見るシステムのちょっと気の利いた表示とかを実装したい場合は普通のWebフレームワークを使って画面を作るのより面倒で時間がかかります。

少しでも画面が複雑な場合、Node-REDで画面を作るのは辞めたほうが良いと思います。画面を作るためのノードがエディタ上にポンポン置かれるだけなのが目立つのでNode-REDのような処理のフローを書いてプログラムするものとはちょっと相容れないところがあるような。フローである意味が感じられないというか。

そして、ショッピングサイトとか予約サイトで見るような表示項目や入力項目の多い画面の作成をNode-REDでやると、画面を構成するフォームやボタンはノードと一対一なのでノードがエディタ上にギッチギチになります。同じような入力フォームを複数出す場合、ループは回せないので必要な数だけノードを配置する必要があります。そうすると、それらのノードに繋がる似たような処理もフォームの数だけ配置しなければなりません。「意味的に同じ処理を抽象化できない」という問題は他の処理でも結構出てきてしまうので、その度にOOPのインタフェースの有り難さを実感しました。ノード数が少ない場合は直感的に素早く実装できて快適なのですが、ある程度の複雑さを超えると途端に効率の悪い開発になってしまう印象です。

そんなわけで、センサーからのデータはNode-REDで処理して、画面は別のフレームワークを使うのが良いのではという感じがしています。正直ビジネスロジックとかもNode-REDでは書かずに、Node-REDにはセンサーから値を取ってある程度きれいにしたデータを返すだけのAPIとして振る舞うように作るのが良いのではないかと思いました。今回のケースの場合全てをNode-REDで作成するのは、無理があるように感じました。

あと、実装時は処理のレベルに応じて層を作っていくようにプログラムを書くと思うのですが、それも表現できないので色々なレベルのロジックが同じファイル上に存在します。書き方を工夫すれば良いのでしょうか。(そういば、そもそも詳しくない人が見ても何をしているか分かりやすいフローにするという前提があった。)後で修正するときに見辛かったです。それに加えてノードの設定を行うときは設定用の小さな画面が開くのですが、修正作業をしているとこの設定画面をいちいち開いたり閉じたりしないといけません。本当に何回も何回も面倒臭くなってくる。私は修正内容によってはJSONのソースコードを開いて直接編集していました。

gitを使うと決めたのに

Node-REDはソースコードの管理にgit用のGUIを備えているのですが、結局ソースコードがメールでやり取りされました。私がみんなのコードをプッシュする係を任されたのですけど、あり得なくてとっても嫌でしたwメールで飛んでくるコードをいちいちこちら側でプッシュしないといけないのは負担です。旧石器時代なのか。そして、コードは基本Node-REDエディタにコピペして本番環境に入れるので益々意味がありませんでした。

ここで注意したいことがあって、ソースのコピペをエディタ上で何回も行っていると、Node-RED内部にゴミノードが溜まっていき、過去のノードと混在して正常に動かなくなる問題が出てきます。このせいで、作ったアプリの画面がぐっちゃぐちゃになってしまって意図通りに動かなくなりました。これの問題を解決するには、エディタの右上ぐらいにあるノードの一覧が表示されるペイン(名前忘れた)にある、点線の枠で囲まれたノードを消します。

開発手法について

Node-REDはウォーターフォールでの開発がそもそも向いてないと思います。素早く実装してモックを見せられるというメリットを活かさない手はないと思います。アジャイルでの開発が向いています。

Node-RED初心者がハマったところ

Node-RED初心者がハマったところ

今日も引き続き、Node-REDをやっていきたいと思います。 基本的なことを理解するためにNode-RED日本ユーザー会のチュートリアルを消化していきます。