for Startups Tech blog

このブログのデザインを刷新しました。(2023/12/26)

MetabaseとRedashどっちが良い?組織の成長とデータ活用の悩み

こんにちは、エンジニアの速水です。

フォースタは22年度4Qで社員が115名となりました。その数は毎年130%成長が続き、まさに拡大中の組織です。組織が100人にもなると役割分担ができてくる一方、事業の全体感をパッとつかむのは難しくなってきます。「タレントエージェンシー支援システム(SFA/CRM)」では、スタートアップ企業、転職を希望される人、ポジションの情報を集約しているのですが、組織の拡大に伴いデータ分析を必要とするシーンも増えてきました。 以前からBIツールのRedashを導入していたのですが、運用で出てきた苦しみ、そこからのMetabaseの導入、残る悩みどころについてまとめていきます。

Redash運用で発生した問題

  • 管理できないほどにクエリが増殖した(その数なんと1400以上!)

  • 開発チームへSQLに関するヘルプが増える

ミニマム導入からスタートしたこともあり、Redashはルールがほぼない状態でした。全員が自由にクエリを作成でき、命名規則やタグ管理、アーカイブ基準は曖昧なまま、クエリはどんどん増えていきました。 それに社員が増えることで、下記状態に陥ります。

  • XXについてデータを出したい!

  • 同じような分析をしているクエリを探すが見つからない!(よくわからん!)

  • SQLを0から書くのは大変だから、とりあえず開発チームに相談しよう!

開発チームはプロダクト開発の中でデータベースもエンハンスしているので、相談を受けないわけにはいきません。とはいえ、表示項目の順番が異なるだけのクエリや、企業や職種などの絞り込みが若干異なるだけのクエリに、毎度エンジニアの工数をかけるのは苦しくなってきました。データ分析はしてもらいたい、だけどエンジニアが都度個々人の依頼を受けカスタマイズしたSQLを書くのも難しい。 エンジニアがSQL勉強会を開きデータ分析の民主化を図ったりもしましたが、定着は難しく一部の人が習得するのみにとどまりました。

Metabaseで解決できるのか

私はRedash上のクエリ分析を経て「同じデータ元で視点が異なるクエリが並列に保存されていること」を課題と定義しました。

例えば企業の採用支援のシーンにおいて、

  • 企業担当は、自分の担当企業のデータが見たい

  • マネージャーは、担当チームの企業データが見たい

という状況があります。 データ元は同じなのに、視点(絞り込み、表示項目の有無/順序)の違いによって並列にクエリが増えてしまうと、その見分けは難しくなる一方です。

MetabaseはRedashにないGUIとクエリをディレクトリ管理できることが強みです。

  • 表示項目の増減/順序の変更・絞り込み条件の指定がGUIで変更できる

  • クエリを階層型ディレクトリで管理できる

https://www.metabase.com/

簡単なデータ出力であれば、GUIでクエリを組み立てることができますし、出力におけるカラム(列)の順序変更や、カラムごとの絞り込みがマウス操作でできます。実際に検証環境で何人かに見てもらい、これならSQLを書けない自分でも操作できると感じていただけたのが導入の後押しとなりました。

項目や日付データでの絞り込みがGUIでできるのは純粋に便利

またクエリをディレクトリに入れて管理ができるので、分析軸ごとに整理することが可能です。ディレクトリごとにパーミッション(クエリを編集できる、閲覧のみ、閲覧できず)も設定できるので、ユーザグループの作成と合わせて「誰がどこを閲覧/編集できる」を明確にすることができます。

MetabaseはAWS Fargateで手動構築し、Terraformでリソース管理するようにしました。環境を作ってしまえばデータベースと接続するだけなので、短期間で進めることができました。 https://hub.docker.com/r/metabase/metabase

Metabaseで困ったこと

複雑なクエリをRehashから移行しようとすると詰まることが多いです。変数を複数設定したようなクエリは「;」でsyntax errorが出てしまったり。Temporary Tables もサポートされていません。複雑なクエリはSQLをそのままコピーするだけでは動きませんでした。 またGUIで簡単にクエリが作成できる反面、多数のJOINで出力データがとても大きくなることもあるので注意が必要です。

現状

