2年半かけて作ってきたスタートアップのSRE 〜体制編〜

こんにちは。ファインディのPlatform開発チームでSREを担当している大矢です。

2026年はファインディのSREについて1ヶ月に1本ペースで発信していきます。今回はその第1弾として、ファインディにおけるSREの体制についてご紹介します。

この記事では、SREチーム(現在のPlatform開発チーム)がどのように発足し、現在どのような体制で運用しているのかをお伝えします。SREに興味がある方、特にこれからSREを目指す方に読んでいただけますと幸いです。

目次

はじめに

2026年1月現在、ファインディでは「Platform開発チーム」が全社横断のSREの役割を担っています。

このチームは、ファインディが提供する複数のプロダクトに対して横断的に信頼性を向上させ、開発チームが事業成長に関わる開発に集中できるような仕組みを構築・提供することを目指しています。

現在は5名のSREメンバーで構成されており、各プロダクトの開発チームと連携しながら、環境の整備や運用改善、ファインディ全社へのSREのイネーブリングに取り組んでいます。

Platform開発チームのSREとEmbedded SREの役割分担

ファインディのSRE体制には、「Platform開発チームのSRE」と「Embedded SRE」という2つの役割があります。

Platform開発チームのSREとは

ファインディで単に「SREチーム」といった場合、SREメンバーが所属するPlatform開発チームを指します。私たちはこのチームに所属しています。

私たちのチームではSREとPlatform Engineeringを推進しており、弊社内では「横断SRE」や「Platform SRE」と呼ばれることもあります。

私たちは「SREの文化を組織全体に根付かせ、開発チームが自律的にSREを実践できるように支援する」というビジョンを掲げています。このビジョンについては別の機会に詳しく紹介したいと思います。

なお、ローンチから日が浅いプロダクトなど、プロジェクト規模が比較的小さいプロダクトには後述のEmbedded SREが在籍していないため、Platform開発チーム/SREがプロダクト固有のタスクも含めて対応しています。

Embedded SREとは

Platform開発チームのSREメンバーとは別に、各プロダクトの開発チームには「Embedded SRE」と呼ばれるメンバーが在籍しています。

Embedded SREは、SREチーム発足前から各プロダクトの開発チーム内でSRE的な立ち回りをしていたメンバーです。Platform開発チーム発足後の現在でも、プロダクトに特化したタスクについては引き続き担当しています。

役割の違い

  • Platform開発チームのSRE: プロダクト横断的な信頼性向上、共通基盤の整備
  • Embedded SRE: 特定プロダクトに特化した信頼性向上、プロダクト固有の課題対応

この2つの役割が連携することで、全社的な視点とプロダクト固有の視点の両方から、信頼性の向上に取り組んでいます。

Platform開発チームとEmbedded SRE

SREチームの発足まで

SREがいなかった時期(〜2023年8月)

実は、ファインディには2023年9月までSREは1人も在籍していませんでした。各プロダクトの開発チーム内で、クラウドやインフラに詳しいメンバーがSRE的な役割を担っていました。

プロダクト開発をメインにしながら、障害対応やインフラの改善も同時に行うという状況が続いていました。

サービスが成長するにつれて、信頼性向上やクラウド・インフラの整備がより重要になり、専門的に取り組む必要性が高まっていきました。

1人目SRE入社後(2023年9月〜2024年3月)

2023年9月、ファインディに1人目のSREが入社しました。ただし、最初はチームではなく「1人SRE」としての活動でした。

この時期は、ファインディの新規サービスの立ち上げのための環境構築や、それまで実現したくても手の付けられなかった課題に対応していきました。

SREチーム発足後(2024年4月〜)

2024年4月、2人目のSREメンバーが加わり、正式に「SREチーム」が発足しました。1人から2人になったことで、チームとしての活動が本格的にスタートしました。

その後、メンバーが徐々に増え、2026年1月現在では5人体制となっています。組織の成長に伴い、チーム名も「Platform開発チーム」に変更されました。

チームの変化

2024年

チーム発足時からしばらくの間、SREチームはマネジメント経験のあるシニアメンバーのみで構成されていました。当時はチームマネジメントは必要最小限にとどめ、マネージャーもプレイングマネージャーとしてメンバーと同等のタスクを担当していました。

タスク管理には「かんばん」を利用し、各自で優先順位付けとチーム内外の合意、タスクのクローズまでおこなっていました。

また、この年の12月にSREチーム初のジュニアメンバーがチームにジョインしました。

2025年

2025年は、ファインディがAI関連の新プロダクトを中心に多くのリリースをおこなった年でした。新プロダクトのリリースに伴い、SREチームには環境構築やインフラ整備の依頼が集中しました。

この状況に対応するため、構築作業の短縮化とトイルの削減が急務となりました。具体的には、新環境を3日で提供できるようTerraformのモジュールを汎用化し、Terraform Testの導入による環境構築の信頼性向上も実現しました。

tech.findy.co.jp tech.findy.co.jp

そしてDevinを使ったユーザー管理業務の自動化など、さまざまな効率化施策に取り組みました。

tech.findy.co.jp

その他、WordPressのShifter移行やFlatt Security様提供のTakumi導入など、セキュリティ強化にも注力しました。

tech.findy.co.jp tech.findy.co.jp

この年にもジュニアメンバーが増え、チームの育成やナレッジ共有の重要性も高まりました。 ファインディでは2026年もより多くの成長を目指しており、チームとしての立ち回りの変化も求められています。

2026年以降

2026年1月現在、Platform開発チームはシニア2名、ジュニア3名の5人体制で運用されています。

チーム運営の面では、これまでの「かんばん」でトイルや細かなタスク管理をおこない、構築や1ヶ月以上かかるタスクはロードマップを引くようになり、中期的な視点でSRE活動を計画できるようになりました。

2026年度も引き続きプロダクトが増え続ける見込みです。

現在の体制でファインディの全てのプロダクトを見ていくことは難しくなるため、環境構築やプロダクトのクラウド運用を開発チーム主体でおこなえるよう、ファインディ全体へのSRE文化の浸透を推進します。

新規プロダクト立ち上げ時や環境追加時には、開発チームの担当メンバーに主導していただき、Platform開発チームはサポート役として次のような支援をおこないます。

  • 簡単に新規環境を構築するための仕組みの提供(汎用Terraformモジュール、環境構築のClaude CodeのPlugin)
  • 構築・運用のレクチャー

これらの施策により、SREが環境構築を直接おこなうのではなく、開発チームが自律的に構築・運用できるような仕組み作りとイネーブリングに注力していきます。

Platform開発チームの移り変わり

まとめ

ファインディのSREは、2023年9月の1人目入社から始まり、約2年半で5人体制のPlatform開発チームへと成長してきました。

Platform開発チーム/SREとEmbedded SREが連携することで、全社的な視点とプロダクト固有の視点の両方から信頼性向上に取り組んでいます。まだまだ発展途上のチームですが、これからもファインディのサービス成長を支えるべく、日々改善を続けています。

ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

【Findy Tech Talk #1】 「開発メンバーが語るFindy Conferenceの裏側とこれから 」を開催しました

こんにちは。

ファインディ株式会社でソフトウェアエンジニアをしている西村です。

普段私たちが開発しているファインディのプロダクトの裏側や、開発メンバーが日々どのように働いているのかをお伝えするために、Findy Tech Talkという技術系のオフラインイベントを開催しています。

その第一弾となる 「開発メンバーが語るFindy Conferenceの裏側とこれから」を開催しました!

findy-inc.connpass.com

今回は3名が登壇し、Findy Conferenceを支える技術基盤(受付システム・GraphQL設計・権限管理)、開発前に「適切なツッコミ」を入れて最速で価値を届けるアプローチ、そしてFindy初のモバイルアプリをReact Nativeで立ち上げた経緯について話しました。

この記事では、各登壇の内容をダイジェストでお届けします。

登壇内容

Findy Conferenceを支える技術基盤の裏側

西村は「Findy Conferenceを支える技術基盤の裏側」と題して、話しました。

Findy Conferenceとは、カンファレンスの準備・開催・運営の管理プラットフォームであり、3つの立場が異なるユーザーが使うシステムです。

  • 主催者
  • 参加者
  • スポンサー企業

異なる立場のユーザーが使うシステムであるため、各ユーザーに応じた機能を提供しつつ、円滑なカンファレンス運営を支援することが求められます。

カンファレンスを開催するまでにある課題を3つに絞って紹介します。

1つ目は、ネットワークが不安定でも止めない参加者受付機能です。

当日の会場では常にネットワークが安定しているとは限りません。例えば、多数の参加者が一斉にWi-Fiへ接続を試みるため、ネットワークが不安定になりがちです。

参加者の入場処理が失敗してしまい、記録が正しく行えなくなります。また、受付スタッフは通常の受付業務ができなくなり、カンファレンスの運営に影響が出てしまう。

そこで、Findy Conferenceでは、受付した参加者のデータをLocalStorageに保存する設計を採用しました。

navigator.onLineでネットワーク接続を検知し、復旧次第バックエンドへ同期する仕組みです。

ネットワークが不安定な環境でも、受付業務を止めることなくスムーズに入場記録を行えるようになりました。

Findy Conferenceの受付機能のシーケンス図

2つ目は、Findy Conferenceに合うGraphQLスキーマ設計についてです。

冒頭で書いた通り、3つの異なる立場のユーザーが存在します。

Findy Conferenceでは、主催者・参加者・スポンサー企業の画面をサブドメインで分けています。

そのため、GraphQLのスキーマ設計においても、各ユーザーが必要とするデータを効率的に取得・権限管理できるように工夫が必要でした。

そこで、Findy Conferenceでは、次のような設計方針を採用しました。

Findy ConferenceのGraphQL構成図

このスキーマ設計によって、後述する権限管理を容易にし、各ユーザーが必要とするデータを効率的に取得できるようにしています。

3つ目は、GraphQLでどのように権限管理するのかについてです。

Findy Conferenceでは主催者画面にユーザーロールごとに権限管理しています。

GraphQLではカスタムディレクティブを使うことで簡単に権限管理をすることができます。

Findy Conferenceでは@authのディレクティブを使い、次のように権限管理を表現しています。

