Findy Tech Blog

Devinはどこまでできる?自律型AIエージェントDevinを2ヶ月試した結果を公開!

こんにちは。ファインディでソフトウェアエンジニアをしている栁沢(@nipe0324a)です。

ファインディでは、25年1月末から転職開発チームにDevinがジョインし、現在2ヶ月ほど一緒に働いています。

Devinのアウトプットとして、プルリクエストのマージ数は「2ヶ月で197件」、「1日あたり平均5.2件」とバリバリ開発をしてもらっています。

過去2ヶ月のDevinのマージ済みプルリク数の推移

Devinの2ヶ月の費用としても約30万($2,000 = 1,000 ACUs)ほどで、比較的簡易なタスクかつ一部サポートは必要でしたが十分なアウトプットを得ることができました。

今回の記事では、Devinに効果的にアウトプットを出してもらうために

  • 試して上手くいったところ
  • 上手くいかなかったところ
  • 具体的なTips

などをご紹介できればと思います。

ちなみに、ファインディ内でのDevinの利用状況は現在検証中の段階であり、まだ「開発生産性が劇的にあがりました!」といえる状況ではありません。

Devinの1つの利用事例として楽しんでいただければ嬉しいです。

  • Devinはどこまでできる?
  • 試行錯誤しつつDevinで上手くいったこと
    • 基本的な開発ルールやプロセスに慣れてもらう
    • 開発中に見つけた軽微なタスクを任せる
    • 軽微なアラート対応やWant対応を任せる
    • 小規模な開発を任せていく
  • ここが辛いよDevin
    • 自分でやったほうが早くない?
    • GitHub CopilotやClineなどのほうが精度良くない?
    • レビューに反応して余計な対応をしてしまう
  • Devinと今後どう付き合っていくか?
  • 最後に
続きを読む

Findyの爆速開発を支える生成AI活用の準備と実践

こんにちは。

Findy で Tech Lead をやらせてもらってる戸田です。

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

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

しかし、これらのツールを導入すれば即座に開発生産性が向上する、というわけではありません。

生成AIを効果的に活用し、真の意味で開発生産性を向上させるためには、適切な準備と理解が不可欠です。

今回は生成AIと既存コードの関係性を掘り下げ、開発生産性を最大化するための具体的な準備について詳しく解説します。

単なるツールとしての導入にとどまらず、組織全体で生成AIと協調して働くための基盤づくりに焦点を当てています。

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

生成AI活用のための準備

生成AIの効果は既存のコードベースの品質と密接に関連していると言われています。(1、2)

生成AIは与えられたコンテキストを基に学習して提案を行います。既存のコードベースが高品質である場合、生成AIはより精度が高い提案をすることができるはずです。

そのため、生成AIを効果的に活用し、真の意味で開発生産性を向上させるためには、適切な準備が不可欠です。

既存コードの最適化

不要なコードの削除

不要なコードが残っていると、生成AIはそれらのコードも学習してしまい、不適切な提案をする可能性があります。

例として次のような実装コードがあるとします。

export const getNotEmptyStrList = (data: string[]): string[] => {
  const result = [];
  for (let i = 0; i < data.length; i++) {
    if (data[i].length > 0) {
      result.push(data[i].trim());
    }
  }
  return result;
};

export const filterStrList = (data: string[]): string[] => {
  return data.filter((item) => item.length > 0).map((item) => item.trim());
};

気付いた読者の方もいると思いますが、この例は関数名と実装コードが違うだけで、やっていることは同じです。 getNotEmptyStrList の方は冗長なコードとなっています。

このコードの状態で次のようなプロンプトを実行したとします。

このコードを参考にして、数値配列から0より大きい値だけを抽出して、その値を2倍にする関数を作成してください。

このプロンプトを複数回実行すると、生成されるコードにバラツキが出てしまいました。

export const filterAndDoubleNumbers = (data: number[]): number[] => {
  const result = [];
  for (let i = 0; i < data.length; i++) {
    if (data[i] > 0) {
      result.push(data[i] * 2);
    }
  }
  return result;
};
export const filterAndDoubleNumList = (data: number[]): number[] => {
  return data.filter((item) => item > 0).map((item) => item * 2);
};

このように、不要なコードが残っていると生成AIからの提案の精度が低下してしまいます。

このようなケースの場合、不要なコードを削除して既存コードを最適化することで、生成AIの理解度を向上させることができます。

実装コードから不要なコードを削除して次のように変更します。

export const filterStrList = (data: string[]): string[] => {
  return data.filter((item) => item.length > 0).map((item) => item.trim());
};

filterとmapを使ったモダンなコードのみに変更しました。この状態で同じプロンプトを複数回実行すると、生成されるコードが一貫性を持つようになります。

export const filterAndDoubleNumList = (data: number[]): number[] => {
  return data.filter((item) => item > 0).map((item) => item * 2);
};

統一されたコーディング規約

Google の Style Guides のようなスタイルガイドを採用し、統一されたコーディング規約に従ったコードベースは、生成AIの理解度を向上させます。

例えば、命名規則が一貫していれば、生成AIはその規則を学習し、同様の命名パターンを提案できます。

例として次のような実装コードがあるとします。

import { useState } from 'react';

type SelectOption = {
  label: string;
  value: number;
};

export const useTestHooks = () => {
  const [select_option, setSelectOption] = useState<SelectOption>();
  const [submitValue, setSubmitValue] = useState<number>();

  const handleSelectOption = (option: SelectOption) => {
    setSelectOption(option);
  };

  const HandleClickSubmitButton = () => {
    if (!select_option) return;

    setSubmitValue(select_option.value);
  };

  return {
    handleSelectOption,
    HandleClickSubmitButton,
  } as const;
};

各種名称にキャメルケースとスネークケースなどが混在してしまっています。

このコードの状態で次のようなプロンプトを実行するとします。

select_option.valueを3倍にしてsubmitValueにsetするハンドラー関数を追加してください

プロンプトを複数回実行すると、実行されるたびに生成されるコードにバラツキが出てしまいました。

const HandleClickTripleSubmitButton = () => {
    if (!select_option) return;
    setSubmitValue(select_option.value * 3);
};
const handleClickTripleSubmitButton = () => {
    if (!select_option) return;
    setSubmitValue(select_option.value * 3);
};

そこで、命名規約をキャメルケースに統一するように変更します。

import { useState } from 'react';

type SelectOption = {
  label: string;
  value: number;
};

export const useTestHooks = () => {
  const [selectOption, setSelectOption] = useState<SelectOption>();
  const [submitValue, setSubmitValue] = useState<number>();

  const handleSelectOption = (option: SelectOption) => {
    setSelectOption(option);
  };

  const handleClickSubmitButton = () => {
    if (!selectOption) return;

    setSubmitValue(selectOption.value);
  };

  return {
    handleSelectOption,
    handleClickSubmitButton,
  } as const;
};

この状態で同じプロンプトを複数回実行すると、生成されるコードが一貫性を持つようになります。

const handleClickTripleSubmitButton = () => {
    if (!selectOption) return;
    setSubmitValue(selectOption.value * 3);
};

単純な例ですが、既存コードに統一性がない場合、生成AIがどの情報を正とするかが曖昧になり、提案の精度が低下してしまう一例でした。

このように、コーディングスタイルの一貫性は生成AIの提案の精度や一貫性に大きく影響します。

コードの設計の一意性

アーキテクチャやデザインパターンが一貫している場合、生成AIはそのパターンを学習し、より適切な提案をすることができます。

例えば、次のようなコードがあるとします。

export interface IRepository<T> {
  findAll(): Promise<T[]>;
  findById(id: string): Promise<T | null>;
}

export interface Entity {
  id: string;
  createdAt: Date;
  updatedAt: Date;
}

export interface User extends Entity {
  name: string;
  email: string;
  role: 'admin' | 'user';
}

export class UserRepository implements IRepository<User> {
  private users: User[] = [];
  
  async findAll(): Promise<User[]> {
    return [...this.users];
  }
  
  async findById(id: string): Promise<User | null> {
    return this.users.find(user => user.id === id) || null;
  }
}

interfaceとclassを使ってリポジトリパターンを実装しています。このコードが存在する状態で、次のようなコードを追加します。

export interface Order extends Entity {
  userId: string;
  products: Array<{
    productId: string;
    quantity: number;
  }>;
  totalAmount: number;
  status: 'pending' | 'completed' | 'cancelled';
}

そして、追加したinterface用のRepositoryクラスを生成してもらうためにプロンプトを実行します。

Order用のRepositoryクラスを生成してください

すると、生成されたコードは次のようになります。

export class OrderRepository implements IRepository<Order> {
  private orders: Order[] = [];
  
  async findAll(): Promise<Order[]> {
    return [...this.orders];
  }
  
  async findById(id: string): Promise<Order | null> {
    return this.orders.find(order => order.id === id) || null;
  }
}

既存コードの UserRepository を参考にして、 OrderRepository が生成されたことがわかると思います。

このようにデザインパターンや型定義などが一貫していると、生成AIはそのパターンを学習し、より精度の高いコード生成できます。

ドキュメンテーションの充実