Redashは継続利用しながらMetabaseを利用し始めた段階で、クエリの移行はもちろん、数が増えた時に混乱しないような整理を、悩みながら進めている最中です。進めていて実感しているのは、ディレクトリでクエリ管理できるようになっただけで、パッと見た時にどんなデータがあるのかわかりやすいということです。移行途中でクエリが少ないからじゃない?というツッコミはあれど、以前よりは直感的に認識できるようになったと思います。

フォースタートアップスでは共に働く仲間を募集中です。本記事を読んで興味を持っていただけましたら採用情報をご覧ください。

t_wadaさんに社内向けTDD研修を開いてもらったよ

どうも、ばやし(@bayashimura)です。

先日、和田卓人(@t_wada)さんにフォースタートアップスのエンジニア向けにTDD(テスト駆動開発)研修をやってもらったので、紹介していきます。

きっかけ

フォースタートアップスでは私が入社する前から自動テストに一定の投資をしていました。 大体の機能に関してはテストが存在し、テストを書かずにプルリクを投げると「書いてください」と返ってくる文化でもあります。 しかしプロダクトのコードが増えるに従い、テストコードも増加し、以下のような問題が発生しておりました。

  • テストの可読性が低く、テスト内容に対する認知負荷が高い
  • テストのメンテナンスコストが高くてしんどい(すぐ壊れる)
  • e2eテストを導入したがflakyで、導入したことをちょっと後悔してる

こういった課題にもやもやしたものを抱えつつそのうちどうにかしないとな、と日々を過ごしていた中、CTOから「研修やりたいんだけどなにか心当たりない?」と聞かれました。
これは!と思い和田さんのTDD研修を提案し、実現する運びとなりました。 最初は問い合わせ先もわからなかったのですが、NTTコミュニケーションズの岩瀬(iwashi86)さんに紹介していただき、見事開催の運びとなりました。岩瀬さんありがとうございます!

研修内容に関しての詳細は割愛しますが、午前中は和田さんのライブコーディングを見て、午後はみんなで実際にTDDで書きつつ、和田さんとの公開1on1をするという形式でした。
これがめちゃめちゃ良くて、研修実施後アンケートでも、満足度は最高5のところ、驚異の平均4.9。 感想も「学びしかない」「これまで受けてきた研修で一番良かった」といった感想がきており、最高といった感じです。

テスト研修後にチームに起きた変化も書いていこうと思います。

テスト駆動開発で書くメンバーがでてきた

今回のTDD研修を受け、TDDで開発する人が私を含め何人かでてきました。慣れないテスト駆動開発で、正直コードを書くスピードは遅くなったなという感覚はありますが

  • 設計に対して丁寧に向き合えるようになった
  • 一度に向き合うものを減らしたことで沼にはまらなくなった

という感覚があります。もうちょっと熟達したらもっとメリットが出てきそうな感覚です。

生みの苦しみ中

一山越えたあと

テストケースを日本語で書くようになった

今までRSpecのテストケースは英語で書いていました。 ただ母国語ではない英語で書くにあたり、細かいニュアンスを書くのが難しく

context 'if valid request' do
  it 'response success' do
  end
end

上記のようなテストケース名などがたくさんありました。

TDD研修でテストケースは仕様を表すということを学び、和田さんから 「テストケースは母国語、チームの公用語で書くのをおすすめしています」 という教えもあり、それから一部のチームではテストケースは日本語で書くようになりました。 新しく書く場合や、テストケースに変更を加える場合は基本的に日本語にしているのですが、早速地獄の蓋が開いてきてる感じがあり、最高だなといった感じです。 以上、t_wadaさんに社内向けTDD研修を開いてもらった話でした。 想像以上に良い学びを得たので、今後も有識者を招いてこういった研修をやっていきたいと思います。

うらやましいと思ったそこのあなた。弊社採用大募集中なので、お気軽にどうぞ。

採用ページはこちら

開発に至る前の要件定義で四苦八苦した話

こんにちは、エンジニアの藤田です。 普段は社内向けのプロダクト「タレントエージェンシー支援システム(SFA/CRM)」の開発をしています。

ヒューマンキャピタリストはTA(タレントエージェンシー)本部という部署に所属しており、そのTA本部が使うシステムを内製で開発しています。