module Types
    module Admin
      class Conference < Types::Admin::BaseObject
        field :id, Int, null: false
        field :conference_participated_users,
              Types::Admin::ConferenceParticipatedUser.pagination_type,
              directives: { ::Directives::Admin::Auth => { roles: [FULL_ACCESS, VIEW_ONLY] } }
    end
  end
end

このRubyコードをGraphQLのスキーマに変換すると次のものになり、@authのディレクティブが使われていることを確認できます。

"""
カンファレンスID
"""
id: Int!

"""
カンファレンス参加者情報
"""
conferenceParticipatedUser(

"""
カンファレンス参加者ID
"""
id: Int
): ConferenceParticipatedUser @auth(roles: ["full_access", "view_only"])

以上、3つの課題をもとに、Findy Conferenceをどう開発してきたかを少しでも伝われば幸いです。

今後もカンファレンスを裏から支え続けるプロダクトとして成長していきます。

最速で価値を出すためのプロダクトエンジニアのツッコミ術

エンジニアマネージャーの大原が「最速で価値を出すためのプロダクトエンジニアのツッコミ術」と題し、迅速にユーザーに価値を届けるための開発前のアプローチについて紹介しました。

迅速にユーザーへ価値を届けるには、開発前にロードマップや企画に対して「適切なツッコミ」を入れることが重要だと思います。 ツッコミなしで進めると「機能が増えてリリースが遅れる」「使われない機能になる」といった問題が生じてしまいます。

そのツッコミを入れる際の重要な観点として、2つの視点を紹介しました。

1つ目は「目的達成のための最小工数になっているか」です。 要望があったときに、実装を想像して、仕様を分解し、どれくらい工数がかかるかを考えます。 その上で、本当に今必要か、使用頻度は高いかなどを検討し、仕様を最小限必要なものにブラッシュアップしていきます。 具体例として、Findy Conferenceでは、参加申込→当日運営→運用・拡大と機能を最小限にして段階的にリリースすることで、短期でのリリースを達成しました。

2つ目は「三方よしになっているか」です。 施策や機能を考えるときに、ユーザー、自社、関係者にとって良いものかを確認し、自社都合のみの施策や利害不一致を避けることが大事です。 ユーザー体験が向上し、その結果事業にインパクトが出るような施策が理想だと考えています。

最後に、ツッコミの質を高めるために大事なこととして、次の3つを挙げました。

  • 仕様・実装を把握し、技術的な制約を即座に指摘出来るようにする
  • ユーザーの声を聞くことで、ユーザー課題の解像度を上げる
  • 事業モデルを理解することで、事業インパクトを理解出来るようにする

今後もこういった観点を大事にしながら、最速で価値のあるサービスを提供していきたいと思います。

ゼロから始めた Findy 初のモバイルアプリ開発

モバイルエンジニアの加藤が「ゼロから始めた Findy 初のモバイルアプリ開発」と題し、当社初のモバイルアプリ「Findy Events」の立ち上げについて紹介しました。

まず、私達がどのような思想でモバイルアプリ開発を始めるに至ったのか、その背景についてです。

AIの進化が目覚ましい昨今だからこそ、オフラインの場でしか手に入らない生きた情報や、かけがえのないつながりがあると考えました。

そこで、「オフラインにおけるつながりを最大化し、エンジニア同士の知識・経験の共有を促進する」ことをモバイルアプリが提供する本質的な価値と位置づけました。

次に、このアプリを0→1で立ち上げるために挑戦した具体的なプロセスについて話をしました。

開発当初、社内にモバイルアプリ開発の実績がなく、現役のモバイルエンジニアも自身一人だけという状況でした。 そのため、要求&要件定義や技術選定だけでなく、社内での開発環境・管理ルールの策定といった土台作りから始める必要がありました。

要求&要件定義では、エンジニアとして、企画のすり合わせから、UI・UXの議論まで深く入り込み、徹底してモバイルアプリならではの体験作りに拘りました。

これは、エンジニア向けのプロダクトを開発しているファインディだからこそ、利用ユーザー目線での解像度の高い意見を出すことができたのだと思います。

また、モバイルアプリ開発のためのメインフレームワークの選定についても紹介しました。

チーム全体のリソースを鑑みて、Cross Platformによる開発を前提としたものの、「Flutter」と「React Native」のどちらを選定すべきなのかは非常に悩んだポイントです。

次のように、国内での採用事例数やモバイルエンジニアとしての習熟のしやすさなど、いくつかの指標を比較することから始めましたが、最終的には「組織のアセット」×「モバイルエンジニアとしての自身のナレッジ」を活かせる「React Native」を採択しました。

Cross Platform Frameworkの比較

この選定により、立ち上がりに苦労した部分もありましたが、次の2点のような大きな収穫があったため、Betterな選択ができたと考えています。

  • Webフロントエンドの有識者による質の高いレビューを通じて、多くの学びを得ることができた
  • Webフロントエンドと親和性の高い技術の理解が進んだことで、他のWebフロントエンドのコードが読めるようになった

また、2025年12月に、Android版をリリースし、「Findyユーザー感謝祭2025〜今年の"しくじり"を供養しよう〜」で実際に触って頂きました。

直接、ユーザーの操作を見たり、感想やご意見を頂けたことで、「伸びしろ」を感じることができました。

今後は、「ユーザーが迷わないUI・UXを突き詰めて、その利便性から、自然とアプリを利用してもらえる」そんなアプリへと、成長させていきたいと考えています。

まとめ

今回のFindy Tech Talkでは、Findy Conferenceを支える技術基盤、プロダクトエンジニアとしてのツッコミ術、そしてモバイルアプリ開発の立ち上げについてお話ししました。

当日、イベントに足を運んでくださった参加者のみなさん、本当にありがとうございました。頂いたアンケート結果を、次回開催の参考とさせていただきます。

残念ながら今回のイベントに参加出来なかったみなさんも、次回イベント開催時には是非ご参加ください!

現在、ファインディでは一緒に働くメンバーを募集中です。

興味がある方はこちらからご覧ください。 herp.careers

「開発生産性」に関する実態調査レポート概説#5 なぜDevExは日本で知られていないのか ── 認知度4.9%が語る未開拓領域

こんにちは。Findy Tech Blog編集長の高橋(@Taka-bow)です。

DevEx(開発者体験)の認知度はわずか4.9%。この数字もまた、日本の開発現場が直面する課題の一つであり、同時に大きな伸びしろを示しています。

前回の記事では、Visual SourceSafe 15.8%という数字から見える技術格差と、AI時代に広がる生産性格差について取り上げました。今回は、その技術格差の背景にあるDevExに焦点を当て、日本の開発者が本当に求めているものを考察します。

【調査概要】
  • 調査対象:ソフトウェア開発(組み込み開発を含む)に直接関わるエンジニア、プロダクトマネージャー、プロジェクトマネージャー、エンジニアリングマネージャー、開発責任者など
  • 調査方法:インターネット調査
  • 調査期間:2025年4月2日(水)~2025年5月21日(水)
  • 調査主体:ファインディ株式会社
  • 実査委託先:GMOリサーチ&AI株式会社
  • 有効回答数:798名(95%信頼区間±3.5%)
  • 統計的検定力:80%以上(中程度の効果量d=0.5を検出)
  • 調査内容:
    • 開発生産性に対する認識
    • 開発生産性に関する指標の活用状況
    • 開発生産性に関する取り組み
    • 開発環境・プロセス評価
    • 組織文化と生産性

DevExとは何か

日々の仕事の「体感」に着目する

DevEx(Developer Experience)とは、開発者がソフトウェア開発で得る体験の質を指します。開発者満足度調査とは異なり、開発生産性に直結する「体感」に着目する点が特徴です。

たとえば、次のような場面を思い浮かべてください。

  • ビルドやテストの結果を待っている時間
  • 必要な情報がどこにあるか分からず探し回る手間
  • 会議の合間で集中が途切れる感覚
  • コードレビューの返答がなかなか来ない状況
  • 複雑なコードを読み解くのに消耗する時間

これらは開発者なら誰しも覚えがある場面ですが、DevExはこの「体感」を改善可能な課題として扱います。

2023年に発表された論文「DevEx: What Actually Drives Productivity」(著者:Abi Noda、Margaret-Anne Storey、Nicole Forsgren(DORA創設者)、Michaela Greiler)では、DevExを構成する3つの中核的な次元が提唱されています。

https://dl.acm.org/cms/attachment/html/10.1145/3595878/assets/html/noda1.png

DevExの3つの次元

次元 説明
Feedback Loops(フィードバックループ) 開発者が行動に対する応答を受け取る速度と質 ビルド時間、テスト実行時間、コードレビューの待ち時間
Cognitive Load(認知負荷) タスク遂行に必要な精神的処理量 ドキュメントの質、コードの複雑さ、ツールの習得難易度
Flow State(フロー状態) 完全に集中して作業に没頭できる状態 中断の頻度、会議の多さ、自律性の度合い

冒頭で挙げた場面は、この3次元に対応しています。

  • ビルドやテストの結果を待っている時間 → フィードバックループ
  • 必要な情報がどこにあるか分からず探し回る手間 → 認知負荷
  • 会議の合間で集中が途切れる感覚 → フロー状態
  • コードレビューの返答がなかなか来ない状況 → フィードバックループ
  • 複雑なコードを読み解くのに消耗する時間 → 認知負荷

3次元フレームワークについては、過去の記事でも詳しく解説しています。興味のある方はあわせてご覧ください。

DevExが提唱された背景

DevEx論文の著者には、DORAの創設者であるNicole Forsgren氏が名を連ねています。DORA指標は組織レベルのデリバリーパフォーマンスを測定できますが、個々の開発者が日々の業務で何に困っているかは見えません。DevExは、この視点を補う「開発者中心のアプローチ」として提唱されました。

加えて、DevExに取り組むことは、開発者が所属する組織全体の力を引き上げることにもつながります。

  • 【エンジニアの採用・定着】開発環境や働きやすさは、エンジニアが職場を選ぶ際の判断材料の一つです。DevExの改善は、人材の採用や定着にも影響します。
  • 【生産性との関連性】前述のDevEx論文では、開発者が良い体験をしている組織ほど、実際の開発生産性も高いと報告されています。DevExは「開発者を甘やかす」のではなく、組織のパフォーマンスを最大化するための投資です。

DevEx認知度4.9%が示す日本の現状

開発生産性指標の認知度と活用度

