ぺのめも

Web開発を勉強中。学んだことや思ったことなど

【Ruby on Rails 7 + React・個人開発】 KPI ツリー図の作成・数値シミュレーションをサクッとできる Web サービス「KPI ツリーメーカー」をリリースしました

はじめに

Ruby on Rails 7 + React で 個人開発した Web サービス、「KPI ツリーメーカー」をこのたびリリースしました。
KPI ツリー図の作成・数値シミュレーションをサクッと行うことができるサービスです。

KPI ツリーメーカーのサービス画面
サービス画面

Google アカウントがあれば無料ですぐに使えるので、ぜひお気軽に触ってみてもらえたら嬉しいです。

kpi-tree.com

github.com

簡単な自己紹介

新卒でシステム開発会社に入り、プロジェクトマネージャーを経て、現在はモバイルアプリや Web サービスのプロダクトマネージャーとして働いています。
仕事ではマネジメントが主になっていて自分で開発・実装する機会が少ないので、エンジニアリング経験をもっと積みたいなあと思い、FjordBootCamp という Rails の学習コミュニティに1年半ほど参加しています。

KPI ツリーメーカーの紹介

KPI ツリーメーカーとは

KPI ツリー図の作成・数値シミュレーションをサクッと行うことができる、無料の Web サービスです。
下記のような KPI ツリーを、ポチポチッとすぐに作ることができます。

KPI ツリーメーカーで作成した KPI ツリーの画像
KPI ツリー

  • 目標設定等で数値シミュレーションが必要なとき
  • 事業やキャンペーンの企画案をたくさん出して、それぞれの KPI を簡単に整理したいとき

など、手軽に KPI ツリーがほしい場面で便利です。

使い方

  1. Google アカウントでサインアップする

    KPI TREE MAKER にサインアップ

  2. ツリーを新規作成する

    ツリーを新規作成する画面

  3. ツリー要素の追加や編集を行う

    KPI ツリーを作成、編集する画面

  4. 作成したツリー画像はダウンロードできます

    KPI ツリーをダウンロードできる画面

作ろうと思った背景

サービス開発の理解を深めるために、個人でイチから実装したものを作りたい。でも何を作ろうか……🤔 となったときに、
あんまり壮大にならない「ちょっとしたツール系」のサービスがいいなあ、と考えました。
そこから、

  • KPI ツリーを作る機会が仕事でちょくちょくあること
  • 数値計算スプレッドシートでしつつ、スライドに図を描く&数値更新があれば図を修正する、というのが面倒だなと感じていたこと

に思い当たり、簡単に KPI ツリーを作成できて、数値をいじれて、画像化できるサービスがあれば嬉しいな! ということで、KPI ツリーメーカーを作ることに決めました。

※ ボツになった案もいくつかあり、例えばそのうちの1つは「コンビニ新商品ウォッチャー」です。
コンビニスイーツ大好きマンの自分としては、各社コンビニチェーンをひとまとめにして、しかも商品カテゴリを絞って新商品をチェックできたら嬉しいな〜と考えたんですが、各コンビニの公式サイトを勝手にスクレイピングするのはマズそう……というわけでボツに。

利用技術

言語

  • Ruby 3.1
  • TypeScript 4.9

フレームワーク

その他主なライブラリ

データベース

ホスティング

テスト

CI/CD

開発はコンテナ (Docker Compose) 上で行い、リリースは Fly.io でビルドおよびデプロイしています。

技術スタック
技術スタック
システム構成図
システム構成図

取り組んでの感想

描画が大変

KPI ツリーの描画を自力で実装するのは大変そうだったので、React の描画系のライブラリを探しました。
その中から、

  • ツリー形式のノードの描画ができる
  • 継続的にメンテナンスされていそう

なものをピックアップし、試しにツリーを作成してみて一番イメージに近い描画ができた react-d3-tree を選びました。
props で各種オプション値を指定するだけで要素の間隔や方向をいい感じに設定できたり、ズームイン/ズームアウトも最初からできたりと、機能が充実していました。
指定の型でデータを渡すだけで、下記のような描画ができます。

