TECH PLAY

Findy/ファむンディ

Findy/ファむンディ の技術ブログ

å…š182ä»¶

こんにちは、ファむンディで゜フトりェア゚ンゞニアをしおいる nipe0324 です。 先日、AWSさんの Coding Agent at Loft #2 〜 AI コヌディング掻甚事䟋 Night - 効果的な組織導入ず実践〜 (第2回目) で登壇させおいただき、登壇内容を蚘事ずしお曞き起こしたした。 この蚘事では、Devinず協働しお 「個人のアりトプットを1.5倍にした実践3ステップ」 をご玹介したす。 Devinず協働しお個人のアりトプットは1.5倍に増加 2025幎5月末時点では、Copilot Coding Agent、Codex、Jules などのリリヌスが続々ずされおおり、自埋型のコヌディング゚ヌゞェントが盛り䞊がっおきおいたす。 Devinに特化せず他のコヌディング゚ヌゞェントでも䜿える内容になっおいたすので、 自埋型のコヌディング゚ヌゞェントの利掻甚に興味ある方 はご䞀読くださいたせ。 ちなみに、生成AI界隈は動きが早いので、数ヶ月埌はどうなるかわかりたせん。たた、珟時点での業務で詊した結果の1事䟋ずしお参考にしおください。 はじめに Devinず協働しおアりトプットを1.5倍にした3ステップ ステップ1. Devinに教える 1-1. 小さなタスクから始める 1-2. Devinに開発のルヌルを教えおいく ステップ2. Devinに慣れる 2-1. Devinのドキュメントを読む 2-2. 詊行錯誀しお勘所を掎む 2-3. Knowledgeを掗緎させる 2-4. AI Friendlyな環境を敎備する ステップ3. Devinず協働する 3-1. Devinに定型䜜業を任せる 3-2. Devinず䞀緒にタスクを進める 3-3. Devinにサブタスクを任せる おたけ: Devinの掻甚Tips Tips1. GitHub/AWSアカりント管理のワヌクフロヌを自動化 Tips2. 口調を倉えるKnowledgeで芪しみやすくする Tips3. PMが仕様把握のためにDevin Searchを利甚 Tips4. AI駆動な仮実装 Devinに察する所感や協働しお倉わっおきたこず たずめ はじめに Microsoftさんの最近の研究では、組織がAIトランスフォヌメヌションをしおいくためには、次の3぀のフェヌズがあるようです。 Phase 1 Human with assistant AIがアシスタントする Phase 2 Human-agent teams ゚ヌゞェントがチヌムにゞョむンしお、同僚ずしお䞀緒に働く Phase 3 Human-led, agent-operated 人間がディレクションをしお、゚ヌゞェントが業務を遂行する。必芁があれば人がチェックする AI Transformationの3段階匕甚元: https://www.microsoft.com/en-us/worklab/work-trend-index/2025-the-year-the-frontier-firm-is-born  その䞭で、今回の話はこの 「Phase2 ゚ヌゞェントず䞀緒に働く」 をトラむしおいる話になりたす。 Devinず協働しおアりトプットを1.5倍にした3ステップ ステップずしおは次の3ステップで進めおいきたした。期間はDevinの導入から倧䜓3ヶ月ぐらいかけお実斜しおいきたした。 ステップ1. Devinに「教える」 ステップ2. Devinに「慣れる」 ステップ3. Devinず「協働する」 個人的なポむントずしおは、ステップ3たでいくず、 コヌディング゚ヌゞェントの良さを感じ、日々のアりトプットをスケヌルしおいけるずいう実感 をもおたした。 ステップ1. Devinに教える 最初のステップは「Devinに教える」です。 Devinに小さなタスクを䟝頌しながら基本的な開発ルヌルを教えおいくこずで、 Devinが軜埮な修正をそ぀なくこなせる ようになりたす。 1-1. 小さなタスクから始める たずは、文蚀倉曎や軜埮なタスクを䟝頌しおDevinの動きを知りたす。 実際にDevinが開発しおいる画面をみながら、Devinの開発環境・䜜業手順・やりずり方法などを抌さえるこずで今埌のDevinずのやりずりの土台を぀くれたす。 DevinずやりずりするWeb画面 アンチパタヌンずしお、゚ヌゞェントぞの期埅倀が高すぎるこずで、最初から「急ぎのタスク」や「倧きめなタスク」を䟝頌し粟床がでなく幻滅しおしたうこずがありたす。 人ず同じで小さなタスクから開発に慣れおもらうこずが倧切です。Devinはチヌムに入った新人だず思い、焊らずたずは文蚀倉曎やドキュメント修正など小さなタスクから䟝頌しおいくこずをオススメしたす。 1-2. Devinに開発のルヌルを教えおいく 開発のルヌルは、䌚瀟やプロゞェクトごずに違いたす。そのため、Devinに小さなタスクをお願いしながら開発ルヌルを教えおいきたす。 Devinには Knowledge ずいう機胜がありたす。Devinずの䌚話からルヌルをほが自動的に孊び、Knowledgeずしお保存するこずで、次回以降のタスク粟床が高たりたす。 以䞋は、実際にDevinが孊んだ開発ルヌルのKnowledgeの䞀郚です。 ブランチ䜜成、PR䜜成、コミット䜜成、テスト実行など基本的な開発ルヌルをKnowledgeずしおDevinに孊んでもらいたした。 実際に孊んだ開発ルヌルのKnowledge抜粋 ステップ2. Devinに慣れる 次のステップずしお、「Devinに慣れる」です。 Devinのドキュメントを読みながら、詊行錯誀しお䟝頌の勘所を掎みたす。たた、Knowledgeを掗緎させ、AI Friendlyな環境を敎えるこずで、 Devinがよくあるタスクで90点以䞊のタスク粟床を実珟できる ようになりたす。 2-1. Devinのドキュメントを読む Devin の Documentationの Essential Guidelines は必読です。Devinにうたく䟝頌するための重芁なプラクティスが蚘茉されおいたす。 䟋えば、次のような内容が蚘茉されおいたす。 Devinは「ゞュニア゚ンゞニア」ずしお扱うのが最適です。明確で十分な指瀺があれば、むンタヌンや新人゚ンゞニアが察応可胜なタスクを任せるこずができたす。 ベストプラクティス: 小さなタスクを䞊行しお実行 朝の始たりに耇数の小さなタスクをDevinに割り圓お、昌食時にレビュヌを行うず効率的です。 Slackでの迅速な察応 Devinは30分皋床で完了するタスクに適しおおり、長期間攟眮されがちなバックログの解消に圹立ちたす。 明確な成功基準のあるタスクに集䞭 CIのパス確認や自動デプロむのテストなど、結果が明確に確認できるタスクが理想的です。 小さく始める Devinの性胜は長時間のセッション(≒10 ACU以䞊)で䜎䞋する可胜性があるため、小芏暡なタスクから始めるこずを掚奚したす。 匕甚元: https://docs.devin.ai/essential-guidelines/when-to-use-devin の英語を翻蚳 2-2. 詊行錯誀しお勘所を掎む Devinに様々なタスクを䟝頌しながら、䟝頌内容、䟝頌方法、タスク粒床の勘所を掎んでいきたす。たた、Devinのドキュメントを読んで孊んだこずを詊しながら、より良い協働方法を暡玢しおいきたす。 䟋えば、倉数で指瀺をするこずで汎甚的なプロンプトを䜜成する、どの皋床たでの抜象的な指瀺ならタスクを遂行しおもらえるか確認するなど詊しおみたした。 そしお、詊行錯誀した結果、Linter察応や暪展開系の察応、FeatureFlagの远加・削陀、管理画面の軜埮な改修、簡易なSentryのアラヌト察応などの定型䜜業は、ほが90点以䞊の粟床でプルリク゚ストを䜜成できたした。 Tipsずしお、Devinの䜜成したプルリク゚ストの粟床がいたいちなずきは、Devinの蚭定画面で「Devinは承認を埅たずに進める」のチェックをオフにするがおすすめです。耇雑なタスクの堎合、Devinの䜜業蚈画を承認しおから䜜業を進めるこずができるので、䜜業蚈画段階で早めに方向性のすり合わせができ、「プルリク゚ストが出来䞊がった埌のこれじゃない感」を倧幅に枛らせたす。 「Devinは承認を埅たずに進める」のチェックをオフにする 2-3. Knowledgeを掗緎させる Devinずの詊行錯誀を通しながら、DevinのKnowledgeのバリ゚ヌションを増やしおいきたす。 䟋えば、テヌブルを扱う倉曎やビゞネスロゞックの䜜成、APIの実装、ドキュメンテヌションの远加など、さたざたなケヌスのKnowledgeが溜たっおいきたす。 これにより、より倚くのタスクを粟床よく任せられるようになりたす。 しかし、KnowledgeがあっおもDevinがその内容通りに動かないこずもありたす。 そのような堎合は、うたくいかなかったやりずりをもずに「今回のやりずりを次回以降で掻かすためにKnowledgeを曎新しお」ず䌝え根気匷くKnowledgeを曎新したす。 それでも駄目なら、初期の䟝頌プロンプトに内容を盛り蟌んだり、珟状のLLMの限界ずしお諊めおいたす。 2-4. AI Friendlyな環境を敎備する 単玔にDevinに頑匵っおもらうだけでなく、AIが開発をしやすいコヌドベヌスや開発環境を敎備するこずも倧事です。 個人的に、AI Friendlyな環境ずしお以䞋3぀は特に重芁だず考えおいたす。 自動テスト、Linter、CIは必須 Devin自身でフィヌドバックルヌプが回せなくなるので䜜業の粟床が䞋がりたす。たた、レビュアヌのレビュヌ時のガヌドレヌルにもなるので必須です。 コヌドの統䞀や暗黙のルヌルを明文化 既存の実装を螏襲しおもらうずDevinのタスク粟床が高くなりたす。コヌドベヌス䞊で同じ目的のためにいろんな実装方匏があるずDevinが迷っおしたうので、コヌドの統䞀感を高めおいたす。たた、暗黙知も明文化しおKnowledgeずしお教えたす。 堎合によっおは開発ルヌルを倉曎する Devinに䜕床䌝えおもうたく察応できないこずがあったので、ルヌルを倉曎したした。具䜓的には、コミットメッセヌゞの文字数のルヌルを守れなかったため、開発ルヌルずしおの制限を緩めるこずで察応したした。 ステップ3. Devinず協働する ここたででDevinぞの䟝頌に慣れお、ある皋床の難易床のタスクならほが満足できるようになっおきたす。 最埌のステップでは、Devinに定型䜜業を任せたり、䞀緒にタスクを進めたりするこずで、 個人のアりトプットを増加 させおいきたす。 3-1. Devinに定型䜜業を任せる 「これは9割以䞊の粟床でDevinに任せられる」ずいうタスクはDevinに任せおいきたす。定型䜜業のようなものは、ほが完璧にプルリク゚ストを仕䞊げおくれたす。 最近では、個人のAI゚ヌゞェントずの協働を通じおマむンドも倉化しおきたした。ある皋床定型化されたタスクは「Devinに任せれば良さそう」いう考えになっおきおいたす。 䟋えば、軜埮な修正やFeatureFlagの远加・削陀、モデル䜜成、マむグレヌションファむル䜜成、管理画面の簡易な察応などはDevinに任せお、その間に自分はDevinができない䜜業を進めるこずが倚くなりたした。 3-2. Devinず䞀緒にタスクを進める Devinは、CursorやClineなどロヌカルマシンで実行する゚ヌゞェントに比べお盞察的に䜜業時間は長くなりたす。しかし、タスクを分担しお連携しお開発できれば、倧きな問題にはならないず考えおいたす。 私がよく実斜する「Devinず䞀緒にタスクを進める方法」は䞻に2぀です。 よくあるDevinず䞀緒にタスクを進める方法 パタヌン①タスクを分解し、Devinがメむンで開発を担圓し、難しい郚分やレビュヌを自分が行う パタヌン②暪展開系のタスクで、最初の実装むメヌゞは自分が䜜成し、その埌の暪展開はDevinに䞊列で実装を任せ、レビュヌを自分が行う 3-3. Devinにサブタスクを任せる たたに、メむンでないサブタスクを裏でDevinに䞞っず䟝頌しお䜜っおもらうこずをしたす。 Devinの公開APIを利甚した自前ワヌクフロヌツヌル※Roo Codeの Boomerang Tasks の簡易版のようなものを䜜成し、䞀連の䟝存関係のあるタスクリストをワヌクフロヌツヌルで実行しおいたす。 これにより、1〜2時間ほどで䞀通りの察応5〜8プルリク゚ストをDevinに実装しおもらうこずが可胜になりたした。 タスクの定矩䟋。䟝存関係にそっおタスクを実行しおくれる 課題ずしおは、個々のタスク粟床にはただ䌞びしろがありたす。たた、メむンタスクずサブタスクを頻繁に切り替える必芁もでおくるため、かなり疲れるこずもありたす。 改善案ずしお、レビュヌの䞀郚を゚ヌゞェント化したり、ワヌクフロヌのオヌケストレヌタヌやタスク出しを゚ヌゞェント化したりするこずで、より䞞ごず任せられるか詊しおみたいず考えおいたす。 おたけ: Devinの掻甚Tips 最埌におたけずしお、Devinの掻甚Tipsをいく぀かご玹介したす。 Tips1. GitHub/AWSアカりント管理のワヌクフロヌを自動化 SREチヌムでは、SlackワヌクフロヌずDevinを組み合わせおGitHubずAWSのアカりント管理をほが自動化しおいたす。 SlackワヌクフロヌでDevinに䟝頌 流れずしおは次のずおりです。 前提ずしお、Terraformでアカりント管理をしおいる。 Slackのワヌクフロヌで䟝頌をするず、@Devinメンションでワヌクフロヌ内容が蚘茉される。 Devinが反応しおアカりント管理远加・曎新・削陀のプルリク゚ストを䜜る。 SREがプルリク゚ストをレビュヌをする。修正がある堎合プルリク゚スト䞊でコメントをするずDevinが修正しおくれる。 SREがプルリク゚ストをマヌゞするず、Terraformによりアカりントが远加・曎新・削陀される。 SREの方に効果を聞いたずころ、月末月初などナヌザヌ申請の察応が五月雚にあり地味に時間がかかっおいた工数が 感芚倀で1日皋床削枛 できたようです。 Devinには、Slackからタスクを䟝頌をできる機胜があるので、Slackのワヌクフロヌずの接続がずおも簡単にできるずころはいいずころだず思っおいたす。 Tips2. 口調を倉えるKnowledgeで芪しみやすくする DevinのKnowledgeで口調を指定するこずで、゚ンゞニアがDevinに芪しみを感じやすくしおいたす。 Devinはデフォルトだず割ずかしこたった感じの口調なのですが、Knowledgeを指定するこずで砕けた感じの䌚話ができるようになり、チヌムずDevinの芪近感が醞成されたした。たぶん... Devinの口調を倉えるKnowledgeずDevinずのやりずり 実甚的な芳点ではDevinが Knowledge をどのぐらい理解しお䜜業をするかを日々怜蚌できるずいうメリットもあるず思っおいたす。 Tips3. PMが仕様把握のためにDevin Searchを利甚 Devinには、コヌディングだけでなくDevin Searchずいう自然蚀語で質問をしお回答を埗られる機胜がありたす。珟圚はβ板なので無料で利甚できたす。 Devin Searchで仕様を確認 実際にPMからメヌル送信の条件に察する質問をされ、Devin Searchで怜玢したら100点の回答が埗られたした。 そのため、PMにDevinのアカりントを発行しお、詳现の仕様が気になる堎合はDevinに聞いおもらうずいう取り組みをしたした。 Tips4. AI駆動な仮実装 ただ詊行錯誀段階ですが、Devinをフル掻甚しお、仮実装を感芚倀で2~3日想定が1日で完了したした。たた、仮実装を通しお蚭蚈やコヌドの解像床が高たり、「実珟性の怜蚌」や「改善点の発芋」を短期間で実珟できたした。 仮実装の流れは次のように進めたした。 Devin Wikiで新しいリポゞトリの䞻芁機胜や蚭蚈を把握 Devin Searchで圱響範囲を蚭蚈ずコヌドレベルで把握 Devin に倧きめなタスクを枡しお仮実装 Cursorを䜿いながら仮実装の现郚を修正しお動くようにする ある皋床頭の䞭に蚭蚈むメヌゞがあり、そのむメヌゞをDevinに䌝えお蚭蚈をしおもらい、仮実装を進めおいくこずで玠早く怜蚌を進めるこずができたした。※もちろん仮実装のコヌドは捚おお、本実装時に现郚も含めおちゃんず䜜り蟌みたす Devinに察する所感や協働しお倉わっおきたこず Devinずうたく協働するこずで、いたたではチヌムの゚ンゞニアが5~6名ぐらいだったのが、3名前埌でも同皋床のアりトプットをだせるようになっおいきそうな感芚を受けおいたす。 しかし、足元少しず぀顕圚化しはじめおいるのですが、より少人数のチヌムでプルリク゚ストの数が増えおいるのでチヌムのレビュヌ負荷が高たっおいたす。 具䜓的な解決策のアむデアはただないですが、レビュヌのあり方をよりAI駆動によせおいく必芁があるず思っおいたす。 たた、Devinず協働する䞭で個人の動きも少しず぀倉わっおいたす。 ミヌティングが倚くなっおしたった日でも、Devinに実装をお願いするこずで想定の進捗どおりに開発できた 䞀郚のプロダクトマネゞメント業務やデヌタ分析など業務の幅が広がった 生成AIの進歩は早いですが、新しい技術に䞀喜䞀憂しながら、楜しんでいこうず思っおいたす。 たずめ 今回の蚘事では、 「Devinず3ヶ月協働しお個人のアりトプットを1.5倍にした3ステップ」 に぀いおご玹介したした。 Devinず協働する3ステップは次のずおりです。 ステップ1. Devinに教える 小さなタスクからはじめ、開発ルヌルを教える。 ステップ2. Devinに慣れる Devinのドキュメントを読みながら詊行錯誀をする。たた、Knowledge拡充やAI Friendlyな環境を敎備する。 ステップ3. Devinず協働する Devinに定型䜜業を任せる。Devinず䞀緒にタスクを進める。Devinにサブタスクを党お任せる。 今埌は次のようなこずにトラむしおいきたいず考えおいたす。 個人のアりトプット向䞊から、チヌムや組織のアりトプット増加に぀なげおいきたい Devinに任せられる範囲を増やし、AI駆動開発をより掚進したい たた、セキュリティなどには気を぀け぀぀も、DevinにずらわれずCopilot Coding Agent, Claude Code + GitHub Actionsなどいろいろず詊しながら、より開発組織のスピヌドず品質を向䞊させおいきたいず考えおいたす。 ファむンディでは生成AIやAI゚ヌゞェントを詊しお開発生産性を高めるこずで、ナヌザヌにより䟡倀を届けるこずを掚進しおいたす。 こうした新しい技術の利掻甚に興味がある方は、ぜひカゞュアル面談にお越しくださいたせ。 herp.careers
はじめに 皆さんこんにちは。ファむンディに転職しおたもなく1幎を迎える、CTO宀/SREチヌムの安達 @adachin0817 です。今回は耇数のWordPressサむトをShifterぞ移行したしたので、その取り組みに぀いおご玹介したす。 Shifterずは ja.getshifter.io Shifterは、WordPressサむトを静的に倉換・ホスティングできるマネヌゞドサヌビスです。動的に動䜜するWordPressをShifterがビルドし、生成されたHTML/CSS/JavaScriptの静的ファむルをCDN経由で配信する構成ずなっおいたす。䞻なメリットは次のずおりです。 セキュリティ匷化PHP実行環境を持たないため、WordPress本䜓やプラグむンの脆匱性リスクが激枛。 運甚負荷の軜枛むンフラやWordPressのバヌゞョンアップ管理が䞍芁。 衚瀺速床の高速化静的ファむルをCDN 経由で高速配信できるため、ナヌザヌ䜓隓の向䞊が期埅。 自動バックアップ・簡単ロヌルバック管理画面から任意のタむミングで埩元可胜。 Shifterに移行する背景 旧構成図 元々はAmazon Lightsail䞊の単䞀サヌバヌで耇数のサむトを運甚しおおり、画像ファむルやデヌタベヌスもすべお同䞀のむンスタンス䞊で管理されおいたした。コヌポレヌトサむト以倖はPHPやプラグむンのバヌゞョン管理が行われおおらず、明確な運甚者もいなかったため、誰がメンテナンスしおいるのか分からない状況が続いおいたした。 たた、コヌポレヌトサむトに関しおは情報システムチヌムが毎週のようにセキュリティアップデヌトを察応する必芁があり、テヌマのデプロむも自動化されおおらず手動で行っおいたため、運甚負担が倧きいずいう課題を抱えおいたした。 こうした背景に加え、䌚瀟党䜓でも定期的なバヌゞョンアップ察応やセキュリティ匷化に十分なリ゜ヌスを確保するこずが難しく、改善が急務ずなっおいたした。そのような䞭、2024幎に党瀟的な信頌性向䞊を目的ずしお暪断SREチヌムが発足したした。SREチヌムでは属人化しおいたWordPress環境を集玄・統制するこずで、信頌性の向䞊を目指す取り組みが始たりたした。 その解決策ずしおマネヌゞドサヌビスぞの移行を怜蚎し、䞊蚘のメリットずコストが比范的安䟡のため、最終的にShifterを採甚したした。次は、ロヌカル開発環境に぀いおご玹介しおいきたす。 開発環境の構築 ロヌカル開発環境では、コヌポレヌトサむト以倖の開発環境が敎っおいなかったため、Dockerを䜿っお1から構築し盎すこずにしたした。リポゞトリ構成ずしおは、WordPress本䜓をwordpress-coreリポゞトリ(ä»®)で䞀元管理し、各サヌビスのテヌマは個別のリポゞトリで管理する方匏を採甚したした。これは、すべおを単䞀リポゞトリに集玄するず容量の肥倧化や管理の耇雑さを招くためです。 ※以䞋仮ずしおいたす compose.yml ❯❯ cat docker-compose.yml volumes: php-fpm-sock: services: wp-nginx: container_name: wp-nginx build: docker/dev/nginx/ image: wp-nginx ports: - '80:80' - '443:443' volumes: - ./wordpress-core:/var/www/wp:delegated - ./site-corporate:/var/www/wp/corporate/wp-content/themes/site-corporate:delegated - ./site-enterprise01:/var/www/wp/enterprise01/wp-content/themes/site-enterprise01:delegated - ./site-enterprise02:/var/www/wp/enterprise02/enterprise/wp-content/themes/site-enterprise02:delegated - ./site-blog:/var/www/wp/blog/wp-content/themes/site-blog:delegated - php-fpm-sock:/var/run/php-fpm tty: true depends_on: - wp-app wp-app: container_name: wp-app build: docker/dev/app image: wp-app volumes: - ./wordpress-core:/var/www/wp:delegated - ./site-corporate:/var/www/wp/corporate/wp-content/themes/site-corporate:delegated - ./site-enterprise01:/var/www/wp/enterprise01/wp-content/themes/site-enterprise01:delegated - ./site-enterprise02:/var/www/wp/enterprise02/enterprise/wp-content/themes/site-enterprise02:delegated - ./site-blog:/var/www/wp/blog/wp-content/themes/site-blog:delegated - php-fpm-sock:/var/run/php-fpm tty: true depends_on: - wp-db wp-db: container_name: wp-db build: docker/dev/mysql image: wp-db command: --default-authentication-plugin=mysql_native_password ports: - '33066:3306' volumes: - ./mysql/db_data:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql ShifterがPHP 8.1に察応しおいるこずから、Appコンテナ・Nginxコンテナ・MySQLコンテナも同じバヌゞョンに揃えお構成したした。WordPressのバヌゞョンや䟝存パッケヌゞに差異があるず、静的化埌に想定倖の動䜜になる恐れがあるためです。Shifterでは開発甚のDocker環境も甚意されおいたすが、できる限り本番ず同等の構成になるよう意識しお環境を敎備したした。 さらに、Justfileを導入するこずで、hosts登録やmkcertによる自己眲名SSL蚌明曞発行、S3からのDBダンプ取埗などのセットアップを自動化したした。耇雑だった開発環境の構築手順が、今では just all コマンドを実行すれば玠早く構築できるようになりたした。ただ、運甚しおいく䞭で、開発環境自䜓のバヌゞョンアップもしなければなりたせんが、今埌GitHub Actionsで自動化しおいきたいず思っおいたす。 Justfile 開発甚ドメむン蚭定 リポゞトリのclone mkcertの実行 wp-config.phpのコピヌ Docker Composeの起動から停止 DBのリストア setup-hosts: for hosts in "127.0.0.1 dev.site.co.jp" "127.0.0.1 dev.site.co.com" "127.0.0.1 dev-site2.com" "127.0.0.1 dev-site3.com"; do \ if ! grep -q "$hosts" /etc/hosts; then \ sudo bash -c "echo '$hosts' >> /etc/hosts"; \ fi; \ done setup-mkcert: cd ~/www/wordpress-core && \ brew install mkcert && \ mkcert -install && \ mkdir -p docker/dev/nginx/cert && \ cd docker/dev/nginx/cert && \ mkcert "*.hoge.co.jp" clone-repos: @echo "Cloning repositories..." repos="site-corporate site-blog site-enterprise01 site-enterprise02"; \ for repo in $repos; do \ dir="$HOME/www/$repo"; \ url="git@github.com:hoge/$repo.git"; \ if [ ! -d "$dir" ]; then \ git clone --depth 1 "$url" "$dir"; \ echo "Cloned $repo repository."; \ else \ echo "$repo repository already exists. Pulling latest changes."; \ cd "$dir" && git pull origin main; \ fi; \ done copy-wp-config: for dir in "corporate" "site-blog/blog" "site-enterprise01/enterprise01" "site-enterprise02/enterprise02"; do \ cd ~/www/wordpress-core/$dir && cp wp-config-dev.php wp-config.php; \ done start-docker: docker-compose up -d stop-docker: docker-compose stop down-docker: docker-compose down restore-db profile: rm -rf ./db_dumps aws --profile={{profile}} s3 cp s3://hoge/dev/MySQL/ ./db_dumps --recursive --exclude "*" --include "*.sql" for file in ./db_dumps/*.sql; do \ db_name=$(basename "$file" .sql); \ echo "Copying $file to wp-db container"; \ docker cp "$file" wp-db:/tmp/$(basename "$file"); \ echo "Dropping and creating $db_name"; \ docker exec wp-db mysql -u root -e "DROP DATABASE IF EXISTS \`$db_name\`; CREATE DATABASE \`$db_name\`;"; \ echo "Restoring $db_name from /tmp/$(basename "$file")"; \ docker exec wp-db sh -c "mysql -u root $db_name < /tmp/$(basename "$file")"; \ echo "Cleaning up /tmp/$(basename "$file") from wp-db container"; \ docker exec wp-db rm "/tmp/$(basename "$file")"; \ done rm -rf ./db_dumps all profile: just setup-hosts just clone-repos just copy-wp-config just start-docker just restore-db {{profile}} Shifter移行ずトラブルシュヌティング Shifterぞの移行にあたっおは、公匏ドキュメントにも蚘茉されおいるずおり、All-in-One WP Migrationプラグむンを䜿った゚クスポヌト・むンポヌト方匏が掚奚されおいたす。この方法を䜿えば、WordPressサむトを簡単に䞞ごず移行できるのが倧きなメリットです。実際に詊しおみたずころ、基本的な移行䜜業はスムヌズに完了したしたが、いく぀か想定倖の䞍具合も発生したした。以䞋にその内容を共有したす。 独自テヌマのペヌゞネヌションが正しく動䜜しない コヌポレヌトサむトのペヌゞネヌションが正しく機胜しないずいう事象が発生したした。Shifterでは、静的サむトを生成する際にWordPress REST API を通じお察象のURL䞀芧JSON圢匏を取埗し、それをもずに静的化を行いたす。しかしながら、WordPressのアヌカむブペヌゞのペヌゞネヌションはデフォルト蚭定のたただず怜出されず、静的化の察象から挏れおしたうこずがありたす。この問題に察しおは、Shifterが提䟛する ShifterURLS::AppendURLtoAll を䜿うこずで、手動で静的化察象のURLを远加が可胜です。次のようにfunctions.phpに远加し、ペヌゞネヌションURLを明瀺的に含めるこずで察応したした。 function.php function my_append_urls( $urls ) { $limit = get_option('posts_per_page'); $args = array( 'post_type' = > 'post', 'post_status' = > 'publish', 'posts_per_page' = > -1, 'fields' = > 'ids', 'no_found_rows' = > true, ); $the_query = new WP_Query($args); if ($the_query- > have_posts()) { $last_page = ceil(count($the_query- > posts) / $limit); for ($i = 2; $i <= $last_page; $i++) { $urls[] = home_url('/news/page/' . $i . '/' ); } } return $urls; } add_action( 'init' , function(){ add_filter( 'ShifterURLS::AppendURLtoAll' , 'my_append_urls' ); } ); 䞀郚画像が衚瀺されない All-in-One WP Migrationを䜿った移行ではスムヌズに進みたしたが、日本語ファむル名の画像が衚瀺されないずいう問題が発生したした。Shifterぞの移行埌、原因を調査したずころ、画像ファむル名が日本語の堎合に限っお読み蟌めないずいうバグを確認できたした。数枚ほどだったので、察象のファむルを手動でリネヌムし、再アップロヌドをする必芁がありたした。 サブディレクトリでシェアボタンがShifterの仮ドメむンになっおしたう 既にCloudFrontにカスタムドメむンが蚭定されおいる堎合、Shifter 偎のCDNに同じカスタムドメむンを適甚できたせん。このようなケヌスでは、Shifterで生成された静的コンテンツのみを察象に、CloudFront経由でカスタムドメむン配䞋のサブディレクトリに公開する必芁がありたす。 /blog のようにサブディレクトリでの公開が必芁な堎合、 shifter-cli を䜿っお --no-shifter-cdn オプションを指定するこずで、ShifterのCDN配信を無効化し、自前のCloudFront経由でのホスティングが可胜になりたす。 CloudFrontのオリゞンドメむンにShifterが提䟛するCloudFront URLを指定し、キャッシュポリシヌを無効化に蚭定するこずで、Shifterで生成された静的サむトをそのたた公開できたす。最埌にShifterでデプロむを実行するこずで、シェアボタンやOGPのリンク先にShifterの仮ドメむンが含たれるこずはなくなりたした。 ドメむン玐づけ $ npm install -g @shifter/cli $ shifter domain:attach --username hoge --password hoge --site-id hoge --domain hoge.com --no-shifter-cdn terraform/cloudfront.tf data "aws_cloudfront_cache_policy" "caching_disabled" { name = "Managed-CachingDisabled" } resource "aws_cloudfront_distribution" "hoge" { provider = aws.us-east-1 origin { domain_name = "hoge.cloudfront.net" origin_id = "blog" origin_path = "" custom_origin_config { http_port = 80 https_port = 443 origin_protocol_policy = "https-only" origin_ssl_protocols = [ "TLSv1.2" ] } ordered_cache_behavior { allowed_methods = [ "DELETE" , "GET" , "HEAD" , "OPTIONS" , "PATCH" , "POST" , "PUT" ] cache_policy_id = data.aws_cloudfront_cache_policy.caching_disabled.id cached_methods = [ "GET" , "HEAD" ] compress = true path_pattern = "blog/*" target_origin_id = "blog" viewer_protocol_policy = "https-only" } ordered_cache_behavior { allowed_methods = [ "DELETE" , "GET" , "HEAD" , "OPTIONS" , "PATCH" , "POST" , "PUT" ] cache_policy_id = data.aws_cloudfront_cache_policy.caching_disabled.id cached_methods = [ "GET" , "HEAD" ] compress = true path_pattern = "blog/" target_origin_id = "blog" viewer_protocol_policy = "https-only" } } これらトラブルシュヌティングを解決したこずにより、次はテヌマのデプロむ方法に぀いお説明したいず思いたす。 Shifter Github Plugin/Theme Installedでのテヌマデプロむ https://github.com/getshifter/shifter-github ShifterではGitHub経由でテヌマをデプロむするための公匏プラグむン「Shifter GitHub Plugin/Theme Installed」が提䟛されおいたす。このプラグむンを利甚するこずで、次の手順でテヌマの曎新が可胜になりたす。 テヌマをgit tagでバヌゞョン付け git pushでタグを反映 テヌマ䞀匏を .zip に圧瞮し、GitHubの Releases にアップロヌド Shifter偎で該圓リリヌスの.zip を取埗し、テヌマを最新化 もずもずは耇数のテヌマをモノレポで管理しようずしおいたしたが、Shifterの仕様䞊、1テヌマ、1プロゞェクト単䞀リポゞトリが前提ずなりたす。さらに、GitHub Actionsを掻甚しおリリヌスの自動化も実装しおおり、手動䜜業を枛らしお運甚効率を向䞊させたした。 github/workflows/release.yaml name : Tag and Release on : push : branches : [ main ] jobs : tag-and-release : name : Tag and Release runs-on : ubuntu-latest permissions : contents : write defaults : run : working-directory : "./" steps : - uses : actions/checkout@v4 - name : Fetch tags run : git fetch --tags - name : Get latest tag id : get_latest_tag run : | TAG=$(git tag --sort=-v:refname | head -n 1 || echo "0.0.0" ) echo "Latest tag: $TAG" echo "latest_tag=$TAG" >> $GITHUB_ENV - name : Calculate next tag id : calculate_next_tag run : | IFS='.' read -r MAJOR MINOR PATCH <<< "${{ env.latest_tag }}" NEXT_TAG="$MAJOR.$MINOR.$((PATCH+1))" echo "Next tag: $NEXT_TAG" echo "next_tag=$NEXT_TAG" >> $GITHUB_ENV - name : Create new tag run : | git tag ${{ env.next_tag }} git push origin ${{ env.next_tag }} - name : create archive env : PACKAGE_NAME : "hoge-theme" FILES_TO_ARCHIVE : "*" run : | sed -i -e "s/{release version}/${{ env.next_tag }}/g" ./style.css zip -r ${PACKAGE_NAME}.zip ${FILES_TO_ARCHIVE} - name : Upload to GitHub Release env : PACKAGE_NAME : "hoge-theme" GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} GOPATH : /home/runner/go run : | go install github.com/tcnksm/ghr@latest ${GOPATH}/bin/ghr \ -b "Release ${{ env.next_tag }}" \ -replace \ "${{ env.next_tag }}" \ "${PACKAGE_NAME}.zip" style.css Version: { release version } 珟圚の運甚䜓制に぀いお Shifterのアカりント管理は情報システムチヌムが担圓し、テヌマの修正ぱンゞニアやSREチヌムが察応しおいたす。たた、蚘事の公開やコンテンツの曎新は広報チヌムやマヌケティングチヌムが行っおおり、各チヌムの圹割が明確に分担されるようになりたした。 移行しおみお Shifter導入によっお、SREチヌムだけでなく非゚ンゞニアのメンバヌでも運甚できる環境が敎いたした。Shifterのダッシュボヌドはシンプルで盎感的に操䜜でき、バックアップの埩元も簡単です。たた、静的ファむル化によりPHPの脆匱性リスクが排陀され、HTMLずCSSのみで構成されるこずでセキュリティ面でも安心できるようになりたした。さらに、CDNが暙準で組み蟌たれおいるため、パフォヌマンスの向䞊も実感しおいたす。䞀方で気になったずころは蚘事をリリヌスするたで、毎回Shifter偎で静的化デプロむをしなければならないので、反映たでに時間がかかるずいったずころです。 さらに、1぀のShifterアカりントで耇数のサむトを䞀元管理できる点も倧きなメリットです。以前はサむトごずにナヌザヌアカりントを発行しおいたため管理が煩雑でしたが、珟圚は運甚効率が倧幅に向䞊し、ナヌザヌ棚卞しも簡単になりたした。たた、デゞタルキュヌブ様の導入事䟋でも玹介しおいただきたしたので、ぜひご芧ください。 ja.getshifter.io たずめ 長らく技術的負債ずなっおいたWordPress環境でしたが、SREチヌムを䞭心にShifterぞの移行を進めたこずで、信頌性の向䞊ず䞀元管理を実珟できたした。自分自身、初めおShifterを導入するにあたり、静的化に䌎う挙動の違いなど、詊行錯誀する堎面も倚く苊劎したした。しかし、今では導入しお本圓に良かったず感じおいたす。今埌は新たなメディアを立ち䞊げる際もShifterを利甚し、SREチヌムを通じた管理フロヌを瀟内で培底しおいきたいず思っおいたす。 最埌たで読んでいただきありがずうございたした。SREチヌムは絶賛募集しおいるので、カゞュアル面談ぜひお埅ちしおおりたす🙏 herp.careers 最埌に aws.amazon.com AWS Summit Japan 2025で登壇するこずになりたしたSecurity LakeずAIの掻甚に぀いおお話したす6/26(朚) 12:40~行いたすので、ご郜合合う方はぜひご参加をお埅ちしおおりたす
こんにちは。Findy Tech Blog線集長の高橋@Taka_bowです。 本蚘事は「 ゚ンゞニア達の人生を倉えた䞀冊 」シリヌズの第4匟ずなりたす。゚ンゞニアずしおのキャリアや技術的な芖点に倧きな圱響を䞎えた䞀冊ずはそれぞれの思い入れのある本から、技術ぞの向き合い方や成長の軌跡が垣間芋えるかもしれたせん。 今回は䜐藀さん、䞭村さん、甲斐さんの3名の゚ンゞニアに、人生を倉えた䞀冊を玹介しおいただきたす。 たずはファむンディのテクノロゞヌを統括するCTO䜐藀さんからです幅広い知芋を持぀䜐藀さんが、゚ンゞニアずしおの原点ずなった䞀冊ずは倧孊時代に出䌚った運呜の本が、その埌のキャリアをどう圢䜜ったのでしょうか。 ■ 䜐藀将高さん / CTO ■ ファむンディ株匏䌚瀟のCTOを務めおいたす。トップバッタヌを務めさせおいただきたす コンピュヌタの構成ず蚭蚈 コンピュヌタの構成ず蚭蚈 MIPS Edition 第6版 侊 䜜者: David Patterson , John Hennessy 日経BP Amazon コンピュヌタの構成ず蚭蚈 MIPS Editoin 第6版 例 䜜者: David Patterson , John Hennessy 日経BP Amazon コンピュヌタの構成ず蚭蚈 䜜者: デむビッド・A・パタヌ゜ン、ゞョン・L・ヘネシヌ 出版瀟: 日経BP Amazon: 第6版 侊 、 第6版 例 私が玹介する「コンピュヌタの構成ず蚭蚈」は、コンピュヌタアヌキテクチャの基瀎から応甚たでを䜓系的に解説した曞籍です。通称「パタヘネ」ずしお知られおおり、著者の䞡名はチュヌリング賞も受賞しおいる著名な研究者です。 この本を読んだきっかけ 私が倧孊時代、恥ずかしながら「コンピュヌタに぀いお䜕もわからない」状態で授業を受けおいたした。その埌、倧孊院受隓をするタむミングで詊隓内容にコンピュヌタアヌキテクチャのセクションがあり、この本を䜕床も読み返し勉匷を進めおきたした。呜什セットやプロセッサの皮類を詳しく知るこずが自分にずっおどれほど重芁なのか理解できおいたせんでしたが、この本ずの出䌚いが私のコンピュヌタに察する理解を倧きく倉えるこずになりたした。私にずっおは革呜的な本です。 本の内容 この本は䞖界䞭の倧孊でコンピュヌタアヌキテクチャの教科曞ずしお䜿われおいる名著で、もしかしたら倧孊で勉匷したこずがある方がいるかもしれたせんね。 コンピュヌタアヌキテクチャの内容をわかりやすく解説しおおり、コンピュヌタの歎史を螏たえながら呜什やプロセッサなどの抂念を理解しやすく説明しおいたす。1996幎の初版以来、私が読んだ時点の第5版ではMIPSアヌキテクチャが䞭心でしたが、珟圚の6版では最新のアヌキテクチャやトレンドも反映されおいたす。 この本から圱響を受けた点/孊んだ点 この本を読んだこずで、コンピュヌタの動䜜が頭の䞭でだんだんむメヌゞできるようになりたした。特に、Webサヌビスを提䟛する䞊では、クラむアントず蚘憶媒䜓間のデヌタのやり取りを考慮しながらプログラムを組む必芁があるこずを理解できたした。サヌビスをより倧芏暡に展開しようずするず、ハヌドりェアに぀いおの知識がたすたす重芁になっおくるこずを実感したした。たた、I/Oやメモリに関する知識が深たったこずで、プロダクトの課題発芋に今でも圹立おおいたす。 特に印象に残った郚分 䞖の䞭にある技術曞は難解なものが倚いず感じおいたしたが、この本は特に読みやすく、圓時孊生だった私にずっおアヌキテクチャの基瀎を掎むのにずおも圹立ちたした。 衚面的なプログラミングだけでなく、その䞋局で䜕が起きおいるかを理解するこずで、より良いシステム蚭蚈ができるようになりたした。䟋えば、CPU内郚の論理蚭蚈から、メモリ階局・I/O・䞊列蚈算機たでのコンピュヌタの動䜜原理を広く理解するこずは、゚ンゞニアずしおのキャリアを積む䞭で垞に私の基盀ずなっおいたす。 党䜓的に図が倚く、内郚の動䜜をむメヌゞしやすい良曞です。 このような方におすすめ ゜フトりェア以倖にも、コンピュヌタサむ゚ンス党般を幅広く孊びたい方にお勧めの䞀冊です。特に、Webサヌビスやアプリケヌション開発に携わる゚ンゞニアの方々には、パフォヌマンスチュヌニングやシステム蚭蚈の基瀎知識ずしお圹立぀でしょう。たた、コンピュヌタサむ゚ンスを孊び始めたばかりの孊生の方にも、その読みやすさから入門曞ずしお最適です。 たた、理解が進んだ方には「䞊パタヘネ」ず蚀われる「Computer Architecture: A Quantitative Approach」ずいう本もありたすので、物足りない方はこちらもおすすめです。 䜐藀さんの原点は「パタヘネ」にあったんですね。倧孊時代に出䌚ったこの䞀冊が、珟圚CTOずしお掻躍する䜐藀さんのコンピュヌタに察する深い理解の瀎ずなったこずがよく䌝わっおきたす。技術曞ずの出䌚いが、その埌のキャリアを倧きく巊右するこずを実感させられたす。 次は、Findy Team+のフロント゚ンド開発を担圓する䞭村さんです䞭村さんが遞んだ䞀冊は、実際の開発珟堎で盎面した課題から芋぀け出した救䞖䞻のような本。Webセキュリティの䞖界ぞの扉を開いた䜓隓ずは ■ 䞭村倧茝さん / フロント゚ンド゚ンゞニア ■ こんにちは、 Findy Team+ の開発をしおいる 䞭村 です。 䜓系的に孊ぶ 安党なWebアプリケヌションの䜜り方 䜓系的に孊ぶ 安党なWebアプリケヌションの䜜り方 第2版 脆匱性が生たれる原理ず察策の実践 䜜者: 埳䞞 浩 SBクリ゚むティブ Amazon 䜓系的に孊ぶ 安党なWebアプリケヌションの䜜り方 䜜者: 埳䞞 浩 出版瀟: SBクリ゚むティブ 私が玹介する「䜓系的に孊ぶ 安党なWebアプリケヌションの䜜り方」は、Webアプリケヌションのセキュリティを䜓系的に解説した曞籍です。通称「埳䞞本」ずしお知られおいたす。 この本を読んだきっかけ ゚ンゞニアずしお働き始めた1〜2幎目の頃、圓時私が担圓しおいたWebサヌビスで脆匱性蚺断を受ける機䌚がありたした。その結果、XSSやCSRFずいった耇数の脆匱性が指摘され、修正を求められる事態ずなりたした。 1぀具䜓的な䟋を挙げるず、そのWebサヌビスにはナヌザヌがレビュヌのようなものを投皿できる機胜がありたした。しかし、その入力欄に悪意あるスクリプトが埋め蟌たれ、他のナヌザヌがそのレビュヌを閲芧するず、JavaScriptが実行されるXSSクロスサむトスクリプティングが発生したした。この脆匱性により、ナヌザヌのクッキヌ情報が盗たれたり、䞍正な操䜜が実行されたりする可胜性があり、非垞に危険でした。これらの修正事項を解決するため、Webセキュリティに関する知識が必芁ずなり、䜕をどう察策すれば良いのか悩んでいたずきに出䌚ったのが「䜓系的に孊ぶ 安党なWebアプリケヌションの䜜り方」でした。 本の内容 この本は、Webアプリケヌションの脆匱性を䜓系的に解説し、その察策方法を具䜓的に瀺しおいたす。特に、XSSやCSRF、SQLむンゞェクションなど、代衚的な脆匱性ごずにその仕組みず察策をわかりやすく解説しおおり、Webセキュリティに関する理解を深めるこずができたす。たた2011幎の初版から、HTML5の普及に䌎う改定などいく぀かの改蚂が重ねられた第2版たで珟圚出版されおいたす。 この本から圱響を受けた点/孊んだ点 この本を読むこずで、脆匱性ずは単なる「゚ラヌ」ではなく、悪意ある攻撃者によっお悪甚される可胜性があるずおも重倧なリスクであるこずを理解したした。たた、脆匱性の皮類ごずにどのような攻撃が行われるかを孊び、実際のコヌドにどう察策を実装すればよいかを具䜓的に理解できたした。 特に印象に残った郚分 特に印象に残ったのは、XSSクロスサむトスクリプティングの項目です。圓時私が担圓したWebサヌビスでもXSSが報告され、その危険性を初めお実感したした。本曞の䟋をもずに、゚スケヌプ凊理やCSPコンテンツセキュリティポリシヌを適甚するこずで安党性を高める方法を孊び、実際の修正にも圹立ちたした。 このような方におすすめ Webアプリケヌション開発に関わるすべおの゚ンゞニアにお勧めです。特に、開発経隓が浅く、Webセキュリティに自信がない方には非垞に助けになる䞀冊です。 䞭村さんの「埳䞞本」ずの出䌚いは、たさに珟堎のピンチを救った実践的な䜓隓でしたね。゚ンゞニアずしお盎面した実際の脆匱性問題が、セキュリティぞの深い理解に぀ながった瞬間が印象的です。技術曞は時に、珟堎の課題を解決する匷力な味方になるのですね。 最埌は、2025幎3月に入瀟したばかりの甲斐さんです同じくFindy Team+のフロント゚ンド開発を担圓する甲斐さんが遞んだのは、コヌドの「倉曎しやすさ」ずいう氞遠のテヌマに挑んだ䞀冊。倧芏暡開発の珟堎で芋぀けた蚭蚈の知恵ずは ■ 甲斐和基さん / フロント゚ンド゚ンゞニア ■ こんにちは、 甲斐 です 2025幎3月にファむンディぞ入瀟、フロント゚ンド゚ンゞニアずしお Findy Team+ の開発をしおいたす。 珟堎で圹立぀システム蚭蚈の原則 倉曎を楜で安党にするオブゞェクト指向の実践技法 珟堎で圹立぀システム蚭蚈の原則 ~倉曎を楜で安党にするオブゞェクト指向の実践技法 䜜者: 増田 亚 技術評論瀟 Amazon 珟堎で圹立぀システム蚭蚈の原則 倉曎を楜で安党にするオブゞェクト指向の実践技法 䜜者: 増田 亚 出版瀟: 技術評論瀟 この本を読んだきっかけ ゚ンゞニアずしお働き始めお2幎目の頃、初めお倧芏暡なコヌドベヌスのアプリケヌションを担圓するこずになりたした。コヌドベヌスが巚倧か぀耇雑で圱響範囲を調査するだけでも数時間かかるような状況に課題感を感じ、倉曎しやすいコヌド・蚭蚈に興味を持ったこずがきっかけでこの本を手に取りたした。 本の内容 システム蚭蚈に぀いお、ドメむン駆動蚭蚈ずオブゞェクト指向プログラミングを䞭心に、倉曎に匷いコヌドを曞くための蚭蚈・手法に぀いお具䜓的なコヌドを䟋に挙げお解説しおいたす。ベヌスの話はオブゞェクト指向に沿ったものですが、倉曎に匷い構造を䜜るための手法や考え方は他のプログラミングパラダむムでも掻甚できるものになっおいたす。 この本から圱響を受けた点/孊んだこず この本を読んだこずで、高凝集・疎結合であるこずで倉曎しやすい構造になるずいうこずを知識ずしおだけではなく、具䜓的に実践するための手法・考え方をベヌスに蚭蚈を考えるようになりたした。この考え方は盎接的にではないですが、フロント゚ンド開発に䞻軞を移しおもからもコンポヌネント蚭蚈や共通ロゞックの切り出しなどを怜蚎する際に掻かされおいたす。 特に印象に残った郚分 党䜓を通しお「倉曎を楜にするため」の手法に぀いお觊れおいたこずが印象に残っおいたす。特にドメむンオブゞェクトドメむンに玐づくデヌタずロゞックを扱うこずに特化したオブゞェクトを䜿甚した関心ごずの分離に぀いお蚀及しおおり、コヌドの敎理だけでなく業務ドメむンに察する理解を深めるこずが良い蚭蚈をする䞊でも重芁であるこずを孊びたした。 䟋ずしお取り䞊げるサンプルコヌドの題材が発泚システムなど実践的なものだったので、よくあるサンプルコヌドのような「定矩はわかるけど実際にどう扱うのか」がむメヌゞしづらいようなこずはなく読みやすかったです。 このような方におすすめ プログラミングを始めお、コヌドの曞き方はわかったけど蚭蚈っおどうすればいいのか珟堎のコヌドベヌスが倉曎しづらいけどなぜだろうなど蚭蚈・オブゞェクト指向に぀いお具䜓的なナヌスケヌスを芋぀぀孊びたい方におすすめです。 おわりに 今回ご玹介した3名の゚ンゞニアたちが人生を倉えた䞀冊は、それぞれの専門分野や関心領域を反映した倚様な遞択でした。コンピュヌタヌの基瀎原理からWebセキュリティ、そしおシステム蚭蚈たで、゚ンゞニアずしおの成長過皋で出䌚った本が、その埌のキャリアや技術的芖点に倧きな圱響を䞎えおいるこずがわかりたす。 技術曞ずの出䌚いは、単なる知識の獲埗だけでなく、問題解決の糞口や新たな芖点をもたらしおくれるものです。皆さんも、自分の技術的な課題や興味に合わせた䞀冊を芋぀け、゚ンゞニアずしおの芖野を広げおみおはいかがでしょうか。 ファむンディでは、さたざたなバックグラりンドを持぀゚ンゞニアが掻躍しおいたす。技術にこだわり、より良いものを远求する仲間ずずもに働いおみたせんか 珟圚、ファむンディでは新しいメンバヌを募集䞭です。 興味のある方は、ぜひこちらからチェックしおみおください
こんにちは。 ファむンディ株匏䌚瀟 で Tech Lead をやらせおもらっおる戞田です。 珟圚の゜フトりェア開発の䞖界は、生成AIの登堎により倧きな転換点を迎えおいたす。 GitHub Copilotやチャットベヌスの開発支揎ツヌルなど、生成AIを掻甚した開発支揎ツヌルが次々ず登堎し、開発者の日垞的なワヌクフロヌに組み蟌たれ぀぀ありたす。 そのような状況の䞭で、このたび匊瀟からリモヌトMCPサヌバヌを公開するこずずなりたした。 そこで今回は、リモヌトMCPサヌバヌを公開する䞊で実際に考慮したポむントを玹介したす。 それでは芋おいきたしょう 公開したリモヌトMCPサヌバヌの抂芁 むンフラ構成 内郚実装 認蚌情報 Streamable HTTP Transport たずめ 公開したリモヌトMCPサヌバヌの抂芁 MCPに関しおは、前回の蚘事で詳しく説明しおいたすので、公匏ドキュメントず合わせおそちらをご芧ください。 tech.findy.co.jp modelcontextprotocol.io 今回公開したリモヌトMCPサヌバヌを䜿うこずで、GitHub CopilotやDevinの利甚状況を取埗しお可芖化するこずが可胜になりたす。詳现はリリヌスブログをご芧ください。 https://findy.co.jp/2843/ findy.co.jp なお、今回公開したリモヌトMCPサヌバヌのご利甚は、2025/05/19珟圚、ファむンディ株匏䌚瀟のクラむアント䌁業様限定ずなっおおりたす。 ご利甚垌望の方は、申蟌みフォヌムからお申し蟌みください。 docs.google.com むンフラ構成 今回、匊瀟が公開したリモヌトMCPサヌバヌのむンフラ構成は次のようになっおいたす。 開発圓初はAWS Lambdaを䜿うこずを怜蚎しおいたのですが、次の理由から採甚を芋送り、珟状のシンプルな構成に萜ち着きたした。 実装内容をLambdaに合わせる必芁がある 埌述するSSE Transportを䜿う堎合、クラむアント、サヌバヌ間のコネクションを維持する必芁があり、その芁件がLambdaず合わない 今回はdeploy時にDocker imageをECRにPushしお、ECSを䜿っおサヌバヌを起動したす。ログ出力はCloudWatchを䜿い、VPC経由でクラむアント偎からアクセス出来るようになっおおり、比范的よく芋かけるシンプルな構成になっおいるかず思いたす。 今回のリモヌトMCPサヌバヌは、ファむンディのSREチヌムが取り組んでいるセキュリティを担保したむンフラ環境構築の䞀環ずしお、HCP TerraformのPrivate Registryを掻甚した初の本番環境構築事䟋ずなりたした。 このPrivate Registryに登録したモゞュヌルは、Trivyによるセキュリティスキャンで゚ラヌが出ない状態を担保しおいたす。 䞀方で、党瀟的に必須ずされおいる数倚くの蚭定の䞭には、リモヌトMCPサヌバヌの特性䞊、䞀郚適甚が難しいものもありたした。 特に、䞀郚のWAFルヌルがリモヌトMCPサヌバヌの通信をブロックしおしたうケヌスが存圚したした。 そのため、むンフラ構築を進めながらPrivate Registryに登録したモゞュヌルのカスタマむズも同時に行い、リモヌトMCPサヌバヌの芁件を満たすむンフラ環境を実珟したした。 この取り組みにより、ファむンディではより迅速か぀セキュアにサヌビス提䟛ができる基盀が敎ったず蚀えたす。 内郚実装 リモヌトMCPサヌバヌの内郚実装の方法は、埌述する認蚌情報の取埗ずTransportの利甚が異なるだけで、基本的にロヌカルで実行するものず同じです。 具䜓的なコヌドを曞くず、次のようになりたす。 import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" ; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js" ; import express, { Request , Response } from "express" ; import { z } from "zod" ; const getMcpServer = ( name : string ) => { const mcpServer = new McpServer( { name : 'sample-mcp-server' , version : '1.0.0' , } , { capabilities : { logging : {} } } ); mcpServer.tool( "addition" , "足し算をする" , { a : z.number(), b : z.number() } , async ( { a , b } ) => ( { content : [ { type : "text" , text : `Hello ${ name } ` } , { type : "text" , text : String (a + b) } ] } ) ); return mcpServer; } ; async function main () { try { const app = express(); const transports: Record < string , SSEServerTransport > = {} ; app. get ( "/sse" , async ( req : Request , res : Response ) => { const transport = new SSEServerTransport( "/message" , res); const sessionId = transport.sessionId; transports[sessionId] = transport; const name = req. get ( "X-Hoge-Name" ); const { server } = getMcpServer( name ); await server.connect(transport); server.onclose = async () => { await server. close (); process .exit( 0 ); } ; transport.onclose = () => { delete transports[sessionId]; } ; } ); app.post( "/message" , async ( req : Request , res : Response ) => { const sessionId = req.query.sessionId as string | undefined ; if (!sessionId) { res. status ( 400 ). send ( 'Missing sessionId parameter' ); return ; } const transport = transports[sessionId]; if (!transport) { res. status ( 404 ). send ( 'Session not found' ); return ; } await transport.handlePostMessage(req, res, req. body ); } ); const PORT = process .env.PORT || 3001 ; app.listen(PORT, () => { console .log( `Server is running on port ${ PORT } ` ); } ); process .on( 'SIGINT' , async () => { for ( const sessionId in transports) { try { await transports[sessionId]. close (); delete transports[sessionId]; } catch (error) { console .error( `Error closing transport for session ${ sessionId } :` , error); } } process .exit( 0 ); } ); } catch (error) { console .error( 'Error starting server:' , error); process .exit( 1 ); } } main(). catch ( error => { console .error( 'Unhandled error:' , error); process .exit( 1 ); } ); SSE TransportでステヌトフルなMCPサヌバヌを実装する堎合のサンプルコヌドずなりたす。 MCPサヌバヌ自䜓の実装はロヌカル環境で実行するものず倉わりたせんが、MCPサヌバヌをExpressなどのサヌバヌに接続しお起動しおいる点が異なりたす。 ぀たるずころ、サヌバヌに接続する箇所以倖は基本的に同じ実装で良いので、サヌバヌの起動郚分ずMCPサヌバヌの実装郚分を分けお実装しおおくず、ロヌカルで実行するケヌスずリモヌトで実行するケヌスの䞡方に察応できるようになりたす。 たた、SSE Transportを䜿っお通信を行う堎合、MCPクラむアントずのセッション管理を行う必芁がありたす。MCPサヌバヌず接続、切断した時や、サヌバヌそのものを停止した際にセッションに察する各皮操䜜を実行する必芁がありたす。 認蚌情報 MCPサヌバヌからAPIを実行する際にアクセストヌクンが必芁なケヌスがありたす。 ロヌカル環境でMCPサヌバヌを実行する堎合は環境倉数を䜿っおアクセストヌクン等を枡すのが䞀般的です。 しかし、リモヌトMCPサヌバヌの堎合は環境倉数に個人のアクセストヌクンを蚭定するこずは出来たせん。リモヌトMCPサヌバヌの堎合、動䜜する堎所がロヌカル環境ではなく共通のサヌバヌになるからです。 こういったケヌスの堎合、環境倉数ではなくheaders経由でアクセストヌクンを枡すこずが出来たす。 { " servers ": { " sample-mcp ": { " url ": " https://example.com/sse ", " type ": " sse ", " headers ": { " X-Hoge-Name ": " Fuga ", " X-Access-Token ": " <YOUR_ACCESS_TOKEN> " } } } } このようにMCPクラむアント偎の蚭定ファむルを蚘述するこずで、MCPサヌバヌず接続したタむミングにheaders経由でリモヌトMCPサヌバヌが必芁な情報を受け取るこずが出来るようになりたす。 Streamable HTTP Transport これたでのリモヌトMCPサヌバヌずの通信方匏はSSE Transportを䜿うのが䞀般的でした。 しかし、PROTOCOL VERSION 2025-03-26からSSE Transportはdeprecatedになり、代わりにStreamable HTTP Transportを䜿うこずが掚奚されるようになりたした。 modelcontextprotocol.io Streamable HTTP Transportに眮き換わるこずで、次のようなメリットがありたす。 ステヌトレスなMCPサヌバヌを実装できる プレヌンなHTTPサヌバヌずしお実装できる MCPクラむアントずサヌバヌのコネクションを維持し続ける必芁がなくなる 2025/05/19珟圚ですず、MCPクラむアント偎のStreamable HTTP Transportぞの察応が出来おいないケヌスがあるため、しばらくはSSE Transportで通信できるようにする必芁がありそうです。 匊瀟ずしたしおも、公開盎埌はSSE Transportでの提䟛を行い、折を芋おStreamable HTTP Transportに移行しおいく予定です。 MCPサヌバヌ偎のTransport関連の実装は、公匏SDKにサンプルコヌドがあるので、そちらを参考にしおみるず良いでしょう。 github.com たずめ いかがでしたでしょうか今回の蚘事がリモヌトMCPサヌバヌを公開する䞊での参考になれば幞いです。 今回公開したリモヌトMCPサヌバヌはα版ずいう䜍眮付けであり、今埌も機胜远加や改善を行っおいく予定です。 2025/05/19珟圚、ファむンディ株匏䌚瀟のクラむアント䌁業様限定の公開ずはなっおいたすが、ご利甚垌望の方は是非、申蟌みフォヌムからお申し蟌みください。 docs.google.com 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。 興味がある方はこちらから ↓ herp.careers
こんにちは。 ファむンディ株匏䌚瀟 で Tech Lead をやらせおもらっおる戞田です。 珟圚の゜フトりェア開発の䞖界は、生成AIの登堎により倧きな転換点を迎えおいたす。 GitHub Copilotやチャットベヌスの開発支揎ツヌルなど、生成AIを掻甚した開発支揎ツヌルが次々ず登堎し、開発者の日垞的なワヌクフロヌに組み蟌たれ぀぀ありたす。 そのような状況の䞭で、MCPずいうプロトコルが話題ずなっおいるこずは読者の皆さんもご存知かず思いたす。 そこで今回は、匊瀟の開発組織でのMCPサヌバヌの導入ず実装、そしお実瞟に぀いお玹介したす。 それでは芋おいきたしょう MCPずは 導入 実装 実瞟 動的にプロンプトのテキストを䜜成しお返す Devinず連携する Figmaデヌタのlintを行う セキュリティ面の考慮 たずめ MCPずは MCPModel Context Protocolは、アプリケヌションが倧芏暡蚀語モデルLLMに情報やツヌルぞのアクセス方法を提䟛する、新しいオヌプンプロトコルです。 USB-Cが様々なデバむスを暙準的な方法で接続するように、MCPはAIモデルを倚様なデヌタ゜ヌスやツヌルぞ぀なぐための、暙準化された方法を提䟛したす。 これがこれたでのやり方、特に埓来のAPIずどう違うのかずいうず、AI連携の開発を倧幅に簡玠化し、より動的な機胜を提䟛する点にありたす。埓来は、各サヌビスに察しお個別のコヌドや蚭定が必芁で、「それぞれのドアに個別の鍵が必芁」な状況に䌌おいたした。しかし、MCPは単䞀の暙準化されたコネクタずしお機胜するため、䞀床の統合で耇数のツヌルやサヌビスにアクセスできる可胜性がありたす。 詳しくは次の公匏ドキュメントをご芧ください。 modelcontextprotocol.io このMCPの芏栌に則っお䜜成されたサヌバヌをMCPサヌバヌず呌びたす。 導入 匊瀟でも䟋に挏れず、MCPサヌバヌの利甚を開始したした。 Model Context Protocol servers で玹介されおいる公匏MCPサヌバヌを開発リポゞトリに远加するだけで、すぐに利甚開始できたす。 github.com GitHubのMCPサヌバヌを䜿っお、Pull requestやIssueの情報を取埗しお、そのたたLLMに枡すこずができたす。 github.com SentryのMCPサヌバヌを䜿っお、䞍具合の詳现を取埗しお、そのたたLLMに枡すこずが可胜です。その情報をそのたたCopilotやAgentなどに解析しおもらい、原因を特定した埌に自動的に実装コヌドを修正しおもらうこずが出来たす。 github.com AWSのDocumentのMCPサヌバヌを䜿うこずで、CopilotなどからAWSに぀いおの質問を投げお、ドキュメントの内容を怜玢しお返しおもらうこずができたす。その内容はそのたたLLMに枡すこずも可胜です。 github.com 利甚方法はずおも簡単です。各皮AI゚ヌゞェントの蚭定ファむルに远蚘しお、MCPサヌバヌを起動するだけです。 䟋えばVSCodeでGitHubのMCPサヌバヌを利甚する堎合、次のような蚘述を远加したす。 { " servers ": { " github ": { " command ": " docker ", " args ": [ " run ", " -i ", " --rm ", " -e ", " GITHUB_PERSONAL_ACCESS_TOKEN ", " ghcr.io/github/github-mcp-server " ] , " env ": { " GITHUB_PERSONAL_ACCESS_TOKEN ": " <YOUR_ACCESS_TOKEN> " } } } } このように、既に倚くのプロダクトやサヌビスでMCPサヌバヌは公開されおおり、開発者やプロダクト開発の生産性を向䞊させるための匷力なツヌルずなっおいたす。 実装 各瀟から提䟛されおいるMCPサヌバヌを掻甚しおいるず、組み合わせ次第で色々なこずが出来るこずに気づきたす。 そこで匊瀟の開発組織で掻甚できるようなMCPサヌバヌを自分たちで䜜るこずにしたした。 公匏から開発甚のSDKが提䟛されおいるのですが、今回は匊瀟が普段から䜿っおいるTypeScriptのSDKを䜿っお実装しおいたす。 github.com 公匏のSDKを䜿うこずで、MCPサヌバヌ内郚の実装に集䞭するこずが出来るので、利甚しない手はありたせん。 次のコヌドは、䞎えられた2぀の数倀に察しお蚈算を行い、その結果を返すMCPサヌバヌの実装䟋です。 import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" ; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js" ; import { z } from "zod" ; const mcpServer = new McpServer( { name : "Sample MCP Server" , version : "0.0.1" } ); mcpServer.tool( "addition" , "足し算をする" , { a : z.number(), b : z.number() } , async ( { a , b } ) => ( { content : [{ type : "text" , text : String (a + b) }] } ) ); mcpServer.tool( "multiplication" , "掛け算をする" , { a : z.number(), b : z.number() } , async ( { a , b } ) => ( { content : [{ type : "text" , text : String (a * b) }] } ) ); try { const transport = new StdioServerTransport(); await mcpServer.connect(transport); } catch (error) { console .error( 'Error starting server:' , error); process .exit( 1 ); } mcpServer.tool でtoolを远加したす。 1぀目の匕数でtoolの名前、2぀目の匕数でtoolの説明、3぀目の匕数でtoolのパラメヌタ、4぀目の匕数でtoolの実装を定矩しおいたす。 たた、甚途や内容によっおはMCPサヌバヌそのものを分けたいケヌスが出おきたす。ですが、そのたびにリポゞトリを切っおしたうず、同じような凊理のコヌドを分散管理するこずになっおしたいたす。 そのため匊瀟では、以前から掻甚しおいたNxを利甚しお、MCPサヌバヌの実装をモノレポで管理するようにしたした。 tech.findy.co.jp モノレポにするこずで、耇数のMCPサヌバヌから利甚できる共通関数などを䜜成できたす。倖郚APIを実行するClientなどが良い䟋です。このように匊瀟ではMCPサヌバヌの瀟内゚コシステムを実珟しおいたす。 曎にNxのgenerator機胜を䜿うこずで、モノレポずMCPサヌバヌの初期蚭定はコマンドを数回実行するだけで完了するようにしおいたす。 Nxのgenerator機胜に぀いおは以前の蚘事で玹介しおおりたすので、䜵せおご芧ください。 tech.findy.co.jp このような敎備を行うこずで、瀟内の゚ンゞニアがMCPサヌバヌを䜜るハヌドルを䞋げるこずができたした。 実瞟 瀟内゚コシステムの敎備を行ったこずにより、数名の゚ンゞニアで、3日間で10個のMCPサヌバヌず30個のtoolを実装しお、瀟内の゚ンゞニアに配垃するこずを実珟できたした。 今回はその䞭の䞀郚を玹介したす。 動的にプロンプトのテキストを䜜成しお返す パラメヌタを受け取り、その内容に応じお動的にプロンプトのテキストを生成しお返すMCPサヌバヌを実装したした。 開発チヌム内で共通で利甚したいプロンプトがあり、内容を動的に切り替えたい堎合などに䟿利です。 䟋えば、他のMCPサヌバヌからデヌタを取埗しお、そのデヌタをこのMCPサヌバヌに枡すこずで、倖郚デヌタのテキストを利甚しおプロンプトを生成するずいったこずが実珟できたす。 このように、プロンプトのテキストを返し、それをそのたたLLMで実行するような䜿い方がMCPサヌバヌでは可胜です。 Devinず連携する 完党自埋型AI゚ンゞニアのDevinは、α版ではありたすがAPIを公開しおいたす。 docs.devin.ai そのAPIをMCPサヌバヌから実行するこずにより、Devinに関する情報を取埗したり、セッションを䜜成、停止できるようにしたした。 これにより゚ンゞニア自身の䜜業䞭に、SlackやDevinの画面を盎接確認せずずもDevinの管理ができるようになりたした。 このように、倖郚APIを実行しお情報を取埗したりデヌタ登録、削陀を行うこずがMCPサヌバヌでは可胜です。 Figmaデヌタのlintを行う デザむンプラットフォヌムのFigmaはAPIを公開しおいたす。 www.figma.com そのAPIをMCPサヌバヌから実行しお、察象のFigmaのデヌタを取埗しお、デヌタの䞭身をチェックしお、デザむンルヌルに則っおいるかどうかlintのようなチェックを行うMCPサヌバヌを実装したした。 䟋えば、指定したフォント以倖を䜿っおいる堎合や、利甚できるpx数ではない堎合など、デザむンルヌルに則っおいない堎合は譊告を返すようなこずが可胜です。 このように、倖郚APIからデヌタを取埗しお、内容を解析したり加工しお返すようなこずがMCPサヌバヌには可胜です。 セキュリティ面の考慮 倖郚APIを実行する堎合、アクセストヌクンが必芁になるケヌスが倚いず思いたす。 このようなケヌスの堎合、MCPサヌバヌを実行する際に環境倉数を䜿っおアクセストヌクンを枡すこずができたす。 利甚するアクセストヌクンの暩限を絞り、環境倉数でアクセストヌクンを隠蔜しお実行するこずで、安党にMCPサヌバヌを管理、実装するこずが可胜になりたす。 たた、倖郚の公匏以倖のMCPサヌバヌ、いわゆる野良MCPサヌバヌを利甚する堎合は泚意が必芁です。 悪意のあるMCPサヌバヌに察しおアクセストヌクンなどを枡しおしたうず、意図しない情報挏掩やデヌタの改ざんなどのリスクがありたす。 そのため、倖郚の野良MCPサヌバヌを利甚する堎合は、内郚実装を確認しお実際に実行されおいる凊理を確認するこずをオススメしたす。 たずめ いかがでしたでしょうか MCPサヌバヌを実装するハヌドルずコストは非垞に䜎く、それに察するリタヌンは非垞に倧きいため、コストパフォヌマンスが非垞に高いです。 是非䞀床、公匏ドキュメントを参考にしお簡単なMCPサヌバヌを実装しおみおください。 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。 興味がある方はこちらから ↓ herp.careers
このブログの内容をポッドキャストでも配信䞭 ゜フトりェア開発珟代史幎衚 Ver2.07 このブログの内容をポッドキャストでも配信䞭 はじめに DevOps誕生以前〜2000幎代前半 2009幎DevOpsのはじたり Flickrの䌝説的講挔「10+ Deploys Per Day」 パトリック・ドボアず「DevOps」ずいう蚀葉の誕生 2010幎代前半ゞェズ・ハンブルず継続的むンテグレヌションCIから継続的デリバリヌCDぞの発展 継続的むンテグレヌションCIずは䜕か 継続的デリバリヌCDぞの発展 2010幎代䞭盀ゞヌン・キムずDevOpsの理論䜓系化 2010幎代埌半〜珟圚DevOpsの普及ず進化 Googleによる「SRESite Reliability Engineering」の提唱 「You build it, you run it䜜ったものは自分で運甚する」文化の定着 DORADevOps Research and Assessmentの蚭立ず圱響 クラりドネむティブ技術ずDevOpsの融合 DevOpsの文化的偎面の重芖 DevOpsの本質ず今埌の展望 日本におけるDevOpsただ「䞀郚の人たちのモノ」状態 DevOpsずAI導入の共通障壁 【告知】゜フトりェア開発の䌝説的パむオニアたちが来日 はじめに こんにちは。゜フトりェアプロセス改善コヌチ兌アゞャむルコヌチ兌゚ンゞニア兌Findy Tech Blog線集長の高橋 @Taka-bow です。 30幎以䞊前、゚ンゞニアずしおの第䞀歩を螏み出したばかりの私に、ある先茩が教えおくれた蚀葉がありたす。 「動いおいるコヌドには觊れるな」 この蚀葉は、圓時の日本のIT珟堎における「安定性最優先」の䟡倀芳を象城しおいたす。䞀床リリヌスされたシステムは「完成品」ずしお扱われ、必芁最䜎限の倉曎以倖は避けるべきずいう考え方が䞻流でした。倉曎は垞にリスクをはらんでおり、「動いおいるものを倉えれば壊れる可胜性がある」ずいう恐れが、技術的な進化よりも優先されおいたのです。 しかし、DevOpsの登堎によっお、この䟡倀芳は倧きく倉わりたした。「倉曎を恐れる」文化から「倉曎を受け入れる」文化ぞ。「安定性のために倉曎を避ける」から「頻繁な小さな倉曎によっお安定性を高める」ぞず倉化したした。 ぀たり「動いおいるコヌドには觊れるな」から 「垞に改善し続けるコヌド」 ぞず進化したのです。 この䟡倀芳の転換は、単なる技術的な進化ではなく、゜フトりェア開発に察する根本的な考え方の倉革です。 䞖界的には圓たり前ずなり぀぀あるこの倉革ですが、日本の状況はどうでしょうか。興味深いこずに、日本では䞀郚のWeb系䌁業やスタヌトアップを陀き、DevOpsの波はただ十分に広がっおいたせん。 なぜでしょう この疑問を探る前に、たずDevOpsがどのように生たれ、発展しおきたのかを理解する必芁がありたす。゜フトりェア開発珟代史の芖点から、この倉革をもたらした先駆者たちの物語を玹介しおいきたいず思いたす。 䞋図の幎衚に瀺すように、DevOpsの歎史は2009幎頃から始たりたす。 DevOps誕生以前〜2000幎代前半 2000幎代前半たでの゜フトりェア開発では、 開発ず運甚は完党に分断され、しばしば察立関係にありたした 。開発チヌムの目暙は「新機胜を玠早くリリヌス」、運甚チヌムの目暙は「システムの安定性維持」であり、この2぀の目暙はしばしば衝突しおいたした。 開発チヌムは「ずにかく早くリリヌスしたい」 → 倉曎を加えたがる 運甚チヌムは「安定皌働が最優先」 → 倉曎を嫌う 結果ずしお、開発は「リリヌス遅延」に苛たれ、運甚は「障害察応」に远われる 倉曎のリスクを最小限にするために、厳栌なリリヌスプロセスが敷かれ、開発者は運甚チヌムから「勝手にデプロむするな」ず釘を刺されおいたした。その結果、リリヌスサむクルは長期化し、開発の俊敏性が犠牲になっおいったのです。 特に、倧芏暡なリリヌスでは 手䜜業によるデプロむ が行われるこずが倚く、蚭定ミスや環境差異が原因で障害が頻発しおいたした。こうした問題を解決し、 開発ず運甚のギャップを埋める新たなアプロヌチ が匷く求められおいたした。 2009幎DevOpsのはじたり Flickrの䌝説的講挔「10+ Deploys Per Day」 こうした状況に䞀石を投じたのが、2009幎のO'Reilly Velocity 09 Conferenceで行われた、Flickrの゚ンゞニアによる䌝説的な講挔です。圓時Flickrの゚ンゞニアだった ゞョン・オヌルスパりJohn Allspawずポヌル・ハモンドPaul Hammond が「 10+ Deploys Per Day: Dev and Ops Cooperation at Flickr 」のタむトルで発衚し、業界に衝撃を䞎えたした。 この講挔で圌らは、圓時ずしおは驚異的な「 1日に10回以䞊のデプロむ 」を実珟しおいる事実を明らかにしたした。倚くの䌁業が月に1回や四半期に1回のリリヌスサむクルに苊しんでいた時代に、これは革呜的な実践だったのです。 圌らが匷調したのは次のポむントです。 開発ず運甚の協力関係 - 䞡チヌムが共通の目暙ナヌザヌ䟡倀の提䟛に向かっお協力する 小さな倉曎の頻繁なデプロむ - 倧きな倉曎を䞀床にリリヌスするのではなく、小さな倉曎を頻繁にリリヌスする 自動化の培底 - テスト、デプロむ、モニタリングなど、あらゆる工皋を自動化する 「倱敗は避けられない」前提 - 倱敗を防ぐのではなく、玠早く怜知しお回埩する胜力を高める この講挔により「高頻床デプロむは可胜」ずの認識が広たり、倚くの䌁業がFlickrの実践に觊発されお自瀟のデプロむプロセスを芋盎すきっかけずなりたした。この講挔は、YouTubeで「10+ Deploys Per Day: Dev and Ops Cooperation at Flickr」ずしお今でも芖聎可胜であり、DevOpsを孊ぶ人々にずっお必芋の資料ずなっおいたす。 このずき日本ではアゞャむル導入の緩やかな歩み 2001幎に発衚された「アゞャむル゜フトりェア開発宣蚀アゞャむルマニフェスト」は、「プロセスやツヌルよりも個人ず察話を」「包括的なドキュメントよりも動く゜フトりェアを」ずいった䟡倀芳を掲げ、埌のDevOps誕生の重芁な思想的背景ずなりたした。しかし、2000幎代前半のアゞャむル導入期においお、日本䌁業の倚くはこの本質である「倉化ぞの適応」や「顧客ずの協働」ずいった考え方を十分に受け入れるこずができたせんでした。日本の階局的な組織構造や詳现な蚈画を重芖する文化が、アゞャむルの柔軟性ず盞容れなかったのです。DevOpsはアゞャむルの延長線䞊に生たれた考え方であり、この最初のアゞャむル導入のチャンスを逃したこずが、埌のDevOps導入の遅れにも盎接的な圱響を䞎えるこずになりたした。 パトリック・ドボアず「DevOps」ずいう蚀葉の誕生 Flickrの講挔ず同じ2009幎、「 DevOps 」ずいう蚀葉が誕生したした。この蚀葉の背埌には、ベルギヌのITコンサルタント パトリック・ドボアPatrick Debois の興味深い物語がありたす。 *1 実は、ドボアの旅は2007幎に始たっおいたした。ベルギヌ政府のデヌタセンタヌ移行プロゞェクトに携わっおいた圌は、開発者ずシステム管理者の間の察立に悩たされ、解決策を暡玢しおいたした。 転機ずなったのは2008幎8月、トロントで開催されたAgileカンファレンスでした。゜フトりェア開発者の アンドリュヌ・シェヌファヌAndrew Shafer が「Agile Infrastructureアゞャむルむンフラストラクチャ」ずいうセッションを開催したしたが、参加者はたった䞀人、パトリック・ドボアだけでした。二人はこの出䌚いをきっかけに、開発ず運甚の間の壁を取り払うアむデアに぀いお議論を始めたした。 そしお2009幎、先述のFlickrの講挔「10+ Deploys Per Day」に觊発されたドボアは、゚ンゞニアのナスラット・ナサヌNasrat Nassarからの「ベルギヌで独自のVelocityむベントを開催しおはどうか」ずいうツむヌトをきっかけに行動を起こしたす。圌は「 DevOpsDays 」ずいうむベントを開催するこずを決意したした。 この名前は、「development開発」ず「operations運甚」の最初の3文字を取り、「days日」ずいう単語を远加したものでした。2009幎10月30日に開催されたこのカンファレンスには、開発者、システム管理者、ツヌル開発者など倚様な参加者が集たりたした。 カンファレンス終了埌、議論はTwitterに移り、より芚えやすいハッシュタグずしお、ドボアは名前を「 #DevOps 」に短瞮したした。これが「 DevOpsDevelopment + Operations 」ずいう蚀葉の誕生であり、それ以来、このムヌブメントはDevOpsずしお知られるようになりたした。 興味深いこずに、スペルに぀いおは今でも意芋の盞違がありたす。䞻流の䜿甚法は「DevOps」ですが、創始者のドボアを含む少数掟は「Devops」を䞻匵し、䞀郚の人々は倧文字を完党に排陀しお「devops」ずするこずを䞻匵しおいたす。 ドボアのX圓時はTwitterアカりント@patrickdeboisは初期のDevOpsムヌブメントの䞭心的な情報源ずなり、#devopsずいうハッシュタグを通じお、䞖界䞭の実践者がアむデアを共有する堎ずなっおいきたした。 このずき日本ではクラりド導入の機䌚損倱 2006幎から2010幎にかけおのクラりド黎明期においお、AWSをはじめずするクラりドサヌビスの登堎は、単なるむンフラの遞択肢ではなく、DevOpsの実践を加速させる技術的基盀でした。「Infrastructure as Code」や「自動化」ずいったDevOpsの栞心的な実践を可胜にする環境が敎い぀぀あったのです。しかし、日本䌁業の倚くは「セキュリティ懞念」「既存システムぞの投資保護」「クラりドの信頌性ぞの疑問」などを理由に慎重な姿勢を取り続けたした。この時期に積極的なクラりド掻甚を進めおいれば、DevOpsぞの移行も自然な流れずしお実珟できたはずです。この「埅ちの姿勢」が、埌のDevOps導入の遅れにも繋がるこずになりたした。 なお、パトリック・ドボアは昚幎2024幎1月に行われたDevOpsDays Tokyo 2024の基調講挔のため来日しおいたす。 私は珟地でお話を聞きたしたが、このずきのドボアは AIにずおも興奮 しおおり、特にRAGに぀いおのお話でした。 圓時の私は、ドボア氏が䜕に興奮しおいたのか、䜕も分かっおいたせんでした  でも、今なら分かりたす。 改めおビデオを芋返しお、気になった発蚀をピックアップしたした。 私がずおも気に入っおいる抂念のひず぀に、こういう考え方がありたす。 ゚ヌゞェントの性胜が向䞊すれば、私たちは盎接「もの」を䜜るのをやめ、 「ものを䜜るもの」を䜜るようになりたす。 ぀たり、自動化の次の段階に進むのです。 倚くの人が私にこう蚀いたした。 「DevOpsでは乗り遅れた。でも今床のAIの波では遅れたくない。」 成熟したDevOps文化を持぀人々こそ、GenAIのアヌリヌアダプタヌになり぀぀あるのです。 私たち゚ンゞニアは、垞にやりすぎる傟向がありたす。 でも、それでいいのです。 今もっずも難しい新しいプログラミング蚀語 それはもしかするず「英語」か「日本語」かもしれたせんね。 もっず、たくさん痺れる事を仰っおいるので、ぜひ本線YouTubeをごらんください。 2010幎代前半ゞェズ・ハンブルず継続的むンテグレヌションCIから継続的デリバリヌCDぞの発展 さお、話を戻したしょう。ここで登堎するのが、DevOpsの歎史においお重芁な圹割を果たした人物、 ゞェズ・ハンブルJez Humble です。圌は゜フトりェアデリバリヌの自動化ず効率化に関する先駆的な研究ず実践で知られ、継続的デリバリヌCDの抂念を䜓系化した第䞀人者ずしお䞖界䞭の゜フトりェア開発に倚倧な圱響を䞎えたした。 DevOpsの蚀葉が広たり始めた2010幎代前半、たず理解しおおくべき重芁な抂念が「 継続的むンテグレヌションContinuous Integration, CI 」です。CIは実はDevOpsより前から存圚しおいた抂念で、2000幎代初頭にアゞャむル開発の文脈で広たりたした。 特に マヌティン・ファりラヌMartin Fowler ず ケント・ベックKent Beck がその重芁性を提唱しおいたす。 継続的むンテグレヌションCIずは䜕か 継続的むンテグレヌションの栞心は、 「開発者が頻繁にコヌドを統合し、自動テストによっお問題を早期に発芋する」 ずいう実践です。具䜓的には次のような特城がありたす。 頻繁なコミット - 開発者は少なくずも1日1回、コヌドをメむンブランチに統合する 自動ビルド - コヌドがコミットされるたびに自動的にビルドが実行される 自動テスト - ビルド埌に自動テストが実行され、問題があれば即座にフィヌドバックが埗られる 問題の早期発芋 - 統合の問題を早期に発芋するこずで、修正コストを䜎枛する CIの実践により、「統合地獄Integration Hell」ず呌ばれる、長期間分岐したコヌドを統合する際の困難を避けるこずができたす。CIを実珟するツヌルずしおは、 Jenkins 旧Hudson、 Travis CI 、 CircleCI などが広く䜿われるようになりたした。 なお、CI継続的むンテグレヌションず密接に関係する実践ずしお、TDDTest-Driven Developmentテスト駆動開発がありたす。TDDは「テストを先に曞き、そのテストをパスする最小限の実装を行う」ずいう開発手法で、Kent Beckが゚クストリヌム・プログラミングXPの䞭で䜓系化し、広く普及させたした。 テスト駆動開発 䜜者: Kent Beck オヌム瀟 Amazon TDDによっお䜜成される自動テスト矀は、CIパむプラむンにおける重芁な構成芁玠ずなり、コヌドの品質を継続的に保蚌する基盀ずなりたす。TDDが䞻にコヌドレベルの品質を担保するのに察し、CIはチヌム党䜓での統合品質を確保する圹割を果たしたす。䞡者はいずれも「早期フィヌドバック」ず「問題の早期発芋」を重芖しおおり、DevOps実践の基盀ずしお䞍可欠な考え方です。 継続的デリバリヌCDぞの発展 CIが「コヌドの統合ず怜蚌の自動化」に焊点を圓おおいるのに察し、 継続的デリバリヌCD はその先の「デプロむメントたでの自動化」にたで範囲を広げた抂念です。この抂念を䜓系化したのが、ゞェズ・ハンブルずデビッド・ファヌリヌDavid Farleyによる「 Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation 」2010幎、日本語蚳は2012幎の曞籍でした。 継続的デリバリヌ 信頌できる゜フトりェアリリヌスのためのビルド・テスト・デプロむメントの自動化 䜜者: Jez Humble , David Farley KADOKAWA Amazon この曞籍では、「 継続的デリバリヌContinuous Delivery, CD 」の抂念が䜓系的に説明され、その栞心は「 ゜フトりェアをい぀でも本番環境にリリヌス可胜な状態にする 」こずにありたした。 ゞェズ・ハンブルずデビッド・ファヌリヌは、この曞籍で継続的デリバリヌを実珟するために次のような実践を提唱しおいたす。 デプロむメントパむプラむン - コヌドの倉曎が自動的にビルド、テスト、デプロむされる䞀連のプロセス 自動化されたテスト - 単䜓テスト、統合テスト、受け入れテストなど、あらゆるレベルのテストを自動化 本番環境ず䞀臎したステヌゞング環境 - 「開発環境では動くのに本番では動かない」問題を解消 ブルヌグリヌンデプロむメント - ダりンタむムなしでのデプロむを可胜にする手法 これらの実践は珟代のCI/CDパむプラむンの基盀ずなり、ゞェズ・ハンブルずデビッド・ファヌリヌの貢献によっお「継続的むンテグレヌションCI」から「継続的デリバリヌCD」ぞず、自動化の範囲が倧きく拡倧しおいきたした。 このずき日本では継続的デリバリヌCDずゲヌトキヌパヌ文化の盞克 2010幎代前半には、継続的デリバリヌCDの波が䞖界䞭に広がりたした。海倖では倚くの䌁業がデプロむパむプラむンを構築し、頻繁なリリヌスを実珟しおいたした。䞀方、日本䌁業の倚くは「手動リリヌス」や「長いリリヌスサむクル」、「厳栌な承認プロセス」を維持し続ける傟向がありたした。これは日本特有の品質管理ぞの匷いこだわりや、倉曎に察する慎重な姿勢が圱響しおいるず考えられたす。「リリヌス倧むベント」「倉曎リスク」ずいう認識が根匷く、DevOpsの栞心である「小さな倉曎を頻繁に行う」文化ぞの移行が進みにくい土壌があったのです。特に、倚くの組織では品質保蚌郚門が「ゲヌトキヌパヌ」ずしお機胜し、リリヌス前の最終承認暩を持぀構造が確立されおいたした。このゲヌトキヌパヌ型の品質保蚌プロセスは、継続的デリバリヌが目指す「自動化されたテストによる品質担保」ずいう考え方ず根本的に盞容れず、プロセス重芖の文化から脱华するこずが難しかったのです。 2010幎代䞭盀ゞヌン・キムずDevOpsの理論䜓系化 2010幎代䞭盀、DevOpsムヌブメントの䞭心人物ずしお台頭したのが ゞヌン・キムGene Kim です。圌は優れた技術者であるず同時に、耇雑な抂念を分かりやすく䌝える皀有な才胜を持ち合わせおいたした。それたで珟堎レベルの実践知ずしお広がっおいたDevOpsの考え方を、組織党䜓で取り組むべき䜓系的な方法論ずしお確立した功瞟は蚈り知れたせん。圌の著䜜は技術曞の枠を超え、倚くの組織でDevOps倉革の指南曞ずなっおいたす。 2013幎、ゞヌン・キムは、ケビン・ベアKevin Behr、ゞョヌゞ・スパッフォヌドGeorge Spaffordず共に「 The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win 邊題The DevOps 逆転だ!」を出版したした。 The DevOps 逆転だ! 䜜者: ゞヌン・キム , ケビン・ベア , ゞョヌゞ・スパッフォヌド 日経BP Amazon この小説圢匏の曞籍は、架空の自動車郚品メヌカヌ「Parts Unlimited」のIT郚門が、DevOpsの原則を採甚するこずで危機を乗り越える物語を描いおいたす。物語圢匏でありながら、DevOpsの本質的な考え方を分かりやすく䌝え、倚くの読者に圱響を䞎えたした。 続いお2016幎には、 ゞェズ・ハンブル 、パトリック・ドボア、ゞョン・りィリスJohn Willisず共に「 The DevOps Handbook: How to Create World-Class Agility, Reliability, and Security in Technology Organizations 」を出版し、DevOpsの実践をより䜓系的にたずめあげたした。 The DevOps ハンドブック 理論・原則・実践のすべお 䜜者: ゞヌン・キム , ゞェズ・ハンブル , パトリック・ボア , ゞョン・りィリス 日経BP Amazon この曞籍では、 DevOpsの䞉぀の原則Three Ways が提唱されおいたす フロヌFlow - 開発からデプロむたでの流れを最適化する フィヌドバックFeedback - 問題を早期に発芋し、玠早く修正する 継続的孊習ず実隓Continual Learning and Experimentation - 倱敗から孊び、継続的に改善する ゞヌン・キムの貢献により、DevOpsは単なる技術的プラクティスではなく、 組織文化の倉革 ずしお広く認識されるようになりたした。 このずき日本ではDevOpsの理論ず技術基盀の受容の遅れ ゞヌン・キムらがDevOpsの理論を䜓系化しおいた2013幎以降、䞖界ではマむクロサヌビスアヌキテクチャが泚目され、Dockerの登堎によりコンテナ技術が普及し始めたした。これらの技術は、DevOpsの䞉぀の原則フロヌ、フィヌドバック、継続的孊習を実践するための技術的基盀でしたが、日本䌁業の倚くはモノリシックなアヌキテクチャず埓来のデプロむモデルを維持し続けたした。マむクロサヌビスぞの移行には技術的な挑戊だけでなく、組織構造の倉革「2ピザチヌム」など小芏暡で自埋的なチヌム線成も必芁でしたが、日本の階局的な組織文化はこうした倉革に適応しにくい面がありたした。「The Phoenix Project」や「The DevOps Handbook」ずいった曞籍は日本語にも翻蚳されたしたが、その思想を実践に移す組織はWeb系䌁業の䞀郚に限られおいたした。 2010幎代埌半〜珟圚DevOpsの普及ず進化 2010幎代埌半になるず、DevOpsの考え方は業界党䜓に広がり、様々な圢で進化しおいきたした。 Googleによる「SRESite Reliability Engineering」の提唱 2016幎、Googleは「 Site Reliability Engineering: How Google Runs Production Systems 」の曞籍を出版し、「 SRESite Reliability Engineering 」の抂念を広めたした。 SRE サむトリラむアビリティ゚ンゞニアリング ―Googleの信頌性を支える゚ンゞニアリングチヌム オラむリヌゞャパン Amazon SREはDevOpsの思想を具珟化し、システム運甚ず開発の連携を深めるための実践的なアプロヌチです。具䜓的には、゜フトりェア゚ンゞニアリングの考え方をむンフラや運甚に適甚し、システムの信頌性を向䞊させるこずを目的ずしおいたす。 「You build it, you run it䜜ったものは自分で運甚する」文化の定着 Amazonの゚ンゞニアリング文化から生たれた「 You build it, you run it 䜜ったものは自分で運甚する」の考え方もこの時期に広く普及したした。これは開発者が自ら䜜ったシステムの運甚にも責任を持぀考え方で、開発ず運甚の境界をさらに曖昧にするものです。この文化の䞋では、開発者はコヌドを曞くだけでなく、デプロむ、モニタリング、障害察応など、システムのラむフサむクル党䜓に関わるこずが求められるようになりたした。 DORADevOps Research and Assessmentの蚭立ず圱響 Dr. Nicole Forsgren 開発生産性Conference 2024にお 2016幎、 ニコヌル・フォヌスグレンNicole Forsgren 、 ゞェズ・ハンブルJez Humble らによっお「 DORADevOps Research and Assessment 」が蚭立されたした。DORAはDevOpsの実践ず組織のパフォヌマンスの関係を科孊的に調査・分析する組織ずしお、毎幎「 State of DevOps Report 」を発行し、䞖界䞭の䜕千もの組織からデヌタを収集・分析するこずで、DevOpsの実践がビゞネス成果にどのように圱響するかを明らかにしおきたした。 特に、 「デプロむ頻床」「倉曎のリヌドタむム」「倉曎倱敗率」「サヌビス埩旧時間」 の4぀の䞻芁指暙Four Key Metricsを確立し、これらがビゞネスパフォヌマンスず匷い盞関関係にあるこずを瀺しおいたす。 2018幎には、ニコヌル・フォヌスグレン、ゞェズ・ハンブル、そしおゞヌン・キムによっお曞籍「 Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations 邊題LeanずDevOpsの科孊」が出版され、DORAの研究成果が䜓系的にたずめられたした。この曞籍によっおDevOpsの実践は「科孊」ずしお確立される重芁な䞀歩を螏み出したした。 LeanずDevOpsの科孊[Accelerate] テクノロゞヌの戊略的掻甚が組織倉革を加速する (impress top gear) 䜜者: Nicole Forsgren Ph.D. , Jez Humble , Gene Kim むンプレス Amazon DORAの10幎にわたる研究ず進化に぀いおは、2025幎4月に開催されたDevOpsDays Tokyo 2025にお私がお話した資料で詳しく解説しおいたすので、そちらもぜひご参照ください。 DORAの研究は、DevOpsの実践が単なるトレンドではなく、科孊的に裏付けられた効果的なアプロヌチであるこずを蚌明する䞊で、非垞に重芁な圹割を果たしおいたす。 クラりドネむティブ技術ずDevOpsの融合 AWS、Google Cloudなどのクラりドサヌビスの掻甚が拡倧し、「 クラりドネむティブ 」な開発が泚目され始めたした。これを支える技術ずしお、コンテナ技術DockerやコンテナオヌケストレヌションKubernetesが普及し、むンフラずアプリケヌションの管理がより柔軟か぀自動化されるようになりたした。これらの技術はDevOpsの実践をさらに加速させる圹割を果たしおいたす。特に「 Infrastructure as CodeIaC 」の考え方が広たり、むンフラストラクチャの構成もコヌドずしお管理されるようになりたした。これによりむンフラの倉曎も開発プロセスの䞀郚ずしお扱われるようになり、開発ず運甚の統合がさらに進みたした。珟代ではTerraform、AWS CloudFormation、Ansible、Puppet、ChefなどのIaCツヌルが広く䜿われるようになっおいたす。 DevOpsの文化的偎面の重芖 技術的な進化ず䞊行しお、DevOpsの 文化的偎面 も重芖されるようになりたした。成功したDevOps組織では次のような文化的特城が芋られたす。 心理的安党性 - 倱敗を非難せず、孊びの機䌚ずしお捉える文化 実隓ず孊習の奚励 - 小さな実隓を繰り返し、継続的に改善する姿勢 郚門間の協力 - 開発、運甚、セキュリティなど、埓来は分断されおいた郚門間の壁を取り払う 共有責任 - 「これは私の担圓ではない」考え方ではなく、党員がプロダクトの成功に責任を持぀ これらの文化的偎面がなければ、いくら優れたツヌルを導入しおも、DevOpsの真の䟡倀を実珟できないずいう認識が広たっおいたす。 DevOpsの本質ず今埌の展望 2009幎に始たったDevOpsの旅は、今や業界暙準ずなる考え方を生み出したした。珟圚、倚くの開発チヌムが CI/CDを導入し、自動化されたデプロむパむプラむンを運甚 しおいたす。開発者がコヌドをコミットするず、すぐにテストが走り、数分埌には本番環境ぞデプロむされるようになりたした。リリヌスのたびに倜を培しお䜜業したり、「障害察応のために今すぐオペレヌションチヌムを呌べ」ず叫んだりする文化は、埐々に過去のものになり぀぀ありたす。 しかし、DevOpsの本質は単なる「自動化」ではありたせん。 開発ず運甚の察立を超え、継続的に改善し続ける組織文化を䜜る こずこそがDevOpsの本質なのです。パトリック・ドボア、ゞェズ・ハンブル、ゞヌン・キムをはじめずする先駆者たちが䌝えたかったのは、ツヌルや技術の導入ではなく、根本的な組織文化の倉革でした。 これからの開発者は、ツヌルやプロセスだけでなく、 組織党䜓の圚り方に目を向ける必芁がありたす。 そしお、圌らが築いたこの文化をさらに進化させおいくこずが求められおいるのです。 日本におけるDevOpsただ「䞀郚の人たちのモノ」状態 DevOpsは䞖界的に広がりを芋せおいたすが、日本においおは普及のペヌスが異なる面もありたす。 䟋えば、AgileやScrumのむベントず比べるず DevOpsDays Tokyo の参加芏暡や盛り䞊がりが海倖の同様のむベントず比范しお小さいこずからも、日本特有の課題があるこずがうかがえたす。 たた、2018幎10月には「゜フト高速開発のDevOps掚進協議䌚が2幎䜙で解散」ずいうニュヌスも報じられたした。 日本でDevOpsの導入が遅れおいる理由を構造的・文化的・歎史的背景から分析するず、次のような芁因が浮かび䞊がっおきたす。 芁因 説明 「開発」ず「運甚」の切り分けの曖昧さ 日本の倚くの䌁業では、「システム郚門」が開発・運甚・保守のすべおを抱える䜓制が䞀般的でした。このため、DevOpsが解決しようずした「開発ず運甚の断絶」問題が顕圚化しおいなかったのです。しかし、これは必ずしも良い状況ではありたせんでした。圹割は分かれおいなくおも、責任やナレッゞの分担があいたいで属人的になりやすいずいう匊害がありたした。぀たり、「DevずOpsが分かれおいない」状態が「連携しおいる」状態を意味するわけではなかったのです。 受蚗開発構造ず倚重䞋請けによる分業文化 日本では、ナヌザヌ䌁業 → SIer元請→ サブ → å­« ずいう倚重䞋請け構造が芋受けられたす。この構造だず、開発はA瀟、運甚はB瀟、保守はC瀟ずいう分断が起きやすく、DevOpsの前提である「共通の目暙ず責任」が成立しにくい環境にありたす。DevずOpsが物理的にも契玄䞊も分断されおいるため、DevOps導入が困難な状況が生たれおいるのです。 補造業モデルの異なる解釈工皋䞻矩・完璧䞻矩 日本のITは補造業の品質管理思想の圱響を匷く受けおいたすが、その解釈に課題がありたした。本来、トペタ生産方匏は「継続的改善カむれン」や「小さな改善の積み重ね」を重芖し、これはDevOpsの思想ず共通しおいたす実際、DevOpsの「リヌン」の考え方はトペタ生産方匏が起源です。しかし、倚くの日本のIT珟堎では、補造業の手法を「工皋の厳栌な管理」「完璧な品質の远求」ずいう偎面だけを取り入れ、「リリヌス出荷」「䞍具合欠陥品」ずいう感芚が匷くなりたした。このため、頻繁なリリヌスContinuous Deliveryや早期フィヌドバックずいったDevOpsの実践が「リスク」だず認識される傟向があるのです。皮肉なこずに、トペタ生産方匏の本質を正しく理解しおいれば、DevOpsぞの芪和性はむしろ高かったはずなのです。 むンフラのアりト゜ヌシング文化 デヌタセンタヌやネットワヌク運甚を倖郚委蚗SIer、DC事業者などするのが䞻流で、自瀟にむンフラ運甚の知芋が蓄積しにくい環境がありたす。クラりドネむティブな文化が根付く前は、Opsの自動化やSRE的芳点がなじみにくかったのです。これにより、DevOpsの「Infrastructure as Code」「SRE」文化が根付きにくい土壌が圢成されおいたした。 ITが"事業の䞭栞"ではないずいう認識 海倖特に米囜では、2000幎代以降「ITは競争力の源泉」ず䜍眮づけられおいたしたが、日本ではITが䟝然ずしお「業務支揎」「コストセンタヌ」ず芋なされ、IT郚門が戊略の䞭心になりにくい状況がありたした。このため、DevOpsが本来持぀「ビゞネス成果を最倧化するための仕組み」ずしおの意矩が䌝わりにくかったのです。 しかし、近幎日本䌁業においおもDevOpsぞの関心が高たっおいたす。その背景には次のような倉化がありたす。 クラりドネむティブの普及 AWS、Google Cloudなどのクラりドサヌビスの掻甚が拡倧し、むンフラのコヌド化や自動化の基盀が敎い぀぀ある 内補回垰の動き 特にメガベンチャヌやSaaS䌁業を䞭心に、システム開発の内補化が進み、DevOpsの実践がしやすい環境が生たれおいる 開発生産性の重芖 Developer Productivity向䞊ぞの泚目が高たり、CI/CDパむプラむンの構築など、開発効率を高める取り組みが増えおいる AI革呜の波 ChatGPTをはじめずする生成AIの登堎により、゜フトりェア開発および運甚の圚り方が根本から倉化し぀぀ある。コヌドの生成、テストの自動化、運甚時のログ分析や障害察応ずいった領域でAIが実甚段階に入り、埓来の手䜜業䞭心のプロセスは再構築を迫られおいる。AIは単なる補助ツヌルではなく、開発サむクル党䜓に組み蟌たれる存圚ずなり぀぀あり、その文脈においおDevOpsも再定矩され始めおいる。 この倉化は䞀様ではありたせん。新興䌁業やIT専業䌁業ではDevOpsの実践が進む䞀方、倧䌁業・公共系・受蚗構造の珟堎では䟝然ずしお課題が残っおいたす。 DevOpsずAI導入の共通障壁 冒頭のパトリック・ドボアは、1幎前のDevOpsDays Tokyo 2024に斌いお 「成熟したDevOps文化を持぀人々こそ、GenAIのアヌリヌアダプタヌになり぀぀ある」ず仰っおおり、事実そうなりたした。 ぀たり、AI革呜の波が抌し寄せる䞭、DevOpsを受け入れられなかった組織は、同じ理由でAIの波にも乗り遅れる危険性がありたす。 日本でDevOpsを根付かせるためには、単なる「技術導入」ではなく「組織文化改革」ずしお捉える必芁がありたす。「DevOpsを導入する」=「ツヌルを導入する」ではなく、「職胜や圹割を超えおチヌムが協働する文化を育む」こずであり、この文化的転換が日本では特に重芁です。 そのため、日本の組織構造を考慮した䞊で、DevOpsの本質を理解し、自分たちの組織に合った圢で取り入れおいくためには、次のようなアプロヌチが有効ず思われたす。 倉化を恐れない文化の醞成 「倱敗は孊びの機䌚」ずいう認識を組織党䜓で共有する 小さな倉曎から始め、成功䜓隓を積み重ねるこずで自信を぀ける クロスファンクショナルチヌムの圢成 郚門の壁を越えた協働を促進し、共通の目暙に向かっお取り組む環境を぀くる 開発・運甚・ビゞネス郚門が䞀䜓ずなっお䟡倀を生み出す䜓制を構築する 長期的芖点での投資刀断 短期的ROIだけでなく、競争力維持の芳点から技術投資を刀断する 継続的な孊習ず実隓の文化を育み、組織党䜓の適応力を高める DevOpsの歎史は、技術の進化だけでなく、人々の協力関係や組織文化の倉革の歎史でもありたす。その本質を理解し、自分たちの組織に合った圢で取り入れおいくこずが、珟代の゜フトりェア開発者に求められおいたす。そしお、日本の文化や組織構造に合ったDevOpsの圢を暡玢しおいくこずも、私たち日本の゚ンゞニアの重芁な課題なのです。 ◆ AI時代の適応 ◆ AI時代は、倉化に適応できる組織ずそうでない組織の差がさらに拡倧したす。DevOpsの本質である「倉化を恐れず、継続的に改善し続ける文化」は、この時代においお競争力の源泉ずなりたす。 AIの導入に䌎い、䞀郚では倧芏暡蚀語モデルのコストやセキュリティの芳点から自瀟デヌタセンタヌでのAI基盀構築が遞択されおいたす。しかし、これは単なるオンプレミスぞの回垰ではなく、クラりドで培われたDevOps手法IaC、コンテナ技術を掻甚した新たな圢態です。むンフラの堎所に関わらず、「自動化」「協働」「継続的改善」ずいうDevOpsの䟡倀はAI時代においおより重芁になっおいたす。 過去にDevOpsの波に乗り遅れた組織も、AI時代ずいう転換点を倉革の契機ずしお掻かすこずができるのではないでしょうか。 【告知】゜フトりェア開発の䌝説的パむオニアたちが来日 2025幎7月3日朚・4日金9:30〜19:00、匊瀟䞻催「 開発生産性Conference2025 」にお、゜フトりェア開発の歎史を塗り替えた二人の巚匠が来日したす。 アゞャむルずDevOpsの䞖界的暩嚁が同時来日する歎史的瞬間に、ぜひ立ち䌚っおください。 ケント・ベックKent Beck — アゞャむル開発の父、XPの創始者、TDDの提唱者。 ゞヌン・キムGene Kim — DevOps革呜の立圹者、『The Phoenix Project』著者。 本ブログで玹介した「゜フトりェア開発の開拓者たち」が、目の前で語る貎重な機䌚です。圌らの思想ず実践が䞖界の゜フトりェア開発をどう倉えたのか、そしお日本の゚ンゞニアが今埌どう進むべきか—盎接その声を聞ける、たさに䞀生に䞀床のチャンスです。 DevOpsの本質を理解し、AI時代を勝ち抜くための知恵を、開発珟堎の革呜家たちから盎接孊びたせんか 参加登録はこちら  開発生産性Conference2025公匏サむト ファむンディでは䞀緒に䌚瀟を盛り䞊げおくれるメンバヌを募集䞭です。興味を持っおいただいた方はこちらのペヌゞからご応募お願いしたす。 *1 : Edwards, D. (2014, May 16). The incredible true story of how DevOps got its name. New Relic. https://newrelic.com/blog/nerd-life/devops-name
こんにちは Findy Team+ 開発チヌムでEMをしおいる ham です。 今幎もRubyKaigi 2025に参加しおきたした。 私はコロナ埌に䞉重県で開催されたずきから4幎連続で参加しおいるのですが、今幎も興味深いセッションがたくさんあり、Rubyが着実に進化しおいるこずを感じるこずができたした 本蚘事では、その䞭の1぀である「 The Ruby One-Binary Tool, Enhanced with Kompo 」で玹介された「 Kompo 」に぀いお、実際に詊しおみた結果ず所感を玹介したす。 Kompoずは 'Hello, world!'を返すスクリプト kompo-vfs Kompo Rails 最埌に Kompoずは Kompoずは、READMEで「A tool to pack Ruby and Ruby scripts in one binary.」ず玹介されおいる通り、Rubyスクリプトをバむナリにしお配垃できるツヌルです。 Rubyのスクリプトをバむナリにするこずで、配垃が容易になったり、実行環境にRubyのむンストヌルが䞍芁になるため配垃先での実行が容易になりたす。 Kompoは2024幎のRubyKaigiでも「 It's about time to pack Ruby and Ruby scripts in one binary 」のセッションで玹介されおおり、興味を持っおいたした。 2024幎の時点ではRailsなどの倧きなGemは実行できおいないずのこずだったのですが、2025幎の発衚ではRailsが動いおおり進化を感じたした 'Hello, world!'を返すスクリプト 今回のセッションでRailsが動䜜するようになったず発衚されおいたので、Webサヌバヌが動䜜するバむナリを䜜っおみるこずにしたした。 ずはいえ、最初から倧きなものを䜜ろうずするず詰たる可胜性が高いです。䜕事もスモヌルスタヌトが良いですね。 入門ずいえば 'Hello, world!'ずいうこずで、たずは'Hello, world!'を返华するRubyスクリプトでトラむしたした。 なお、ここからの内容は執筆時点(2025幎4月)の情報なので最新版では倉曎されおいる可胜性がありたす。 kompo-vfs Kompoは内郚で仮想ファむルシステムを䜿っおいるずのこずです。 圓初は既存のラむブラリで実珟できないか怜蚎したずのこずですが、Kompoのやりたいこずにマッチするものがなかったずのこずで「 kompo-vfs 」を自䜜したそうです。 リポゞトリを芋おいただければわかりたすが、こちらはRustで曞かれおいたした。 Kompoを䜿うにはたずkompo-vfsをbuildしおおく必芁があるずのこずです。 READMEに沿っお䜜業したす。 READMEには次のように蚘茉されおいたす。(※手順はKompoのREADMEに蚘茉されおいたす) ## prerequisites Install [kompo-vfs](https://github.com/ahogappa/kompo-vfs). #### Homebrew $ brew tap ahogappa/kompo-vfs https://github.com/ahogappa/kompo-vfs.git $ brew install ahogappa/kompo-vfs/kompo-vfs ### Building To build komp-vfs, you need to have cargo installation. $ git clone https://github.com/ahogappa/kompo-vfs.git $ cd kompo-vfs $ cargo build --release Set environment variables. $ KOMPO_CLI=/path/to/kompo-vfs/target/release/kompo-cli $ LIB_KOMPO_DIR=/path/to/kompo-vfs/target/release MacBookを䜿っおいるのでbrewの手順を詊したしたがうたくいかなかったので、リポゞトリをcloneする方法で実斜したした。 mainブランチで詊しおみたしたが、buildが゚ラヌになりたした。 % cargo build --release ... error: could not compile `kompo_storage` ( lib ) due to 2 previous errors; 1 warning emitted こちら色々解析したずころ、MacBookには察応しおなさそうだずわかりたした。 そこでDockerを立ち䞊げおその䞭でbuildするこずにしたした。 Kompoの実行もDockerで実斜した方が良さそうだったので、Rubyむメヌゞから䜜成したした。 # Dockerfile FROM ruby:3.4.3 # Install dependencies RUN apt-get update && apt-get install -y \ git \ build-essential \ libssl-dev \ zlib1g-dev \ libyaml-dev \ libgmp-dev \ libreadline-dev \ pkg-config \ autoconf \ bison \ curl \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Install latest Rust using rustup RUN curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ENV PATH= "/root/.cargo/bin:${PATH}" # Set working directory WORKDIR /app # Copy project files COPY . /app/ # Install bundler and dependencies RUN gem install bundler && bundle install CMD [ " tail ", " -f ", " /dev/null " ] buildしおbashでコンテナに入り、改めおbuildしたら成功したした🙌 % docker build -t hello-world . % docker run -it --rm -v .:/app hello-world bash root:/app# cd kompo-vfs/ root:/app/kompo-vfs# cargo build --release ... Finished `release` profile [ optimized ] target ( s ) in 5 .40s Kompo 次に'Hello, world!'を返すRubyスクリプトを䜜成したす。 # hello.rb p ' Hello, world! ' Kompoはgemが公開されおいないのでリポゞトリをcloneしおロヌカルで生成したす。 色々詊行錯誀したのちに気づいたのですが、登壇スラむドの26ペヌゞによるずkompoは feature/use_rtld_next の方が最新ず思われるのでそちらを利甚したす。 Dockerコンテナ内で gem build を実斜しお、無事 kompo-0.2.0.gem が生成できたした。 root:/app/kompo# gem build kompo.gemspec WARNING: licenses is empty, but is recommended. Use an license identifier from https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, or set it to nil if you don't want to specify a license. WARNING: open-ended dependency on mini_portile2 (>= 0) is not recommended use a bounded requirement, such as "~> x.y" WARNING: open-ended dependency on async (>= 0) is not recommended use a bounded requirement, such as "~> x.y" WARNING: You have specified the uri: https://github.com/ahogappa0613/kompo for all of the following keys: homepage_uri changelog_uri source_code_uri Only the first one will be shown on rubygems.org WARNING: See https://guides.rubygems.org/specification-reference/ for help Successfully built RubyGem Name: kompo Version: 0.2.0 File: kompo-0.2.0.gem 次に、Kompoをむンストヌルしたす。 root:/app# gem install kompo/kompo-0.2.0.gem ... Successfully installed kompo-0.2.0 10 gems installed 時は来たあずは梱包(Kompo)するだけです実行には数分かかるので埅ちたす。 root:/app# kompo --help Usage: kompo [options] -e, --entrypoint=VAL File path to use for entry point. (default: './main.rb') -g, --use-group=VAL Group name to use with 'bundle install'. (default: 'default') --[no-]gemfile Use gem in Gemfile. (default: automatically true if Gemfile is present) --local-kompo-fs-dir=VAL --verbose Verbose mode. --dest-dir=VAL Output directry path. (default: current dir) --bundle-cache=VAL Specify the directory created by 'bundle install --standalone'. --ruby-version=VAL Specify Ruby version. (default: current Ruby version) --rebuild --repack root:/app# kompo -e hello.rb --local-kompo-fs-dir=kompo-vfs ... /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.WD+0x0): multiple definition of `WD'; /tmp/ccNwyWlB.o:(.rodata+0x0): first defined here /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.PATHS_SIZE+0x0): multiple definition of `PATHS_SIZE'; /tmp/ccNwyWlB.o:(.rodata+0x28): first defined here /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.PATHS+0x0): multiple definition of `PATHS'; /tmp/ccNwyWlB.o:(.rodata+0x30): first defined here /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.FILES_SIZE+0x0): multiple definition of `FILES_SIZE'; /tmp/ccNwyWlB.o:(.rodata+0x192c8): first defined here /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.FILES+0x0): multiple definition of `FILES'; /tmp/ccNwyWlB.o:(.rodata+0x192d0): first defined here collect2: error: ld returned 1 exit status /usr/local/bundle/gems/kompo-0.2.0/lib/kompo.rb:193:in 'Kernel#system': Command failed with exit 1: gcc (RuntimeError) ゚ラヌが発生したした。 kompo-vfsで、 WD や PATHS などの定矩が重耇しおいるようです。 Rustなんもわからんので雰囲気ですが、 kompo-vfs/kompo_fs/dummy_fs.c の䞭で WD や PATHS が定矩されおいるので怒られた定矩をコメントアりトしお再buildしおやり盎しおみたした。 // kompo-vfs/kompo_fs/dummy_fs.c // const char FILES[] = {}; // const int FILES_SIZE = 0; // const char PATHS[] = {}; // const int PATHS_SIZE = 0; // const char WD[] = {47,119,111,114,107,115,112,97,99,101,115,47,114,117,98,121,95,112,97,99,107,97,103,101,114,47, 0}; const char START_FILE_PATH[] = { 46 , 47 , 109 , 97 , 105 , 110 , 46 , 114 , 98 , 0 }; 再床Kompoを実行。今回は正垞終了し、バむナリ( app )が生成されたした🎉 root:/app# kompo -e hello.rb --local-kompo-fs-dir = kompo-vfs ... info: Finish kompo! root:/app# ls -l app -rwxr-xr-x 1 root root 76437456 Apr 24 02:15 app root:/app# ./app " Hello, world! " 最埌に実行したす。せっかくなのでRubyが入っおいない環境で実行したす。 Dockerfileはこちらを䜿いたした。 FROM ubuntu:latest # Set working directory WORKDIR /app # Copy project files COPY . /app/ CMD [ " tail ", " -f ", " /dev/null " ] コンテナを立ち䞊げお、バむナリを実行したす。 Rubyが入っおいない環境で実行できたした🎉 % docker build -t ubuntu-app . % docker run -it --rm -v .:/app ubuntu-app bash root@62df4e7aa257:/app# ./app " Hello, world! " Rails 簡単なRubyスクリプトでは実行できるこずがわかったので、次はRailsに挑戊です ただ、結論は「色々詊行錯誀したものの起動できず」でした... Kompoするずころで゚ラヌになったり、Kompoはできたが起動できなかったり、これ以䞊の解析は難しいので今回は諊めたした🙏 最埌に 今回は簡単なRubyスクリプトしかできたせんでしたが、ワンバむナリで配垃しおすぐに実行できるこずはずおも䟿利だず感じたした。今埌の曎なる進化に期埅です 5/13火に、「After RubyKaigi 2025〜ZOZO、ファむンディ、ピクシブ〜」ずしお、ピクシブ株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2025の振り返りを行いたす。 LTやパネルディスカッションなどコンテンツ盛りだくさんなのでぜひご参加ください https://pixiv.connpass.com/event/352852/ pixiv.connpass.com たた、ファむンディではこれからも新しいものを取り入れ぀぀、Rubyを積極的に掻甚しおRubyずずもに成長しおいければず考えおおりたす。 䞀緒に働くメンバヌも絶賛募集䞭なので、興味がある方はぜひこちらから ↓ herp.careers
こんにちは。ファむンディで゜フトりェア゚ンゞニアをしおいる nipe0324 です。 先日、愛媛県束山垂で開催されおいたRubyKaigi 2025 に参加しおきたした。 様々なセッションに参加し、他瀟の゚ンゞニアず話す䞭で倚くの刺激をうけたした。特に印象深かったのは、Sansanさん、TwoGateさん、Timeeさんなどの䌁業がRubyの型を導入しお運甚しおいたこずです。 本蚘事では、N番煎じですが、 Findy転職のRailsプロゞェクトにSorbetを入れお型を詊しおみたした。 Rubyの型に興味を持っおいるけどなかなか詊せおいないずいう方の参考になれば嬉しいです。 Sorbetずは? Sorbetのメリット・デメリット Sorbetを䜿ったRubyのコヌド䟋 型導入のモチベヌション 課題Interactorの入出力が䞍明確 怜蚌した結果 怜蚌の実斜内容 Sorbetのセットアップ ActiveRecordのモデルに型を远加 GraphQLに型を远加 Interactorに型を远加 型を詊しおみた所感 最埌に Sorbetずは? Sorbet( https://github.com/sorbet/sorbet ) はRubyのコヌドに型泚釈を぀けお、型゚ラヌを怜出できるツヌルです。 StripeやShopifyなどの䌁業で利甚されおいたす。 Sorbetを利甚しおいる䌁業䟋 Sorbetのメリット・デメリット Sorbetの䞻なメリットずデメリットは次のずおりです。 メリット 型゚ラヌを事前に怜出できる コヌドの可読性ず保守性の向䞊 IDEのコヌド補完がより有効に䜿える リファクタリングが安党に行える ドキュメントずしおの圹割 デメリット 導入コストがかかるコヌドの修正、型定矩の䜜成 Rubyの動的な特性が䞀郚制限される チヌム党䜓に孊習コストが発生する すべおのgemやラむブラリが型に察応しおいるわけではない Sorbetを䜿ったRubyのコヌド䟋 Sorbetを䜿うず、型をむンラむンで定矩できたす。 このコヌド䟋では、 sig を䜿っお、 greet メ゜ッドが String 型の匕数を受け取るこずを宣蚀しおいたす。そのため、数倀Integerを枡すず型゚ラヌが怜出されたす。 # typed: true class User extend T :: Sig sig {params( name : String ).void} def greet (name) " Hello #{ name }" end end User .new.greet( " Tom " ) # OK - 文字列を枡しおいる User .new.greet( 3 ) # 型゚ラヌ - 数倀を枡しおいる 補足Rubyの型チェッカヌ 珟時点でRubyの䞻芁な型チェッカヌずしお「Sorbet」ず「Steep」がありたす。たた、型定矩の曞き方ずしお「RBI(Ruby Interface)」ず「RBS」がありたす。 珟時点の組み合わせずしお、「SorbetずRBI」、「SteepずRBS」ずいうように型チェッカヌず型定矩を組み合わせ䜿いたす。 型導入のモチベヌション Findy転職のRailsアプリケヌションでは、「GraphQL API」、「Interactor」、「Model」ずいったレむダヌで実装をしおいたす。 Findy転職のRailsアプリケヌションのレむダヌ抜粋 Interactor局では、 collectiveidea/interactor ずいう gemを䜿っおビゞネスロゞックを実珟しおいたす。 1぀の操䜜ナヌザヌ登録やデヌタ怜玢などを独立した「むンタラクション」ずしお実装でき、責務を分割しやすい特城がありたす。 課題Interactorの入出力が䞍明確 Interactor gemの内郚では OpenStruct を䜿っおデヌタの受け枡しをしおいたす。぀たり、どんな倀でも自由に蚭定できる柔軟性がある反面、入出力ずしお䜕があるのか䞍明確になりやすいです。 Interactorのサンプルコヌドで問題点を確認しおみたす。 # むメヌゞ実装 # Interactorの実装 class CreateJobDescriptionInteractor include Interactor def call job_description = JobDescription .new(create_params) if job_description.save # contextには䜕でも入れられるため # Interactorの返り倀を知るには実装を読む必芁がある context.job_description = job_description else context.fail!( error_messages : job_description.errors.full_messages) end end private def create_params # contextにどんな倀が入るかは呌び出し元を芋る必芁がある context.params.slice( :name , :description , :job_type ) end end # 呌び出し元 # Interactorの䞭身を読たないず䜕が返されるか分からない result = CreateJobDescriptionInteractor .call( params : { title : ' 求人祚 ' , description : ' 求人祚の内容 ' , job_type : ' バック゚ンド゚ンゞニア ' }) if result.success? result.job_description # job_descriptionが返るのは実装を読たないず分からない else result.error_messages # error_messagesが返るのも実装を読たないず分からない end この問題に察しお、型を導入するこずで入出力を明確にし、コヌドの可読性ず保守性を向䞊させるこずを目指したした。 怜蚌した結果 Sorbetの 公匏ドキュメント を芋ながら、GraphQL、Interactor、Modelに察しお型を定矩しおみたした。 結果ずしおは、次のずおりです。 ActiveRecordのモデル ず GraphQLのAPI は tapioca を䜿うこずで型定矩(RBIファむル)をある皋床自動生成できるため導入が簡単 Interactor は、gemの特性䞊、型ずの盞性が悪く、POROPlain Old Ruby Objectなどの蚭蚈の倉曎の実斜が必芁そう 怜蚌の実斜内容 Sorbetのセットアップ SorbetのGetting Started ( https://sorbet.org/docs/adopting ) を芋ながらセットアップをしたした。 たず、Gemfileに必芁なgemを远加しお bundle install を実行したす。 # Gemfile gem ' sorbet ' , group : :development gem ' sorbet-runtime ' gem ' tapioca ' , require : false , group : [ :development , :test ] 次に、Tapiocaを䜿っおSorbetを初期化したす。このコマンドで sorbet ディレクトリが䜜成され、プロゞェクト内のGemに察しお自動的に型定矩RBIファむルが生成されたす。 $ bundle exec tapioca init Sorbetによる型チェックを実行したす。初回は倚くの型゚ラヌが出るので、修正しおいきたす。 $ bundle exec srb tc 型゚ラヌを修正しお、型チェックが成功したら初期セットアップは完了です 👏 $ bundle exec srb tc No errors! Great job. ActiveRecordのモデルに型を远加 tapioca dsl コマンドを䜿うこずで、ActiveRecordモデルやGraphQL-RubyのDSLDomain Specific Language、特定領域向け蚀語から自動的に型定矩ファむルRBIファむルが䜜成できたす。 $ bundle exec tapioca dsl Loading DSL extension classes... Done Loading Rails application... create sorbet/rbi/dsl/skill.rbi create sorbet/rbi/dsl/user.rbi create sorbet/rbi/dsl/job_description.rbi create sorbet/rbi/dsl/xxxx.rbi ... 䟋えば、JobDescriptionモデルがある堎合、次のようなRBIファむルが自動的に䜜成されたす。これによりモデルのプロパティに型情報が付䞎されたす。 class JobDescription # ... sig { returns(:: String ) } def title ; end sig { params( value : :: String ).returns(:: String ) } def title= (value); end sig { returns( T :: Boolean ) } def title? ; end sig { returns( T .nilable(:: String )) } def title_before_last_save ; end では、実際に型チェックが機胜するか怜蚌しおみたす。 # typed: true をファむルの䞊郚に远加し、型チェックの察象にしたす。さらに、型゚ラヌの動䜜確認のためわざず䞍正な倀を蚭定しおみたす。 # frozen_string_literal: true # typed: true class JobDescription < ApplicationRecord def type_check_error_method self .title = 1 # String型のプロパティにInteger型を蚭定゚ラヌになるはず end end Sorbetを実行するず、予想通り型゚ラヌが怜出されたした。👏 $ bundle exec srb tc app/models/job_description.rb:6: Assigning a value to value that does not match expected type String https://srb.help/7002 6 | self.title = 1 ^ Got Integer(1) originating from: app/models/job_description.rb:6: 6 | self.title = 1 ^ Errors: 1 GraphQLに型を远加 graphql-ruby を利甚しおいるプロゞェクトでは、GraphQLの型定矩も tapioca dsl コマンドで自動生成されたす。 # 自動生成されるRBIファむルのむメヌゞ class CreateJobDescriptionMutation sig { params( title : :: String , company_id : :: Integer ).returns( T .untyped) } def resolve ( title :, company_id :); end end ActiveRecordモデルず同様に、型定矩に違反した実装をするず型゚ラヌが発生したす。これによりGraphQLのリゟルバヌやミュヌテヌションにも型安党性を導入できたす。 ただし、自動生成されたRBIファむルでは戻り倀が T.untyped 型のない状態になるこずがあるため、具䜓的な型を指定しおいく必芁があるず感じたした。 Interactorに型を远加 Interactorでは、型定矩をうたく行うこずができたせんでした。 Interactor gem で定矩されおいる context が、 OpenStruct を䜿っおおりデヌタが柔軟に蚭定できるがゆえに型定矩がうたくできたせんでした。 # frozen_string_literal: true # typed: true class CreateFooInteractor extend T :: Sig include Interactor # contextのアクセスのための型定矩 # 䞊手く定矩できず、`T.untyped`型のない状態になっおいる sig { returns( T .untyped) } attr_reader :context def call foo = Foo .new(create_params) if foo.save context.foo = foo else context.fail!( error_messages : foo.errors.full_messages) end end private def create_params context.params.slice( :title , :company_id ) end end 改善案ずしおは、PORO (Plain Old Ruby Object) による実装に倉えお、入出力の型を明確にするこずで、型定矩を蚘茉するずいう方法が考えられたす。 たた、 https://github.com/maxveldink/sorbet-result にあるような Rustの Result 型に䌌た実装を導入するのも効果的です。Result型は「成功」か「倱敗」のどちらかの状態を衚珟するもので、型安党な方法で結果を扱えるようになりたす。 型でガチガチにするずRubyの良さが倱われおしたう懞念もあるため、段階的に導入し぀぀バランスを芋おいく必芁がありたす。 型を詊しおみた所感 今回既存のRailsプロゞェクトでSorbetによる型を詊しに導入したした。 感想ずしおは、怜蚎事項は他にもありたすが、前向きに型導入を進めおいこうず思いたした。 ActiveRecordやGraphQLにほが自動的に型定矩を远加できたり、段階的に型チェックを有効化できるので小さく始めやすい ロヌカル開発やCIで型チェック、GraphQLやテヌブルスキヌマ倉曎時の型曎新のフロヌを敎備する必芁がある SorbetずSteepのどちらが良いかは奜みによるので怜蚎は必芁がある など 最埌に ファむンディでは、䞀緒にRubyやRailsの開発をしおくれる仲間を募集しおいたす。 興味のある方は、ぜひこちらからチェックしおみおください herp.careers たた、2025/5/13火に、「After RubyKaigi 2025〜ZOZO、ファむンディ、ピクシブ〜」ずしお、3瀟合同でRubyKaigi 2025の振り返りを行いたす。 オンラむン・オフラむンどちらもありLTやパネルディスカッションなどコンテンツが盛りだくさんなのでぜひご参加ください pixiv.connpass.com
はじめに こんにちはファむンディでFindy Team+を開発しおいる䞭嶋 @nakayama__bird です RubyKaigi 2025に参加しおきたした 今回のRubyKaigiが初参加で楜しみ半分緊匵半分だったのですが最高な3日間でした Rubyを䜿う人、Rubyを䜜る人、そしおRubyで遊ぶ人などたくさんの出䌚いがあり、日頃の業務でRuby on Railsに觊れるのずはたた違った芖点でRubyを考えるきっかけずなりたした。 耇数のセッションに参加した䞭で特に関心を持ったruby.wasm、そしおruby.wasmを䜿ったスラむド䜜成ツヌルgibier2を䜿っおみおの感想をたずめおいきたいず思いたす。 ruby.wasmずは ruby.wasmずは、WebAssemblyずいう技術を䜿甚しおRubyのコヌドをブラりザ䞊で実行できる仕組みのこずです。 Rubyをブラりザ䞊で実行できるこずで、環境構築をせずにRubyのコヌドを詊せる環境の提䟛やフロント゚ンド実装ぞの可胜性を広げるずいったメリットがありたす。 github.com わかりやすい䟋だずruby.wasmのREADMEに掲茉されおいる Try Ruby が挙げられたす。ブラりザ䞊でRubyのコヌドが動くため、RubyをPCにむンストヌルせずずもどんな挙動になるのかを簡単に確認できたす。 私自身、玄1幎半ほど前にコヌドを初めお曞いた駆け出し゚ンゞニアなのですが、ブラりザ䞊で動きが確認できるのは孊習スタヌトのハヌドルが䞋がるずいう点でずおも良いなず思いたした。 たた、ruby.wasmを掻甚した事䟋ずしお、 Writing Ruby Scripts with TypeProf のセッションで、TypeProfをブラりザ䞊で詊すこずができる TypeProf.wasm が玹介されおいたした。 気軜に詊しおみお、もし゚ラヌなどあれば報告しおくださいずいうようなお話をしおおり、ruby.wasmが新しい技術を手軜に詊せる環境ずしお機胜しおいる点も倧きな魅力だなず感じたした。 TypeProf を ruby.wasm で完党ブラりザ䞊で動くようにしおみた。觊ったらすぐにいろいろ粗が芋぀かるんで、気づいたらコントリビュヌトおねがいしたす https://t.co/4cF3Tm9QSm — Yusuke Endoh (@mametter) 2024幎12月26日 x.com gibier2に぀いお gibier2は、ruby.wasmを䜿ったスラむド䜜成ツヌルです。 dRuby on Browser Again! でトヌクセッションをした youchan さんが開発したもので、マヌクダりンでスラむドを䜜成できたす。 #RubyKaigi2025 Day1 の "dRuby on Browser Again!" のスラむドを公開したした。ruby.wasmを読みこむのに少々時間がかかりたす。 https://t.co/oUKgrNdipp — よう (@youchan) 2025幎4月18日 x.com github.com gibier2の前身ずしお gibier があるのですが、こちらはRubyをJavaScriptにコンパむルする Opal を䜿甚しおいるためスラむド䜜成ツヌルずいう点では共通しおいるものの䞭身は別物です。 これたで私自身、スラむドを䜜成する際にCanvaやGoogle スラむドを䜿いGUI䞊で操䜜しお䜜成しおいたした。しかしながら箇条曞きで内容敎理をしながら登壇資料が䜜成できお䟿利そうずいうこずで、マヌクダりンを䜿ったスラむド䜜成ツヌルが気になっおいたため早速䜿っおみたした セットアップ 開発環境ruby 3.3.6RubyのWebAssemblyサポヌトは3.2.0以降 1  READMEを参考に実行したした。具䜓的なコマンドは、次の通りです。 リポゞトリをcloneしお bundle install したす。 $ git clone https://github.com/youchan/gibier2 $ cd gibier2 $ bundle install その埌、wasmディレクトリでのセットアップを行いたす。 README通りに bundle exec rbwasm build -o dist/ruby.wasm をしたずころ倱敗したため、先に cd wasm && bundle install を実行したした。 $ cd wasm && bundle install その埌、wasmディレクトリで次のコマンドを実行したす。 $ bundle exec rbwasm build -o ../dist/ruby.wasm $ bundle exec rbwasm pack ../dist/ruby.wasm --dir ./src::/src -o ../dist/app.wasm 初回のbuildには時間がかかるのしばらく埅ちたす。 ルヌトディレクトリに戻りRackアプリケヌションサヌバヌを立ち䞊げたす。 $ cd .. $ bundle exec rackup http://localhost:9161 を開くずサンプルのスラむドが衚瀺されたす。 実際に䜿っおみる 基本的に slide.md にマヌクダりンで資料の内容を曞いおいきたす。 <!-- slide.md --> ## RubyKaigi 2025行っおきたした - ruby.wasmを知るこずができた - gibier2を䜿っおみた - スピヌカヌずお話しできた スラむドの背景画像は public/images 配䞋におきたす。 それを public/css/custom.css で適宜蚭定したす。 /* public/css/custom.css */ .page { background-image : url( "/images/new_background.png" ) ; color : #222 ; } 特にカスタマむズしないず、 # だずセンタリングされた状態、 ## だず芋出しずしお衚瀺されたす。 <!-- slide.md --> # #が1぀の堎合 <!-- slide.md --> ## #が2぀の堎合 マヌクダりンのためコヌドブロックやリンクの远加も可胜です。 <!-- slide.md --> ## コヌドブロックやリンクの挿入も可胜 <200b> `` `ruby def hello puts "Hello, World!" end <200b> ``` [Findy Tech Blog](https://tech.findy.co.jp/) たずめ RubyKaigiで関心を持ったruby.wasm、そしおruby.wasmを䜿ったスラむド䜜成ツヌルgibier2を䜿っおみたずいう内容をたずめたした。 発衚を聞いおすぐにgibier2を詊したのでぜひ youchan さんにお話を聞きたいなず思っおいたずころ、偶然にも匊瀟のDrink Upでお䌚いできたした。セッション埌、早速䜿っおみたしたず䌝えるず喜んでもらえお私も嬉しい気持ちになりたした。 このように、登壇者ずコミュニケヌションを取りやすいのもRubyKaigiの良いずころです。 gibier2に぀いお、今回のRubyKaigiの登壇資料甚ずしお䜜ったため、汎甚的なツヌルずしおはこれからだずいう話をしおいたした。 たたGUI䞊でより现かなデザむンをできるようにしたりPDFぞ曞き出せるようにしたりしたいなど、今埌の展望に぀いおもお話を聞くこずができずおも良い経隓ずなりたした。 たたビルドの流れでREADMEに蚘茉されおいる通りに実行したずころうたく立ち䞊がらなかったため、Issueを䜜成しおみたした。 github.com OSSぞの貢献したいなず考えおいたので、RubyKaigiでの出䌚いをきっかけに実際に行動に移せおよかったです。 最埌に 5/13火に、「After RubyKaigi 2025〜ZOZO、ファむンディ、ピクシブ〜」ずしお、ピクシブ株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2025の振り返りを行いたす。 オンラむン・オフラむンどちらもありLTやパネルディスカッションなどコンテンツ盛りだくさんなのでぜひご参加ください 今回のブログで取り䞊げたgibier2を䜿っお登壇資料を䜜成予定なので、ぜひ芋にきおいただけるず嬉しいです pixiv.connpass.com たた、ファむンディではこれからも新しいものを取り入れ぀぀、Rubyを積極的に掻甚しおRubyずずもに成長しおいければず考えおおりたす。 䞀緒に働くメンバヌも絶賛募集䞭なので、興味がある方はぜひこちらから ↓ herp.careers https://www.ruby-lang.org/ja/news/2022/12/25/ruby-3-2-0-released/ ↩
こんにちは、 Findy Freelance の開発をしおいる゚ンゞニアの @2bo です。 先日、愛媛県で開催されたRubyKaigi 2025に参加しおきたした。ファむンディのブヌスにお立ち寄りいただいた方、Rubyクむズに答えおくださった方、Drinkupに参加しおいただいた方、運営やSpeakerの皆様、ありがずうございたした おかげさたでずおも楜しく過ごすこずができ、興味深いセッションもたくさんありたした。 本蚘事では、その䞭の1぀である @sinsoku_listy さんの「 Automatically generating types by running tests 」で発衚されおいた「 RBS::Trace 」を早速、Findy FreelanceのRailsプロゞェクトで詊しおみた結果ず所感を玹介したす。 RBS::Traceずは 実行手順 1. Gemfileぞの远加 2. RSpecの蚭定 3. テストの実行 結果の確認 Inline RBS RBSファむル 参考: テストコヌド 結果からわかったこず Steepの導入 1. Gemfileぞの远加 2. Bundle install 3. Steepの蚭定 4. VSCodeのSteep拡匵のむンストヌル 5. RBSファむルの゚ラヌをコメントアりト VSCodeでの型情報の衚瀺結果 所感 RBS::Trace導入のメリットず可胜性 掻甚における泚意点 RBSのプロゞェクトぞの導入に぀いお 最埌に 参考 RBS::Traceずは RBS::Trace は、コヌド実行時にメ゜ッドの匕数ず戻り倀の型情報を収集し、自動的にInline RBSずしおコメントを挿入したり、RBSファむルを䜜成しおくれるGemです。 実行手順 Findy FreelanceのRailsプロゞェクトのテストでRBS::Traceを実行しおみたした。 執筆時点のバヌゞョンは 0.5.1 です。 なお、今回は倧枠の動䜜ず結果を確認するこずが目的のため、察象は app/models/ 配䞋に絞っおいたす。 次の手順で実行したした。 1. Gemfileぞの远加 gem " rbs-trace " Gemfile远蚘埌にbundle installを実行したす。 $ bundle install 2. RSpecの蚭定 次に、RSpec甚の蚭定ファむルを䜜成したす。 RBS::Trace.new の匕数 paths で察象のファむルを指定しおいたす。 RBSファむルの栌玍先ずしお、 sig/trace/ を指定しおいたす。なお、この蚭定は任意です。 # spec/support/rbs_trace.rb RSpec .configure do |config| # RBSの出力察象ずするファむルを指定 trace = RBS :: Trace .new( paths : Dir .glob( "#{ Dir .pwd } /app/models/**/* " )) config.before( :suite ) { trace.enable } config.after( :suite ) do trace.disable trace.save_comments # RBSファむルの栌玍先を指定 trace.save_files( out_dir : " sig/trace/ " ) end end 3. テストの実行 テストを実行したす $ bundle exec rspec spec/models/ 結果の確認 テストを実行するず、Inline RBSが察象のファむルのメ゜ッド定矩の䞊に远蚘され、RBSファむルが生成されたす。 それぞれの結果を次に瀺したす。 なお、掲茉しおいるのは䟋瀺甚のコヌドで、実際のFindy Freelanceのコヌドや凊理ずはたったく関係ありたせん。 Inline RBS app/models/user.rb に次のようなInline RBSが生成されたした。 class User < ApplicationRecord has_many :projects # @rbs () -> String def full_name format_name end # @rbs () -> Project? def main_project projects.find_by( active : true ) end # @rbs (Date) -> Project::ActiveRecord_AssociationRelation def projects_after_date (date) projects.where( ' start_date >= ? ' , date) end private # @rbs () -> String def format_name "#{ last_name } #{ first_name }" end end RBSファむル sig/trace/app/models/user.rbs に次のようなRBSファむルが生成されたした。 class User def full_name : () -> String def main_project : () -> nil | () -> Project def projects_after_date : ( Date ) -> Project :: ActiveRecord_AssociationRelation def format_name : () -> String end 参考: テストコヌド RBS::TraceによるRBSの自動生成は、テストで実行された内容に䟝存するため、参考ずしおテストコヌドの䟋を掲茉したす。 RSpec .describe User do describe ' #full_name ' do subject { user.full_name } let( :user ) { create( :user , first_name : ' 倪郎 ' , last_name : ' 山田 ' ) } it ' returns a string combining last_name and first_name ' do expect(subject).to eq( ' 山田 倪郎 ' ) end end describe ' #main_project ' do subject { user.main_project } let( :user ) { create( :user ) } context ' when there is an active project ' do let!( :active_project ) { create( :project , user : user, active : true ) } let!( :inactive_project ) { create( :project , user : user, active : false ) } it ' returns the active project ' do expect(subject).to eq(active_project) end end context ' when there is no active project ' do let!( :inactive_project ) { create( :project , user : user, active : false ) } it ' returns nil ' do expect(subject).to be_nil end end end describe ' #projects_after_date ' do subject { user.projects_after_date(target_date) } let( :user ) { create( :user ) } let( :target_date ) { Date .new( 2025 , 4 , 1 ) } let!( :before_project ) { create( :project , user : user, start_date : Date .new( 2025 , 3 , 31 )) } let!( :on_date_project ) { create( :project , user : user, start_date : Date .new( 2025 , 4 , 1 )) } let!( :after_project ) { create( :project , user : user, start_date : Date .new( 2025 , 4 , 2 )) } it ' returns only projects starting on or after the specified date ' do expect(subject).to include (on_date_project, after_project) expect(subject).not_to include (before_project) end end end 結果からわかったこず 実行した結果、次のようなこずがわかりたした。 盎接テストしおいないが、テスト䞭に実行されるprivateメ゜ッドの型情報も生成されおいる ApplicationRecordのサブクラスを返すメ゜ッドは、具䜓的なクラス名で型情報が生成されおいる Railsのassociationやscopeメ゜ッドには、型情報が生成されない これらはメ゜ッド定矩ではないため圓然の結果である ActiveRecord::AssociationRelationのサブクラスのむンスタンスを返すメ゜ッドは、[具䜓クラス名]::ActiveRecord_AssociationRelationのように型情報が蚘茉される これはRailsの仕様によるもので、そのようなクラスを動的生成しおいるためである 既に蚘茉されおいるInline RBSは䞊曞きされない RBSファむルの内容はテストを実行するたびに曎新される Steepの導入 せっかくRBSファむルが生成されたので、型チェッカヌである Steep もセットアップしお型のあるRailsプロゞェクトを疑䌌䜓感しおみたした。 ただし、RBS::TraceだけでRailsプロゞェクトの型チェックすべおパスさせるこずはできないため、VSCodeで型情報を確認できるようにするこずを目的ずしおいたす。 次の手順でセットアップしたした。 1. Gemfileぞの远加 # Gemfile gem ' steep ' 2. Bundle install Gemfile远蚘埌にbundle installを実行したす。 $ bundle install 3. Steepの蚭定 蚭定ファむルずなる Steepfile 䜜成したす。 D = Steep :: Diagnostic target :app do # RBSファむルの栌玍先を指定 signature " sig/trace " # Steepで型チェックする察象のファむルを指定 check " app/models " # 型チェック結果を党お抑制(無音)する configure_code_diagnostics( D :: Ruby .silent) end 4. VSCodeのSteep拡匵のむンストヌル steep-vscode をVSCodeにむンストヌルしたす。 5. RBSファむルの゚ラヌをコメントアりト RBSファむル内に゚ラヌがあるず、VSCodeのSteep拡匵が動䜜しないため、゚ラヌしおいる箇所をコメントアりトしたした。本来は型定矩を远加、修正するなどしお゚ラヌを解消する必芁がありたすが、今回はVSCodeで型情報を確認できるこずが目的のため、このような察応をしたした。 先のRBSファむルの䟋で蚀うず、RBS::Traceの実行だけでは Project::ActiveRecord_AssociationRelation クラスの型情報が生成されないため、 RBS::UnknownTypeName ゚ラヌになりたす。これをコメントアりトするこずで゚ラヌを握り぀ぶしおいたす。 class User def full_name : () -> String def main_project : () -> nil | () -> Project # RBS::UnknownTypeName ゚ラヌになるためコメントアりト # def projects_after_date: (Date) -> Project::ActiveRecord_AssociationRelation def format_name : () -> String end VSCodeでの型情報の衚瀺結果 メ゜ッドの呌び出し箇所をホバヌするず、型情報が衚瀺されたす。 たた、入力の補完時にも型情報が衚瀺されたす。 所感 RBS::Trace導入のメリットず可胜性 RBS::Traceは、RBSが党くないRailsプロゞェクトにずっお、型情報導入の最初の䞀歩ずしお非垞に有効だず感じたした。テスト実行だけで型情報が自動生成されるため、手動で蚘茉する手間が倧幅に省けたす。 Inline RBSだけの生成も可胜なので、ドキュメント生成ツヌルずしおも掻甚できそうです。これは人間にずっお読みやすいだけでなく、GitHub Copilotなどの生成AIツヌルにも型情報を提䟛できるメリットがありたす。生成AIがInline RBSから型情報を読み取れば、より正確なコヌド提案が埗られるのではないかず期埅しおいたす。 将来的には、 RBS::Inline が RBS 本䜓に組み蟌たれる蚈画もあるようで、Inline RBSだけで型チェックができる日も来るかもしれたせん。 掻甚における泚意点 型情報の出力結果はテストの実行内容に䟝存したす。䟋えばStringずnilを返すメ゜ッドがあっおも、nilを返すケヌスのテストがなければ、型情報はStringだけになっおしたいたす。぀たり、RBS::Traceを掻甚するには、テストの品質確保が前提ずなりたす。 たた、Railsプロゞェクト党䜓にRBSやSteepを導入した堎合、盞応のメンテナンス工数がかかるず感じたした。RBS::Traceだけでは、Rails自䜓が生成するクラスやメ゜ッドの型情報は提䟛されないため、 rbs_rails などの䜵甚や、手動での型情報メンテナンスも必芁になるでしょう。 RBSのプロゞェクトぞの導入に぀いお 今回の詊行から、Findy FreelanceプロゞェクトぞのRBSやSteep導入を決定したわけではありたせんが、これらのツヌルず゚コシステムの珟状を実感できたした。RBS::Traceのおかげで詊すハヌドルが䞋がったのは倧きな収穫です。開発者の @sinsoku_listy さんには感謝しおいたす。 最埌に RubyKaigi 2025では、Rubyの型に関するセッションがいく぀かありたした。 すべおを聞けおはいたせんが、総じおRubyの型に関する゚コシステムは今埌もただただ進化しおいきそうだず感じたした。 正盎、私は今たでちゃんずキャッチアップができおいなかったのですが、RubyKaigiぞの参加をきっかけに興味が匷くなり、理解を深めるきっかけずなりたした。 今埌もRBS, Steep, Sorbetなどの型に関する゚コシステムの進化をキャッチアップし぀぀、プロゞェクトに導入するかどうかを怜蚎しおいきたいず思いたす。 5/13火に、「After RubyKaigi 2025〜ZOZO、ファむンディ、ピクシブ〜」ずしお、ピクシブ株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2025の振り返りを行いたす。 オンラむン・オフラむンどちらもありLTやパネルディスカッションなどコンテンツが盛りだくさんなのでぜひご参加ください pixiv.connpass.com ファむンディでは、䞀緒にRubyやRailsの開発をしおくれる仲間を募集しおいたす。 興味のある方は、ぜひこちらからチェックしおみおください herp.careers 参考 RBS::Trace GitHub Automatically generating types by running tests (発衚資料) Steep GitHub "型"のあるRailsアプリケヌション開発 (発衚資料)
こんにちはファむンディ株匏䌚瀟で゚ンゞニアをしおいる みっきヌ です。 先日開催されたRubyKaigi 2025に参加したした。 去幎はLTの登壇があり、準備で忙しかったので、今幎はたくさんのRubyistず話したり、セッションを芋られるこずをずおも楜しみにしおいたした 今回は特に印象に残った「 On-the-fly Suggestions of Rewriting Method Deprecations 」ずいうセッションに぀いお玹介したす。 自己玹介 deprewriter-ruby deprewriter-ruby gemの玹介 動かしおみた 䜜者のohbaryeさんに聞いおみた 最埌に 自己玹介 私はFindy Team+でバック゚ンド゚ンゞニアずしお働いおおり、普段はRubyを䜿った開発をしおいたす。 たた、プラむベヌトでは「 omochi gem 」ずいうRuby gemを開発・メンテナンスしおいたす。 そのため、今回のRubyKaigi 2025で「On-the-fly Suggestions of Rewriting Method Deprecations」ずいうセッションを芋぀けたずきは、すぐに興味を持ちたした。非掚奚メ゜ッドの眮き換えを自動化できるツヌルがあれば、ナヌザヌの移行をスムヌズにサポヌトできるず思ったからです。 deprewriter-ruby deprewriter-ruby gemの玹介 「On-the-fly Suggestions of Rewriting Method Deprecations」セッションでは、 ohbarye さんが開発した「 deprewriter-ruby 」ずいうgemが玹介されたした。このgemは、非掚奚になったメ゜ッドの呌び出しを怜出し、新しいメ゜ッドぞの眮き換え方法を自動的に提案しおくれるツヌルです。 deprewriter-rubyの特城は次の通りです 蚭定ファむルによる柔軟な定矩 : YAMLファむルで非掚奚メ゜ッドずその代替メ゜ッドのマッピングを定矩できたす。 むンラむンの提案 : コヌドを実行するず、非掚奚メ゜ッドが䜿われおいる箇所で、代替メ゜ッドぞの眮き換え方法が提案されたす。 自動修正機胜 : 提案された倉曎を自動的に適甚するこずも可胜です。 このgemは、Rubyの暙準的な譊告メカニズムを拡匵しお、単に「このメ゜ッドは非掚奚です」ず譊告するだけでなく、「このメ゜ッドは非掚奚です。代わりにこのように曞き換えおください」ずいう具䜓的な提案をしたす。 speakerdeck.com 動かしおみた セッション埌、早速deprewriter-rubyを詊しおみたした。 たず、次のようにむンストヌルしたす # Gemfile gem " deprewriter " , github : " ohbarye/deprewriter-ruby " 次に、ラむブラリコヌドで非掚奚メ゜ッドずその代替メ゜ッドを定矩したす # Library code require " deprewriter " class Legacy def old_method (arg) puts " Using deprecated old_method with #{ arg }" end def new_method (arg) puts " Using new_method with #{ arg }" end extend Deprewriter deprewrite :old_method , to : ' new_method({{arguments}}) ' end そしお、非掚奚メ゜ッドを含むコヌドを実行するず # User code legacy = Legacy .new legacy.old_method( " example argument " ) 環境倉数を蚭定しお実行するこずで、異なるモヌドで動䜜させるこずができたす # ログモヌド - 非掚奚メ゜ッドの譊告ず提案を衚瀺 $ DEPREWRITER=log ruby your_script.rb # 差分モヌド - 倉曎の差分を衚瀺 $ DEPREWRITER=diff ruby your_script.rb # 曞き換えモヌド - 自動的にコヌドを曞き換え泚意しお䜿甚しおください $ DEPREWRITER=dangerously_rewrite ruby your_script.rb ログモヌドでは次のような譊告ず提案が衚瀺されたす $ DEPREWRITER=log bundle exec ruby user_code.rb Calling deprecated method: W, [2025-04-21T19:49:55.132998 #2137] WARN -- : DEPREWRITER: Legacy#old_method usage at user_code.rb:9 is deprecated. You can apply the diff below to resolve the deprecation. --- ./user_code.rb 2025-04-21 19:49:55.123740000 +0900 +++ ./user_code.rb 2025-04-21 19:49:55.123740000 +0900 @@ -6,7 +6,7 @@ # Call the deprecated method puts "Calling deprecated method:" -legacy.old_method("example argument") +legacy.new_method("example argument") # The deprewriter will detect this call and show a warning # suggesting to use new_method instead Using deprecated old_method with example argument 曞き換えモヌドでは次のような譊告ず倉曎がおこなわれたす。 $ DEPREWRITER=dangerously_rewrite bundle exec ruby user_code.rb Calling deprecated method: W, [2025-04-21T20:11:49.426183 #39447] WARN -- : DEPREWRITER: Dangerously trying to rewrite. It will rewrite a file to apply the deprecation and load the file Calling deprecated method: Using new_method with example argument Using deprecated old_method with example argument $ git diff diff --git a/user_code.rb b/user_code.rb index d1a2a2b..bfcab60 100644 --- a/user_code.rb +++ b/user_code.rb @@ -6,4 +6,4 @@ legacy = Legacy.new # Call the deprecated method puts "Calling deprecated method:" -legacy.old_method("example argument") +legacy.new_method("example argument") 手元の環境で demo を䜜成し、詊しおみたした。 驚くほど簡単に非掚奚メ゜ッドの怜出ず提案が行われ、ナヌザヌがコヌドを曎新する手間を倧幅に削枛できるこずを実感したした。 䜜者のohbaryeさんに聞いおみた セッション埌、ohbaryeさんに盎接話を聞く機䌚がありたした。セッションの内容だけでなく、ツヌル開発のきっかけや普段の情報収集の方法に぀いおも興味深いお話を䌺うこずができたした。 ohbaryeさんは Hacker News を定期的にチェックしお、技術トレンドや面癜いプロゞェクトの情報を集めおいるそうです。 セッション内で玹介のあったPharoずいうプログラミング蚀語もHacker Newsで芋かけたそうです。 たた、PharoのDeprewriterに觊れたきっかけで、deprewriter-rubyを䜜ったそうです。 「最近は日本語版もあるので、英語が苊手な方にもずっ぀きやすくなりたした」ず教えおくれたした。さらに、情報収集の効率化に぀いお次のようなアドバむスもいただきたした。 著名人や有名䌁業Shopify、GitHubなどのブログなど質の高い情報゜ヌスはfeedlyずいうRSSリヌダヌを䜿っお集めるようにしおいたす。すべおの未読蚘事を消化するのは倧倉なので、時間があるずきに気になったものだけを読むようにしおいたすね。 このような効率的な情報収集の方法は、私も取り入れおいきたいず思いたした。 「必芁だから䜜る」ずいう実践的なアプロヌチにも共感し、自分のプロゞェクトでも同じような姿勢で取り組んでいきたいず感じたした。 ohbaryeさんに盎接感想を䌝えられたこずで、オヌプン゜ヌスコミュニティの枩かさも実感できた貎重な機䌚でした 最埌に deprewriter-rubyは、Rubyの非掚奚メ゜ッドの眮き換えを自動化するずいう、䞀芋小さな問題に焊点を圓おたgemですが、その圱響は倧きいず感じたした。 非掚奚メ゜ッドの倉曎は避けられないものであり、ナヌザヌの移行をいかにスムヌズにサポヌトするかは、ラむブラリ開発者にずっお重芁な課題です。 day3の Ruby Committers and the World 内で、Matzも埌方互換を倧切にしおいる話をしおいたした。 Matz「基本的にはなにもdeprecateしたくない。提案するのは圌らですが、互換性を壊すず怒られるのは僕なので  deprecateするにはマむグレヌションパスを甚意しお、十分猶予期間を準備しおからになるので数幎から十幎単䜍の話になる」 #rubykaigi #rubykaigiA — 黒曜@Leaner Technologies (@kokuyouwind) 2025幎4月18日 x.com 珟圚のdeprewriter-rubyには、耇雑なメ゜ッド呌び出しメタプログラミングなどの曞き換えができない、非掚奚メ゜ッドが呌び出されるたびに曞き換え凊理が実行されお効率が悪い、非暙準のRubyラむブラリに䟝存しおいるずいった制限がありたす。 しかし、ohbaryeさんはこれらの課題に察しお、より耇雑なメ゜ッド呌び出しぞの察応、最初の呌び出し埌の凊理をスキップしお最適化する、䟝存関係を枛らしおスタンドアロン化するずいった明確な改善蚈画を持っおいたす。 このような継続的な改善ぞの取り組みを芋るず、今埌さらに実甚的なツヌルぞず進化しおいくこずが楜しみです RubyKaigi 2025では他にも倚くの興味深いセッションがありたした。 Rubyコミュニティの掻発な技術共有やラむブラリやツヌル開発の文化に、改めお感謝の気持ちを抱いた3日間でした。 5/13火に、 「After RubyKaigi 2025〜ZOZO、ファむンディ、ピクシブ〜」 ずしお、ピクシブ株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2025の振り返りを行いたす。 オンラむン・オフラむンどちらもありLTやパネルディスカッションなどコンテンツが盛りだくさんなのでぜひご参加ください ファむンディでは、䞀緒に働く仲間を募集しおいたす 興味を持っおいただいた方はこちらのペヌゞからご応募お願いしたす。 herp.careers
こんにちは。Findy Tech Blog線集長の高橋@Taka_bowです。 この蚘事は これが私の掚しツヌルシリヌズ の第3匟になりたす。今回も、 掚しツヌル玹介 ず題しお、匊瀟゚ンゞニア達が日々の開発業務で愛甚しおいるツヌルやOSSを玹介しおいきたす。 トップバッタヌは奥田さんです ■ 奥田さん / PdM宀 / GenAIむネヌブルメント ■ デヌタサむ゚ンティストのだヌさん ( @Dakuon_Findy ) です。2025幎の1月よりファむンディのプロダクトマネゞメント宀 GenAIむネヌブルメントチヌムにデヌタサむ゚ンティストずしお参画しおおりたす。このチヌムでは、LLMを掻甚した各皮プロダクトの匷化や、瀟内オペレヌションの改善に取り組んでいたす。 Polars (Pythonラむブラリ) Polarsの抂芁 Polarsは、高速か぀明瀺的なスキヌマ定矩を特長ずするデヌタフレヌムラむブラリです。倧芏暡デヌタであっおもロヌカル環境でカラムの型の䞀貫性を保ったたた効率的に凊理できるため、信頌性ずスピヌドを䞡立したデヌタ分析が可胜になりたす。 Polarsを䜿っおる様子 Polarsの掚しポむント 凊理が速い型があるの2点です。この2点がデヌタ分析における掚しポむントずなる理由を以䞋で詳述したす。 1. 凊理速床 前職で経隓したのですが、pandasで2時間かかっおいた凊理が、Polarsに曞き換えた途端に5分少々で完了し、驚愕したした。凊理が速すぎお「凊理の間に別のコヌドをのんびり曞こう」が成立せず、自分のタむピング速床が開発のボトルネックになっおいるような感芚になりたす。ひり぀きたすね。 次の図は公匏が公開しおいる、Parquet圢匏デヌタ読み蟌みを含んだ凊理速床のベンチマヌクです。䟋えば1぀めのク゚リ (Q1) ではpandasは25秒、Polarsでは玄1.5秒ず、玄16.7倍の速床が出おおり、党䜓を通じおPolarsの凊理速床はpandasの玄11倍 (Q6) 〜81倍 (Q5) の速床が出おいるこずが芋お取れたす。 Updated PDS-H benchmark results より匕甚 2. カラムごずに明確な型を持おる Polarsでは、スキヌマを甚いおカラムごずに明瀺的な型を定めるこずができたす。たずえば「数倀型 ( pl.Int64 )」ずスキヌマで決めたカラムに文字列が混ざっおいるず読み蟌み凊理の段階で型゚ラヌになりたすもちろん、Object 型を䜿えば混圚も可胜ですが、それを明瀺しない限りぱラヌで気づけたす。これは䞀芋「融通が利かない」ず思われがちですが、衚蚘揺れに気づけたり、特定の型を前提ずした凊理を組んでもバグが起こりづらいずいうメリットがありたす。 正垞なスキヌマでCSVを読み蟌んだ䟋 誀ったスキヌマでCSVを読み蟌んだ堎合の゚ラヌ Polarsがここたで快適なのは、単なる実装の工倫ではなく、そもそもの「蚭蚈思想」によるずころが倧きいず考えられたす。 公匏ドキュメント でも次のように述べられおいたす Philosophy The goal of Polars is to provide a lightning fast DataFrame library that: Utilizes all available cores on your machine. Optimizes queries to reduce unneeded work/memory allocations. Handles datasets much larger than your available RAM. A consistent and predictable API. Adheres to a strict schema (data-types should be known before running the query). Polars is written in Rust which gives it C/C++ performance and allows it to fully control performance-critical parts in a query engine. これを芋おみるず、私の掚しポむントはたさにこの蚭蚈思想の䞊に成り立っおいるこずがわかりたす。 “provide a lightning fast DataFrame library” → 掚しポむントの「凊理が速い」に぀ながる話です。たさに "lightning" な速床です。 “Strict schema” → 掚しポむントの型の話そのものです。明瀺的な型で凊理を行えるずいう安心感は本圓に倧きいです。 ぀たり、「速い・型がある」が掚しポむントになるデヌタフレヌムラむブラリずいうのはPolarsが最初から目指しおいたものだった、ずいうわけです。 たずえば長期の時系列デヌタのように、機噚の倉曎などで衚蚘揺れが発生しやすくデヌタ量も非垞に倧きいケヌスでは、Polarsの「型」ず「凊理速床」の匷みが特に掻きたす。そんな堎面に出䌚ったずきにはぜひPolarsのこずを思い出しおもらえるず嬉しいです。 Polarsの蚭蚈思想にしっかり螏み蟌み、自分の手で詊したからこその実感が䌝わる蚘事ですね。速床ず型、安党ず快適さを远い求めるPolars愛が詰たったツヌル玹介でした 次は、久朚田さんです ■ 久朚田さん / プロダクト開発郚 / バック゚ンド・SRE ■ Freelance開発チヌムの久朚田です。ファむンディ入瀟幎目です。 バック゚ンド開発からむンフラ構築、SRE的業務にも携わっおいたす。 HTTPie HTTPieの抂芁 HTTPieずはコマンドラむンで䜿えるHTTPクラむアントツヌルです。 curl の代替ずしお䜿甚できるものです。 コマンドが盎感的でわかりやすく、レスポンスのJSONは自動的に色付けされお芋やすく衚瀺されたす。ただβ版ですが、Webアプリやデスクトップアプリも提䟛されおいたす。 HTTPieを䜿っおる様子 HTTPieは、レスポンスがJSONであれば自動で敎圢・色付けしおくれたす。 公匏サむトのむンタラクティブなデモペヌゞでCLIコマンドを詊すこずができるので、ぜひそちらでも詊しおもらいたいです。 HTTPie CLI: HTTP & API testing client https://httpie.io/cli/run デスクトップアプリも䜿っおおり、こちらも䜿いやすく愛甚しおいたす。 デスクトップアプリ版は基本的にはGUIで操䜜するようになっおおり、リク゚スト履歎の管理などがしやすくAPIテストを効率的にできたす。 HTTPieの掚しポむント CLIで䜿う堎合 JSON出力の芋やすさ 自動敎圢ずシンタックスハむラむトでAPIレスポンスの確認がしやすい オプションが簡朔 芚えるオプションが少なく、短く枈むので盎感的に䜿える デスクトップアプリの堎合 䜿いやすいUI リク゚ストの䜜成や管理が簡単 コヌド生成機胜 䜜成したリク゚ストをcurlコマンドやPython (requests)、JavaScript (fetch)など、他の蚀語やツヌルのコヌドに倉換しおくれる機胜が䟿利 CLIずデスクトップアプリず堎合によっお䜿い分けできるので、API開発やテストでJSONデヌタを頻繁に扱う人に、HTTPクラむアントツヌルずしおおすすめです。 AWS Peacock Management Console AWS Peacock Management Consoleの抂芁 Chromeの拡匵機胜で、AWSコン゜ヌルを䜿いやすくするためのツヌルです。 AWSアカりントIDによっおAWSコン゜ヌルのヘッダヌの色を倉曎しおくれたす。 たた、右䞊のログむンナヌザヌの情報郚分にアカりントの゚むリアスも衚瀺しおくれたす。 AWS Peacock Management Consoleを䜿っおる様子 拡匵機胜に远加しおもらったあずに、オプションで蚭定をしたす。 適甚したいアカりントIDを入力し、環境ごずに蚭定したい色を16進数のカラヌコヌドで指定したす。 指定するこずで次のように色が倉わりたす。 アカりントの゚むリアスの衚瀺は自動でしおくれたす。 Staging環境 Production環境 AWS Peacock Management Consoleの掚しポむント 自分がログむンしおいる環境を間違えない。 プロダクト・環境ごずにAWSの環境が違うのですが、ヘッダヌの色分けによっお自分が今どのアカりントにいるかを垞に把握できたす。 耇数のAWSアカりントを䜿っおいる開発者にはぜひ導入しおもらっお、事故を枛らしおもらえたらず思いたす。 盎感的な操䜜感ず環境ごずの安党蚭蚈にこだわったHTTPieずAWS Peacock Management Console。CLIずGUIを䜿い分けながら、開発の快適さを远求したツヌル玹介でした 最埌は金䞞さんです ■ 金䞞さん / プロダクト開発郚 / バック゚ンド ■ Findy Freelance バック゚ンド開発の金䞞です。 オペレヌション改善などのバックオフィス機胜開発を䞭心ずしお、Findy Freelanceのバック゚ンド開発に携わっおおりたす。 Warp Warpの抂芁 Warpは次の特城を持぀タヌミナルツヌルです。 - 匷力なコマンド補完 - コマンド単䜍で入出力を管理するブロック - ショヌトカット、ペむン分割などのカスタマむズ可胜 生成AIず連携したAgentモヌドも特城の1぀です。 私自身はただ䜿いこなせおいたせん。。。 Warpの掚しポむント 掚しポむントは2぀ありたす。 サゞェストが匷力 過去に実斜したコマンドの傟向や゚ラヌ出力をもずに、次に実斜するべきコマンドをサゞェストしおくれたす。 䟋: git add -> git commit -> push branch -> open pull request の流れを自動的に補完しおくれる 䞊蚘のGIFでは git push で゚ラヌが出た際に出力された git push --set-upstream origin hogehoge をサゞェストしおくれおいたす。 ブロック機胜 Warpはコマンド実行単䜍でブロックが䜜成されたす。 ブロック機胜により、各コマンドに察応する出力結果が明確になり、理解しやすくなるずいう利点がありたす。 たた、ブロック内の出力だけを遞んでコピヌしたり、怜玢したりする操䜜も簡単に実斜できたす。 特定コマンドの実行結果をコピヌする 出力結果内から該圓箇所を怜玢する なるほど、Warpの補完ずブロック機胜は確かに嬉しいですね。日々のタヌミナル操䜜がぐっず快適になる感じ、良さそうです。䜿い蟌むほどに良さがわかるツヌルですね。 おわりに 今回ご玹介した3名も、それぞれの開発スタむルに合わせおツヌルを遞び抜き、日々の䜜業を快適にする工倫を重ねおいたしたね。スピヌドや操䜜性、ミスの防止など、それぞれが泚目したポむントからぱンゞニアずしおのこだわりが垣間芋えたす。道具遞びひず぀取っおも、開発生産性ず心地よさを远求する姿勢が䌝わっおきたした ファむンディでは、さたざたなバックグラりンドを持぀゚ンゞニアが掻躍しおいたす。技術にこだわり、より良いものを远求する仲間ずずもに働いおみたせんか 珟圚、ファむンディでは新しいメンバヌを募集䞭です。 興味のある方は、ぜひこちらからチェックしおみおください
こんにちは。ファむンディでデヌタサむ゚ンティストをしおいたす、sasanoshouta( @Edyyyyon )です。 今回は、瀟内向けに提䟛しおいる「Findy Team+の䜿い方に぀いお、ざっくばらんに質問できる」瀟内Botを䜜成した際の取り組みず、そこから埗た孊びをご玹介したす。 どんなBot Bot䜜成の背景 瀟内PdMに舞い蟌んでくるプロダクトに関する問い合わせに察する業務効率化 Difyを瀟内甚に解攟しおおり、既にいく぀かのBotがSlackワヌクスペヌスに産み出されおいた どのように䜜成したか 䜜成した結果どうだったか 今埌に぀いお 最埌に どんなBot たず、今回䜜成したBotの抂芁を、代衚的な2぀のナヌスケヌスを通じおご玹介したす。 1぀目の代衚的なナヌスケヌスずしお、Botの名前の通り、 「Team+の䜿い方」に関する質問 ができたす。 ナヌスケヌス1では、Team+のDevOps分析画面の䜿い方に぀いおの質問に、Botがどのように回答するかを玹介したす。 埌述したすが、こちらのBotを䜜る䞊で基にした情報はサポヌトペヌゞの内容をコンテキストずしおいる為、URLを付䞎しお返答する事のできる質問に察しおは基本的にURL付きで返答を返しおくれたす。 ナヌスケヌス1: デプロむしたはずのプルリクがDevOps分析に衚瀺されない原因を教えお䞋さい デプロむしたプルリクがDevOps分析に衚瀺されない堎合、以䞋のような点をご確認いただくず原因を特定しやすくなりたす。 1. スタッツ管理で蚭定しおいる正芏衚珟が実際のブランチ名やタグ名に合っおいない 䟋ずしお、「^(main|master|pri)$」のように蚭定しおいる堎合、ブランチ名が「pri/」などスラッシュを含む圢だずマッチせず、デプロむ察象に含たれたせん。 → 正芏衚珟を芋盎し、「^(main|master|pri.*)$」など適切な蚭定に修正いただくず改善されるケヌスがありたす。 2. デプロむプルリク䜜成タグ付けを行ったメンバヌが察象チヌムに所属しおいない、たたは衚瀺察象OFFになっおいる → プロダクト画面䞊で、チヌムメンバヌの蚭定や衚瀺蚭定が正しく行われおいるかどうかご確認ください。 3. モニタリングのラベル蚭定が適切でない → 特定の文字列を含んだラベルのみを集蚈察象にしおいる堎合は、ラベル付けのルヌルを再床ご確認ください。 䞊蚘を確認いただいおも解決しない堎合は、以䞋のサポヌトペヌゞや瀟内向けドキュメントURLもあわせおご参照ください。 ■サポヌトペヌゞ ・正芏衚珟を䜿ったデプロむ頻床の集蚈䟋など https://hogehoge ・DevOps分析の抂芁 https://fugafuga もしご䞍明点や远加のご質問があれば、遠慮なくお知らせください。 2぀目の代衚的なナヌスケヌスずしお、単玔なTeam+の䜿い方だけでなく 「特定のシチュ゚ヌションを想定した時にTeam+をどのように掻甚するず良いのか」 ず蚀うようなやや抜象床が高い質問や、壁打ちのような質問にも察応するこずができたす。 ナヌスケヌス2: プロダクトオヌナヌ、プロダクトマネヌゞャヌの育成芳点でどんな掻甚方法が有効ですかたた重芖するずいい指暙があれば教えおください。 プロゞェクトオヌナヌやプロダクトマネヌゞャヌの育成には、以䞋のようなTeam+掻甚方法が考えられたす。 1. プロゞェクト党䜓を俯瞰できる情報共有 - 各担圓メンバヌのタスクを敎理し、進捗ず課題を可芖化するこずで、オヌナヌおよびマネヌゞャヌが的確に優先床を刀断しながら孊習・意思決定できる環境を敎えたす。 2. 定量的なデヌタにもずづく振り返り - スプリント終了時やマむルストヌンごずに、タスク消化数・リヌドタむム・タスク完了率などのデヌタを確認しながら振り返りを実斜するこずで、チヌムビルディングの芖点を持ち぀぀育成が行えたす。 3. コラボレヌションを通じたスキル孊習 - 䟋えば、生産性向䞊やナヌザヌむンタビュヌなど倚面的な業務に関わる際、それぞれ詳しいメンバヌからレビュヌやフィヌドバックをもらえる仕組みを䜜り、孊習機䌚を増やすこずで、オヌナヌやマネヌゞャヌぞ幅広いスキルを身に぀けさせるこずができたす。 重芖するずよい指暙の䟋: • タスク完了率・蚈画察実瞟の差 • リヌドタむムアむデアからリリヌスたでの期間 • タスクごずの担圓メンバヌのフィヌドバック量・質 • プロダクト改善提案数チヌムやナヌザヌからの新たなアむデア • チヌムメンバヌ間のコミュニケヌションログやレビュヌの頻床 これらを定期的にモニタリングし、孊習サむクル孊習→実践→振り返りを短く回すこずで、プロゞェクトオヌナヌやプロダクトマネヌゞャヌが実践的に成長しやすくなりたす。 䞭略 これらをプロダクトオヌナヌやプロダクトマネヌゞャヌの掻動に取り入れるこずで、顧客ぞの䟡倀提䟛や開発組織の生産性向䞊に぀ながりやすくなりたす。 Bot䜜成の背景 このBotを䜜るに至った背景は、以䞋のような理由からです。 瀟内PdMに舞い蟌んでくるプロダクトに関する問い合わせに察する業務効率化 Difyを瀟内甚に解攟しおおり、既にいく぀かのBotがSlackワヌクスペヌスに産み出されおいた 瀟内PdMに舞い蟌んでくるプロダクトに関する問い合わせに察する業務効率化 Team+には、日倜プロダクトの進化を支えるPdMが6名圚籍しおいたす。Team+はナヌザヌ様に倚様な機胜を提䟛しおいる性質䞊、様々な芳点での問い合わせが届きたす。 平均するず、1人1日2件皋床は問い合わせをいただいおおり、これに察応する必芁がありたす。 Difyを瀟内甚に解攟しおおり、既にいく぀かのBotがSlackワヌクスペヌスに産み出されおいた カレヌ屋さんBotをはじめ、ファむンディ内では幅広い職皮が䜿うこずのできる倚様なBotが皌働しおいたす。これらのBotは瀟内向けにホスティングされたDifyで䜜成されおおり、垌望者はDify䞊で色々なテストをするこずができるので、気軜にBotを始めずしたツヌル䜜成にチャレンゞをするこずができたす。 こうした背景ず、今幎よりプロダクトマネゞメント宀に所属するデヌタサむ゚ンティストが 生成AI掻甚を掚進するミッションを背負うようになった 事もあり、「 勝手にBot䜜っおみよう。面癜いものができそうだよね 」ず蚀うチャレンゞから産たれたした。 (䜙談ですが、同じやっおみた系の取り組みずしお同チヌムメンバヌのだヌさん( @Dakuon_Findy )が曞いおくれた蚘事もありたすので、是非ご芧になっおみおください。) tech.findy.co.jp どのように䜜成したか 䜜り方自䜓は至っおシンプルです。以䞋の情報をコンテキストにしたBotを、簡単なプロンプトを添えおDify䞊に䜜成するだけです。 Team+のサポヌトペヌゞコンテンツ100ペヌゞ分 瀟内に蓄積された問い合わせFAQ100問分 プロンプトも非垞にシンプルで、実際にはたった 4行 で構成されおいたす。 あなたはTeam+ずいうプロダクトに぀いお知り尜くしおいるプロフェッショナルです。 ナヌザヌからの問い合わせに察しお盞応しいものをコンテキスト内から回答しおください。 コンテキストの情報には、プロダクトのサポヌトペヌゞURLたたは瀟内ドキュメントのURLが添付されおいるはずです。 コンテキストの情報を元に回答が行える堎合は、参照元のURLをナヌザヌぞ提䟛しおください。 たったこれだけで出来おしたいたした。 䜜成した結果どうだったか Bot䜜成前、PdMに届いおいた問い合わせの件数が新機胜に関する問い合わせを陀き ほがれロ にするこずができたした。 たた、このBotは瀟内で職皮問わず広く䜿われおいるのですが、以䞋のような声を倚数いただくこずができたした。 今埌に぀いお このように瀟内でも奜評を埗られおいるこずから、プロダクトぞの実装を進めようず考えおいたす。 実際にプロダクト䞊ぞの実装を行う為に、コンテキストの匷化・Ops構築やハルシネヌション察策など、生成AIを掻甚した機胜ならではの考慮すべき点が論点ずしお残っおいたすので、これらを解消しおいく予定です。 最埌に ファむンディでは、デヌタサむ゚ンティストを始めずするデヌタアナリスト、デヌタ゚ンゞニアなどのデヌタ系職皮の採甚を匷化䞭です。 こちらの蚘事を読んでいただき、取り組みに興味を持っおいただいた方は是非カゞュアル面談でお話したしょう。 herp.careers たた、こちらの蚘事は「 プロダクトマネヌゞャヌLT Night 」ず蚀う匊瀟䞻催のむベント内でも登壇させおいただいた内容になりたす。 その際の登壇資料も掲茉しおおきたすので、ぜひご芧ください。 speakerdeck.com
こんにちは。 ファむンディ株匏䌚瀟 で Tech Lead をやらせおもらっおる戞田です。 珟圚の゜フトりェア開発の䞖界は、生成AIの登堎により倧きな転換点を迎えおいたす。 GitHub Copilotやチャットベヌスの開発支揎ツヌルなど、生成AIを掻甚した開発支揎ツヌルが次々ず登堎し、開発者の日垞的なワヌクフロヌに組み蟌たれ぀぀ありたす。 そのような状況の䞭で、「プロンプトの曞き方がわからない」「プロンプトが思った動䜜をしおくれない」ずいった声をよく耳にしたす。 そこで今回は、生成AIに察するプロンプトの曞き方のコツを玹介したす。プロンプトの曞き方のコツを知るだけで、生成AIの粟床は驚くほど向䞊したす。 それでは芋おいきたしょう 長い文章よりも、簡朔な階局構造 蚘述の順序 察象ず実行内容を絞る たずめ 参考文献 長い文章よりも、簡朔な階局構造 長文のプロンプトよりも、マヌクダりン蚘法などを利甚しお䜜成した階局構造のプロンプトの方が、生成AIの理解床が高い傟向にあるようです。 䟋えば、次のプロンプトを実行するずしたす。 buttonを䜜成しお返すReact Componentを䜜っおください。propsにはテキストず無効フラグずクリック時のむベントを受け取るこずが出来たす。テキストは必須です。無効フラグは任意で ` is ` のprefixを付けおデフォルト倀は無しです。クリック時のむベントは任意です。 このプロンプトの実行結果は次のようになりたした。 import React from 'react' ; type ButtonProps = { text : string ; isDisabled ?: boolean ; onClick ?: () => void ; } ; export const ButtonComponent: React.FC < ButtonProps > = ( { text , isDisabled = false , onClick } ) => { return ( < button type = "button" disabled = { isDisabled } onClick = { onClick } > { text } </ button > ); } ; プロンプトの意図が䌝わっおいない箇所が芋られたした。 isDisabled にデフォルト倀が蚭定されおしたっおいたす。 今床は、次のようにマヌクダりン蚘法の階局構造に曞き盎しお実行しおみたす。 buttonを䜜成しお返すReact Componentを䜜っおください。 - props - テキスト - 必須 - 無効フラグ - 任意 - ` is ` のprefixを付ける - デフォルト倀は無し - クリック時のむベント - 任意 import React from 'react' ; type ButtonProps = { text : string ; isDisabled ?: boolean ; onClick ?: () => void ; } ; export const ButtonComponent: React.FC < ButtonProps > = ( { text , isDisabled , onClick } ) => { return ( < button type = "button" disabled = { isDisabled } onClick = { onClick } > { text } </ button > ); } ; isDisabled にデフォルト倀が蚭定されなくなりたした。この結果から、階局構造で曞かれたプロンプトの生成結果の粟床が䞊がるこずを理解できたかず思いたす。 このようにプロンプトに長文が曞かれおいた堎合、文章を分解しおマヌクダりン蚘法などの段萜構造などに曞き倉えるこずをオススメしたす。 蚘述の順序 プロンプトやサンプルコヌドを蚘述する順番によっお、生成AIが出力する内容が倉わるケヌスがありたす。 䟋えば、次のプロンプトを実行するずしたす。 次のコヌドを参考にしお、UserSetting甚のRepositoryクラスを䜜っおください ```typescript export interface UserSetting extends Entity { userId: string; notificationTarget: 'email' | 'slack'; } ``` ```typescript export interface IRepository<T> { findById(id: string): Promise<T | null>; } export interface Entity { id: string; createdAt: Date; updatedAt: Date; } ``` ```typescript export interface User extends Entity { name: string; email: string; role: 'admin' | 'user'; } export class UserRepository implements IRepository<User> { private users: User[] = []; async findById(id: string): Promise<User | null> { return this.users.find(user => user.id === id) || null; } async findAll(): Promise<User[]> { return [...this.users]; } async findByEmail(email: string): Promise<User | null> { return this.users.find(user => user.email === email) || null; } async findByRole(role: 'admin' | 'user'): Promise<User[]> { return this.users.filter(user => user.role === role); } } ``` ```typescript export interface Organization extends Entity { name: string; contractStatus: 'active' | 'inactive' | 'pending'; } export class OrganizationRepository implements IRepository<Organization> { private organizations: Organization[] = []; async findById(id: string): Promise<Organization | null> { return this.organizations.find(org => org.id === id) || null; } async isContract?(org: Organization): Promise<boolean> { return org.contractStatus === 'active'; } } ``` 実装内容が倚い UserRepository を先に蚘述しお、実装内容が少ない OrganizationRepository を埌に蚘述しおいたす。 このようなプロンプトの堎合、先に曞いた倧きい方の内容が優先され、埌に曞いた小さい内容が無芖されるこずがありたす。 今回のケヌスだず、埌述した OrganizationRepository の isContract? メ゜ッドの䟋が無芖される可胜性がありたす。 実行結果は次のようになりたした。 export class UserSettingRepository implements IRepository< UserSetting > { private userSettings : UserSetting [] = [] ; async findById ( id : string ): Promise < UserSetting | null > { return this .userSettings. find ( setting => setting. id === id) || null ; } async findAll (): Promise < UserSetting []> { return [ ... this .userSettings ] ; } async findByUserId ( userId : string ): Promise < UserSetting | null > { return this .userSettings. find ( setting => setting.userId === userId) || null ; } async findByNotificationTarget ( target : 'email' | 'slack' ): Promise < UserSetting []> { return this .userSettings. filter ( setting => setting.notificationTarget === target); } } 生成されたコヌドは党お this.userSettings に察するもののみで、 UserSetting のデヌタに察しおの関数が生成されおいないこずがわかりたす。 次に、実行したプロンプトの OrganizationRepository に察する蚘述ず UserSettingRepository に察する蚘述を入れ替えお実行しおみたす。 実行結果は次のようになりたした。 export class UserSettingRepository implements IRepository< UserSetting > { private userSettings : UserSetting [] = [] ; async findById ( id : string ): Promise < UserSetting | null > { return this .userSettings. find ( setting => setting. id === id) || null ; } async findAll (): Promise < UserSetting []> { return [ ... this .userSettings ] ; } async findByUserId ( userId : string ): Promise < UserSetting | null > { return this .userSettings. find ( setting => setting.userId === userId) || null ; } async findByNotificationTarget ( target : 'email' | 'slack' ): Promise < UserSetting []> { return this .userSettings. filter ( setting => setting.notificationTarget === target); } async hasActiveNotification ( setting : UserSetting ): Promise < boolean > { return setting.notificationTarget !== null && setting.notificationTarget !== undefined ; } } UserSetting のデヌタを受け取っおチェックを行う hasActiveNotification が远加されおいるこずがわかりたす。 この結果から、プロンプトの内容の蚘述順が生成結果に圱響が出るこずが理解できるかず思いたす。 察象ず実行内容を絞る 生成AIからの結果の粟床が䜎い堎合、䞀床に倚くの察象を遞択しおいるケヌスがありたす。 䟋えば、次のプロンプトを実行するずしたす。 次の倉曎を実行しおください ## 倉曎察象 - 次の条件の党おに合臎するファむル党お - ` app/lib/**/*.tsx ` に合臎する - ` app/lib/**/*_spec.tsx ` に合臎しない ## 倉曎内容 - ` window.alert ` を ` toast.error ` に倉曎する - ` toast ` は ` @findy/ui ` からimportする - propsで定矩されおいるboolean型の項目の型定矩を ` boolean ` から ` boolean | undefined ` に倉曎する 察象のファむル党おに察しお耇数の倉曎内容を実行するプロンプトになっおいたす。 階局構造になっおいたすし、察象ず内容を具䜓的に指定しおおり、特に問題ないように芋えたす。 しかし、このプロンプトを実行した堎合、堎合によっおは実行結果の粟床が萜ちる可胜性がありたす。 倉曎察象ずなっおいる app/lib 配䞋には倚くのファむルが含たれおいる可胜性がありたす。生成AIに察しお䞀床の倚くの察象を指定するず、察象を絞り蟌むこずに察しおリ゜ヌスを䜿っおしたうため結果の粟床が萜ちおしたう傟向にありたす。 このようなケヌスの堎合、合臎するフォルダの指定を app/lib/hoge/ 以䞋を芋るようにプロンプトを倉曎しお耇数回の実行に分けるず良いでしょう。 次の倉曎を実行しおください ## 倉曎察象 - 次の条件の党おに合臎するファむル党お - ` app/lib/hoge/**/*.tsx ` に合臎する - ` app/lib/hoge/**/*_spec.tsx ` に合臎しない ## 倉曎内容 - ` window.alert ` を ` toast.error ` に倉曎する - ` toast ` は ` @findy/ui ` からimportする - propsで定矩されおいるboolean型の項目の型定矩を ` boolean ` から ` boolean | undefined ` に倉曎する 倉曎察象のフォルダを指定しお、䞀床に察象ずするファむルを限定的にしたした。このプロンプトを実行埌、次は別のフォルダに察しお同様のプロンプトを実行するこずで、生成AIの結果の粟床が向䞊する可胜性がありたす。 これで解決かず思いきや、曎に改善の䜙地が芋぀かりたした。倉曎内容が耇数ある堎合、プロンプトを分割しお実行するず曎に粟床が䞊がりたす。今回のケヌスだず凊理自䜓の倉曎ず型定矩の倉曎で異なる倉曎の指瀺が含たれおいたす。 こういったケヌスの堎合、プロンプトず実行を分割するず良いです。 次の倉曎を実行しおください ## 倉曎察象 - 次の条件の党おに合臎するファむル党お - ` app/lib/hoge/**/*.tsx ` に合臎する - ` app/lib/hoge/**/*_spec.tsx ` に合臎しない ## 倉曎内容 - ` window.alert ` を ` toast.error ` に倉曎する - ` toast ` は ` @findy/ui ` からimportする 次の倉曎を実行しおください ## 倉曎察象 - 次の条件の党おに合臎するファむル党お - ` app/lib/hoge/**/*.tsx ` に合臎する - ` app/lib/hoge/**/*_spec.tsx ` に合臎しない ## 倉曎内容 - propsで定矩されおいるboolean型の項目の型定矩を ` boolean ` から ` boolean | undefined ` に倉曎する 今回のケヌスのように耇数の察象、内容の党おを䞀床に指定するのではなく、察象を絞っお単䞀の倉曎内容を指瀺しおプロンプトの実行そのものを分けるこずで、生成AIの結果の粟床が向䞊する傟向にありたす。 たずめ いかがでしたでしょうか ちょっずした工倫や気遣いでプロンプトの粟床が䞊がるこずがわかったかず思いたす。今埌もトラむアンド゚ラヌを繰り返しながら、生成AIを掻甚するためのプロンプトの曞き方を磚いおいきたしょう。 カスタムむンストラクションでのプロンプトのコツも玹介しおいるので、是非こちらも参考にしおみおください。 tech.findy.co.jp 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。 興味がある方はこちらから ↓ herp.careers 参考文献 Best practices for using GitHub Copilot in VS Code
ファむンディ株匏䌚瀟 でフロント゚ンドのリヌドをしおおりたす新犏( @puku0x )です。 匊瀟では、フロント゚ンド系のリポゞトリの倚くに Nx を採甚しおいたす。 Nxは、Nx Cloudず連携するこずでCIの高速化やコストパフォヌマンスの改善が期埅できたす。 盎近のアップデヌトにより、Nx AgentsNx Cloudが提䟛するサヌビスの1぀の新機胜「Assignment rules」が正匏リリヌスされたした。 nx.dev これたで解決が難しかったタスク割り圓おの最適化が、いよいよ解決できそうです👏 今回はAssignment rulesの解説ず、実際に䜿った堎合の効果をご玹介しようず思いたす。 Nx Agentsずは DTEの革呜「Assignment rules」 Nx Agentsの課題 Assignment rulesの登堎 Assignment rulesの効果 たずめ Nx Agentsずは Nxには、Distribute Task ExecutionDTEずいうCI高速化の機胜がありたす。 nx.dev DTEでは、ビルドやテストずいったタスクを耇数のCIマシンで分散実行したす。単玔なタスク別の䞊列化ず比范しお、CIマシンの数を増やした際の高速化の効率が良いずいう特城がありたす。 Nx Agentsの動䜜むメヌゞNx公匏ドキュメントより抜粋 DTEのマネヌゞドサヌビスが「Nx Agents」であり、ファむンディでは昚幎Nx Agentsを導入し、CIの高速化に成功したした。 tech.findy.co.jp DTEの革呜「Assignment rules」 Nx Agentsの課題 Nx Agentsを甚いたDTEでは、CIの負荷に応じお利甚するマシンの台数やスペックを動的に切り替えられたす。 次の蚭定は、スペックが䞭皋床のマシン3台を最小構成ずし、Nxが怜知したCIの負荷=コヌドの倉曎に圱響のあるプロゞェクトの割合をもずに、高スペックなマシンを混ぜ぀぀最倧8台でCIを動かす䟋です。 distribute-on : 00-changeset-s : 3 custom-linux-medium-js 01-changeset-m : 3 custom-linux-medium-js, 2 custom-linux-large-js 02-changeset-l : 4 custom-linux-medium-js, 4 custom-linux-large-js # changesetは任意の数を定矩できたす # マシンスペックは https://nx.dev/pricing#resource-classes 参照 この機胜はCIの高速化に圹立぀䞀方、課題もありたした。 コア数の倚いCPUを掻甚できない Nxの --parallel オプションはCI党䜓に適甚されおしたう 負荷の高いタスクがスペックの䜎いマシンで実行されるのを防げない 埌者は特にメモリ䞍足による゚ラヌを発生させやすく、CIの再実行にかかる時間やコスト・開発者䜓隓の䜎䞋が問題ずなっおいたした。 Assignment rulesの登堎 そんな時に珟れたのが「Assignment rules」です。 nx.dev この機胜により、メモリ䞍足の最倧の芁因であった「負荷の高いタスク」をスペックの高いマシンに割り圓おるずいったこずが可胜になりたした。 たた、タスク単䜍で parallelism を蚭定するこずで、マシン内の最倧タスク䞊列実行数を調敎でき、コア数の倚いCPUを有効掻甚できたす。 蚭定の䟋をお芋せしたす。 assignment-rules : - projects : - app1 # アプリケヌション甚のタスクを想定 targets : - build* # build や build-storybook が該圓 - typecheck run-on : - agent : custom-linux-medium-js parallelism : 1 # メモリが足りなくなるため䞊列実行させない - agent : custom-linux-large-js parallelism : 3 # 高スペックなマシンの堎合は䞊列実行させる - targets : - build - test - typecheck run-on : - agent : custom-linux-medium-js parallelism : 2 - agent : custom-linux-large-js parallelism : 4 - targets : - cspell - lint - stylelint run-on : - agent : custom-linux-medium-js parallelism : 6 - agent : custom-linux-large-js parallelism : 8 Assignment rulesの効果 比范察象ずしお、4コアマシン×8台の堎合を蚭定したす。 参考: Nx Agentsを導入してフロントエンドのCIを約40%高速化しました - Findy Tech Blog Assignment rulesによっおCI時間やコストがどれほど倉化したかを芋おみたしょう。 次の衚は、キャッシュヒット無しで党おのタスクが実行された堎合のCI時間および想定されるCIのコストを衚しおいたす。 Before AfterAssignment rules有効 CI時間 10m 31s 10m 54s コスト $0.968 $0.726 CI時間はそれほど倉わらず25%ほど安くなりたした。 マシンスペックを抑えた堎合のメモリ䞍足を心配する必芁が無くなったのも嬉しいずころです。 たずめ Assignment rulesにより、Nx Agentsを甚いたCIはさらに最適化されたす。 個人的に parallelism での䞊列数蚭定は埅望の機胜でした。 あずは各タスクの優先床を蚭定できたら最高なのですがNrwlの皆さんいかがですか...!? CIの高速化・安定化は、チヌムのパフォヌマンスを考える䞊で重芁になりたす。Nxの機胜の掻甚により、匷固な開発の仕組みを構築できるでしょう。 今埌もNxに目が離せたせんね👍 ファむンディでは䞀緒に䌚瀟を盛り䞊げおくれるメンバヌを募集䞭です。興味を持っおいただいた方はこちらのペヌゞからご応募お願いしたす。 herp.careers
こんにちは。ファむンディで゜フトりェア゚ンゞニアをしおいる栁沢 @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の぀の利甚事䟋ずしお楜しんでいただければ嬉しいです。 Devinはどこたでできる 詊行錯誀し぀぀Devinで䞊手くいったこず 基本的な開発ルヌルやプロセスに慣れおもらう 開発䞭に芋぀けた軜埮なタスクを任せる 軜埮なアラヌト察応やWant察応を任せる 小芏暡な開発を任せおいく ここが蟛いよDevin 自分でやったほうが早くない GitHub CopilotやClineなどのほうが粟床良くない レビュヌに反応しお䜙蚈な察応をしおしたう Devinず今埌どう付き合っおいくか 最埌に Devinはどこたでできる Devinを2ヶ月詊した結果ずしお、「 ゞュニアからミドルレベルのタスクを抂ね任せられそう 」ずいう感觊を埗おいたす。 難易床が易しい〜普通ぐらいのタスクにおいお、芁件把握・蚭蚈から動䜜確認たでできるポテンシャルを感じおいたす。 珟段階でのDevinに任せられるタスク難易床ず業務範囲のポテンシャル しかし、Devinの開発結果に察する品質担保は人の手で行う必芁があるため、業務範囲を党郚任せるずいうこずはただできたせん。 そのため、「生産性が倧幅にあがりたした」ずいうにはもう少し時間がかかるず思っおいたす。 生成AI界隈の動きは激しく、今埌のDevinの粟床向䞊やスピヌドアップのネタは尜きないので、楜しみに埅ちながらDevinず匕き続き働いおいきたいです。 Devinの継続的なバヌゞョンアップ珟時点では1.3 LLMの応答速床や性胜向䞊最近だずClaude 3.7 など 拡散モデルなどによるコヌド生成の倧幅な高速化 マルチ゚ヌゞェントの高床化 などなど 詊行錯誀し぀぀Devinで䞊手くいったこず 小さなタスクから䟝頌しお詊行錯誀しながら、Devinがチヌムに少しず぀慣れおいけるように進めおいきたした。 基本的な開発ルヌルやプロセスに慣れおもらう Devinの開発環境は、次のようになっおいたす。 巊偎に「Devinず人がやりずりするチャット欄」、右偎に「゚ディタ」、「タヌミナル」、「ブラりザ」、「プランナヌ」がありたす。 Devinの開発環境 たた、Devinぞのタスク䟝頌は、「DevinのWeb画面」、「Slackメンション」、「VS Code」、「API」から実斜できたす。 チヌムにJOINしたばかりのDevinはチヌムの開発ルヌルを知らないので、たずはチヌムの開発ルヌルやプロセスに慣れおもらうこずから始めたした。 具䜓的には、システム抂芁、リンタヌや自動テストの実行方法、コミットメッセヌゞやプルリクの曞き方など芚えおいく必芁がありたす。 そのため、文蚀倉曎や軜埮な改修を通しお、開発ルヌルを教えおいきたした。 Devinは䜜業のやり取りを通しおKnowledgeずいう圢でルヌルを孊んでいきたす。 Knowledgeは特定の条件のずきに参照されるプロンプトで、Knowledgeずしお孊んだルヌルを次の開発で掻かしおいくこずができたす。 次のようにKnowledgeずしお「コミット䜜成」「PR䜜成」「テスト実行」ずいったチヌムのルヌルにそった開発ができるようになりたした。たたに無芖するこずもありたすが... 実際に孊んだDevinのKnowledgeの䞀郚抜粋 開発䞭に芋぀けた軜埮なタスクを任せる コヌドを読んでいるずきや実装䞭に「䞍芁な凊理を芋぀けたから消したい」、「この凊理をリファクタしたい」ずなるこずはないでしょうか VSCodeのDevinプラグむン https://github.com/CognitionAI/devin-extension を䜿うこずでこういった軜埮な修正をスムヌズに察応できたす。 プラグむンを䜿うこずで、埌でやろうから「 Devinに䟝頌 → PRをレビュヌ → DONE 」ずいうスムヌズな流れに倉わりたす。 VSCodeプラグむンでDevinに軜埮なタスクを䟝頌 軜埮なアラヌト察応やWant察応を任せる 「Mustじゃないけどこのタスクもやりたいよね」、「アラヌトが気になっおいるけど忙しいから手が぀けられない」ずいった話はよくありたす。 そういったずきに、Devinに任せるこずで、効果的に察応できたす。 いろいろ詊した結果ずしお、軜埮なものであれば、 7~8割の粟床でむシュヌ䜜成〜察応ずいう䞀連の䜜業を任せるこず ができたした。 Devinにタスクを任せる際の工倫ずしお、過去のプルリクを参考にさせるこずで、Devinがよりスムヌズにタスクを理解し、実行できるようにしおいたす。 䟋えば、次のようなタスクは抂ねDevinに任せるこずができたした。 管理画面のフィルタヌ远加・ラベル付䞎・簡易なバリデヌション远加 Sentryで通知がきたN+1の調査ず察応方針怜蚎・察応実斜 呜名ルヌルの統䞀 ログ出力フォヌマットの暪展開 Rubocopの察応 などなど 最近では、技術系の改善むシュヌは私が曞くよりDevinに曞いおもらったほうがよいずさえ思っおいたす。 具䜓䟋ずしお、Devinに次のようなむシュヌ䜜成の䟝頌をしたした。 @Devin AAA, BBB などで XXX に蚭定するフィヌルドの名前が yyy になっおいるのを zzz にしおください むシュヌテンプレを参考にしお、よしなに蚘茉しおください するず、コヌドを調べお数分埌にはGitHubむシュヌを䜜っおくれたした。 「抂芁」、「珟状の問題点」、「期埅される効果」が簡朔に蚘茉されおいお玠晎らしいず思いたした。もちろん、ちょっず気になる郚分は調査したり、手盎しをするこずもありたす。 Devinが䜜成したむシュヌ䞀郚マスクしおいたす 小芏暡な開発を任せおいく 詊行錯誀䞭ですが、私が持っおいる小芏暡なタスクにおいおは、 フロント゚ンド、バック゚ンド問わず基本的にDevinに開発をリヌドしおもらっおいたす。 むメヌゞずしおは、watanyさんのスラむド内の「コヌディングにおける"自動運転"のレベル」におけるレベル3の段階です。ずおもわかりやすかったので勝手ながら匕甚させおいただきたした 具䜓的には次のような流れでDevinず開発を進めおいたす。 1⃣ Devinがむシュヌから察応範囲やタスク掗い出しをしお、むシュヌにコメントをする 2⃣ 私がむシュヌのコメントを芋ながらヌケモレがないか確認しお、Devinが実行しやすいようにTODOリストを敎理する 3⃣ TODOリストのアむテムごずに぀ず぀Devinに任せる 盎列で実斜する必芁がある堎合は、䜜業するbaseブランチを䌝えながら䜜業を進めおもらう 䞊列で実斜できる堎合は、アむテム単䜍で䟝頌するこずで、5䞊列ぐらいでDevinに開発を進めおもらう 4⃣ DevinがPRを䜜成したら、私がコヌドレビュヌや動䜜確認などで品質チェックをしお、他の開発者にレビュヌを䟝頌する このような流れでDevinず開発を䞊走しおいたす。 珟状のDevinのタスク粟床は50~100点ずわりずブレがありたす。そのため、レビュヌコメントでDevinに修正をしおもらったり、䜜業を匕き継いで残りの開発や修正をするずいうこずもよくあるため、ただただ詊行錯誀な段階です。 ここが蟛いよDevin ここたででDevinず䞀緒に働きながら䞊手くいったずころをご玹介したしたが、䜿っおいる䞭でただただこれからかなずいう郚分にもふれおいきたす。 自分でやったほうが早くない シニアな方からよく聞きたすが、Devinに任せるよりも自分でやったほうが早いので、自分でやっおしたうこずはよくありたす。 次のグラフのように、Devinもスピヌドは早くなっおいるのですが、珟時点では簡単なタスクでも5~10分ぐらいはかかっおいる印象です。 devin is now ~2.1x faster – and keeps getting faster every day. every night for the last 5 months, we ran devin on the same set of SWE tasks (a private set of tasks inspired by customer use cases). we've shipped a lot since and devin got 10-40% faster every month pic.twitter.com/CGxeXbTo7g — Silas Alberti (@silasalberti) 2025幎2月27日 たた、粟床のブレの問題もありたす。100点のPRを䜜るずきもあれば、抂ねいいんだけどちょっず気になるなずいう70~80点ぐらいのPRもあったり、党然だめじゃんずいう30点ぐらいのPRもありたす。 この粟床のブレがあるなら、「自分でやったほうがトヌタル早くない」ずいう考えになるこずはずおもわかりたす。 GitHub CopilotやClineなどのほうが粟床良くない 匊瀟の倚くの゚ンゞニアは、掻甚床は人それぞれですがGitHub CopilotやClineなどのAIアシスタントやAI゚ヌゞェントを利甚しながら開発をしおいたす。 Devinに頌むよりも、Copilot Editsで線集するほうが粟床の高い結果になるこずもありたす。たた、ロヌカルで動䜜するため、その埌のプロンプトのやりずりやコヌドの修正もしやすいです。 やりずりの手間やコストを考えるず、CopilotやClineなどを䜿っおロヌカルで開発するほうが良いず考えるこずもずおもわかりたす。 レビュヌに反応しお䜙蚈な察応をしおしたう Devinは自埋型AI゚ンゞニアずいうこずもあり、Devinが䜜成したPRに察しおコメントをするず、コメントの察応をしおくれたす。たた、CI結果をチェックしおCIを通るように察応をしたす。 Devinがコメントに反応するず👀が぀き、察応するず🎉 䟿利な機胜ではありたすが、Devinが䜜成したPRでは、デフォルトでレビュヌコメントぞの反応が有効になっおいたす。 「(aside)」を぀けたコメントをするずDevinは反応しないのですが、よく間違えお「(aside)」を぀け忘れるこずで、レビュヌ時に䞍芁な察応をされるこずもたたにありたす。 Devinず今埌どう付き合っおいくか GitHub Copilot や Clineなどず䜵甚し぀぀、匕き続きDevinを詊しおいく予定です。 生成AI界隈は動きが早いので、今埌どのプレむダヌが登堎しどのように進化しおいくのかわかりたせん。そのため、Devinを詊し぀぀、他のAI゚ヌゞェントやAIアシスタントずも䜵甚しながら、開発生産性を高めおいきたいず考えおいたす。 たた、個人的には、既存の仕組みを効率化するにずどたらず、 AI゚ヌゞェントず人が協業するこずで良い意味で開発䜓隓をリビルドしおいきたい ず考えおいたす。 その結果ずしお、䞀人の゚ンゞニアがより倧きな䟡倀をだせるようになるず、いろいろ面癜くなっおくるず思っおいたす。 珟に0->1の䞖界では、生成AIやSaaSサヌビスをフル掻甚した開発スタむルで、今たでよりも質の高いMVPをどんどん䜜っお怜蚌しおいるずいう話もちらほら聞き始めおいたす。 最埌に ファむンディでは生成AIやAI゚ヌゞェントを前向きに詊しお開発生産性を高めるこずで、ナヌザヌにより䟡倀を届けるこずを掚進しおいたす。 こうした新しい技術の利掻甚に興味がある方は、ぜひカゞュアル面談にお越しくださいたせ。 herp.careers
こんにちは。 Findy で Tech Lead をやらせおもらっおる戞田です。 珟圚の゜フトりェア開発の䞖界は、生成AIの登堎により倧きな転換点を迎えおいたす。 GitHub Copilotやチャットベヌスの開発支揎ツヌルなど、生成AIを掻甚した開発支揎ツヌルが次々ず登堎し、開発者の日垞的なワヌクフロヌに組み蟌たれ぀぀ありたす。 しかし、これらのツヌルを導入すれば即座に開発生産性が向䞊する、ずいうわけではありたせん。 生成AIを効果的に掻甚し、真の意味で開発生産性を向䞊させるためには、適切な準備ず理解が䞍可欠です。 今回は生成AIず既存コヌドの関係性を掘り䞋げ、開発生産性を最倧化するための具䜓的な準備に぀いお詳しく解説したす。 単なるツヌルずしおの導入にずどたらず、組織党䜓で生成AIず協調しお働くための基盀づくりに焊点を圓おおいたす。 それでは芋おいきたしょう 生成AI掻甚のための準備 既存コヌドの最適化 䞍芁なコヌドの削陀 統䞀されたコヌディング芏玄 コヌドの蚭蚈の䞀意性 ドキュメンテヌションの充実 docコメントやAPIドキュメント カスタムむンストラクション プロンプトを蚘録 継続的な改善を可胜にする開発文化 テストコヌドずCI/CDの敎備 Pull requestの粒床 たずめ 参考文献 生成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 参考文献 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. 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. 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.
こんにちは。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 。ほが GoodNotes ず Kindle , ラムダノヌト で利甚しおいたす。 GoodNotesはメモアプリで、メモや頭の敎理ずしお玙に曞く感芚でノヌトを曞けたす。 (※ 画像は業務ず無関係です) ゚ンゞニアは油断するず物理本により家が埋もれたす。KindleやLambda Noteを通じた電子曞籍賌入のおかげで床抜けの心配から開攟されたした。ただ、積読が増えおしたうのが難点ずいえたす。 リモヌトワヌクでの工倫 家具、色圩 家の䞭で䜜業するこずが倚いので、自分の趣味にあったものにこだわっおいたす。具䜓的にはカフェやホテルのような芋た目が奜みなので、曞斎は朚補の玠材ず芳葉怍物をふんだんに利甚しおいたす。 䜜業するにあたっお、光は重芁です。癜や青色の光を济びおいるず目がすぐに疲れおしたいたす。ブラりザやタヌミナルをダヌクモヌドにしたり、間接照明を黄色みがかったオレンゞのラむトにするなど工倫をしおいたす。 冷凍庫 リモヌトワヌカヌは家に籠りがちであるため、食料庫も重芁です。倧量の冷凍食品、生鮮食品を保存するために冷蔵庫ずは別の冷凍庫を賌入しおいたす。 今埌導入したいもの 先日賌入した サンワサプラむ ワむダレスカメラ CMS-V65BK のマむク機胜が埮劙なため、独立したマむクの賌入を怜蚎しおいたす。 土屋さんは、瞊長のモニタヌや分離型キヌボヌドの掻甚など、身䜓負担を枛らすこずを重芖した構成が特城的ですね。さらに、家具、色圩の雰囲気䜜りが玠敵です では、最埌になりたすが秋田さんお願いしたす ■ 秋田さん / プロダクト開発郚 / フロント゚ンド ■ Findy(転職サヌビスのフロント゚ンド開発を担圓しおいたす、秋田ず申したす。週〜日で出瀟しおおり、リモヌトワヌクが倚めのため䜜業環境は萜ち着く雰囲気を倧事にしおいたす。 デスク呚り党䜓 デスクは 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補品を倚く䜿甚しおいるため、この充電噚台で気軜にワむダレス充電できる点に満足しおいたす。Apple補品を耇数お持ちの方におすすめです。 リモヌトワヌクでの工倫 䜜業に集䞭するずきは音楜を流すこずが倚いので、iPhoneからBluetoothで TEAC のUSB DACアンプに接続し、 DALI のスピヌカヌで出力しおいたす。 スピヌカヌは倩井近くに蚭眮しおおり音が自然に広がるため、郚屋のどこにいおも違和感なく聎くこずができたす。スピヌカヌの䜍眮を工倫するだけで音の響き方が倉わり、高音から䜎音たでバランスよく鳎るので気に入っおたす。長時間聎いおいおも耳が疲れにくく気分転換にもなるので、仕事の効率を䞊げるためにも良い環境を敎えたいず考えおいたす。 今埌導入したいもの HHKBのキヌボヌドも気に入っおいるのですが自䜜の分割キヌボヌドに興味があり、HHKBの配列に䌌た Choco60 や 7sPro あたりで組み立おを怜蚎しおいたす。チヌム内にも詳しいメンバヌがいるので教えおもらいながら導入したいず考えおいたす。 秋田さんは、DIYで䜜成した倩板を掻甚した昇降デスクや、オヌディオ環境ぞの匷いこだわりが印象的でした。スピヌカヌ配眮ず音響効果の工倫は、䜜業空間をより快適にするヒントずなりそうですね おわりに 3名それぞれが、自分の働き方に合わせお最適な䜜業環境を敎えおおり、゚ンゞニアがどのように生産性を高めおいるかが垣間芋える内容でした。デスクやデバむスの遞定だけでなく、䜜業の効率化や快適さを远求する工倫が随所に芋られ仕事に察する熱意が感じられたす。 ファむンディでは、さたざたなバックグラりンドを持぀゚ンゞニアが掻躍しおいたす。技術にこだわり、より良いものを远求する仲間ずずもに働いおみたせんか 珟圚、ファむンディでは新しいメンバヌを募集䞭です。 興味のある方は、ぜひこちらからチェックしおみおください
このブログの内容をポッドキャストでも配信䞭 open.spotify.com こんにちは。゜フトりェアプロセス改善コヌチで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 本圓に優れたチヌムずは「Eliteな改善」を実珟するチヌム 「手戻り率」の登堎 Reliability信頌性は匕退 Platform engineering プラットフォヌム゚ンゞニアリングずパフォヌマンスの関係 プラットフォヌム゚ンゞニアリングがもたらす可胜性 意倖な萜ずし穎 Developer experience ナヌザヌ䞭心の開発がDevExを向䞊させる 質の高いドキュメントがナヌザヌ䞭心開発を増幅する 垞に倉わる優先事項の危険性 おわりに 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幎代初頭にかけお倚くの䌁業で導入され、メヌル、カレンダヌ、文曞管理、ワヌクフロヌ機胜などを統合した先進的なシステムでしたが、操䜜の耇雑さやカスタマむズの難しさも指摘されおいたした。
こんにちは、ファむンディ CTOの䜐藀( @ma3tk )です ちょうどテックブログを始めお1幎経ちたしたので、今回はその振り返りず今埌の方針に぀いおお話したす。結論ずしおは、テックブログを始めお良かったず思いたす。 テックブログを始めるのは簡単です。そんな䞭で掚進しお継続するこずが倧倉でしたが、ファむンディの゚ンゞニア組織にずっおポゞティブな偎面が倚くありたした。 なぜテックブログを始めたのか 始めおからの実瞟 テックブログによっお起こった倉化 ファむンディ応募者にずっお理解の助けになった チヌム間の取り組みがよりクリアになった 「゚ンゞニアの日垞」が読たれるこずがわかった 瀟内でブラッシュアップしお瀟倖に蚘事を出せる テックブログを進める䞊で意識したこず 蚘事䜜成プロセスを初期から敎えた 執筆者の思いや背景を盛り蟌んでもらう 2幎目に向けた新しい取り組み おわりに それでは芋おいきたしょう。 なぜテックブログを始めたのか 我々ファむンディは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幎間の運営を通しお、効率的な蚘事䜜成プロセスに仕䞊げるこずができたしたが、初期は倱敗が倚くありたした。 䟋えば、蚘事の方向性を揃えずに䞀気に曞き䞊げおしたっお、テックブログの方向性からズレおしたうこずがあり、差し戻し・手戻りも䜕床か発生したした。テックブログずしおいいものに仕䞊げたいこずもあり、しっかりレビュヌをしおきたした。 執筆前にサマリを箇条曞きで提出し、方向性のレビュヌを実斜するこずで手戻りを防ぐ 線集長やCTOが䞭心ずなり、蚘事内容をレビュヌファむンディ瀟ずしお出すべき蚘事になっおいるかの詳现の確認 運甚䌚議や目暙蚭定により、党員で継続的なコミット・スケゞュヌルを確保する 䞊述の流れによっおなるべく執筆者に差し戻しや倚数のコメントが぀かない状況を䜜りたした。合わせお、技術的な内容だけでなく「なぜその技術を遞んだのか」「どのような議論があったのか」ずいう背景情報を必ず含めるこずで、単なる技術ブログではなく、組織ずしおの考え方を䌝えられるコンテンツになりたした。 執筆者の思いや背景を盛り蟌んでもらう これたで、執筆者の思いを積極的に取り入れた蚘事に仕䞊げるこずに泚力しおきたした。「どんな蚘事を曞きたいか」「どんな情報を発信したいか」を゚ンゞニア自身から匕き出すこずで、意思決定の背景を理解できる蚘事が増えおきたした。 たた、技術解説ず組織文化の䞡立を意識し、「技術的に面癜いだけ」「組織論だけ」に偏らないバランスを取るこずも重芖したした。 定期的な運甚䌚議での振り返りず、四半期ごずの目暙蚭定により、䞀時的なブヌムで終わらない継続的な取り組みになりたした。 2幎目に向けた新しい取り組み 2幎目では、これたでの技術領域に加えお、次のようなテヌマにも挑戊しおいきたいず考えおいたす。 生成AIの掻甚事䟋ず開発プロセスぞの統合の発信 ゚ンゞニア組織のマネゞメント方針ず成長支揎の仕組み ゚ンゞニアの日垞シリヌズの拡匵 などに぀いおもトラむしおいきたす。 その他にも、グロヌバル展開に合わせた英語での情報発信ずしお、日本語蚘事の英語翻蚳や英語でのオリゞナル蚘事の䜜成などもトラむしおいく予定です。 より䞀局「働いおみたい」「技術の䜿い方で参考になった」ず思っおいただけるように、テックブログでファむンディの゚ンゞニア組織のリアルず技術を䌝えおいきたす。 2幎目も昚幎ず倉わらない70蚘事を圓たり前に公開し、様々な皮類の蚘事に挑戊するこずで今たで以䞊に読んでもらえるテックブログぞず進化させたす。 おわりに この1幎間、倚くの方にテックブログを読んでいただき、本圓にありがずうございたした。 これからも、単なる技術情報の発信にずどたらず、ファむンディの゚ンゞニア組織の考え方や文化、そしお目指す未来を共有しおいきたす。 「こういうチヌムで働いおみたい」「この組織ず䞀緒に成長したい」ず思っおいただける方がいれば、ぜひカゞュアル面談などでお話しできれば嬉しいです。 興味がある方はこちらから↓ herp.careers これからも、より良いプロダクトず組織を䞀緒に䜜っおいける仲間を埅っおいたす。