エンジニアの採用競争力にも、組織の生産性向上にも直結するDevEx。しかし日本での認知度はわずか4.9%です。開発者が日々抱える課題を解決するフレームワークが、ほとんど知られていません。

調査では25種類の開発生産性指標について認知度と活用度を調べています。何が知られていて、何が知られていないのか。その差が、日本の開発現場の現状を映し出しています。

開発生産性指標の認知度・活用度(全25指標)

指標 認知度 活用率
バグの数 58.1% 31.8%
残業時間 53.3% 21.9%
コードの行数 52.9% 22.9%
タスクの完了数(スプリントの達成率に含まれることもある) 48.1% 30.1%
テストカバレッジ 34.1% 18.2%
バグ修正のスピード(修正にかかる時間) 27.7% 9.9%
顧客からのフィードバック 26.1% 10.9%
コミット数 24.7% 6.9%
タスクの割り当て数(アサインされた数と完了した数の比率) 23.7% 9.9%
コードレビュー効率(レビューに要する時間や改善の質など) 20.3% 10.2%
ベロシティ(ストーリーポイントの消化速度) 17.7% 7.1%
平均復旧時間(MTTR – Mean Time to Recovery)(単独計測) 15.7% 3.6%
デプロイ頻度(単独計測) 13.9% 3.4%
チームの幸福度(eNPSなど) 11.3% 4.5%
変更リードタイム(単独計測) 10.0% 3.1%
技術的負債の定量評価(コードの複雑性などを数値化) 7.8% 2.8%
コードのリワーク率(修正が必要になったコードの割合) 6.5% 2.9%
プルリクエストサイクルタイム(PRの作成からマージまでの時間) 6.0% 1.6%
デベロッパーエクスペリエンス(DevEx) 4.9% 2.1%
変更失敗率(単独計測) 4.6% 1.8%
Flow Metrics(開発プロセス全体の流れを可視化する指標) 4.4% 1.9%
Four Keys / DORAメトリクス(変更リードタイム、デプロイ頻度、デプロイ失敗時の復旧までの時間、変更失敗率) 4.3% 2.4%
PSP(Personal Software Process) 3.9% 1.8%
SPACEフレームワーク(開発者の満足度、パフォーマンス、コラボレーションなど) 3.8% 1.8%
DX Core 4™(DORA、SPACE、DevExを統合したフレームワーク) 3.1% 1.3%
知らない / 聞いたことがない 14.0% 18.2%
その他(具体的に) 0.1% 0.1%

(N=798)

上位4指標(バグの数、残業時間、コードの行数、タスク完了数)は認知度50%前後で、いずれもアウトプットを直接カウントする指標です。これらは測定しやすい反面、開発者が日々感じている「ビルドが遅い」「情報が見つからない」「集中できない」といった体験とは直接結びつきません。

一方、DevExの認知度は4.9%に留まっています。開発者の体験を改善すれば生産性が上がるという考え方は、まだ日本では広まっていないようです。

興味深いのは、DORA指標を構成する「デプロイ頻度」「変更リードタイム」「平均復旧時間(MTTR)」「変更失敗率」の認知度です。個別指標としては4.6%〜15.7%の認知度があるにもかかわらず、「Four Keys / DORAメトリクス」というフレームワーク名の認知度は4.3%に留まっています。指標は知っていても、体系化されたフレームワークとしては認識されていないのかもしれません。

なぜDevExは日本で知られていないのか

先ほどの表を見ると、認知度の高い指標には共通点があります。「バグの数」「残業時間」「コードの行数」「タスク完了数」はいずれも数えやすく、報告しやすい指標です。一方、DevExが扱う「ビルドを待つストレス」「情報を探す手間」「集中が途切れる感覚」は、数値化しにくく、経営層への説明も難しい。測れないものは改善対象になりにくいのかもしれません。

もう一つ考えられるのは、開発手法との相性です。調査では、ウォーターフォール開発が36.8%、開発手法が「よくわからない」が18.2%で、合わせて55%を占めました。DevExはアジャイルやDevOpsの反復的な開発と親和性が高く、フィードバックを素早く得て改善を繰り返す文化が前提にあります。半数以上の開発現場では、そもそもDevExが機能する土壌がない可能性があります。

加えて、日本の産業構造も影響しているかもしれません。受託開発では「納品」がゴールになりやすく、開発者の体験は顧客への請求項目に含まれません。自社プロダクト開発と比べ、DevExへの投資が正当化されにくい構造があると考えられます。

CI/CDとドキュメンテーションに見る課題

DevExが知られていないということは、開発者の体験を改善するという発想自体が広まっていないことを意味します。その影響は、開発基盤の満足度に表れています。第4回でも取り上げたデータをDevExの視点で見直してみます。

開発基盤の満足度とDevExの対応

項目 満足度 DevExの次元
CI/CDパイプライン 14.2% フィードバックループ
ドキュメンテーション 17.5% 認知負荷
タスク管理システム 18.2% 認知負荷
コードレビュープロセス 19.2% フィードバックループ
開発環境整備 24.7% 認知負荷

(N=798、「満足」「やや満足」の合計)

CI/CDパイプラインの満足度14.2%は、ビルドやテストの結果を待たされている開発者が多いことを示唆しています。これはDevExの「フィードバックループ」の課題です。

一方、ドキュメンテーションの満足度17.5%は、新メンバーのオンボーディングに時間がかかったり、「あの人に聞かないと分からない」状態が続いたりする形で現れます。これはDevExの「認知負荷」そのものであり、開発者が本来のコーディングに集中できない状況を生んでいます。

阻害要因をDevExの視点で読み解く

開発基盤だけでなく、開発現場で日常的に挙がる「困りごと」にも、DevExの課題は潜んでいます。第3回で取り上げた「開発生産性を阻害する要因」をDevExの視点で整理すると、次のような対応関係が見えてきます。

阻害要因 回答率 DevExの次元 影響
不明確な要件 53.5% 認知負荷 何を作るべきか分からず、確認や手戻りに時間を取られる
会議が多い 38.7% フロー状態 集中できる時間が確保できない
コミュニケーションの問題 33.6% フィードバックループ 必要な情報が適時に得られない
技術的負債 30.5% 認知負荷 複雑なコードの理解に時間がかかる

日本の開発現場が抱える課題の多くはDevExの問題として捉えられます(影響はDevExだけに留まりませんが)。「不明確な要件」と「技術的負債」は認知負荷を高め、「コミュニケーションの問題」はフィードバックループを遅らせ、「会議が多い」はフロー状態を妨げます。

まとめ

今回は、DevExの認知度4.9%という数字から、日本の開発現場の現状を読み解きました。従来型指標(バグの数、残業時間など)が50%以上の認知度を持つ一方で、開発者の体験に着目するDevExは浸透していません。

CI/CDパイプラインの満足度14.2%、ドキュメンテーションの満足度17.5%という数字は、フィードバックループや認知負荷に課題があることを示しています。また、「不明確な要件」「会議が多い」といった阻害要因も、DevExの3次元で整理すると改善の糸口が見えてきます。

認知度の低さは、裏を返せば伸びしろの大きさです。開発者の体験を改善することが、結果として組織のパフォーマンス向上につながります。

次回は「なぜDORA指標は日本で普及しないのか ── 認知度4.3%の背景と打開策」をお届けします。

  • 調査全体について
  • 開発手法による意識の違いの本質
  • 取り組みが失敗する本当の理由
  • なぜ従来型ツールから移行できないのか
第5回、なぜDevExは日本で知られていないのか ── 認知度4.9%が語る未開拓領域
  • 日本の開発者が本当に求めているもの
第6回、なぜDORA指標は日本で普及しないのか ── 認知度4.3%の背景と打開策
  • 数値化への懸念と向き合う方法
第7回、生産性向上を阻む組織の壁 ── 37.8%が未着手の深刻な理由
  • 経営層を説得する具体的な方法
第8回、既存システムから次世代への変革 ── 日本の開発現場が立つ分岐点
  • 品質文化を強みに変える改革のロードマップ

お知らせ

Development Productivity Conference 2026」が2026年7月22日〜23日に開催されます。継続的デリバリー(CD)の先駆者であり『継続的デリバリーのソフトウェア工学』著者のDave Farley氏が初来日。日本からはテスト駆動開発の第一人者・和田卓人氏が登壇します。

prtimes.jp


ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。 興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

Findyの爆速インフラ構築を支えるTerraform活用術 〜汎用モジュール編〜

はじめに

こんにちは、ファインディのPlatform開発チームでSREを担当している原(こうじゅん)です。

2025年は、ファインディにとって新規サービスリリースが相次ぐ年でした。

Platform開発チーム(以降、SREチーム)では、この1年間で6つのサービスのインフラ環境を構築してきました。

スピード感を持った環境構築を実現するために、私たちがどのような工夫を行ったのか、今回はTerraformの汎用モジュールを活用した取り組みについてお話しします。

2025年、6つのサービスをリリース

2025年、SREチームでは次のサービスのインフラ環境を構築しました。

  • Findy Conference
  • Findy AI+
  • Findy Team+ AIチャットボット
  • Findy ID
  • Findy Insights
  • アーキテクチャ壁打ちAI by Findy Tools

これらのサービスは、それぞれStaging環境やProduction環境といった複数の環境が必要であり、SREチームとしては短期間で多数の環境構築を実施する必要がありました。

スピード感のある環境構築で直面した課題

新規サービスのリリースラッシュの中で、私たちは次のような課題に直面しました。

サービス開発はスピード感を持って行われており、インフラ環境の構築にも「2週間でStaging環境とProduction環境を用意してほしい」といった依頼も珍しくありません。サービスリリースのタイミングが重なると、複数の環境構築依頼が同時に舞い込むこともあります。

SREチームは環境構築だけに専念できるわけではなく、既存サービスの運用改善、障害対応、セキュリティ対応なども並行して進める必要があります。

2025年当時、SREチームのメンバーは4名でした。この人数で、これだけのサービスリリースに対応するのは容易ではありませんでした。

Terraformでの汎用モジュールの導入

これらの課題を解決するために、ファインディのプロダクトで頻繁に利用するAWSリソース(ECS、ALB、RDS、VPCなど)を、再利用可能なTerraformモジュールとして整備しました。

これらを「汎用モジュール」と呼んでいます。