生成AIが読み込む内容は実装コードだけでなく、READMEなどのドキュメントも含まれます。そのため、ドキュメントの充実は生成AIの学習に少なからず影響します。

生成AI時代のドキュメンテーション能力は、更に求められるようになってくるでしょう。

docコメントやAPIドキュメント

関数やクラスに記載されるdocコメントは、生成AIがコードの意図を理解する上で重要な情報源となります。

docコメントは実装コードを読み込んで生成AIが自動生成することも可能ですが、実装コードの内容によっては必ずしも十分な情報を提供できない場合があります。このようなケースの場合、まずdocコメントを生成AIに自動生成してもらい、意図や仕様を補足することで、生成AIの理解度を向上させることができます。

また、REST APIの仕様を記述したSwagger/OpenAPIドキュメントやGraphQLのスキーマ定義などは、生成AIがAPIの仕様やクエリを理解する上で重要な情報源となります。

生成AIがAPIの仕様を理解することでモックデータの自動生成などが容易になり、開発効率を向上させることができます。

カスタムインストラクション

生成AI向けのカスタムインストラクションを調整するのも良いでしょう。

カスタムインストラクションは生成AIに対して、特定のコンテキストやルールを教えるための手段です。これを調整して育てることで、生成されるコードや提案内容の精度を向上させることができます。

プロジェクトやリポジトリのコーディング規約やドメイン知識などをカスタムインストラクションに記載しておくことで、それらの内容を生成AIに読み込ませ、提案内容に反映できます。

カスタムインストラクションについては別の記事でも紹介していますので、是非参考にしてみてください。

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

プロンプトを記録

実際に利用したプロンプトを記録して残しておくことも重要です。コード内のコメントや各種ドキュメント、Pull requestなどに記載しておくとよいでしょう。

実際に求めている変更内容とプロンプトの内容が一致しているのかをレビューする必要があるからです。

また、そのコードがどんなプロンプトを利用して生成されたのかが残っていなかった場合、機能追加や修正時にまた一からプロンプトを作らないといけなくなってしまいます。

実装コードを変更したいならプロンプトを変更する。といったパラダイムシフトが来るのはそう遠くない未来なのかもしれません。

最近だと自分は、プロンプトのテンプレートもドキュメントに残すようにしています。状況と変更内容が近いのであれば、プロンプトをコピーして調整して実行するだけで、同じような作業を横展開することが簡単になるからです。

継続的な改善を可能にする開発文化

ここまで説明した内容を実践して維持するためには、継続的な改善や技術的負債の解消を可能にする開発文化が不可欠です。

なぜならば、ドキュメントの整備や既存コードの最適化などは一度だけで終わるものではなく、継続的な取り組みが必要だからです。

テストコードとCI/CDの整備

このような開発文化を作る上でテストコードの整備は特に重要な要素と言えます。一定以上のテストコードが存在することで、継続的な変更に対する心理的安全性を確保できます。

またCI/CDを整備し、自動化されたビルド、テスト、デプロイを行うことで、開発プロセスを効率化し、品質を維持できます。

テストコードとCI/CDの整備については別の記事でも紹介していますので、是非参考にしてみてください。

tech.findy.co.jp

Pull requestの粒度

適切な粒度のPull requestを維持することも重要です。Pull requestの粒度が適切であれば、生成AIに対して「これを実現させるためにはこの修正が必要」とピンポイントで学習させることができます。

tech.findy.co.jp

Pull requestの粒度はプロンプトの精度にも繋がってきます。

生成AIで実行するプロンプトは可能な限り単一責務の方が実行結果の精度が高い傾向にあります。1行のプロンプトで全ての内容を実行するのではなく、プロンプトを分解して階層構造にしたり、対話形式で実行することで、より精度の高い実行結果を実現できます。(*3)

日頃からタスク分解やPull requestの粒度を意識した開発文化にすることで、プロンプトを作成する際にも応用できるのです。

tech.findy.co.jp

これらの準備ステップを着実に実行することで、生成AIをより効果的に活用するための基盤を整えることができます。

まとめ

いかがでしたでしょうか?

生成AI活用のための準備ステップは、単なる事前作業ではなく、生成AIの効果を最大化するための基盤づくりです。

生成AIの活用は目的ではなく、より良いソフトウェアをより効率的に開発するための手段です。

堅固な開発基盤と文化こそが、生成AIの真の力を引き出す鍵となります。

小さな一歩から、大きな変革が始まります。技術の進化に伴い、私たち開発者の役割も進化していきます。

この変化を恐れるのではなく、積極的に受け入れ、活用していくことで、私たちはソフトウェア開発の新たな時代を切り開いていこうと考えています。その未来に向けて、今日から準備を始めましょう。

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

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

参考文献

  1. Best practices for using GitHub Copilot in VS Code #Provide context to Copilot
    • Copilot works best when it has sufficient context to know what you're doing and what you want help with.
  2. Best practices for using GitHub Copilot in VS Code #Be consistent and keep the quality bar high
    • Copilot is going to latch on to your code to generate suggestions that follow the existing pattern, so the adage "garbage in, garbage out" applies.
  3. Best practices for using GitHub Copilot in VS Code #Be specific and keep it simple
    • When you ask Copilot to do something, be specific in your ask and break down a large task into separate, smaller tasks.

【エンジニアの日常】エンジニア達の自慢の作業環境を大公開 Part6

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

この記事は自慢の作業環境を大公開シリーズの第6弾になります。今回も、3名のエンジニアの作業環境を紹介します!

トップバッターは安達さんです!

■ 安達さん / プロダクト開発部 / SRE ■

みなさんこんにちは。SREチームの安達(@adachin0817)です。

僕は週2出社とリモートワークでハイブリッドな働き方をしていますが、エンジニアガジェッターでもあります。それでは作業環境を紹介していきたいと思います。

デスク周り全体

マシン

  • 個人
    • Mac mini(M2 Pro)
    • Mac mini(Intel i7)
    • MacBook Air(M1)
    • iPad
    • iPad mini
  • 会社
    • MacBook Pro(M3 Max)

機材構成は上記のようになっています。なぜ個人でMacBook AirもあるのにMac miniも持っているの?とよく質問されますが、Appleオタクという理由だけではありません。ラップトップのバッテリーは数年で劣化してしまうため、交換時にコストがかかってしまいます。また、MacBook Proはコストも高いので、コストパフォーマンスが良いMac miniをメインとして利用しており、外で開発する場合はMacBook Airを利用しております。Intel Mac miniの利用用途としては、BootCampでWindows 11が動作するようにしています。仕事柄SREといったことから、環境依存が発生しないように個人の開発環境周りの検証を日々行っています。

デスク/ディスクシェルフ

最近、デスク周りを改善し、COFO Desk Premiumを購入しました。椅子もCOFO Chair Premium でCOFOに統一をしています。昇降デスクは裏面が全てマグネットになっているため、配線をきれいに仕上げられるのと、COFOマグネット用オリジナルアイテムも販売されています。モニター台であるFengeのデスクシェルフを置くことで、見えない配線を隠すことができます。

ディスプレイ

ディスプレイはBenQウルトラワイドモニター38インチ/EW3880Rを利用しています。BenQといえば台湾を拠点とする電気製品メーカーですが、ディスプレイの鮮やかさはダントツだと思います。また、このディスプレイはtreVoloスピーカーが内蔵されており、高音質と迫力ある低音で、ゲームや映画にも最適です。

また、モバイルディスプレイ/kksmart 16インチ(WQHD) も活用しています。このディスプレイにはSlackやChatGPTを表示させて素早く返信や検索ができる環境を構築しました。以前はワイドモニターのみで作業していましたが、コマンドタブでの頻繁な切り替えに煩わしさを感じていました。結果として、低価格な小型ディスプレイの導入により生産性向上を実感できています。

このように素晴らしい理想のデスク環境が整いましたが、次はこだわっているアイテムの紹介をしていきましょう。

キーボード/トラックボール

キーボードはHHKB StudioでトラックボールはKensingtonを利用しています。トラックボールはマウスと違って、手首が痛くならず、手全体で操作できるので、非常に便利です。キーボードの前に謎のスイッチングが見えていると思いますが、こちらについて解説していきたいと思います。

こだわりのアイテム紹介

自作充電マジェットスタンド

iPhoneの充電を整えるにあたり、色々と考慮する必要がありました。元々はRORRY ワイヤレス充電器 を利用していましたが、スマホ、Apple Watch、イヤフォンと1つに充電ができるものの、アイテムが大きすぎるといったデメリットがありました。また、Magsafeで充電すると、取り外す際に必ず両手を使わなければならないのも不便でした。

こうした教訓から、リスペクトしているYouTuberツヨシさんの動画を参考にして、デスクシェルフの裏にステンレスカット版を両面テープで固定し、マジェットスタンドの上にTHREEKEY Qi2 充電器を磁石で貼り付けています。この自作マジェットスタンドにより、充電中のiPhoneを片手で簡単に取り外せるようになりました。

同じ仕組みを応用し、モバイルディスプレイもマジェットスタンドでデスクシェルフに取り付けているので、角度調整が非常に便利になりました。