react-d3-treeを説明する図。要素の位置や線のスタイルを簡単に設定できる。
react-d3-tree で作成したツリー図。要素の位置や線のスタイルを簡単に設定できる

ここから、ノードのサイズや色を変えたり、クリック時のアクションをつけたり、プロパティに応じてアイコンを表示するようにしたりとカスタマイズしていきました。

react-d3-treeを使ったことを説明する図。
カスタマイズの結果、こうなる

react-d3-tree はデフォルト機能が充実している一方で、ライブラリ側が用意している基本オプションから逸れたカスタマイズをしようと思うと、React も D3 も使うのが初めての私はなかなか苦戦しました。。

ツリーを表現するためのデータ変換と検索にひと苦労

例えば、下記のような親子関係のツリーを描画したいとします。

親子ノードの図

DB で下記のようにフラットな形で保存している状態から、

Node テーブル:

id parent_id
1
2 1
3 1
4 2
5 3
6 3
7 3
8 7
9 7

下記のような入れ子構造に変換して react-d3-tree に渡すことで、ツリー図を描画できます。

{
  id: 1,
  children: [
    {
      id: 2,
      children: [{id: 4}]
    },
    {
      id: 3,
      children: [
        {id: 5},
        {id: 6},
        {
          id: 7,
          children: [
            {id: 8},
            {id: 9}
          ]
        }
      ]
    }
  ]
}

この変換には、 list-to-tree というライブラリを使いました。

また、ツリー図に対するユーザー操作が発生した場合は、この入れ子構造のデータに対して検索処理をしていきます。
例えば、ユーザーがツリー図のノードをクリックしたら、クリックしたノードとその兄弟ノードの色を変えるという機能があります。
その時、裏側では「クリックされた描画要素に対応するノードオブジェクトの id を取得し、その兄弟ノードを検索して isSelected プロパティを true にする」といったことをしています。これを自分で実装するには思いの外面倒で、tree-model というライブラリを利用することで楽に実装ができました。

リリースまで到達できてよかった

2、3ヶ月でリリースできるといいかな〜なんて当初は思っていたものの、結果的にはなんだかんだ半年ほどかかりました。
自身のモチベーションのみが原動力となる個人開発においては、結局のところ「諦めずにリリースまで到達すること」が一番大変なことなんじゃないかなと思います。
自分がぶつかったつらみと、その乗り越え方は以下のような感じでした。

  • 疲れてたり、予定が入ったり、ついダラダラしたりで作業が進まなくてつらい。
    • 生活リズムに作業時間を組み込む💪
      • 平日1時間・休日4時間というノルマを決めました。
      • 朝型の生活に切り替えた上で、平日出勤前の1時間・休日午前中4時間、は基本マストで作業する時間としていました。
  • 仕事の繁忙期や、家族のライフイベントなどが重なり、作業時間の確保がどう頑張っても無理でつらい。
    • 潔くあきらめて、開発のことはいったん忘れる💪
  • エラーにハマったりして、時間をかけているのに開発進捗が出なくてつらい。
    • 結果的に開発の進捗は全くなくても、机に向かっただけで今日は OK・進捗だった、と自分の気持ちを上げていく💪

半年かかったとはいえ、働きながらでもサービス1つリリースできるんだ、という成功体験になったなあと感じています。
机に向かう時間が生活リズムに組み込まれたのも、良い効果となりました。
リリースまで、と言いましたが、サービスはこれからも継続・改善していく所存です。

その他もろもろ

  • GitHub Projects のカンバンが便利だった
  • CSS の苦手意識がだいぶなくなった
    • 実現したいデザインを模索しながら複数のパターンを試す過程を通して、ある程度サクッとページにデザインを当てられるようになれた
  • テストコードを書くのが大好きになった
    • 利用ライブラリのバージョンを安心して上げられたり、ある修正が予期せぬところに影響していることに気付けたり、テストがある安心感が本当に良い

おわりに

「KPI ツリーメーカー」は、皆さまの KPI ツリーの作成・更新のちょっとした手間を削減できるサービスにできたと思っています。

kpi-tree.com

お気軽に使ってみていただけますと嬉しいです!