汎用モジュールの目的は、次の2点です。

  1. スピード: 環境構築にかかる時間を大幅に短縮する
  2. 品質: 標準化されたモジュールを使うことで、設定ミスを減らし、品質を担保する

generic_terraform_module

汎用モジュールは、HCP Terraform(旧Terraform Cloud)のプライベートレジストリに登録しています。これにより、チーム内で簡単にモジュールを共有・再利用できるようになりました。

Network、Container、Databaseなど、様々なパッケージを整備

汎用モジュールは、リソースの機能ごとにパッケージを分けて整備しています。

例えば次のようなカテゴリーに分けています。

  • Network: VPC、サブネット、ルートテーブル、NATゲートウェイなど
  • Container: ECS、Fargate、ALB、タスク定義など
  • Database: RDS、Aurora、パラメータグループなど
  • その他、必要に応じてモジュールを追加

モジュールごとにパラメーターを指定すれば環境が立ち上がる仕組み

汎用モジュールを使えば、必要なパラメーター(プロジェクト名、環境名、リソースサイズなど)を指定するだけで、標準化された環境が立ち上がります。

例えば、次のようなイメージです。

module "database" {
  source  = "app.terraform.io/Findy/findy-XXXX-platform/aws//modules/database"
  version = "X.XX"

  environment = "staging"

  engine_type             = "postgresql"
  db_parameter_group_name = "sre-staging"
  instance_class          = "db.t4g.medium"
  number_of_instances     = 2
  preferred_backup_window = "20:05-20:35"
  service_name            = "sre-sandbox"
}

このように、モジュールを組み合わせることで、複雑なインフラ環境を短時間で構築できます。

汎用モジュールで解決した課題

汎用モジュールの導入により、品質が担保されてスピード感のある構築が可能になりました。

汎用モジュールを使うことで、モジュール内の構成ならProduction環境とStaging環境を含めても最短3日で完了できるようになりました。

またパラメーターを指定するだけで環境が立ち上がるので、新しいメンバーでもすぐに戦力になれる仕組みを作ることができました。

Terraformのplanは成功するけどApplyはコケる問題

汎用モジュールの導入で大きな成果が得られた一方、汎用モジュールから呼び出した構成でTerraformのplanは成功するけどApplyはコケるという問題も発生しました。

この問題は、構築スピードの低下につながるため、Terraform Testを導入して対処しました。

詳細については、次の記事で詳しく紹介していますので、ぜひご覧ください。

tech.findy.co.jp

まとめ

2025年、SREチームは多数のインフラ環境を構築しました。その裏側で、Terraformの汎用モジュールを活用することで、スピード感と品質を両立した環境構築を実現しました。

汎用モジュールの導入により、SREチームの環境構築はスピードアップしましたが、まだまだ改善の余地があります。

現在は、SREチームが主体となってインフラ環境を構築していますが、今後は開発チームが主体となって容易にインフラ構築できるPlatformを作りたいと考えています。

これにより、開発チームがより自律的にサービスをリリースできるようになり、SREチームはより注力すべきタスクに集中できるようになります。いわゆるPlatform Engineeringの取り組みを進めていきます。


ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。 興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

「開発生産性」に関する実態調査レポート概説#4 AI時代の技術格差 ── Visual SourceSafe 15.8%が示す変革への壁

こんにちは。Findy Tech Blog編集長の高橋(@Taka-bow)です。

2012年にサポート終了したVisual SourceSafeが、いまだに利用率2位。この調査結果に私はとても驚きました。

前回の記事では、開発生産性を阻む「組織の3大課題」として、要件定義、会議、コミュニケーションの問題を取り上げました。今回は、それらと深く関わる技術環境の世代差と、AI時代における影響を考えます。

【調査概要】
  • 調査対象:ソフトウェア開発(組み込み開発を含む)に直接関わるエンジニア、プロダクトマネージャー、プロジェクトマネージャー、エンジニアリングマネージャー、開発責任者など
  • 調査方法:インターネット調査
  • 調査期間:2025年4月2日(水)~2025年5月21日(水)
  • 調査主体:ファインディ株式会社
  • 実査委託先:GMOリサーチ&AI株式会社
  • 有効回答数:798名(95%信頼区間±3.5%)
  • 統計的検定力:80%以上(中程度の効果量d=0.5を検出)
  • 調査内容:
    • 開発生産性に対する認識
    • 開発生産性に関する指標の活用状況
    • 開発生産性に関する取り組み
    • 開発環境・プロセス評価
    • 組織文化と生産性

ソースコード管理ツールの利用状況

意外と多かったVisual SourceSafe

今回の調査で、ソースコード管理ツールの利用状況を調べてみたのですが、私はVisual SourceSafeをアンケート回答の選択肢に入れるかどうか、最後まで悩みました。さすがにもう使われていないだろうと思い込んでいたからです。

それは、大きな間違いでした。

ソースコード管理ツールの利用状況

順位 ツール名 利用率 回答者数 備考
1位 GitHub 30.5% 243名 Gitベース
2位 Visual SourceSafe 15.8% 126名 2012年サポート終了
3位 Subversion 13.7% 109名 集中型VCS
4位 Azure DevOps (Repos) 8.4% 67名 Gitベース
5位 GitLab 8.0% 64名 Gitベース
6位 CVS 3.6% 29名 2008年開発終了
7位 TFVC 2.4% 19名 従来型
8位 Bitbucket 1.8% 14名 Gitベース
9位 Gitea 1.6% 13名 Gitベース
9位 SourceForge 1.6% 13名 ホスティング
11位 Perforce (Helix Core) 1.3% 10名 大規模向け
12位 Mercurial 0.4% 3名 分散型VCS
- その他 11.0% 88名 -

(N=798、単一回答)

GitHubが1位であることは予想通りでしたが、Visual SourceSafeが2位に入っていたのです。

Subversion(13.7%)、CVS(3.6%)を加えると、約3割の組織が従来型のバージョン管理システムを使用しています。

AI時代に広がるソースコード管理ツールの影響

AI開発支援ツールとGit連携

2023年以降、AI開発支援ツールが急速に普及しました。

GitHub Copilot、Cursor、Claude Code、Devin、Clineなど、いずれもGitベースのワークフローを前提に設計されています。そのため、従来型ツールの環境ではこれらのツールを十分に活用できません。

  • AIがコードベース全体を把握できず、提案の精度が下がる(リポジトリ連携機能)
  • 変更履歴や差分を活用したコード生成ができない(diff/commit統合)
  • コードレビューやタスク管理の自動化が使えない(PR自動作成、イシュー管理)

DevinやClineなどAIエージェント系ツールは、コード補完にとどまらず、プルリクエスト作成、コードレビュー、イシュー管理まで自動化します。これらはGitHub/GitLabのAPIを前提としているため、旧来のバージョン管理では活用できません。

このツール環境の差は、どのような影響をもたらすのでしょうか。

ツールの差がAI活用の差になる

GitHub社の調査によると、Copilot利用者は特定のタスク(HTTPサーバー実装)において、非利用者より55%速く完了したと報告されています。日常業務すべてで同じ効果が出るとは限りませんが、無視できない差です。

Visual SourceSafe(15.8%)とSubversion(13.7%)を合わせると約3割の組織が、こうしたAI開発支援ツールを十分に活用できない環境にあります。このようなツール環境の違いが、将来の生産性格差につながっていく可能性があります。

つまり、AI活用の有無が開発速度に影響する可能性があります。

CI/CDパイプラインへの低い満足度

次のグラフは、満足度が50%を下回った項目を抜粋したものです。

開発基盤の満足度(全7項目が50%未満、ワースト順)

項目 満足度
CI/CDパイプライン 14.2%
ドキュメンテーション 17.5%
タスク管理システム 18.2%
コードレビュープロセス 19.2%
開発環境整備 24.7%
チーム内意思決定 34.1%
チーム内コミュニケーション 37.1%

(N=798)

CI/CDパイプラインの満足度はわずか14.2%で、最も低い結果となりました。

この低さは、ソースコード管理ツールの選択と無関係ではないと思います。現在主流のCI/CDツールはGitベースのバージョン管理を前提としており、Visual SourceSafeやSubversionとシームレスに連携することが難しいからです。

なぜ従来型ツールから移行しないのか

従来型ツールを使い続ける組織には、それぞれの事情があると考えられます。

  • 基幹システムや業務システムとの連携が従来型ツール前提で構築されている
  • 過去の履歴データ、ワークフロー、ビルドスクリプト等の移行に膨大な工数がかかる
  • 長年使い続けたツールに習熟したメンバーが多く、再教育コストが高い
  • 「動いているものは触るな」という保守的な判断が優先される
  • ウォーターフォール型ではリリース頻度が低く、Gitベースのワークフローの恩恵を感じにくい

大規模組織ほど、これらの要因が重なり移行が難しくなります。

とはいえ、全面移行にはリスクが伴います。履歴データの損失、一時的な生産性低下、デリバリー遅延、メンバーの抵抗などです。一方で、現状維持にも見えないコストがあります。セキュリティリスクの増大、新しい技術との統合困難、採用市場での不利など、これらは時間とともに大きくなっていきます。

具体的な移行のロードマップは、最終回(第8回)で取り上げます。

開発プロセスの認識の課題

ソースコード管理ツールの選択は、組織の開発プロセスに対する認識とも関連しています。調査からは、開発プロセスの認識にも課題が見えてきます。

開発フレームワークの認識状況

開発フレームワーク 回答率 回答者数
ウォーターフォール 36.8% 294名
よくわからない 18.2% 145名
ウォーターフォールとアジャイルのハイブリッド 13.2% 105名
【アジャイル開発】決まったフレームワークはない 13.2% 105名
【アジャイル開発】スクラム 6.8% 54名
【アジャイル開発】XPのプロセス 3.8% 30名
【アジャイル開発】大規模スクラム:LeSS 2.4% 19名
【アジャイル開発】大規模スクラム:SAFe 1.3% 10名
【アジャイル開発】大規模スクラム:Nexus 1.3% 10名
【アジャイル開発】大規模スクラム:Scrum@Scale 0.8% 6名
【アジャイル開発】大規模スクラム:その他 0.8% 6名
リーン 0.4% 3名
カンバン 0.3% 2名
その他 1.0% 8名

(N=798)

なんと、約5人に1人(18.2%)が自分の組織がどんな開発フレームワークを使っているか「よくわからない」と回答しています。