分配器について

このスイッチングは個人PCと会社PCを瞬時に切り替える分配器です。以前まで、会社PCを切り替える場合、毎回HDMIやUSB-Cを抜き差ししていましたが、この分配器があることで、簡単に行き来できるようになりました。

リモートワークでの工夫

リモートワークを快適にするには、昇降デスクは欠かせません。自分は午後になると集中力の低下を感じるため、スタンディングデスクを活用し、MTGやペアプロをより楽しくこなせるようにしています。(ちなみにスタンディングしていると愛犬がデスク下で眠りにつきます)

また、基本的なことですが、「仕事したい」と思えるデスク環境を整えることが何より重要です。自分はガジェット好きなので、日々改善点を探しながら環境をアップデートするのも、リモートワークの楽しみのひとつになっています。

今後導入したいもの

購入しつくした、と言っても過言ではないですが、しいてあげるならiPadのアームです。それ以外は妻もリモートワークをしているため、昇降デスクを購入しようか検討しております。機会があれば個人ブログでも紹介したいと思います。

デスク環境はかなり費用がかかってしまいましたが、以上が僕の作業環境となります。もっとアイテムを紹介したいですが、長くなってしまうので、個人的に色々と聞きたい!という方にはぜひ、ファインディのイベントやXでのDM等お待ちしております!ありがとうございました!

安達さんは、Mac miniを活用し、コストパフォーマンスと環境依存を考慮した構成が印象的でした。また、自作の充電スタンドや分配器の導入による快適な環境構築が参考になりますね!

では、次は土屋さん行ってみましょう!

■ 土屋さん / CTO室 / データエンジニア ■

データエンジニアの土屋 (しゅんそく)です。私の所属するデータソリューションチームはFindyのデータ基盤の設計、開発、運用を担当しています。

所属チームにあわせて、週2-3日のペースで出社しています。土日は家で作業していることが多いため、作業環境は私の最も大きな関心事の1つです。

デスク周り全体

机は作業スペースが広く、昇降機能が付いているFlexispot E7 Proを利用しています。天板はカーブ型にしています。手の届く範囲が増えるのでお勧めです。

デスクのモニターの高さを調節可能にしています。自分の目線とモニターの良く見る位置が同じ高さになっていてほしいので高さ調整ができるアームにしています。

モニター

JAPAN NEXT WUXGA のモニターがお気に入りです。特徴は縦横比です。

コードを読むときにそれなりの高さがほしいですが、単純にサイズを大きくすると横が長くなり首を振る必要がでてきます。このモニターは24インチ、解像度1980x1200と縦長でコードが読みやすいです。

キーボード

Mistel Barocco MD600 Alpha RGB BT Black(英語配列)を利用しています。キーボードは一日触るので体に負担の掛けないことを意識して選んでいます。肩を痛めない左右分離型でタッチが軽めのキーボードを探していたところ、Mistel Baroccoに行き着きました。

キートップは趣味の麻雀仕様にしています。Vimを使っているのでhjklが東南西北です。ただ、jに突起がついていないため若干使いにくいです。

マウス

Kensington ケンジントン Slimblade Proを利用しています。通常のトラックボールマウスとは異なり、指への負担を軽減する特徴を持っています。ブラウザなどの戻るボタンは右前に配置されており、この位置は非常に使いやすく感じられます。

こだわりのアイテム紹介

iPad Air

iPad Air。ほぼGoodNotesKindle, ラムダノートで利用しています。

GoodNotesはメモアプリで、メモや頭の整理として紙に書く感覚でノートを書けます。

(※ 画像は業務と無関係です)

エンジニアは油断すると物理本により家が埋もれます。KindleやLambda Noteを通じた電子書籍購入のおかげで床抜けの心配から開放されました。ただ、積読が増えてしまうのが難点といえます。

リモートワークでの工夫

家具、色彩

家の中で作業することが多いので、自分の趣味にあったものにこだわっています。具体的にはカフェやホテルのような見た目が好みなので、書斎は木製の素材と観葉植物をふんだんに利用しています。

作業するにあたって、光は重要です。白や青色の光を浴びていると目がすぐに疲れてしまいます。ブラウザやターミナルをダークモードにしたり、間接照明を黄色みがかったオレンジのライトにするなど工夫をしています。

冷凍庫

リモートワーカーは家に籠りがちであるため、食料庫も重要です。大量の冷凍食品、生鮮食品を保存するために冷蔵庫とは別の冷凍庫を購入しています。

今後導入したいもの

先日購入したサンワサプライ ワイヤレスカメラ CMS-V65BKのマイク機能が微妙なため、独立したマイクの購入を検討しています。

土屋さんは、縦長のモニターや分離型キーボードの活用など、身体負担を減らすことを重視した構成が特徴的ですね。さらに、家具、色彩の雰囲気作りが素敵です!

では、最後になりますが秋田さんお願いします!

■ 秋田さん / プロダクト開発部 / フロントエンド ■

Findy(転職サービス)のフロントエンド開発を担当しています、秋田と申します。週1〜2日で出社しており、リモートワークが多めのため作業環境は落ち着く雰囲気を大事にしています。

デスク周り全体

デスクはFlexiSpot昇降式デスクにDIYで作成した天板を載せており、チェアはErgohumanのものを利用しています。座り作業・立ち作業のどちらでも快適に使えるので助かっています。 また、ファインディではオフィスでErgohumanのチェアが利用できるので出社時とリモートで同じチェアが利用できるのは嬉しいポイントです。

マシン

  • 会社貸与 16インチMacBook Pro
  • 私物 12.9インチ iPad Pro

ディスプレイ

ディスプレイはPHILIPSの27インチ4Kディスプレイをメインに利用しつつ、MacBook Pro16インチのディスプレイをサブに利用して開発しています。また、時々iPad Proでメモを取りたい場合があるので手元に置いてあります。

キーボード/マウス

HHKB Professional HYBRID Type-Sにキーキャップをサードパーティのものでカスタマイズしています。メカっぽい色味が気に入ってます。 マウスについてはMacのTrackpadの操作感が好きなので、Magic Trackpadのみで作業をしています。

こだわりのアイテム紹介

ERGOTRON モニターアーム

モニターアームにはERGOTRONのアームを利用しています。昇降デスクのおかげで立ったり座ったりすることが多いためディスプレイの位置は頻繁に調整したくなるのですが、このアームはディスプレイやMacBookの位置を自由自在にスムーズな移動ができるためとても便利です。またシルバーな見た目も気に入っています。

belkin MagSafe 3-in-1 充電器

ガジェットの充電器はbelkinのワイヤレス充電器を利用しています。私はiPhone、Apple Watch、AirPodsなど小型ガジェットにはApple製品を多く使用しているため、この充電器1台で気軽にワイヤレス充電できる点に満足しています。Apple製品を複数お持ちの方におすすめです。

リモートワークでの工夫

作業に集中するときは音楽を流すことが多いので、iPhoneからBluetoothでTEACのUSB DACアンプに接続し、DALIのスピーカーで出力しています。

スピーカーは天井近くに設置しており音が自然に広がるため、部屋のどこにいても違和感なく聴くことができます。スピーカーの位置を工夫するだけで音の響き方が変わり、高音から低音までバランスよく鳴るので気に入ってます。長時間聴いていても耳が疲れにくく気分転換にもなるので、仕事の効率を上げるためにも良い環境を整えたいと考えています。

今後導入したいもの

HHKBのキーボードも気に入っているのですが自作の分割キーボードに興味があり、HHKBの配列に似たChoco607sProあたりで組み立てを検討しています。チーム内にも詳しいメンバーがいるので教えてもらいながら導入したいと考えています。

秋田さんは、DIY(!)で作成した天板を活用した昇降デスクや、オーディオ環境への強いこだわりが印象的でした。スピーカー配置と音響効果の工夫は、作業空間をより快適にするヒントとなりそうですね!

おわりに

3名それぞれが、自分の働き方に合わせて最適な作業環境を整えており、エンジニアがどのように生産性を高めているかが垣間見える内容でした。デスクやデバイスの選定だけでなく、作業の効率化や快適さを追求する工夫が随所に見られ仕事に対する熱意が感じられます。

ファインディでは、さまざまなバックグラウンドを持つエンジニアが活躍しています。技術にこだわり、より良いものを追求する仲間とともに働いてみませんか?

現在、ファインディでは新しいメンバーを募集中です。 興味のある方は、ぜひこちらからチェックしてみてください!

2024 Accelerate State of DevOps Report 概説#4 『Four Keysは解散前夜なのか!"変更失敗率"がグループ離脱?』

こんにちは。ソフトウェアプロセス改善コーチでFindy Tech Blog編集長の高橋(@Taka_bow)です。

2024 DORA Reportについての連載も、今回で最終回です。

今回はDORA Reportの中から、前回取り上げたAI関連以外で個人的に気になったトピックをまとめました。

本記事ではv.2024.3をベースに解説します。なお、執筆時点で日本語版はまだリリースされていませんでした。また、正誤表を確認しなるべく最新の情報を参照するように努めました。
DORA Reportのライセンスは次の通りです。
“Accelerate State of DevOps 2024” by Google LLC is licensed under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)