エンジニアとしてジョインして約半年、ここでの開発手法はアジャイルでフラットな開発チームであり、優先順位はあるもののタスクは開発者の裁量で取って進めていくスタイルで割と自由に開発しています。

書籍『アジャイルサムライ』第2章冒頭で書かれている、

典型的なアジャイルチームには、あらかじめ決まった役割分担は存在しないッ!!

というやつですね。

普段のタスク内容は、RubyやVue.jsを使ったシステム開発、バージョンアップ対応、インフラに強いメンバーはインフラ整備など行っています。

さて、ここ最近私が取ったタスクが「POと共にユーザヒアリングに同席しながら要件定義していく」というタスクでした。

正確に言えば、当初は「とある機能追加の為のUI、設計を考える」タスクであり、平行で動いている別の改修タスクと切り離し可能な作業と考えていたのですが、進めていくうちに他の改修機能との兼ね合いを考慮する必要もでてきたり、別のタスクが自分のタスクにも影響でてきたりして、こう思ったわけです。

「もっと上流から考え直す必要があるじゃん。。」

ということで色々苦労したのですが、ユーザの声を聞けたいい経験でもあったのでその時の記録を書いていこうと思います。

TA本部のとある課題と我々開発チームのミッション

おおよその業務は社内向けシステムで運用を管理できているのですが、当然ですが組織や事業は日々変化していきます。
そのため我々が気づかないうちに新たな運用が発生し、別のツール(スプレッドシートやその他管理ツール)を現場でカスタマイズし管理していくケースが往々にして発生します。
今回要件定義したものも、詳細は書けませんがこういった業務のひとつです。

別のツールだとしても管理できているならいいじゃんとなるかもしれませんが、次のようなデメリットもいくつかあるので

  • 情報が分散されてデータが管理しにくい
  • 属人化してしまう

今回は組織として挙がった課題を解決できるよう、システムに組み込むといったものになります。

開発者の課題

要件定義をしようとしたところ、以下の課題に直面しました。

  • 何となくやりたいこと、現場の課題があることはわかったが、具体的な「システムで管理できていない運用」のところがよくわかっていない。
  • 通常の運用も具体的なところまではわかっていない部分はある。

というわけで、いきなり躓くわけです。

困った時のヒミツ道具ということで手元にある『エンジニアリング組織論への招待』を開いてみると以下のことが書かれていました。

ソフトウェアにおける実現

それは誰かの曖昧な要求からスタートし、それが具体的で明確な何かに変わっていく過程が実現で、その過程のすべてがエンジニアリングという行為です。
つまり、「曖昧さ」を減らし、「具体性・明確さ」を増やす行為が「エンジニアリングとは何か」という答えでもあるのです。

1-2. 不確実性とエンジニアリング

具体性・明確さを増やすために、まずはユーザの運用から整理しようと思い、業務フロー図を作成しました。

業務フロー図作成

ユーザヒアリングまで少し時間があったので、業務の理解と整理の為に業務フロー図の作成準備に入りました。
先にこれをやるメリットは以下が考えられます。

  • 事前に図として整理することでヒアリングの質が向上する。
  • 質問の準備ができる。
  • 図を共有しながら話もできる。

どのような運用をしているかはslackのやり取りにもヒントがあったり、開発チームでも知見のあるメンバーはいるのでそれらの情報を集め整理しながら簡単な業務フロー図を作成しました。
あくまでチームで理解の共有ができればOKなので、結果以下のような図になりました。

登場人物の関係性と下半分は時系列の処理フローのような図があったり、パターンを考えた図も含まれています。
教科書通りの業務フロー図とは異なりますが、いいのでしょうか?

いいということにしましょう!

最初の段階では仮説思考的に作成したものとなり、その後にチーム内で相談、議論したりユーザから正確な運用をヒアリングしながら図を更に肉付けしていきました。

ユーザヒアリングや業務フロー図作成の過程で以下のようなことがわかってきました。

  • ユーザの業務運用フローはどういったものか
    • どのように管理しているのか
  • 課題の具体的な特定

また、今回システム改修をする上で考慮しなければならない点も整理できるようになりました。

組織として

  • 現場の運用をシステムで管理したい。

現場として

  • スプレッドシート管理の拡張性は手放せない。
  • システム化することで業務が回りづらい状態になっては困る。