開発フレームワークを十分に理解できていないということは、

  • なぜそのプロセスで開発しているのか
  • どのような改善が可能なのか
  • 自分の役割がプロセス全体のどこに位置するのか

こうしたことが把握しづらくなります。

この問題は、第3回で取り上げた「不明確な要件」の問題とも関連しています。開発プロセスが明文化・共有されていない組織では、要件定義も曖昧になりがちだと思われます。

まとめ

798名の調査から見えてきたのは、日本の開発現場における技術環境の世代差です。Visual SourceSafeが15.8%、Subversionが13.7%と、約3割の組織が従来型ツールを使い続けています。CI/CDパイプラインの満足度は14.2%にとどまり、18.2%は自組織の開発手法を「よくわからない」と答えました。

AI時代において、このツール環境の差はさらに広がっていくでしょう。最新のAI開発支援ツールはGitベースのワークフローを前提としているからです。ただし、ツールを入れ替えるだけでは解決しません。技術基盤の刷新と組織文化の変革、両方が必要です。

次回は「なぜDevExは日本で知られていないのか ── 認知度4.9%が語る未開拓領域」をお届けします。

  • 調査全体について
  • 開発手法による意識の違いの本質
  • 取り組みが失敗する本当の理由
第4回、AI時代の技術格差 ── Visual SourceSafe 15.8%が示す変革への壁
  • なぜ従来型ツールから移行できないのか
第5回、なぜDevExは日本で知られていないのか ── 認知度4.9%が語る未開拓領域
  • 日本の開発者が本当に求めているもの
第6回、なぜDORA指標は日本で普及しないのか ── 認知度4.3%の背景と打開策
  • 数値化への懸念と向き合う方法
第7回、生産性向上を阻む組織の壁 ── 37.8%が未着手の深刻な理由
  • 経営層を説得する具体的な方法
第8回、既存システムから次世代への変革 ── 日本の開発現場が立つ分岐点
  • 品質文化を強みに変える改革のロードマップ

お知らせ

Development Productivity Conference 2026」が2026年7月22日〜23日に開催されます。継続的デリバリー(CD)の先駆者であり『継続的デリバリーのソフトウェア工学』著者のDave Farley氏が初来日。日本からはテスト駆動開発の第一人者・和田卓人氏が登壇します。

prtimes.jp


ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。 興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

Findyの爆速開発を支えるAIフレンドリーなIssue生成カスタムコマンド

こんにちは。

ファインディ株式会社でテックリードマネージャーをやらせてもらってる戸田です。

現在のソフトウェア開発の世界は、生成AIの登場により大きな転換点を迎えています。

GitHub CopilotやClaude Codeなど生成AIを活用した開発支援ツールが次々と登場し、開発者の日常的なワークフローに組み込まれつつあります。

2025年はSpec Driven DevelopmentやAI-DLCなどといった新しい開発手法が注目を集める年になりました。

ファインディでも新しい開発手法への取り組みを進めており、その一環として要件定義、設計、タスク分解、Issue作成までのフローを自動化しました。

そこで今回は、自動化したフローの内容と仕組みを実現したカスタムコマンドについて紹介します。

それでは見ていきましょう!

背景と課題

機能追加の要件から、設計、タスク分解、Issue作成までを行う必要があります。これらを生成AIに任せたいところですが、必要とされる事前知識が多くハードルが高いという課題がありました。

システム全体を把握できていないと適切な設計が難しいケースもあります。また、生成AIに対して効果的な依頼を作成するには明確で簡潔なステップ構造にすることが重要です。

つまり明確な要件を定義して、生成AIが正しい方法と手順を理解して実行できるように、設計図や指示書をAIフレンドリーな形で用意する必要があったのです。

既存の開発手法の検討

2025年はSpec Driven DevelopmentやKiroといった新しい開発手法が注目を集めました。これらは要件定義から実装まで一貫した自動化を目指すアプローチです。

私たちもこれらの手法を検討しましたが、タスク分解とPull requestの粒度に対する考え方に課題を感じました。

Spec Driven Developmentでは、システム全体の仕様を詳細に定義してから実装に進みます。これは大規模な機能開発や新規プロジェクトでは有効ですが、仕様の粒度やSpec/Taskの部分が大きくなりがちです。その結果、実装を進めると大きな変更を含むPull requestが作られることになり、コードレビューの負担が増大する傾向があります。

どちらにも利点がありますが、私たちはレビューの品質とチーム全体の開発速度を重視して、タスク分解と粒度に重点を置いたアプローチが必要だと考えました。

解決策: AIフレンドリーなIssue

この課題を解決するため、システムの現状を把握して、必要な要件をタスク分解してIssueに切り出すカスタムコマンドを構築しました。

重要なのは、Pull requestとタスクの粒度を維持しつつ、生成AIが理解しやすく精度の高いIssueを自動生成することです。この一連の流れをカスタムコマンドで自動化しました。

Issueが作成されたら、その内容や手順が正しいのかどうかチェックして、問題なければそのまま生成AIに渡して実装を進めてもらうようになります。

カスタムコマンドの仕組み

概要とフロー

今回紹介するカスタムコマンドは要件とコードベースを元に、要件の明確化、設計、タスク分解、Issue作成までを自動化します。

特徴的なのはインタラクティブな形式を採用している点です。曖昧な部分や不明点があれば、その都度生成AIが質問を投げかけてきます。人間は質問に答えながら生成AIとの対話を通じて要件を明確化していきます。

このプロセスを経て、生成AIが設計を行い、タスク分解を実施し、最終的にGitHubのIssueを自動で作成します。人間が行うのは作成されたIssueのレビューだけです。

Issueのレビューが完了したら、そのIssueをそのまま生成AIに渡して実装を進めてもらいます。Pull requestの粒度を意識した形でIssueが作成されるため、後続のコードレビューの負担も軽減されます。

このカスタムコマンドの全体フローは次のようなイメージです。

全体のシーケンス図

これら全てのフローを実行するために必要なカスタムコマンドやSkill、Sub Agentを社内Pluginとして開発組織全体に展開しています。

ステップ1: 要件の理解

まずは実現したい要件を生成AIが理解するところから始めます。このステップのフローは次のようなイメージです。

要件理解のシーケンス図

カスタムコマンドを実行して実現したい要件をパラメータ経由で伝えます。この段階では要件がある程度曖昧でも問題ありません。

❯ /plugin:feature-breakdown 複数ユーザーの新規登録を一括で実行する機能を追加したい 

⏺ I'll help you break down the bulk user registration feature into implementation tasks and create GitHub issues. Let me start by creating a TODO list for all phases.

⏺ Phase 1: 要件の理解

  初期リクエスト: 複数ユーザーの新規登録を一括で実行する機能を追加したい

要件の中に曖昧な内容があれば生成AIが確認のための質問を投げかけてきます。対話を通じて徐々に要件を明確にしていきます。

今回は追加したい機能を具体的にするために生成AIから幾つかの質問が投げかけられました。解答を選択式にすることで、スムーズに要件を明確化できます。

  この機能について、以下の点を明確にさせてください。

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
←  ☐ 対象ユーザー  ☐ 入力形式  ☐ 認証フロー  ☐ エラー処理  ✔ Submit  →

この一括登録機能は誰が使うことを想定していますか?

❯ 1. 管理者(AdminUser)のみが使用
     管理画面から管理者が実行する機能として実装。一般ユーザーは使用できない。
  2. 組織の管理者(Org内の特定ロール)
     組織内の権限を持つユーザーが自組織のメンバーを一括登録できる。
  3. 一般ユーザーも使用可能
     全ユーザーが利用可能な機能として実装。
  4. Type something.

解答を選択式にするためにClaude CodeのToolの AskUserQuestion を利用するようにプロンプトに明記すると便利です。 AskUserQuestion は情報を収集または曖昧さを明確にするために、ユーザーに複数選択肢の質問をします。

一通りの質問に回答すると生成AIが要件を整理してくれます。ここまでの選択で要件を理解することができました。認識にズレがなければこのまま次のステップに進みます。何かしらに誤りがあった場合、この段階で軌道修正もできます。

⏺ User answered Claude's questions:
  ⎿  · この一括登録機能は誰が使うことを想定していますか? → 管理者(AdminUser)のみが使用
     · ユーザーデータの入力形式はどのようなものを想定していますか? → CSV/TSVファイルのアップロード
     · 登録時のユーザー認証フローはどうしますか? → 確認メール送信(既存フロー準拠)
     · 登録処理中のエラーハンドリングはどうしますか? → 部分成功を許可

⏺ ありがとうございます。要件を整理します。

⏺ 理解した要件

  機能: 複数ユーザーの新規登録を一括で実行する機能

  要件の詳細:
  - 対象ユーザー: 管理者(AdminUser)のみが使用可能
  - 入力形式: CSV/TSVファイルのアップロード(email, name, org_id等のカラム)
  - 認証フロー: 確認メール送信(既存の単一ユーザー登録フローと同じ)
  - エラー処理: 部分成功を許可(成功したユーザーは登録、失敗したユーザーはエラーレポートで返す)

ステップ2: コードベースの探索

次に、要件を実現させるために既存のコードベースがどうなっているのかを理解する必要があります。

次のようなフローでコードベースを探索していきます。

コード探索のシーケンス図

既存のコードベースを理解するため、Claude Codeの公式Pluginであるfeature-dev にある code-explorerエージェントを活用します。このエージェントはプロジェクトの構造やパターンを自動的に分析して実装に必要な情報を収集します。feature-devプラグインをインストールするだけでcode-explorerエージェントを利用できるようになります。

要件を分割して複数のcode-explorerエージェントを並列で起動します。各エージェントが特定の観点からコードベースを探索して必要な情報を収集します。

⏺ Phase 2: コードベースの探索

  既存のコードとパターンを理解するため、複数のcode-explorerエージェントを並列で起動します。

  Running 3 feature-dev:code-explorer agents… (ctrl+o to expand)
   ├─ Explore user registration architecture · 12 tool uses · 29.1k tokens
   │  ⎿  Search: **/models/admin*.py
   ├─ Explore admin API patterns · 12 tool uses · 27.6k tokens
   │  ⎿  Read: main.py
   └─ Explore CSV and file handling · 10 tool uses · 17.0k tokens
      ⎿  Search: **/api/routes/**/*.py
     ctrl+b to run in background