なお、DORA Report原文はGoogle Cloudのこちらのページからダウンロードできるので、ぜひ一次情報に触れてみてください。

Software delivery performance

DORAは、ソフトウェアデリバリープロセスのアウトカムを効果的に測定する手法として、4つの重要指標(Four Keys)と呼ばれるソフトウェアデリバリーの指標を継続的に検証してきたことは御存知の通りです。

2024 DORA Reportの結論としては、

最高パフォーマンスのチームは、Four Keys(変更リードタイム、デプロイ頻度、デプロイ失敗時の復旧までの時間、変更失敗率)すべてで優れた結果を出している一方、最低パフォーマンスのチームはこれらFour Keysすべてで低い結果となっています。

パフォーマンスの高低は業種に関係なく、あらゆる産業分野のチームが各パフォーマンスグループに存在しています。(p6)

と、いつも通りです。

しかし、パフォーマンスレベル表が提示される直前、次のような注目すべき一文が添えられていました。

私たちは、前年のクラスター分析との一貫性を保つため元の4つのソフトウェアデリバリー指標に対してクラスター分析を実施しました。(p13)

「一貫性を保つため」とはどういう事でしょうか?

実は、今回のレポートでDORAはソフトウェアデリバリーパフォーマンスの測定指標を再定義しています。 DORAはこの変更を「Evolving(進化)」と表現しています。

本当に優れたチームとは「Eliteな改善」を実現するチーム

まず、この新しい指標の説明に入る前にFour Keysベースの、いつものクラスター分析の結果を見てみましょう。

【2024 パフォーマンス指標】

指標 Elite High Medium Low
Deployment frequency オンデマンド(1日複数回) 1日1回以上週1回未満 週1回以上月1回未満 月1回以上6ヶ月に1回未満
Change lead time 1日未満 1日以上週1回未満 1週間以上1ヶ月未満 1ヶ月以上6ヶ月未満
Failed deployment recovery time 1時間未満 1日未満 1日未満 1週間以上1ヶ月未満
Change failure rate 5% 20% 10% 40%
全回答者に占める割合 19%(18-20%) 22%(21-23%) 35%(33-36%) 25%(23-26%)

*89% 信頼区間

集計では、Change failure rate (変更失敗率)に特異な傾向が見られます。 この特徴は次のグラフを見るとより明確です。

Figure 1. Software delivery performance levels

なんと、変更失敗率のHighレベルとMediumレベルが逆転しているのです。

私は、この決定をDORAからの強いメッセージと捉えました。それは、次の解説に表れています。

私たちは、より高速なチームを「High パフォーマー」、より遅いが安定しているチームを「Medium パフォーマー」と呼ぶことにしました。この決定は、これらのパフォーマンスレベルを使用する際の潜在的な落とし穴の一つを浮き彫りにしています。つまり、特定のパフォーマンスレベルに到達することよりも、改善を続けることの方がチームにとって重要であるという点です。

本当に優れたチームとは、「Eliteなパフォーマンス」を達成するチームではなく、「Eliteな改善(elite improvement)」を実現するチームなのです。(p14)

「パフォーマンスレベルを上げましょう」「Eliteを目指しましょう」といったスローガンは、本質的な目的を見失わせる危険性をはらんでいます。真に重要なのは、品質とスピードを同時に追求するマインドです。この両立を実現するためには継続的な改善活動が不可欠だと言えます。

さて、変更失敗率ですがDORA Reportの歴史においては当初から予測しづらい異質な指標として認識されてきました(第2回のブログで触れています)。

2024年でもその影響が現れてしまったわけですが、一方で、DORAは変更失敗率に関して大きな実験をしています。それは、変更失敗率に関するアンケートの質問の追加と、新たな計測指標の仮説検証です。

私たちは、変更失敗率という指標がチームに求められる手戻り作業量の代替指標として機能するという長年の仮説を持っています。デリバリーが失敗すると、チームはその変更を修正する必要があり、おそらく別の変更(修正コミット)を加えることになります。

この理論を検証するため、今年はアプリケーションの手戻り率に関する別の質問を追加しました。

「あなたが主に担当しているアプリケーションやサービスにおいて、過去6ヶ月間に計画されていなかったものの、アプリケーション内のユーザーに影響するバグに対処するために実施されたデプロイは約何回ありましたか?」

私たちのデータ分析により、手戻りと変更失敗率が関連しているという仮説が確認されました。(p11)

「手戻り率」の登場

そこでDORAは、長年の仮説であった「手戻り率」を追加することにしました。 しかし、具体的にどう影響を与えているのかの明確なデータは提示されていません(「仮説が確認された」という明言のみ)。

従来のFour Keysとの関係を整理すると次のようになります。

p11 の表を元に筆者が作成

ポイントは、ソフトウェアデリバリーに関連するメトリクスを「スループット」と「安定性」を明確に分けたことだと思います。(個人的には「デプロイ失敗時の復旧までの時間」は「安定性」を測る指標だと思っていましたが、今回は明確に「スループット」であると提案されました。)

つまり、指標として不安定な「変更失敗率」は新たな「手戻り率」というパートナーを迎え、新ユニットを結成したのです。

従来所属していたグループ「Four Keys」(変更リードタイム、デプロイ頻度、デプロイ失敗時の復旧までの時間、変更失敗率の4つの主要メトリクス)に籍を置くものの、メンバー同士の関係性は変わった……と言ったところでしょうか。

今後の関係性も含め継続的な分析を期待したいところです。私達も実験してみる必要性を感じています。

Reliability(信頼性)は引退?

なお、今回のDORA Reportではパフォーマンス指標としてのReliability(信頼性)についての言及は限定的であり、「A decade with DORA(DORAと共に過ごした10年)」という章で少し紹介されただけでした。

Reliability(信頼性)はこのままひっそりと引退するのか、それとも重要な指標として再評価されるか、今後も注目していきたいと思います。

なお、あくまでソフトウェアデリバリーパフォーマンスの指標として有意なのか?という視点の話であって、信頼性が重要なメトリクスであることには変わりないことを申し添えておきます。

Platform engineering

2024 DORA Reportは、基本的にソフトウェアデリバリーに焦点を当てたレポートですが、今回はプラットフォームエンジニアリングについてかなりの紙面を割いています。このレポートでは、プラットフォームの活用が、ソフトウェアのデリバリーと運用面のパフォーマンスにどのように関係しているのかを詳細に検証しています。

プラットフォームエンジニアリングとパフォーマンスの関係

まだ日本国内では聞き慣れない言葉かもしれませんので、最初にプラットフォームエンジニアリングの解説をしておきます。

ご存じの方は読み飛ばしてください。

【プラットフォームエンジニアリングとは】 プラットフォームエンジニアリングとは、近年、クラウドネイティブ技術の進化により、開発環境が複雑化し、開発者がインフラ管理に時間を取られる課題が浮上しています。プラットフォームエンジニアリングは、この問題を解決するために、開発者向けのセルフサービス型プラットフォームを構築し、生産性を向上させる手法 です。

この考え方は Team Topologies における Platform Team の役割と密接に関係しています。Team Topologies では、開発チーム(Stream-aligned Team)が機能開発に集中できるよう、Platform Team がインフラ管理を抽象化し、共通の開発基盤を提供することを推奨しています。Spotify の Backstage は、Internal Developer Platform(IDP)を構成する要素の一つであり、主に開発者向けのポータル(Dev Portal)として機能します。IDP には、インフラのセルフサービスプロビジョニングや CI/CD の統合など、より広範な機能が含まれる場合があります。

プラットフォームエンジニアリングを支える重要な技術の1つが Infrastructure as Code(IaC) であり、その実現において重要な役割を果たすのが Terraform です(他に、Pulumi や Crossplane などのツールも選択肢として存在します)。Terraform を活用することで、開発者がセルフサービスでインフラをプロビジョニングできる環境 を整えることが可能になります。例えば、Terraformモジュールを用意することで、開発者は簡単な設定だけでクラウドリソースを構築でき、インフラ管理の負担が軽減されます。

プラットフォームエンジニアリングは単なるツール導入ではなく、組織文化やプロセスの改善も含めた包括的な戦略 です。適切なツールを導入するだけではなく、開発者のニーズを把握し、継続的にフィードバックを反映させる仕組みが求められます。チームが「本来やるべき仕事」に集中できる環境を整えることで、ソフトウェアの提供速度を向上させ、ビジネスの成長にも貢献します。

Internal Developer Platform(IDP)を利用している開発者は、次のような結果が分かったそうです。いくつかのポジティブな結果と共に、欠点も見えています。

ポジティブ ネガティブ
個人の生産性が8%向上 スループットが8%低下
チームのパフォーマンスが10%向上 変更の安定性が14%低下
組織全体のソフトウェアデリバリーおよび運用のパフォーマンスが6%向上

プラットフォームエンジニアリングがもたらす可能性

プラットフォームの使用期間と生産性*1の関係を見ると、プラットフォームエンジニアリングの取り組み開始時に初期の成果が得られ、その後プラットフォームが年数を重ね成熟するにつれて一旦低下し、その後回復するというパターンが見られました。