開発チームとしては上記、両方考慮しながら開発しなければなりません。

ちなみにユーザヒアリングについては1.5ヶ月の間にトータル10回程行いましたが、POは別途回数こなしてヒアリングしていました。 様々なチームや役割があるので多角的に情報収集し、その中でベストな方向性を模索しました。

システムの新機能について要件定義

システムで管理出来ていない運用フローについて明らかになってきました。次のステップはどのように既存システムに新機能を組み込むかになります。

まずはPOが大まかな仕様を考えたり、壁打ちしたり、開発チームで仕様を検討するMTGを行いました。
仕様について検討する機会が多くなったため、仕様検討MTGを増やして議論を重ねました。

チームミーティングは1回のMTGで1時間〜2時間を週に2〜4回くらい、その時の課題によって増やしたり減らしたりしました。トータルで10~20時間は仕様検討に使いました。
この段階でシステム開発における「達成すべきもの」が徐々に明確になってきました。

ワイヤーフレーム、画面遷移図、ER図を作成

また、この工程でワイヤーフレーム、画面遷移図、ER図も作成します。
ワイヤーフレームはチーム内で理解のズレが無いよう、できる限り正確な情報でデザインしていき、それを基に更に開発チーム内で議論、ユーザとも感触を伺ったりしていき、改良を重ねていきました。

この段階での正確なワイヤフレーム作成手法はその昔、ECサイト開発をしていた時に一緒に働いたWeb制作会社のやり方を真似ました。
完成品をイメージしやすいのはもちろんですが、なかなか綺麗なワイヤーフレームを見て感心したものです。
バックエンドエンジニアの自分がやっても下手で時間的コストが掛かるので簡単な対応の時はやりませんが、他人と理解のズレが発生しそうな仕様を考える時などはこのやり方を意識してます。

話を戻しますが、ここで重要になるのが、先に挙げた以下2点です。

  • この新たな機能追加が組織の課題解決になっているか、かつ
  • 現場の業務改悪になっていないか。

ユーザは既に別の管理ツールで運用しており、我々が下手な追加機能を開発しても使ってもらえません。社内のユーザとはいえ、使いたいと思う機能を提供しないと使われないのは一緒です。
開発者として使われないまま負の遺産になることは何としても阻止しなければなりません。

そこで開発チームの提案とユーザの考えの違いに差がないか、慎重に仕様を詰めていきます。
ズレていたら再度、仕様見直しと共にドキュメント修正、開発チームで議論、ユーザへ提案またはヒアリングを繰り返していきます。
週一2時間でプラニングポーカーの見積もりミーティングがあるのですが、この対応の話をしていていたら長引いて見積りができない回が何回かありました。
もちろん見積りミーティングはリスケです。

またここまで、できる限り正確なワイヤーフレームを作成してきましたが、開発中に「こっちの方がいい」はどうしても出てくるのであくまでチームの共通理解が主な目的になります。

ER図等のDB設計についても「DB設計検討作業」をチケット化し、担当者が数パターンを開発チームに提案、チームで合意を得ながら進めていきました。

ユーザーストーリー作成、タスク化

この段階まで来たらかなり「曖昧さ」が減り、「具体性・明確さ」が増えてきました。
あとはユーザーストーリー作成や作業のタスク化をし、開発メンバーでプランニングポーカーの見積もりをしていきます。

また、この段階でフロント→バックエンドの仕様を描いたシーケンス図も作成しましたが、これも開発段階で変わってくることはあるので、あくまで参考程度の情報にしています。

最後に

組織の課題解決をどのようにシステムに落とし込むかを皆で頭抱えながら進めていき、話し合いの最中や開発の段階でも新たな課題が発生しては、仕様詰め、設計、見積もりを繰り返してきましたが、無事に開発も着手でき、部分的にリリースもできてきました。

今回の開発作業では、「組織の課題を解決できるだけでなく、現場のユーザの使い勝手」の2つを考えなければならないのが大変でした。
開発チームの提案がユーザ側には通らない場面も多々あり、運用ヒアリングしていく中で「なるほど」と納得する場面が多く勉強になりました。

手段として、色々ドキュメント書いたりミーティング増やしたりしましたが、「何の為に作るか」の目的は常に意識する必要があるかなと思いました。
もちろん手段もいいやり方を吸収していきたいです。