⏺ Excellent! Now let me read the critical files identified by the code-explorer agents to deepen my understanding.

⏺ Read(src/api/routes/user/users.py)
  ⎿  Read 60 lines

⏺ Read(src/api/routes/user/users.py)
  ⎿  Read 60 lines

⏺ Read(src/api/routes/admin/orgs.py)
  ⎿  Read 70 lines

⏺ Read(src/api/routes/user/orgs/teams.py)
  ⎿  Read 60 lines

⏺ Read(src/services/email/email_service.py)
  ⎿  Read 132 lines

今回は複数のユーザー登録を一括で実行する機能を追加したいので、既存のユーザー登録処理や管理者用APIのパターン、CSVファイルの取り扱い方法などを中心にコードベースを探索しているようです。

要件を実現させるために必要なコードベースの情報が揃ったようなので、次のステップに進みます。

ステップ3: 要件の明確化

次は入力した要件とコードベースの情報を元に、要件を更に明確化していきます。

既存コードと要件を精査して曖昧な内容が残っていれば、追加で質問が投げかけられます。対話を繰り返すことで実装に必要な情報を揃えていきます。

⏺ Phase 3: 明確化のための質問

  コードベースの調査結果から、以下の点について確認させてください。


────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ☐ CSV Columns 

CSVファイルにはどのような情報を含めますか?

❯ 1. 必須情報:メール、名前、ロール (Recommended)
     email, first_name, last_name, roleの4カラム。GitHubアカウントはオプション
  2. 必須情報:メールと名前のみ
     email, first_name, last_nameの3カラム。ロールはデフォルトでmember
  3. メールアドレスのみ
     emailの1カラムだけ。他の情報は後から追加
  4. Type something.

このステップではエラーハンドリングやエッジケースなど、細かい点についての要件を明確化します。

⏺ Phase 3: 明確化のための質問

  コードベースの調査結果から、以下の点について確認させてください。
                                                                                                 
⏺ User answered Claude's questions:
  ⎿  · CSVファイルにはどのような情報を含めますか? → 必須情報:メール、名前、ロール (Recommended)


────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ☐ Duplicate Emails 

既存ユーザー(同じメールアドレス)がいた場合、どう処理しますか?

❯ 1. スキップして結果に記録 (Recommended)
     既存ユーザーは登録せず、skipped_emailsリストとして返す
  2. エラーとして返す
     既存ユーザーがいたらエラー情報を返し、その行を登録しない
  3. 情報を更新する
     既存ユーザーの名前やロールをCSVの値で更新
  4. Type something.

ここまでで要件と既存コードの変更内容が明確化されました。次のステップで設計に進みます。

ステップ4: 設計

設計フェーズでは、Claude Codeの公式Pluginであるfeature-dev にある code-architectエージェントを活用します。

このエージェントは設計方針を提案してくれます。開発者は提案された選択肢の中からプロジェクトに最適な実装方針を選ぶことができます。この選択により実装の方向性が確定します。

設計に関するフローは次のようなイメージになります。

設計のシーケンス図

今回は最小構成、クリーンアーキテクチャ、実用的バランスの3つのアプローチでcode-architectエージェントを並行稼働して最適な設計方針を提案してもらいました。

⏺ Phase 4: アーキテクチャ設計

  それでは、3つの異なるアプローチでアーキテクチャ設計を行います。

⏺ Running 3 feature-dev:code-architect agents… (ctrl+o to expand)
   ├─ Design minimal change approach · 3 tool uses · 10.1k tokens
   │  ⎿  Search: send_invite_user_email
   ├─ Design clean architecture approach · 4 tool uses · 10.1k tokens
   │  ⎿  Search: src/services/**/*.py
   └─ Design pragmatic balance approach · 0 tool uses
      ⎿  Initializing…
     ctrl+b to run in background

⏺ 3 feature-dev:code-architect agents finished (ctrl+o to expand)
   ├─ Design minimal change approach · 20 tool uses · 25.2k tokens
   │  ⎿  Done
   ├─ Design clean architecture approach · 26 tool uses · 41.0k tokens
   │  ⎿  Done
   └─ Design pragmatic balance approach · 0 tool uses
      ⎿  Done

⏺ Perfect! Now I have three comprehensive architecture designs. Let me present them to the user for selection.

⏺ 3つのアーキテクチャアプローチが完成しました。それぞれの特徴を整理してご提案します。

  3つのアプローチ比較

  1. 最小変更アプローチ (Minimal Change)

  特徴:
  - CSV処理をルートハンドラに直接実装(約150行の単一ファイル)
  - 既存パターンを最大限活用(teams.pyの部分成功パターン)
  - 新規作成ファイル: 2個(エンドポイント + テスト)

  メリット:
  - 最速で実装可能(2 PR、~650行)
  - シンプルで理解しやすい
  - 既存コードとの整合性が高い

  デメリット:
  - ルートハンドラが長くなる(~150行)
  - CSV処理ロジックの再利用が困難
  - 将来の拡張(Excel対応など)に追加実装が必要

  タスク数: 2個

  ---
  2. クリーンアーキテクチャアプローチ (Clean Architecture)

  特徴:
  - サービス層を導入して責務を分離
    - Parser(CSV解析)
    - Validator(バリデーション)
    - UserImportService(オーケストレーション)
  - 新規作成ファイル: 7個

  メリット:
  - 将来の拡張が容易(Excel, JSON対応)
  - テストが容易(各層を独立してテスト可能)
  - ビジネスロジックの再利用性が高い
  - 保守性が高い

  デメリット:
  - 初期実装に時間がかかる(6 PR、~730行)
  - 抽象化により複雑さが増す
  - シンプルなCSV処理に対してはオーバーエンジニアリングの可能性

  タスク数: 6個

  ---
  3. 実用的バランスアプローチ (Pragmatic Balance)

  特徴:
  - サービス層を導入するが、Parser/Validatorは分離しない
  - UserImportServiceで一元管理
  - 新規作成ファイル: 5個

  メリット:
  - 適度な抽象化で保守性を確保
  - 実装速度とコード品質のバランスが取れている
  - 将来の拡張もある程度対応可能

  デメリット:
  - クリーンアーキテクチャほどの柔軟性はない
  - 最小変更アプローチほどシンプルではない

  タスク数: 5個

  ---


────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ☐ Approach 

どの実装アプローチを採用しますか?

  1. 実用的バランス (Recommended)
     開発速度と品質のバランス。サービス層を導入しつつもシンプルさを維持。タスク数: 5個
  2. 最小変更
     最速で実装。ルートハンドラに直接実装。既存パターンを最大限活用。タスク数: 2個
❯ 3. クリーンアーキテクチャ
     保守性と拡張性を重視。Parser/Validatorを分離し、将来の複数フォーマット対応を考慮。タスク数: 6個
  4. Type something.

様々な設計方針ごとにメリット、デメリットなどが提示されます。要件やプロジェクトの方針にもよりますが、今回はクリーンアーキテクチャを選択します。設計方針が決まったので次のタスク分解のステップに進みます。

ステップ5: タスク分解

確定した設計方針を元に実装に必要なタスクを洗い出して分解します。

今回のカスタムコマンドで特に重要なのは、Pull requestやIssueの粒度を考慮することです。今回のカスタムコマンドの調整により、レビューしやすく適切な粒度でマージしやすい最適な粒度に分解してくれます。

Pull requestやIssueの粒度に関するガイドラインはSkillに切り出しています。 Sub AgentやSkillに切り出すことにより、タスク分解の品質を継続的に改善できるだけでなく、カスタムコマンドの一連の流れのコンテキストを適切に管理できるようになります。

今回はクリーンアーキテクチャを選択しており、最初に各種共通処理の作成とリファクタを行い、その後にAPIを追加するというタスクの分け方になっているようです。

⏺ 承知しました。クリーンアーキテクチャアプローチで進めます。

  それでは Phase 5 に進んで、task-breakdown Skillを使ってタスク分解を評価・調整します。

⏺ Skill(task-breakdown)
  ⎿  Successfully loaded skill