このパターンは、変革の取り組みにおいてよく見られるもので、初期の成果を上げた後に困難に直面するケースを指します。しかし、長期的には生産性の向上が維持されており、ソフトウェアデリバリーと運用プロセスにおける内部開発者プラットフォームの重要性とその潜在的な価値を示しています。

意外な落とし穴

上記で書いた通り、スループットの8%低下や変更の安定性の14%低下といった欠点も確認されています。DORAとしても明確な分析はできておらず、次のような仮説を提示しています。

# 仮説 詳細
1 プロセスの複雑化 コードが本番環境に到達するまでの「引き継ぎ」段階が増え、各段階で時間が追加される
2 プラットフォーム強制利用の問題 アプリ開発の全工程でプラットフォームの使用が義務付けられる場合、さらに6%のスループット低下
3 実験の促進 プラットフォームが開発者に変更を自信を持って行う環境を提供し、より多くの変更を可能にする
4 品質保証の課題 プラットフォームが変更の品質を十分に保証できていない、またはチームがスループットを優先して自動テスト機能を活用していない

また、プラットフォームエンジニアリングとバーンアウト*2の関係性に関する調査では、変更の不安定性とプラットフォーム利用の組み合わせによってバーンアウトリスクが高まることが明らかになりました。

この興味深い関連性について、DORAは3つの仮説シナリオを提示していますが、本ブログで取り上げるのは止めます。詳しく知りたい方は原著をお読みください。

プラットフォームエンジニアリングの章は全体的に具体性が欠けており、個人的には科学的ではないと感じた章です。

今後の研究成果に期待したいと思います。

Developer experience

2024 DORA Reportでは、デベロッパーエクスペリエンス*3(以降、DevEx)に関して多くの誌面を割いています。このセクションでは、DevExが組織の成功に直結するという重要な発見と、それを改善するための具体的な方法について掘り下げています。

AIの時代においても、最終的にソフトウェアを構築するのは人間です。DevExがいかに製品品質と組織のパフォーマンスに影響するのか、DORAレポートに基づいて解説します。

なお、私は以前DevExの科学的な研究について解説したブログを書いておりますので、合わせてお読み頂ければと思います。

ユーザー中心の開発がDevExを向上させる

レポートでは、DevExを向上させるにはまず、エンドユーザーエクスペリエンス(UX)を向上させることが重要であるという点が強調されています。エンドユーザーのニーズを深く理解し、それを開発プロセスの中核に据える組織では、開発者の生産性が向上するとともに、組織全体の成長が促進されることが調査で示されています。