-社員と別け隔てがない環境- Startups Firstの為に常に挑戦し続けるフォースタのエンジニアインターンで学んだこと

初めまして、杉谷です。

2021/10月から入社までの約5ヶ月間、インターンとして働き4月から正社員として入社しました。 今回は、そのインターンについてや5ヶ月間で学んだことについて書いていきたいと思います。

フォースタのインターンってどんなことするの?

最初に、インターン内容についてですが、 インターンは、大きく「課題」・「実務」の2ステップ構成になっています。

まず初めに、課題に取り組みます。

この課題は、実務で扱うプロダクト内容や扱う技術への理解を深める為に設けられています。 例を挙げると、弊社ではElasticsearchという検索エンジンを使っているので、課題では「実際にフィールドを追加してAPIのレスポンスを返す」といった実務でも行われるAPIの改修に取り組んでもらったりしています。 フォースタ以外でも通用する技術を効率よくキャッチアップ出来る機会なので、1つの魅力的な点かなと個人的には思っています。 課題を修了することで、一定レベルのプロダクト・技術的な知識を共有した状態になり、スムーズに実務に着手することが出来ます。

またこれはユニークな点ですが、課題はインターン生自身の手によって常に更新されています。 更新というのは具体的に、課題を修了し実務に携わっているインターン生が、前もって学んでおいた方が良いことをまとめ、それを課題に反映させています。彼らが主体性を持って自身の学びを課題にアウトプットすることで、常に課題は改善され、同時に彼ら自身の成長にも繋がるというサイクルです。 実際、私が課題に着手していた際は課題の数は6つでしたが、現在では11個に増えています。ただ多ければ良いという話でもないので、初期に追加された課題を複数まとめてアップデートし、より密度の高い課題にすべくインターン生の方々が自身の経験をもとに試行錯誤しています。(課題10くらいまでに抑えるのが理想です)

そんな優秀なインターン生が寄稿している記事もありますので是非ご一読下さい。

tech.forstartups.com

課題を修了すると、いよいよ実務に取り組みます。 主にインターン生は、『STARTUP DB』やその裏側にあたる管理システム(STARTUPS DATA PLATFORM)に携わります。 社内にいるユーザーからの意見を基に改修を行なったり、新規機能開発を行うなど幅広いタスクに着手しています。 またタイトルにある通り、社員とインターンの間に垣根がなく、実務に当たる際は優先的なタスクから順にインターン生・正社員問わず着手しています。

さらに、自身の興味のあるプロダクトや磨きたい技術が実務にあれば、手を挙げて挑戦できます。 私自身、インターンとして働いている時にフロントエンドの開発に興味があったので、手を挙げた結果翌月からフロントの開発にもアサインされました。(他にもインフラをやりたくて手を挙げて、現在terraformをバリバリかいているインターン生もいます) 社員との垣根が無く自由度が高い分、それに伴う責任やプレッシャーもありますが、やりたいことに挑戦できる環境はとても貴重な為、モチベーション高く業務にコミット出来る環境だなとインターンを通して感じています。

スキルアップ会や勉強会で幅広い知識をインプット

エンジニアインターン生は、業務時間内で課題や実務以外に2つの会に参加しています。

スキルアップ会(輪読会)では、主に1冊の本をみんなで輪読しディスカッションを行いスキルアップを図っています。その一冊は、社員・インターン生関係なくビブリオバトルを通して選ばれます。 詳しい内容は下記の記事にて紹介していますのでご参照下さい。

tech.forstartups.com

勉強会では、発表者を募りそれぞれが興味のあることや共有したいことをテーマにして30分プレゼンしています。 テーマは様々で、実務に即したものから自身の興味のあることについてなど話しています。 もちろん、インターン生も発表することが可能で、自身の学んだことをアウトプットする場所として推奨されています。 私自身もこの記事を書く前に、勉強会でこれまで学んできたことについて発表し、改めてこの5ヶ月で学んできたことを自分の中により深く落とし込むことが出来ました。

この他にスプリント定例や各種mtgもあるのですが、それはまた別の記事で書ければなと思っています。上記の内容でもっと詳しく知りたいと思った方は、ぜひ一度カジュアル面談に来て頂けると嬉しいです。