⏺ Task Breakdown Skillがロードされました。それでは、Phase 4で得たクリーンアーキテクチャアプローチのタスク分解を評価します。

  code-architectが提案したタスク分解

  以下は、クリーンアーキテクチャアプローチで提案された6つのタスクです:

  Task 1: [Data] ドメインモデルの追加

  - 変更ファイル:
    - CREATE: src/services/user_import/models.py
    - CREATE: src/services/user_import/__init__.py
    - CREATE: tests/services/user_import/test_models.py
  - 概要: ImportRow, ValidationError, CreatedUser, ImportResult モデルを作成
  - 依存関係: なし

  Task 2: [Logic] CSVパーサーの実装

  - 変更ファイル:
    - CREATE: src/services/user_import/parser.py
    - MODIFY: src/services/user_import/__init__.py
    - CREATE: tests/services/user_import/test_parser.py
  - 概要: CSVParserインターフェースとDefaultCSVParserを実装
  - 依存関係: Task 1(ImportRowモデルが必要)

  Task 3: [Logic] バリデーターの実装

  - 変更ファイル:
    - CREATE: src/services/user_import/validator.py
    - MODIFY: src/services/user_import/__init__.py
    - CREATE: tests/services/user_import/test_validator.py
  - 概要: UserDataValidator(ビジネスルール検証)を実装
  - 依存関係: Task 1(ImportRow, ValidationErrorモデルが必要)

  Task 4: [Logic] ユーザーインポートサービスの実装

  - 変更ファイル:
    - CREATE: src/services/user_import/user_import_service.py
    - MODIFY: src/services/user_import/__init__.py
    - CREATE: tests/services/user_import/test_user_import_service.py
  - 概要: UserImportService(オーケストレーション層)とメール連携
  - 依存関係: Task 1, 2, 3(すべてのコンポーネントが必要)

  Task 5: [API] 管理者用一括登録エンドポイント

  - 変更ファイル:
    - CREATE: src/api/routes/admin/user_import.py
    - MODIFY: main.py
    - CREATE: tests/api/routes/admin/test_user_import.py
  - 概要: POST /api/v1/admin/users/import エンドポイントの実装
  - 依存関係: Task 1, 2, 3, 4(サービス層全体が必要)

  ---
  Task Breakdown Skillによる評価

  1. タスクの粒度チェック

  Task 1: ドメインモデル
  - ファイル数: 3個 ✅ (理想的)
  - 行数: ~80行 ✅ (適切)
  - 評価: 適切なサイズ

  Task 2: CSVパーサー
  - ファイル数: 3個 ✅ (理想的)
  - 行数: ~100行 ✅ (適切)
  - 評価: 適切なサイズ

  Task 3: バリデーター
  - ファイル数: 3個 ✅ (理想的)
  - 行数: ~120行 ✅ (適切)
  - 評価: 適切なサイズ

  Task 4: ユーザーインポートサービス
  - ファイル数: 3個 ✅ (理想的)
  - 行数: ~180行 ✅ (適切)
  - 評価: 許容範囲だが、メール連携部分を分離できる可能性あり

  Task 5: APIエンドポイント
  - ファイル数: 3個 ✅ (理想的)
  - 行数: ~100行 ✅ (適切)
  - 評価: 適切なサイズ

  2. 密結合の識別

  ✅ 密結合が適切に保たれているもの:
  - Task 1: モデル定義 + テスト (実装とテストが同一PR)
  - Task 2: Parser実装 + テスト (実装とテストが同一PR)
  - Task 3: Validator実装 + テスト (実装とテストが同一PR)
  - Task 4: Service実装 + テスト (実装とテストが同一PR)
  - Task 5: APIエンドポイント + ルーティング + テスト (API完全性が保たれている)

  ❌ 潜在的な密結合の問題: なし

  3. 独立性の検証

  独立してrevertできるか?
  - Task 1: ✅ 他のタスクに影響なし(モデルのみ)
  - Task 2: ✅ Task 1に依存するが、独立して削除可能
  - Task 3: ✅ Task 1に依存するが、独立して削除可能
  - Task 4: ⚠️ Task 2, 3に依存するため、revert時は順序が重要
  - Task 5: ✅ Task 4に依存するが、独立して削除可能(ルーター登録を削除するだけ)

  各PRマージ後、アプリケーションは正常動作するか?
  - Task 1マージ後: ✅ モデルのみ追加、既存機能に影響なし
  - Task 2マージ後: ✅ パーサーのみ追加、既存機能に影響なし
  - Task 3マージ後: ✅ バリデーターのみ追加、既存機能に影響なし
  - Task 4マージ後: ✅ サービス層のみ追加、APIエンドポイントがないため既存機能に影響なし
  - Task 5マージ後: ✅ 新規エンドポイント追加、既存機能に影響なし

  4. 依存関係の整理

  Task 1 (モデル)
  ├── Task 2 (Parser) ← Task 1に依存
  └── Task 3 (Validator) ← Task 1に依存
      └── Task 4 (Service) ← Task 2, 3に依存
          └── Task 5 (API) ← Task 4に依存

  並列実装可能なタスク:
  - Task 2とTask 3は並列実装可能(どちらもTask 1にのみ依存)

  5. 推奨事項

  現在のタスク分解は非常に良好です。以下の理由から、このまま進めることを推奨します:

  良い点:
  1. ✅ 各タスクのサイズが適切(3-10ファイル、100-200行)
  2. ✅ 実装とテストが密結合として同一PRに含まれている
  3. ✅ 各タスクが独立してrevert可能
  4. ✅ 依存関係が明確で、並列実装の余地もある
  5. ✅ 各PRマージ後もアプリケーションは正常動作する

  最終判断: 現在のタスク分解をそのまま採用

  ---

ここまでで要件を正しい方法と手順で実現するために必要な準備が整いました。最後のステップをこれらを元にIssueを作成していきます。

ステップ6: Issue作成

最後のステップで、分解したタスクを元にGitHubのIssueを自動で作成します。

作成前には確認ステップを踏み、認識がズレていないか最終チェックを行います。問題がなければ、そのままIssueを作成してSub Issueの紐付けとrelationshipの設定まで完了させます。

これにより親Issueと子Issueが適切に構造化された状態で、すぐに実装に取り掛かれるようになります。

GitHubのIssueを作成する処理もSub Agentに切り出しています。Issueを作成するために必要な情報量が多く、すぐにコンテキストが肥大化してしまうからです。そのためIssue作成専用のSub Agentを用意して必要な情報だけ渡してIssueを作成する形にしています。

⏺ Phase 7: GitHub Issueの作成

  github-issue-creator agentを起動してGitHub issueを作成します。

⏺ plugin:github-issue-creator(Create GitHub issues)
  ⎿  Done (25 tool uses · 117.1k tokens · 8m 35s)                                                                                                                                                                                                                                                  

⏺ ✅ Feature Breakdown 完了!

  GitHub Issueの作成が完了しました。以下が作成されたIssueです。

  📋 親Issue

  #1 - Feature: 複数ユーザーの一括登録機能
  https://github.com/Findy/Example/issues/1

  📦 子Issue(実装タスク)

  1. #2 - [Data] ドメインモデルの追加 + テスト
  https://github.com/Findy/Example/issues/2
  依存関係: なし
  2. #3 - [Logic] CSVパーサーの実装 + テスト
  https://github.com/Findy/Example/issues/3
  依存関係: #2
  3. #4 - [Logic] バリデーターの実装 + テスト
  https://github.com/Findy/Example/issues/4
  依存関係: #2
  4. #5 - [Logic] ユーザーインポートサービスの実装 + テスト
  https://github.com/Findy/Example/issues/5
  依存関係: #2, #3, #4
  5. #6 - [API] 管理者用一括登録エンドポイント + テスト
  https://github.com/Findy/Example/issues/6
  依存関係: #5

  ---
  📊 Issue構造

  📋 #1 Feature: 複数ユーザーの一括登録機能
  ├── 📦 #2 [Data] ドメインモデルの追加 + テスト
  │   ├── ⚙️  #3 [Logic] CSVパーサーの実装 + テスト
  │   └── ⚙️  #4 [Logic] バリデーターの実装 + テスト
  │       └── ⚙️  #5 [Logic] ユーザーインポートサービスの実装 + テスト
  │           └── 🔌 #6 [API] 管理者用一括登録エンドポイント + テスト

  ---
  🎯 次のステップ

  1. 実装開始: #2から順番に実装してください
  2. 並列実装可能: #3と#4は#2完了後、並列で実装可能です
  3. 進捗管理: 親Issue #1で全体の進捗を確認できます
  4. PRの作成: 各Issueごとに1つのPRを作成してください

  ---
  📝 設計サマリー

  採用アーキテクチャ: クリーンアーキテクチャ
  - Parser層(CSV解析)
  - Validator層(ビジネスルール検証)
  - Service層(オーケストレーション)
  - API層(HTTPハンドリング)

  主な技術要素:
  - CSVパース: Python標準ライブラリ csv.DictReader
  - バリデーション: Pydantic + カスタムロジック
  - トランザクション: ユーザー単位のコミット
  - メール送信: 既存のEmailService再利用
  - エラー処理: 部分成功パターン

  受入基準:
  - テストカバレッジ90%以上
  - 各PRは3-10ファイル、200-500行の変更
  - すべてのPRは独立してrevert可能

  Feature Breakdown コマンドの全フェーズが完了しました!

これで要件の策定から適切な粒度でのIssue作成までの一連の流れが完了しました。Issueの内容をチームでレビューして、実装を生成AIに任せましょう。適切な粒度でタスクが分解されているので、Pull requestの粒度も適切になり、レビューの負担が大幅に軽減されます。

カスタムコマンド作成のコツ

様々な開発タスクを効率化するためには必要な情報を用意する必要があります。その結果、コンテキストが肥大化してしまい精度が一気に落ちてしまうことがよくあります。

まずは一通りの流れをカスタムコマンドで作成して、内容やスコープに応じてSkillやSub Agentに切り出していくのが良いです。特定の知識やガイドラインなどはSkillに切り出しましょう。メインのコンテキストには不要で結果のみ必要な情報を扱う場合はSub Agentに切り出すのが良いです。

いかにしてコンテキストを最小限に保つかがコツです。 カスタムコマンドに限らず、コンテキストが肥大化すると生成AIの精度は一気に落ちてしまいます。 必要な情報だけを適切に渡して維持し続けることが、生成AIを活用する上で非常に重要です。

まとめ

今回紹介したカスタムコマンドは、誰でも高品質で適切な粒度のAIフレンドリーなIssueを作成できるようにするものです。

生成AIを活用した開発では、生成AIが理解しやすい形で要件と設計を伝えることが重要です。要件定義から設計、タスク分解、Issue作成までのフローを自動化することで、開発者はより本質的な開発業務に集中できるようになります。生成AIとの協業による開発スタイルは、今後ますます重要になっていくでしょう。

最後になりますが、このたび 2026年2月18日(水)にFindy AI Meetup in Fukuoka #4の開催が決定 しました!

findy-inc.connpass.com

会場へのアクセスは天神駅から徒歩3分となっています。またTVCM公開記念ノベルティや、イベント後半には懇親タイムもご用意しています。

申込みの先着順となっておりますので、気になっている方は早めにお申し込みいただくことをおすすめします。生成AIの活用事例に興味のある方は奮ってご参加ください!

みなさんにお会いできることを楽しみにしています!

採用情報

現在、ファインディでは一緒に働くメンバーを募集中です。

興味がある方はこちらから。 herp.careers

Findyの爆速開発を支えるAI×チェックリスト型セルフレビュー

こんにちは。

ファインディ株式会社でテックリードマネージャーをやらせてもらってる戸田です。

現在のソフトウェア開発の世界は、生成AIの登場により大きな転換点を迎えています。

GitHub CopilotやClaude Codeなど生成AIを活用した開発支援ツールが次々と登場し、開発者の日常的なワークフローに組み込まれつつあります。

弊社でも例に漏れず、生成AIを活用して開発効率の向上に取り組んでいます。その中でFindy Team+で開発組織の生産性をチェックしていたところ、Pull requestの質が落ちているのでは?という仮説が浮かび上がりました。

今回は仮説が浮かんできた経緯と、その対策として導入したセルフレビューの仕組みについて紹介します。

それでは見ていきましょう!

思っていたよりPull requestの数が増えていなかった

稼働人数は昨年比で1.5倍程度増えており、それと比例する形でPull requestの作成数も単純に1.5倍に増えていました。この図から、人数の増加とPull request作成数が概ね比例していることが分かります。