ユーザーのニーズを軸に開発を行うことで、開発者の仕事の満足度が高まり、結果的に組織全体のパフォーマンス向上につながる可能性があります。ユーザー中心(User-Centric)のマインドセットを実践している開発者には、次のような特徴が見られます。

  • より高い生産性を発揮する(目的意識が明確になり、不要な作業が減る
  • バーンアウトのリスクが低下する(仕事の意義を感じやすく、ストレスが軽減される
  • より高品質な製品を生み出す(ユーザーの課題に直結したソリューションを提供できる

また、ユーザーエクスペリエンス(UX)を最優先する組織では、ソフトウェアデリバリーの安定性やスループットが必ずしも品質の前提条件とはならないという点が指摘されています。 その理由として、最終的な製品の品質は「迅速なデリバリー」ではなく、「ユーザーにとっての価値」によって決まる可能性があるからです。

このレポートの知見を踏まえると、ユーザー価値の創出に組織的に取り組むことの重要性が浮かび上がります。ファインディでは幸いなことに、専門のデザインチームがありエンジニアと共にユーザーエクスペリエンス(UX)に力を入れているため、この課題への取り組みはすでに進んでいると言えるでしょう。今後もさらなる進化を目指して努力を続けていきたいです。

一方で、ユーザーフィードバックを十分に取り入れない組織では、安定したデリバリー速度が品質を確保する唯一の手段になりがちであるとも述べられています。

これは本来「ユーザー価値の創出」が目的であるべきところ、「安定したデリバリー」という手段が目的化してしまう典型的な例といえるでしょう。その結果、ユーザーの実際のニーズとはズレた機能や、見た目は魅力的でも実際にはほとんど使われない機能("shiny but hardly used")が生まれるリスクが高まるという考察がされています。

最終的な目標は、私たちが作る製品をユーザーに愛してもらうことです。「デベロッパーエクスペリエンス」の章で述べているように、ユーザーに焦点を当てることで、製品の機能に存在意義が生まれます。開発者は、これらの機能がユーザーエクスペリエンスの向上に役立つことを確信して、自信を持って開発を進めることができます。(p73)

これは非常に興味深い考察です。シンプルに言い換えれば「エンジニアもお客様の喜ぶ顔を見れば生産性は上がり組織も成長する」ということなので、商売の基本みたいな話だなと思いました。

質の高いドキュメントがユーザー中心開発を増幅する

2021年からドキュメントの調査を開始したDORAですが、2024年のレポートでは、質の高いドキュメントとユーザー中心のアプローチを組み合わせると、製品パフォーマンスが向上することが明らかになりました。

質の高いドキュメントの評価には、内容の見つけやすさや信頼性といった要素が含まれます。

DORAは、アジャイルマニフェスト(アジャイルソフトウェア開発宣言)を引用して次のように述べています。

アジャイルマニフェストは「包括的なドキュメントよりも動くソフトウェアを」*4を提唱しています。しかし、私たちは依然として、質の高いドキュメントが動くソフトウェアの重要な構成要素であることを認識しています。「包括的なドキュメント」という表現は、ドキュメントを含む不健全な慣行を表しているのかもしれません。

問題のあるドキュメントには、官僚的な目的だけのために作成されたドキュメントや、経営陣と従業員の間の不信感を取り繕うためのドキュメントが含まれます。不健全なドキュメント文化には、ドキュメントを作成するものの、維持や整理を行わないことも含まれます。

アジャイルマニフェストが宣言された2001年頃は、「ドキュメント作成に時間を取られすぎる問題」が開発現場の切実な課題でした。

アジャイルソフトウェア開発宣言

当時の多くの開発では詳細な仕様書作成が前提とされ、要件変更が発生するたびに仕様書の修正に追われ、実際の開発よりもドキュメント管理に多大な時間を費やしていました。大量の紙にプリントして製本、そのドキュメントを納品、といった風習もまだ残っていた時代です。

また、現代に生きる私たちは忘れがちですが、2001年頃の技術的な制約も大きく影響していました。

ツールはWordやWiki、Lotus Notes/Domino*5が主流でしたが、当時のツールはバージョン管理機能が貧弱で、複数人での同時編集が不可能、変更履歴の追跡も困難でした。

また、大きなドキュメントは頻繁にクラッシュし、図や表の扱いも現在より遥かに制限されていました。さらに、ストレージは現在と比べて容量が小さく高価であり、ネットワーク速度も遅いという環境でした。

一方、クラウド中心の現代ではNotionやConfluence、GitHub Wikiなど、協働作業に適したドキュメント管理ツールが普及し、リアルタイム共同編集や変更履歴の自動管理が当たり前となっています。

DORAレポートによれば、現代におけるドキュメントの役割は「ユーザーの声やフィードバックをチーム全体に共有し、それを製品に反映させる」という、より価値創造に直結したものへと進化しています。

DORAレポートは、健全なドキュメント文化を構築するための具体的な実践方法も提示しています:

  • 重要なユースケースの文書化
  • テクニカルライティングの研修
  • 明確な責任者と更新プロセスの定義
  • チーム内でのドキュメント作業の分担
  • 開発ライフサイクルの一部としてのドキュメント維持
  • 古いドキュメントの削除
  • 業績評価における文書作成貢献の認識

さらに、詳しく知りたい方は原著をお読みください。

常に変わる優先事項の危険性

DORAの調査で最も注目すべき発見の1つは、組織の優先事項が頻繁に変わることによる悪影響です。

エンジニアであれば直感的に「危険」と思える現象です。

この感覚は誰もが経験したことがあるでしょう。数か月かけて新しい機能の開発に取り組んできて、それがユーザーにとって必要なものであると確信し、集中し、モチベーションも高い状態です。ところが、突然、あるいは突然のように感じるほど急に、経営陣が組織の優先事項を変更します。すると、あなたのプロジェクトが一時停止されるのか、中止されるのか、別の形に変わるのか、それとも全く違うものになるのかが分からなくなります。

データによれば、優先事項が不安定な組織では、

  • 生産性に小さいながらも確実な低下が見られる
  • バーンアウトが大幅に増加する

興味深いことに、強力なリーダーシップや質の高いドキュメント、ユーザー中心のアプローチがあっても、優先事項が不安定であれば従業員はバーンアウトのリスクにさらされ続けることが明らかになりました。DORAは、これが慢性的なストレスによるものと推測しています。

一方で興味深いことに、優先事項が安定すると、逆にソフトウェアデリバリーのスピードと安定性が低下するという予想外の結果も報告されています。これについてDORAは、安定した組織では変更が少なくなるか、推奨されるよりも大きなバッチでの出荷が行われるためではないかと仮説を立てています。

おわりに

さて、全4回にわたってお届けしたDORAレポートに関するブログも一旦終わりにし、2025年のDORAレポートを待ちたいと思います。

皆様におかれましてはDORAレポートを参考にしながら、ぜひ自組織についての仮説や理論を組み立てるのに役立ててください。独自の実験に取り組むことで、より実践的な知見が得られるでしょう。

今回のブログを書きながら改めて感じたのは、ソフトウェア開発の複雑さです。

クネビン(Cynefin)フレームワークで例えると「Complicated」ではなく、「Complex」の領域に位置します。

Tom@thomasbcox.com, CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0>, via Wikimedia Commons

領域 特徴 対応方法
明確(Clear) 因果関係が明確であり、誰が見ても同じ答えが得られる領域。ルールやベストプラクティスが効果的。(2014年までは単純(simple)、その後明白(obvious)と呼ばれ、最近の名称に変更) 「分類し、対応する」(Sense — Categorize — Respond) マニュアル化された業務、明確な手順がある問題
煩雑(Complicated) 因果関係が理解できるが、専門知識や分析が必要。答えが複数存在する可能性もある。理論的に解決可能。 「分析し、対応する」(Sense — Analyze — Respond) エンジニアリング、法律の専門的問題、データ分析が必要な業務
複雑(Complex) 因果関係が曖昧で、試行錯誤を通じてパターンが見えてくる。予測が困難で、正しい答えが最初からわからない。 「試し、理解し、対応する」(Probe — Sense — Respond) 新製品開発、文化変革プロジェクト、組織変革
混沌(Chaotic) 因果関係がなく、予測不可能な状況。迅速な介入が必要で、秩序を取り戻すことが優先される。 「即座に行動し、理解し、対応する」(Act — Sense — Respond) 自然災害、事故発生直後の対応、緊急事態
混乱(Confusion) どの領域にも属さない、または適用領域が不確かな状況。複数の視点が入り乱れ、争いが発生することも。 状況を分解し、他の4領域に割り当てることで解決の糸口を見つける 情報が混乱していて、どの領域に該当するか判断が難しい場合

様々な要因が絡み合いComplexになりやすいソフトウェア開発ですが、パターンは存在します。

まず「試し、理解し、対応する」(Probe — Sense — Respond)というアプローチで小さな実験を繰り返し、そこから学んでいく。この積み重ねが、ソフトウェア開発では大事なのだと、改めてDORAレポートを熟読して実感しました。

そして、この複雑さ(Complexity)こそが、ソフトウェア開発の魅力であり、日々新たな発見と創造の喜びをもたらしてくれるのだと実感しています。


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

herp.careers

*1:DORAの生産性(Productivity)の定義:個人が自身の仕事において、どれだけ効果的かつ効率的であると感じているか、価値を生み出し、タスクを達成できているかを測るもの。

*2:バーンアウト(Burnout)とは、長期間のストレスや過重な業務負担によって、心身ともに疲弊し、モチベーションや集中力が低下する状態を指します。特にソフトウェアエンジニアのように、高い認知負荷や締切に追われる職種では発生しやすく、「燃え尽き症候群」とも呼ばれます。主な症状には、慢性的な疲労、仕事への意欲の低下、感情の枯渇などがあり、生産性の低下や離職の要因にもなります。DORAは10年に渡り、このようなバーンアウトのリスクを考慮した調査を数多く実施しています。

*3:私は頑なに「開発者体験」とは訳しません。正しいニュアンスを伝えるなら「開発者が快適かつ効果的に働ける環境全般」とするべきで、でもこれだと面倒なのでそのままの言葉で良いかなと思っています。

*4:「包括的なドキュメントよりも使い物になるソフトウェアを」と訳したほうが良い説を支持しています。 https://x.com/t_wada/status/1848630196775346294

*5:Lotus Notes/Dominoとは、IBMが1995年にLotus Development社を買収して獲得した企業向けグループウェア・情報共有プラットフォームです。1990年代から2000年代初頭にかけて多くの企業で導入され、メール、カレンダー、文書管理、ワークフロー機能などを統合した先進的なシステムでしたが、操作の複雑さやカスタマイズの難しさも指摘されていました。

1年間で80記事をリリースしてきたテックブログ運営から見えてきたもの

こんにちは、ファインディ CTOの佐藤(@ma3tk)です! ちょうどテックブログを始めて1年経ちましたので、今回はその振り返りと今後の方針についてお話します。結論としては、テックブログを始めて良かったと思います。

テックブログを始めるのは簡単です。そんな中で推進して継続することが大変でしたが、ファインディのエンジニア組織にとってポジティブな側面が多くありました。

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

なぜテックブログを始めたのか

我々ファインディは2024年2月にテックブログを始め、ちょうど1年が経過しました。

実は昔からテックブログは始めたい気持ちがあったものの、次の点で躊躇していました。

  • テックブログが途切れることで逆にエンジニア組織が微妙に見えてしまう可能性
  • 推進する人が少なく、やりたいと言ってくれる人が多くなかった

エンジニアリングとして高いレベルでプロダクト開発が行えているものの、個人のnoteの発信だけでは不十分で、組織的に技術広報をする必要があることを2023年に認識しました。

そして日々の目標設定をする上で、エンジニア個人でも実は「発信をして採用や技術広報にトライしたい」という意欲の高いメンバーが多かったことも相まりました。

このテックブログは単なる技術の紹介だけではなく、組織としてのアーキテクチャやツール選択の背景や組織としてのあり方に透明性を持たせて発信をすることを目的としました。

始めてからの実績

テックブログを始める以前の話ですが、カジュアル面談のタイミングでファインディについて「サービスは知っているが、エンジニアがどんなことをしているかはわからない」という声が多くありました。

テックブログを始めて1年で次のような実績になりました。

  • 80記事以上をリリース(週平均1.5記事以上のペース)
  • 延べ282,223人のユーザーにご訪問いただき、1記事あたり平均約3,500アクセス
  • はてなブックマーク合計4,622、1記事あたり平均57はてブ

2025年2月時点での情報ですが、「思っていた以上にアウトプットできた」というのが僕の感想です。

特に反響の大きかった記事などは 2024年ふりかえり!Findy Tech Blogの人気記事まとめ - Findy Tech Blog でまとめておりますのでこちらもご覧ください。

テックブログによって起こった変化

ファインディ応募者にとって理解の助けになった

テックブログを開始してから、カジュアル面談や選考の場で「ブログを読みました」という声を多くいただくようになりました。

実際に入社したメンバーからも「ブログを読んで、ファインディのエンジニア組織の考え方や業務の進め方にマッチすると感じて応募しました」といったポジティブなフィードバックをもらっています。

また、テックブログで過去の意思決定の背景が書いてあることによって、カジュアル面談でもファインディの未来についてお話する時間が多くなり、興味を持っていただける割合が増えたと感じています。

組織の意思決定プロセスや技術選定の背景や取り組みを伝えることで、入社前後のギャップを減らし、互いの期待値をすり合わせることができるようになったと感じています。

一方で、カジュアル面談で「ブログ記事を過去に読んだことがあるかどうか」を聞いても、テックブログの認知ができていないこともあります。まだまだ伸びしろがいっぱいですね。

チーム間の取り組みがよりクリアになった

ブログ執筆をきっかけに、社内のエンジニアが外部イベントでの登壇や技術発信に積極的になるという好循環も生まれました。

社内でチーム間での取り組みを共有していたつもりでしたが、テックブログの記事を公開することで異なるチーム間でのコミュニケーションも活性化し、「他チームがどんな課題に取り組んでいるのか」を知る機会が増えました。

「エンジニアの日常」が読まれることがわかった

予想していなかった効果として、「日常シリーズ」として公開している日々使っているツールや作業デスクなど直接の業務に関係しない記事がヒットしています。

なぜそれほど読まれるのかについては分かりきっていませんが、技術的な内容だけでなく、実際に私たちがどのように働いているかという「日常」を見せることで、どんなメンバーがファインディに関わっているのかの人柄がわかってくるのではないかと思います。

PV数においても、当初の予想を大きく上回る記事が複数あり、これからも様々なエンジニアの「日常」についてシリーズ化して出していきます。

社内でブラッシュアップして社外に記事を出せる

実はテックブログの記事の原案の一部は、社内のナレッジ共有ツールに投稿しています。

まず社内向けの情報共有を行い、その記事をベースに社外に向けてテックブログに公開するという流れも徐々に確立されつつあります。

社内では多少荒削りな内容でも投稿して言語化の強化を進め、そこでの反応を見ながら外部に発信したい記事を選定・ブラッシュアップすることで、効率的なコンテンツ作成フローになります。

テックブログを進める上で意識したこと

記事作成プロセスを初期から整えた

1年間の運営を通して、効率的な記事作成プロセスに仕上げることができましたが、初期は失敗が多くありました。

例えば、記事の方向性を揃えずに一気に書き上げてしまって、テックブログの方向性からズレてしまうことがあり、差し戻し・手戻りも何度か発生しました。テックブログとしていいものに仕上げたいこともあり、しっかりレビューをしてきました。

  1. 執筆前にサマリを箇条書きで提出し、方向性のレビューを実施することで手戻りを防ぐ
  2. 編集長やCTOが中心となり、記事内容をレビュー(ファインディ社として出すべき記事になっているかの詳細の確認)
  3. 運用会議や目標設定により、全員で継続的なコミット・スケジュールを確保する

上述の流れによってなるべく執筆者に差し戻しや多数のコメントがつかない状況を作りました。合わせて、技術的な内容だけでなく「なぜその技術を選んだのか」「どのような議論があったのか」という背景情報を必ず含めることで、単なる技術ブログではなく、組織としての考え方を伝えられるコンテンツになりました。

執筆者の思いや背景を盛り込んでもらう

これまで、執筆者の思いを積極的に取り入れた記事に仕上げることに注力してきました。「どんな記事を書きたいか」「どんな情報を発信したいか」をエンジニア自身から引き出すことで、意思決定の背景を理解できる記事が増えてきました。

また、技術解説と組織文化の両立を意識し、「技術的に面白いだけ」「組織論だけ」に偏らないバランスを取ることも重視しました。

定期的な運用会議での振り返りと、四半期ごとの目標設定により、一時的なブームで終わらない継続的な取り組みになりました。

2年目に向けた新しい取り組み

2年目では、これまでの技術領域に加えて、次のようなテーマにも挑戦していきたいと考えています。

  • 生成AIの活用事例と開発プロセスへの統合の発信
  • エンジニア組織のマネジメント方針と成長支援の仕組み
  • エンジニアの日常シリーズの拡張

などについてもトライしていきます。

その他にも、グローバル展開に合わせた英語での情報発信として、日本語記事の英語翻訳や英語でのオリジナル記事の作成などもトライしていく予定です。

より一層「働いてみたい」「技術の使い方で参考になった」と思っていただけるように、テックブログでファインディのエンジニア組織のリアルと技術を伝えていきます。

2年目も昨年と変わらない70記事を当たり前に公開し、様々な種類の記事に挑戦することで今まで以上に読んでもらえるテックブログへと進化させます。

おわりに

この1年間、多くの方にテックブログを読んでいただき、本当にありがとうございました。

これからも、単なる技術情報の発信にとどまらず、ファインディのエンジニア組織の考え方や文化、そして目指す未来を共有していきます。

「こういうチームで働いてみたい」「この組織と一緒に成長したい」と思っていただける方がいれば、ぜひカジュアル面談などでお話しできれば嬉しいです。

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

herp.careers

これからも、より良いプロダクトと組織を一緒に作っていける仲間を待っています。

AIエンジニアDevinを用いたデータ分析の可能性を探る:Wine Qualityデータセットで検証

はじめまして、データサイエンティストのだーさん (@Dakuon_Findy) です。2025年の1月よりファインディのプロダクトマネジメント室 GenAIイネーブルメントチームにデータサイエンティストとして参画しております。このチームはLLMを活用した各種プロダクトの強化や内部の業務オペレーションを改善するチームです。

近年、GitHub Copilotをはじめとしてソフトウェア開発へのLLM導入が進む中で、Cognition社が開発したDevinというAIエンジニアが注目を集めています。Devinは、指示に応じてコードを自動生成し、PR作成や修正提案までこなす自律型AIです。

現在、Findy開発チームにおいてフロントエンド開発の支援にDevinを活用していますが、データサイエンティストとしてはデータ分析におけるDevinの力も気になるところです。

そこで、本記事ではWine Qualityデータセットを用いて、Devinに探索的データ分析 (EDA) を実施させた実験の結果を紹介します。Devinはデータをどのように解析し、どんな洞察を導き出したのか? そして実際に使ってみて感じた強みや課題とは?AIを活用したデータ分析の可能性を一緒に探っていきましょう。

ファインディ社内での活用状況

現在Findy開発チームではフロンエンド業務に対するDevinのオンボーディングが進んでおり、オンボーディング初期の4日間で26件のPRを作成し、そのうちの20件がマージされるという結果を出しています。

実際に使用したメンバーに感想を尋ねたところ、どのPRもジュニアレベルの内容で、微修正のみで済んだPRが4割、それを踏まえてプロンプトを調整した結果、2割が承認のみで十分なPRとなり、残り4割はある程度の修正が必要だったとのことです。

4割には依然として伸びしろはあるものの、「ミドル〜シニアエンジニアの業務の中で発生したジュニアレベルの作業をDevinに任せることで、ミドル〜シニアエンジニアの時間をより高度な作業に充てることができる」というメリットがあるように個人的には感じています。

詳細は別の機会により詳しい記事を掲載する予定ですので、続報をお待ちください。

DevinにWine QualityデータセットのEDAをやらせてみた

実験の概要

データ分析には前処理、可視化、モデリングなど多くの工程がありますが、今回はデータ分析の最初のステップとなるEDA(Exploratory Data Analysis)でDevinを試しました。1

EDAとは「データの傾向や特徴をざっくりと掴むための分析」です。機械学習のモデルを作る前に「このデータにはどんなパターンがあるのか?」「おかしなデータ (異常値) はないか?」といったことをグラフや統計量を使って可視化し、「このデータで本当に良いモデルが作れそうか?」を見極め、「もし作るならばどのようにすればよいか?」を探るために行います。

データにはWine Qualityというワインの品質に関するデータセットを使いました。

Cortez, P., Cerdeira, A., Almeida, F., Matos, T., & Reis, J. (2009). Wine Quality [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C56S3T.

データサイエンスの分野では初学者の学習目的でよく利用されるデータセットがあります。Wine Qualityデータセットもその1つで、赤ワインと白ワインの品質に関するデータが含まれています。ワインのアルコール度数や糖分などの成分と、品質スコア (0〜10点) が記録されています。成分の情報から機械学習モデルを作り、品質を予測できるか?などを試すことができるデータセットです。

実験の手法

まずDevinにWine QualityデータセットをUC Irvine Machine Learning Repositoryからダウンロードするように指示を出しました。

Devinへの指示

Devinにはこの画像のようにSlack経由で指示を出すことができます。DevinにSlack経由で開発を任せる際のざっくりとした流れは次の通りです。

  1. SlackからDevinに指示を出す
  2. Devinが指示を受けて自動でコードを生成し、GitHubにPRを作成する
  3. DevinからPRを作成した旨通知が来る
  4. ユーザがレビューし必要なら修正する。LGTMならmainブランチにマージする
  5. 1〜4を繰り返し、開発を進める
  6. 作業が終わったら、DevinにSLEEPコマンドを送り、休止させる
  7. 休止後にDevinがここまでの指示をもとにナレッジを提案し、ユーザはそれを採用するかどうかを選択したり文言を変更したりする

7で採用するナレッジによりある程度Devinの行動をコントロールできます。私が事前の実験で与えたデータ分析に関するナレッジは次の3点のみで、それ以外はほとんど指示していません。データのダウンロードほか残りの作業はDevinが自律的に判断し行いました。

  1. PRやSlackのやりとりは日本語で行うこと
  2. 図のキャプションなどは日本語で書くこと (事前にIPAexフォントをDevinに与えています)
  3. 図示のカラーパレットにはviridisを使うこと

結果の考察

こちらがEDAの結果の抜粋です。実際にDevinが書いたコードの詳細はリンク先のPRで確認でき、作業後にDevinが書いたEDA結果の考察や今後の課題はリンク先のIssueに記載されています。2

EDAの結果

個人的な感想ではありますが、未知のデータに対するEDAであり人間による詳細な指示を加えていないことを踏まえると、非常に良い結果が得られていると感じました。

特に作業後に書かせたIssueには、どのデータをどの表現形式で図示するかといった意図や、EDAの結果わかったデータの特徴、次のステップについての提案が書かれていました。

今回はあえて白ワインと赤ワインを分けずにデータを取ってくるよう指示を出したのですが、Devinは可視化の際にワインの種類を意識して1つの図に分布をまとめて表示することで特徴量の分布の違いを比較しやすくしていました。結果としてデータ数の不均衡や品質に影響を与える特徴量の違いを把握できており、次のステップとして赤ワインと白ワインを分けた分析・モデリングを提案するなど、適切なデータ分析に基づく判断ができていると感じました。

今回の実験で感じたDevinの伸びしろは次の2点です。いずれも修正するよう依頼するとすぐに修正され、ナレッジにも追加されたため今後は改善される可能性があります。

  1. 特に初回の可視化において日本語フォントが正しく設定されていない図を作成することがある
    修正依頼の図
    今回の実験で新たに追加されたナレッジ
    ナレッジへの追加
  2. 作成した図をコミットしたりSlackに送付したりせず、ユーザが確認できないことがある
    結果をGitHubにpushするよう依頼
    それに対するDevinの返答
    • 実験段階ではSlackに画像が直接添付されることもあったため、ナレッジを追加すれば改善できそうです。
    • 事前実験でcsv等のローデータはGitHubにアップロードしないように指示しており (ライセンスの問題等を孕むため)、ローデータが推測できる図版もGitHubにpushすべきでないとDevinが判断した可能性もあります。

まとめ

Devinの活用はまだ発展途上ですが、データ分析の新しいアプローチを試す機会にもなります。

GenAIチームは、上記のように生成AI技術による技術検証を行ったり、プロダクト実装も担い全社において生成AI利活用を推進するチームです。 こうした取り組みから、プロダクトのエンハンスと事業成長に貢献することを目指しています。我々の取り組みに興味を持っていただいた方は、是非一度カジュアル面談でお話しましょう!


  1. これは初めての実験ではありません。寺本さんの記事を拝読していたところ、secretsに近い文字列をpushしてしまうというセキュリティリスクが存在することがわかっていたため、この記事を書く前に何度か実験とセキュリティに関する注意事項を提示し、セキュリティに対するナレッジをある程度学習させてから記事を書いています。セキュリティに関してはどうやら徐々にアップデートされているような記事も寺本さんより出ていますので今後の動向を注視したいところです。
  2. PRやIssueに記載されていたDevinの実行リンクを公開に際して削除している都合でPRがeditされていますが、実行リンクの削除以外の変更はありません。

Findyの爆速成長を支えるエンジニア教育メソッド ~ 育成ノウハウの一部を初公開 ~

こんにちは。

ファインディ で Tech Lead をやらせてもらってる戸田です。

弊社では沢山のエンジニアがJOINしてくれておりますが、2年ほど前から「成長が期待ができる」エンジニアの採用もするようになりました。

そのため、エンジニアの教育についても様々な取り組みを行っており、それらの取り組みを明文化してエンジニア教育メソッドとしてドキュメント化を行いました。

そこで今回は、ドキュメント化された弊社のエンジニア教育メソッドの一部を公開したいと思います。

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

教育メソッドの目的

まず教育メソッドを作成した目的について説明します。教育メソッドには次のように定義しました。

- 組織全体の「人数だけではない拡張性」を高める
  - 人数が倍になったら全体のアウトプット数が3倍になるような組織を目指す
- チーム内だけで継続して育成することができるようになる

ありがたいことに直近数年の弊社のエンジニア採用は順調に進んでおり、フルタイムだけで50人を超える規模になりました。

しかし、増えた人数に対して組織全体のアウトプット数が思ったよりも伸び切らないという悩みも出てきました。

伸び悩んでいた背景に、急激に人数が増える中でエンジニア達に対するサポートが追いついていないということがありました。これまでにない成長をしてきた我々にとって新しい課題でした。

当時は開発組織全体を見ている自分が特定のチームに一時的に入ってサポートすることで対応していましたが、これでは人数が増えてもスケールしづらいという課題が出てきました。1人で見ることが出来る人数には限界があるからです。

そこで自分が直接サポートする必要がないように、各チーム内で継続して育成するための指標、教科書としての教育メソッドを作成することになりました。

教育メソッドの一部を紹介

目の前のことに集中

- 記載されている教育メソッドの中で、一番重要なのがこれ
- 他のことに目移りしているエンジニアが伸び悩む
  - 伸びる理由は人それぞれだが、弊社の環境で伸び悩んでいたエンジニアの全員に共通していたのがこれ
- 目の前の一つのことに集中するように促す
  - 一定の等級以上に上がるまでは、問い合わせ対応や障害調査からは外し、与えられたタスクに集中してもらう
  - やることが無いのであれば、やることを一緒に探して考える
    - コードを一緒に追っていけば、小さなリファクタやテスト追加など必ず何か見つかる
    - 一緒に探して考えることが重要
  - 「やりたいこと」ではなく「やるべきこと」に集中してもらう

作成した教育メソッドの中での最重要項目となっています。

inputした内容以上のoutputは出ないと考えており、まずinputを優先してもらうためにも重要な内容と言えるでしょう。

新しい環境が目新しく映り、やりたいことが沢山出てきたり、色々なことに興味が出るのは当然のことです。しかし1つのことを集中してやり切ることが出来なければ、他のことを並行してやり切ることは難しいのです。

そのため一定以上の等級、レベル感に上がるまでは、とにかく目の前のタスクだけに集中してもらうように促しています。

やりたいことをやらせてあげたい気持ちはありますが、まずは目の前の「やるべきこと」に集中してもらうことが重要です。

色々なことを一度に叩き込むのではなく、段階を踏んで1個ずつ確実に覚えていく

#### 3段階に分けて確実に覚えていく
- 基礎
  - スキルマップを参照
- 手数
  - 小さい修正内容でいいので、適切な粒度でPull requestを沢山作る
  - 量は質に転化する
- 質と理解
  - 正しいコードを理解して利用する
  - Pull requestでコメントを貰うことは問題ではない
    - 問題はコメントの内容
    - セルフレビューで防げるようなことに対してのコメントは質が低い
    - 実装内容やパフォーマンスなど、本質に近いものに対するコメントを貰うことはOK

#### クリアできるところ、つまずくべきところは分けて考える
- セルフレビューで防げる指摘は、技術力や経験に関係なくクリアできるはず
- テストや型定義、非同期処理やPromiseなど、難易度が高くて重要な要素はつまずいても問題ない
  - つまずくべきところでつまずいているかが重要
- 難易度が高いところでのつまずきが増えてきたということは成長している証拠
- 同じ失敗を繰り返さないことが重要

まず

  1. 基礎
  2. 手数
  3. 質と理解

の3段階に分け、段階を踏んで1個ずつ確実に覚えていくようにします。

基礎に関してはエンジニアの職種別にスキルマップを用意しており、自分に必要とされている項目をその都度覚えてもらいます。

手数に関しては、とにかく小さい修正でもいいので適切な粒度でPull requestを作り続け、大量のフィードバックを得るようにします。

量は質に転化すると言われているように、手数が増えれば増えるほど結果的に質と理解が深まっていき、最終的にはスピードが身に付きます。

また、指摘事項が多い場合はPull requestの粒度が大きすぎるケースが多く、そういったケースでは粒度を細かくしてPull requestを作り直してもらいます。一度に100個指摘されて100個覚えるよりも、1個指摘されて1個覚えることを100回繰り返すほうが覚えやすいからです。

この時、クリアできるところ、つまずくべきところは分けて考えています。

例えばlintやtypoでの指摘はセルフレビューである程度防げるはずであり、技術力や経験に関係なくクリアできるはずです。この指摘が多い場合は指導します。

逆にテストコードや型定義など難易度が一定以上高い要素に対する指摘を貰うことは問題ありません。次に同じような指摘をもらわなければ良いのです。

このように一度に全てのことを詰め込んで覚えてもらうのではなく、段階を追って覚えるべきタイミングで1個ずつ覚えてもらうことを重要視しています。

正しい方法を正しい手順で作業する

- 正しい方法と手順を徹底するよう促す
  - 既存コードを変更するならば、まずは該当するテストコードの存在を確認
    - テストが漏れてるなら、まずはテストケースの追加を先に行う
  - etc
- スピードは気にしない
  - まずは正しい方法と正しい手順を身に付ける。そこから手数を増やし、結果的にスピードが身に付く。
  - スピードは後から勝手に付いてくるものであり、最初から求めるべきものではない

開発や業務を進めるうえで、スピードを求める前に正しい方法と手順を覚えることを優先します。

単純な例で言うと、既存実装を変更する際にはまず該当するテストコードの存在を確認し、テストが漏れている場合はテストケースの追加を先に行います。

正しい方法と手順に拘る理由は2点あります。

1つ目は本当の意味で理解するためです。正しい方法と手順には必ず理由と意味があり、それらを理解して作業を行うことで何故その作業が必要なのかを理解することに繋がります。

2つ目は結果的に最速になるのが正しい方法と手順だからです。一見遠回りに見える時もあるかもしれませんが、開発サイクルを回す上で結果的に一番速く効率的な方法と手順が身に付くようになります。

教育メソッドをより良いものにしていく

ドキュメント化された教育メソッドはGitHub上で管理されており、弊社エンジニアであれば誰でも閲覧して、変更提案のPull requestを作成することが出来るようにしました。

これは、今回作成した教育メソッドがver1.0という立ち位置であることを示しています。教育メソッドは会社のフェイズ、時代背景、開発組織の状態などに応じて変化し続けなければいけないものと考えているからです。

実際に教育メソッドを運用して気付いたことや、改善案やフィードバックがあれば積極的に提案してもらい、教育メソッドをより良いものにしていきたいと考えています。

まとめ

いかがでしたでしょうか?

今回は弊社のエンジニア教育メソッドの一部のみを公開しました。

実際に私がこの教育メソッドを適用して、とあるメンバーを3ヶ月程度サポートした結果、Findy Team+上の数値は次のように向上しました。

Findy Team+の画面キャプチャ

Pull request作成数の1日あたりの平均が4個だったのが2倍以上の9個に増加しました。彼は私のサポートが外れた現在も、引き続き高いアウトプットを出し続けることが出来ているそうです。個人差はありますが社内の他の事例でも一定の教育効果が出ており、今後の成長が楽しみです。

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

今は技術力や経験に自信は無いけど、弊社の環境で爆速成長したいエンジニアの皆さん。 是非一度カジュアル面談を受けてみませんか?

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