インターンを通して学んだこと

ここからは自身がインターンを通して学んだことについて書いていきたいと思います。 細かいところまで列挙してしまうと、長くなってしまうので特に自身への影響が大きかったものを挙げたいと思います。

理解しやすくパフォーマンスを考慮したコードを書けているか

これは、自身のコードが他人にとって可読性が高いか、プロダクトにどれくらいの負荷がかかるのかといった点を考慮しながら書けているか常に意識すべきであるという学びを表しています。

フォースタのインターンでは、エラー調査や改修作業などは主にインターン生が担当しています。 エラー調査はプロダクトを知るのにとても良い方法で、色々な箇所のソースコードを読み漁ります。そうして改修箇所を特定しリファクタリングを行うのですが、当然調査をすればするほどプロダクトのソースコードに詳しくなっていきます。そうなると、「あの箇所、ページの描画速度が遅いから改善したほうがいいな」とか「ここら辺は共通化できそうだ」という点が出てきます。 そうして改修を重ねるうちに、自身が書くソースコードでもパフォーマンスを考慮して書けているかを自然と意識するようになりました。 これは、実務に入らないと分からないことだなとインターンを通して深く理解しました。

自走できないと活躍できない

今まで「自走力」というのは、ある一定の技術力を有することであると考えていました。 しかしそれ以外にも「目標を持って取り組み、それに見合った行動・成果を出す」といったことも「自走力」であるとインターンを通して学びました。

これを実感したのは、実務に取り掛かった初期の頃です。 課題を通してプロダクトへの理解は一定程度得たものの、いざタスクに取り掛かろうとすると何から着手すべきかの順序立てが上手く出来ませんでした。結果、当初予定していたよりもだいぶかかってしまうという結果に終わりました。

そこから、「まずはタスクをしっかり期日までに完了させる」という目標を持つようになりました。 そのような目標を持つことで、段階的にやるべきことを順序立てていけるようになりました。 また、質問の仕方も目標を持ったことで徐々に変わっていきました。質問も同じように順序立て、具体的にどうしたかったのか、それが出来ない理由と試したことは何かなどを落とし込んで質問を行えるようになりました。 そうすることで煮詰まることが少なくなり、タスクをこなすスピードが改善され目標に対して自身の行動や成果が追いつくようになりました。

この学びは、自由度が高いからこそ高い自走力を求められる、フォースタのエンジニアインターンの環境があったからだと実感しています。

ユーザーの領域に関する知識も深く蓄えないとvisionは遠退く

これは、どんな領域・分野のユーザーが『STARTUP DB』をどのように活用し、どのような情報を求めているのか、自分もユーザーのことを深く理解する必要性があるということです。 言い方を変えれば、エンジニアだからと言ってユーザーと接する最前線に行かずにいるのではなく、むしろ前のめりに出て話をしに行き、そこから常にユーザーの本質的な課題を探す姿勢を持つことも重要であるということです。

結局のところ、フォースタのエンジニアが技術力を高めるのはビジョンを達成する為であり、それがモチベーションとなり日々挑戦し続けられます。

www.wantedly.com

私はこの5ヶ月、なるべく自身のプロダクトを使う領域の人や他部署の方と話をするように心がけ、「STARTUP DBが今どんなユーザーに使われているのか」・「STARTUP DBにはどんな情報を求めているのか」といった開発しているだけでは中々見えてこない情報を蓄えるようにしました。そうすることで、ユーザーの視点でプロダクトを見たり、それを基に課題を自分なりに見つけ壁打ちするといったことが出来る様になってきました。そして日々ユーザーと話しその中から見つけ出した課題の解決策をプロダクトに反映させることが、ビジョン実現の一番の近道ではないかとインターンを経て改めて強く実感しています。 またこの学びは、共に目指すべき目標が同じであり挑戦する仲間が集まったフォースタのインターンだったからこそ学べたものと深く実感しています。

ここまで読んで頂きありがとうございます。 この5ヶ月の間、インターンとして挑戦し上記に述べた学びは勿論、それ以外にもたくさんのことを学ぶ貴重な機会でした。 これからは、正社員として日本からグローバルに戦えるスタートアップを創出するべくモチベーション高く挑戦していきたいと思います!