Pull request作成数の推移

しかし、1人あたりのPull requestの作成数は、昨年とほぼ変わらずでした。この図を見ると、人数が増えても1人あたりのPull request作成数はほぼフラットであることが分かります。

1人あたりのPull request作成数の推移

生成AIにPull requestを作成してもらうのであれば、1人あたりの作成数も伸びて、増えた人数以上に総数も伸びるはずでは?ここが疑問ポイントでした。

Pull requestの数が多ければ必ずしも良いわけではありませんが、AIを導入しても1人あたりの数値が伸びていないということは、どこかしらに問題があるはずです。

Pull requestの作成数だけでは判断することが出来ないので、他の数値に目を向けてみました。すると、各種リードタイムが昨年比で悪化していることがわかりました。

その中でも私が特に目を付けたのが「レビューからApproveまでの平均時間」です。この数値が昨年比で平均約20分近くも伸びていたのです。

更に「平均コメント数」と「平均レビュー数」にも目を付けました。こちらも昨年比で30%近くも増えていたのです。

これらの数値の変化から、1つの仮説が浮かび上がりました。それは「レビューで指摘された内容の対応で各種リードタイムが伸びており、マージまでの時間が伸びて結果的にPull requestの作成数が伸びていないのでは?」ということです。

この仮説を一言で言うと、「作成されているPull requestの質が落ちているのでは?」と言い換えることもできます。仮説を整理できたので、その仮説が正しいのかどうかを検証することにしました。

理解しないままレビュー依頼を出していた

AIが作成したPull requestを幾つか確認してみたところ、確かにセルフレビューである程度防げるような指摘が多く見受けられました。

例えばAIが次のようなテストコードを追加しているシーンがありました。

import { render, screen } from '@testing-library/react';

it('should render with isHiddenTitle', () => {
    render(<HogeComponent isHiddenTitle />);

    expect(screen.queryByText("Title")).not.toBeInTheDocument();
});

一見特に問題なさそうなテストコードですが、仮にテキストが常に非表示になっている状態だった場合、このテストコードは常に成功してしまいます。つまり、テストコードとしての意味を成していないのです。

特定の条件下で「表示されないこと」を守りたいのあれば、その条件下以外で「表示される」ことも同時に守る必要があります。この変更に対してはリードクラスのエンジニアからレビューで指摘が入り、次のようなテストコードになりました。

import { render, screen } from '@testing-library/react';

it('should render', () => {
    render(<HogeComponent />);

    expect(screen.getByText("Title")).toBeInTheDocument();
});

it('should render with isHiddenTitle', () => {
    render(<HogeComponent isHiddenTitle />);

    expect(screen.queryByText("Title")).not.toBeInTheDocument();
});

このテストコードで文言が表示されること、特定の条件下のみで表示されないことの両方を守ることができるようになりました。

このように、AIが出力したコードを依頼主が理解しないままレビュー依頼を出しているケースが少なからず見受けられました。そしてそれらをレビューするリードクラスのエンジニアのレビュー負担が上がっており、結果的にマージまでのリードタイムが伸びている。という状態に陥っていたのです。

これらの多くは難しい問題点ではなく、セルフレビューの時点で気づくことが出来るような内容が大半でした。

AIが出力したコードの責任は人間にあります。 レビュー依頼を出す前に、まずセルフレビューをして、早い段階で問題点に気付けるように仕組みを作ることにしました。

AIでセルフレビューを支援する仕組みを導入

自動でレビューをしてくれるサービスも利用したのですが、汎用的な内容でのレビューなのでドメイン知識や個人の癖などを考慮出来ておらず、指摘内容としても薄いものが多く、レビュー依頼する前のセルフチェックという意味合いでは不十分でした。

そこで、自分自身にカスタマイズされたセルフレビューのチェックリストを作成する仕組みを内製することにしました。

流れとしてはこうです。

まず直近数カ月で自分が作ったPull requestの一覧を取得します。そのPull requestに対して作成されたレビューコメントを全て取得します。それらレビューコメントの全てをLLMに渡して、どういう内容や傾向で自分自身が指摘されているのかを分析後にチェックリストを作成します。

作成されたチェックリストに沿って、Claude Codeにセルフレビューしてもらいます。

一連の流れはこのようになります。

セルフレビューの仕組みのシーケンス図

このシーケンス図から、チェックリストの生成からセルフレビュー、修正の反映までが一連のフローとして自動化されていることが読み取れます。

この一連の流れを全て自動で行うカスタムコマンドを作成し、Pluginsに入れて社内に展開しました。

チェックリストを更新するカスタムコマンドと、そのチェックリストを使ってセルフレビューを実行するカスタムコマンドは分けています。チェックリストは定期的に更新すれば良いので、セルフレビューの度に更新する必要はないからです。

まずチェックリストを作成するコマンドを実行して、次のようなファイルが出力されます。

# Self-Review Checklist for hoge

このチェックリストは、過去3ヶ月間(2025年9月30日〜2025年11月26日)にマージされたPRとレビューコメントを分析して作成されました。

## 🧪 テストコード

### アサーションの品質
- [ ] `toEqual` の代わりに `toStrictEqual` を使用しているか
  - より厳密な型チェックのため
- [ ] テストケースは実装の意図を正確に検証しているか
- [ ] スナップショットテストは適切に使用されているか

### テストの網羅性
- [ ] 主要な機能パスはすべてカバーされているか
- [ ] エラーハンドリングのテストは含まれているか
- [ ] エッジケースを考慮しているか

## 🎨 UI/UX 設計

### アクセシビリティ
- [ ] aria-label は適切に設定されているか
- [ ] キーボード操作に対応しているか
- [ ] カラーコントラストは十分か

## 🎯 コミットメッセージ

### Conventional Commits
- [ ] プロジェクトのコミットメッセージ規約に従っているか
- [ ] 適切な type を使用しているか(feat, fix, refactor, chore, etc.)
- [ ] scope は正しく指定されているか
---

**最終更新日**: 2025-11-28
**分析期間**: 2025-09-30 〜 2025-11-26

次にセルフレビューのコマンドを実行します。出力されたチェックリストの内容に沿って、変更箇所をレビューしてもらいます。実際の出力例は次のようになります。

> 変更箇所に対して、`self-review-check-list.md` の内容を元にレビューしてください

⏺ 変更箇所をレビューするために、まず self-review-check-list.md の内容を確認します。

⏺ Search(pattern: "**/self-review-check-list.md")
  ⎿  Found 1 file (ctrl+o to expand)

⏺ Read(self-review-check-list.md)
  ⎿  Read 33 lines

⏺ Read(packages/feature-server/src/clients/github/github-client.spec.ts)
  ⎿  Read 863 lines

⏺ self-review-check-list.md の内容に基づいて、変更ファイルのレビューを実施しました。

  レビュー結果

  ✅ コード品質

  命名の明確さ
  - 関数名や変数名が実際の動作を正確に表現しています
  - ドメイン用語(GitHub API関連)を正しく使用しています

  ✅ テストコード

  テストの網羅性
  - 各関数に対して以下のテストケースを網羅しています:
    - すべてのパラメータを指定した成功ケース
    - 必須パラメータのみの成功ケース
    - エラーケース
  - toStrictEqual を使用してオブジェクト全体の検証を適切に行っています

  テスト依存関係
  - 不要なテスト依存関係は追加されていません
  - プロジェクト標準のテストライブラリのみを使用しています

  ✅ プロジェクト固有のルール

  - TypeScript Deep Dive のスタイルガイドに従っています
  - ファイル名がケバブケース(github-client.spec.ts)になっています

  ⚠️ 改善提案

  テストアサーションの統一性

  packages/feature-server/src/clients/github/github-client.spec.ts:307

  expect(response.data).toEqual(mockData);

  他のテストケースでは toStrictEqual を使用していますが、ここだけ toEqual を使用しています。toStrictEqual に変更することを推奨します:

  expect(response.data).toStrictEqual(mockData);

  toStrictEqual は toEqual よりも厳密なチェック(undefined
  プロパティも検証)を行うため、より堅牢なテストになります。

  ---
  全体的に非常に高品質なテストコードです。上記の1点のみ修正すれば、チェックリストのすべての項目を満たしま
  す。

テストコードを変更した場合のセルフレビュー例ですが、コード品質やテストコード、プロジェクト固有のルールに関しては基本的にクリアしていましたが、改善提案として1点のみ指摘がありました。

このレビュー結果を元に、修正も自動で行ってもらいましょう。続いてプロンプトを実行します。

> レビュー結果を元に、変更箇所を修正してください 

⏺ レビュー結果に基づいて修正します。

⏺ Update(packages/feature-server/src/clients/github/github-client.spec.ts)
  ⎿  Updated packages/feature-server/src/clients/github/github-client.spec.ts with 1 addition and 1
     removal

       304            }
       305          );
       306          expect(response.status).toBe(HttpStatusCode.OK);
       307 -        expect(response.data).toEqual(mockData);
       307 +        expect(response.data).toStrictEqual(mockData);
       308        });
       309    
       310        it('fetch data with only required params', async () => {

⏺ 修正が完了しました。

  修正内容

  packages/feature-server/src/clients/github/github-client.spec.ts:307

  変更前:
  expect(response.data).toEqual(mockData);

  変更後:
  expect(response.data).toStrictEqual(mockData);

  この修正により、テストアサーションが統一され、すべてのテストケースで toStrictEqual
  を使用するようになりました。toStrictEqual は toEqual よりも厳密なチェック(undefined
  プロパティも検証)を行うため、より堅牢なテストになります。

  これで self-review-check-list.md のすべての項目を満たすコードになりました。

この仕組みにより、定期的にチェックリストのファイルを更新することによって、セルフレビューの精度を上げ続けることが可能となります。

まとめ

今回はジュニアエンジニアがAIを使ってPull requestを作成した場合に、セルフレビューでのチェックが甘くなり、レビュワーの負担が上がっているといったケースでした。

「AIに使われる」のではなく、「AIを使う」ためにも、AIが出力したコードを理解することが必要不可欠です。AIが出力したコードの責任は人間にあります。自分自身の責任を果たす意味でも、生成AI時代のセルフレビューが持つ意味合いは、これまで以上に重要になってくるでしょう。

現在、ファインディでは一緒に働くメンバーを募集中です。

興味がある方はこちらから ↓ herp.careers