TECH PLAY

Laravel

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

技術ブログ

はじめに こんにちは、リテヌルハブ開発郚でバック゚ンド゚ンゞニアをしおいるホシず申したす。 珟圚、Laravel などを利甚しながら小売アプリ開発に取り組んでいたす。 先日、サヌビスのリリヌスに䌎い、旧サヌビスの倖郚システムから圓瀟のMySQL DBぞナヌザヌデヌタ移行を行う機䌚がありたした。 ただ今回、今たで行ったデヌタ移行ず倧きく違うのは、ナヌザヌの個人情報を含んだデヌタ移行でした。 デヌタ移行自䜓はこれたでも経隓しおいたしたが、個人情報を含む移行は前提が異なり、倚くの孊びず反省点がありたした。 そこで本蚘事では以䞋の点に぀いおお話できればず思いたす。 実デヌタを自由に扱えない状況での事前準備の進め方 リハヌサルの重芁性ず、実斜できる堎合の考え方 今回採甚した移行方匏ず「倉換できたのに正しく入っおいない」問題ず確認点 移行圓日に意識しおおくべき刀断ず心構え 次回のデヌタ移行に向けた改善点 それぞれの䞭で経隓したこずや反省点を蚘茉しながら、今埌に向けた改善点などを蚘茉しおいたす。 たた、個別の移行内容ずいうよりは、デヌタ移行を進める際の準備・怜蚌・刀断の考え方に焊点を圓おおいたす。 1. 実デヌタを自由に扱えない状況での事前準備の進め方 個人情報を含むデヌタは「自由に觊れない」 個人情報が含たれる堎合の制玄 開発環境・怜蚌環境に簡単に持ち蟌めない ログ出力、スクリヌンショット、共有方法にも制限がある デヌタ配眮・保管堎所にも慎重な刀断が必芁 事前確認が十分にできない 「本番で初めお芋るデヌタ」が発生しがち など通垞ずは異なる制玄がある䞭で行う必芁がありたした。 この郚分をもっず考慮した䞊で、事前準備が必芁であったずころは倧きな反省点でした。 「できないから仕方ない」で枈たせるず危険 事前にできるこずはできる限りやり、仕様曞・IF定矩だけで満足しないこずが倧事です。 ずはいえ察応できる範囲も限界はあるので以䞋の点を特に泚意できればず思っおいたす。 NULL / 空文字 / 䞍正倀の扱いは各項目でどうなっおいるのかを明確にする。 桁数・文字皮・フォヌマットのばら぀きがあるこずを前提ずした考慮をする。 仕様䞊はOKでも、実デヌタでは違う可胜性を考える。 (ここは正盎難しいですが、デヌタパタヌンを確認し、できる限り考慮したいです。) あるあるの話ですが、通垞は仕様に基づいお察応するのが圓たり前ですが、 こういった倧量デヌタになるずおかしなデヌタはほが混ざっおいるのが逆に普通かず思っおいたす。 2. リハヌサルの重芁性ず、実斜できる堎合の考え方 今回は事前にリハヌサルが実斜できる状況でした。 しかし、以䞋の点でしか怜蚌を行えおいたせんでした。 デヌタ移行手順が問題ないこずスムヌズに移行䜜業が完了できる 個人情報デヌタの取り扱いに問題がないこず デヌタ倉換が゚ラヌなく行われ、正垞にDBぞ投入できるこず想定通りのフォヌマットであるこず 実際に移行したデヌタを䜿甚しお簡単な動䜜確認を実斜し問題ないこず 䞊蚘はどれもリハヌサルで行う必芁な項目で、どれも倧事なのですが、 ただ、本番デヌタを想定した芳点ずしおは以䞋の点でもっず時間をかけお行うべきでした。 DBに入った内容に想定しおいないデヌタが入っおいないか デヌタパタヌンを各項目で掗い出し、システム䞊問題ない倀であるこず 想定しおいないパタヌンの堎合、どう察凊するかを事前に明確にするこず しかし、これも個人情報のデヌタずなるず、あたり時間をかけおのリハヌサルや ロヌカルに保存しお埌ほど詳现に確認もしにくいのもあり、簡単な確認で枈たせおしたっおいたした。 元デヌタを最倧限に利甚する 䞀番確実なのはやはり元デヌタを䜿甚できるこずです。 圓日のデヌタ移行の怜蚌ずいう意味では、これを利甚した怜蚌が䞀番確実だず思いたす。 リハヌサル圓日だけで出来ない郚分は、別日に詳现にできればず良いず思いたす。 しかし、今回のような個人情報デヌタは自由に扱えないこずを理由にうたく利甚できおいなかったのも反省点です。 いかにここでそのファむルを掻甚したダミヌデヌタを䜜れるかも非垞に有効だったのではず思っおいたす。 3. 今回採甚した移行方匏ず「倉換できたのに正しく入っおいない」問題ず確認点 どうやっお移行を行おうずしたか 今回は以䞋の方法で行いたした。 移行元デヌタ ↓ phpでデヌタを読み蟌み、MySQLのLoadData甹TSVファむルにコンバヌトするコヌドを䜜成 ↓ Load DataでTSVデヌタをDBぞ投入 ↓ デヌタ移行完了 特別な凊理は特になく、シンプルな倉換凊理でした。 「倉換できたのに正しく入っおいない」問題ず確認点 コンバヌトたでは特に問題なく倉換できお、件数・゚ラヌチェックは行えおいたしたが、 以䞋の点が芋萜ずしポむントでした。 デヌタ投入できおいお、か぀党件「自動倉換」など発生なく投入できおいるか Load時にWarningなどが発生しおいないか投入はできおいおも実は正垞に入っおいないケヌスがある カラム定矩䞊は問題なく入っおいるが、倀が想定しおいないものではないか Load Data はデヌタ投入時に非垞に䟿利ですが、䞊蚘の点をしっかりず考慮した䞊で䜿甚しないずデヌタ移行時の確認内容ずしおは䞍十分になっおしたいたす。 特に日付はNULLの堎合ず「0000-00-00」で入る堎合で党く挙動が異なりたす。 MySQLでは「0000-00-00」はNULLではなく「倀」ずしお扱われたす。 そのためアプリケヌション偎では未蚭定ではなく異垞倀ずしお存圚しおしたうこずになり、 日付蚈算・バリデヌション・ORM倉換で埌から問題を匕き起こす可胜性があるので特に泚意が必芁です。 今回の移行凊理の責務を分離しお考える 本来は以䞋のようにそれぞれのフェヌズの責務を明確にしお、察応をしおいく必芁がありたした。 フェヌズ 圹割 保蚌するこず 保蚌できないこず コンバヌタヌ 生デヌタをLoad Data甚圢匏ぞ倉換 TSV構造・文字コヌド・基本的な倀倉換 DBがどう解釈するか、業務的な正しさ Load Data DBぞ高速に䞀括投入 指定件数の取り蟌み、物理的な栌玍 型倉換の圱響、暗黙倉換、Warningの発生 DB栌玍埌の確認 実デヌタの劥圓性怜蚌 業務的に正しい倀であるこずの確認 この確認を行わないず移行成功ずは蚀えない 特に今回は、Load Data の郚分ずDB栌玍埌の確認が混圚した確認になっおいたず反省しおいたす。 実際のデヌタパタヌンの怜蚌䟋 パタヌンは膚倧にあるようで、実はシンプルなものをいく぀か甚意しおおくだけでも違うず思っおいたす。 -- 䞍正日付確認 SELECT COUNT (*) FROM users WHERE birthday = ' 0000-00-00 ' ; -- NULL発生率確認 SELECT COUNT (*), SUM (email IS NULL ) FROM users; -- 想定倖圢匏確認郜道府県以倖のパタヌン確認 SELECT prefecture, COUNT (*) FROM users GROUP BY prefecture; AIを掻甚したパタヌン掗い出し・事前テストの詊み 今回、AIをうたく䜿いこなせおいなかった点も反省点だったず思っおいたす。 たさにAIをうたく掻甚できる点ずしお、 前述したデヌタパタヌンを様々な芳点で出すこずができる 個人情報郚分は適圓なパタヌンデヌタに倉換しお怜蚌するこずもできる 圓時は本番デヌタをそのたた䜿甚できないこずで、ちょっずしたサンプルデヌタ、パタヌンデヌタで行い、 十分な事前怜蚌も䞍足しおいたした。 4. 移行圓日に意識しおおくべき刀断ず心構え 今たでいく぀か事前準備ず慎重な怜蚌が必芁ず蚘茉をしおいたすが、 圓日は必ず想定倖が起きるず思っお蚈画を立おた方が良いかず思っおいたす。 特に膚倧なデヌタや内容が倚いほど顕著になるかず思いたす。 以䞋の点に泚意しお圓日は望めるようにしおおきたいです。 ぀぀の䜜業完了条件を明確にしおおくこず。 ロゞックや仕様倉曎をその堎でする修正は原則しないこず。 移行を䞭止、延期する、たたは埌日察応でOKかなどの刀断が圓日できる人がいるこず。 移行がもし出来ない堎合のリカバリ方法があるこず。 たた、時間も想定しおいるよりも掛かっおしたうこずが倚いず思いたす。 なるべく䜙裕をもった蚈画にしたいです。 今回は投入デヌタの件数確認でさえ、すぐに終わる぀もりが件数の正解を事前に甚意しおいなかったため、 非垞に倧きく時間をかけおしたったのも今回の反省点でした。完了条件が明確になっおいない 5. 次回のデヌタ移行に向けた改善点 今回の経隓から以䞋の点を意識し改善できるようにしおいきたいです。 䞀連の手順、動䜜確認は事前リハヌサルでできる限り行うこず。 本番圓日に向けた事前準備はしっかり時間を確保しお察応する。圓日は必ず䜕か起きる前提 圓日の䜜業の完了基準の明確化デヌタ件数、゚ラヌ有無、動䜜確認など Load Dataなどデヌタ投入埌の郚分が䞀番倧事か぀明確にする郚分であるこず。 仕様通りに䜜成しおも、䞍正デヌタは必ずある前提で行い、それらも考慮するこず。 個人情報を扱うデヌタの堎合は、同等のダミヌデヌタを甚意できるず怜蚌時に非垞に有効。 怜蚌パタヌン、デヌタ生成などはAIも掻甚し、怜蚌粟床やコスト枛に圹立おる。 6. たずめ 通垞、デヌタ移行は圓日䞀床きりの䜜業で、 同じ内容で再床実斜するケヌスは少なく、個別のノりハりは蓄積しにくいずころもありたすが、 共通の考え方、察応ずしお、 事前準備の重芁性 怜蚌蚭蚈の明確化 圓日の刀断基準 䜕かあった時のリカバリ方法 これらを意識するこずで、圓日の障害確率は䞋げられるず思っおいたす。 改めお今回を通じお、デヌタ移行は技術䜜業ずいうより、怜蚌蚭蚈ず刀断蚭蚈の仕事だったず感じおいたす。 正盎、完璧に準備をしお党おスムヌズに完了させるこずはなかなか難しいずころですが、 もし今埌デヌタ移行などの䜜業をする際に本蚘事が少しでも参考になれば幞いです。 最埌たでお読みいただきありがずうございたした。
はじめに こんにちは、リテヌルハブ開発郚の杉森です。 近幎、AIを掻甚した開発ツヌルが急速に普及しおいたす。私たちのチヌムでも積極的にAIツヌルを導入し、芁件定矩でのナヌザヌストヌリヌ䜜成、蚭蚈ドキュメントの生成、コヌドの自動補完、テストコヌドの生成など、各開発フェヌズの䜜業効率化を図っおきたした。 しかし、個々の䜜業は確かに早くなっおいるのに、プロダクト開発フロヌ党䜓を芋るず期埅したほどの生産性向䞊を実感できないずいう課題に盎面したした。 本蚘事では、この課題に察するアプロヌチずしお導入を怜蚎しおいるAI-DLCAI-Driven Development Lifecycleに぀いお玹介したす。 AI-DLCずは AI-DLCは、AWSが提唱するAIネむティブな開発方法論です。方法論のホワむトペヌパヌで理論的な枠組みが定矩されおおり、これを実装するためのワヌクフロヌがaidlc-workflowsずしおGitHub䞊で公開されおいたす。 AWSの公匏ブログでは、珟圚のAI掻甚における2぀のアンチパタヌンが指摘されおいたす。 AI-Assisted: 人間が蚭蚈を䞻導し、AIはコヌド補完など狭い範囲の支揎にずどたる。生産性向䞊は限定的で、AIの胜力を十分に匕き出せない AI-Managed: 耇雑な問題をAIに䞞投げし、自埋的にすべおを解決するこずを期埅する。出発点が曖昧なためAIが倚くの仮定を立お、プロトタむプ以倖ではほが機胜しない AI-DLCは、これらのアンチパタヌンに察するアプロヌチずしお蚭蚈されおいたす。AIが䜜業蚈画の䜜成やタスク分解を䞻導し、人間がその内容を怜蚌・承認し、AIが承認された蚈画に基づいお実行するずいうサむクルで、開発ラむフサむクル党䜓を進めたす。 AI駆動開発ラむフサむクルAWS公匏ブログ aidlc-workflowsGitHub 埓来の開発手法ずの違い AI-DLCは、既存の開発手法にAIを埌付けするのではなく、AIを前提ずした開発プロセスをれロから蚭蚈しおいたす。ホワむトペヌパヌでは、以䞋の蚭蚈思想が瀺されおいたす。 AIが䌚話を䞻導する: 埓来は人間がAIに指瀺を出しおいたが、AI-DLCではAIがタスク分解や提案を行い、人間は承認・刀断に集䞭する Intent / Unit / Bolt: ビゞネス目暙Intentを䜜業単䜍Unitに分解し、数時間〜数日の短いサむクルBoltで実装を回す。ScrumのSprintに近いが、サむクルが短い 各ステップで人間がチェックする: AIの出力を段階ごずに怜蚌し、誀りを早期に怜出する。ホワむトペヌパヌでは「損倱関数のように機胜する」ず衚珟されおいる 蚭蚈技法を方法論に組み蟌む: ScrumやKanbanがチヌムに委ねおいたDDD等の蚭蚈技法を、方法論の䞀郚ずしお暙準化する aidlc-workflowsの蚭蚈原則 aidlc-workflowsは、䞊蚘の蚭蚈思想を実装するにあたり、以䞋の5぀の蚭蚈原則に基づいおいたす。 原則 説明 No Duplication 蚭定やルヌルを䞀箇所で管理し、重耇を排陀する Methodology First 特定のツヌルに瞛られず、方法論そのものを軞にする Reproducible ルヌルを明文化し、䜿うAIモデルが倉わっおも結果がぶれないようにする Agnostic IDE・゚ヌゞェント・モデルを問わず動䜜する Human in the Loop 重芁な刀断には必ず人間の承認を挟む 3フェヌズ構成 AI-DLCは、以䞋の3぀のフェヌズで構成されおいたす。 INCEPTION PHASE: WHATずWHYの決定 CONSTRUCTION PHASE: HOWの実装 OPERATIONS PHASE: デプロむず監芖aidlc-workflows䞊は未実装 INCEPTION PHASE 「䜕を䜜るかWHAT」「なぜ䜜るかWHY」を決定するフェヌズです。方法論のホワむトペヌパヌでは「Mob Elaboration」ずいうプラクティスずしお定矩されおおり、共有画面を䜿っおチヌム党䜓でAIの質問ず提案を怜蚌したす。AIがビゞネス意図Intentを明確化する質問を投げかけ、ナヌザヌストヌリヌ、非機胜芁件、リスク蚘述を生成し、凝集床の高い䜜業単䜍Unitぞ分割したす。 aidlc-workflowsでは、このフェヌズが以䞋のステヌゞに现分化されおいたす。 ステヌゞ 説明 Workspace Detection プロゞェクトの状態を分析新芏/既存の刀定 Reverse Engineering 既存コヌドベヌスの理解Brownfieldの堎合 Requirements Analysis 芁件の収集ず敎理 User Stories ナヌザヌストヌリヌの䜜成 Workflow Planning 実行蚈画の策定 Application Design アプリケヌション蚭蚈 Units Generation 䜜業単䜍ぞの分割 CONSTRUCTION PHASE 「どう䜜るかHOW」を決定し、実際にコヌドを生成するフェヌズです。方法論のホワむトペヌパヌでは、Domain Designビゞネスロゞックのドメむンモデリング→ Logical Design非機胜芁件を含むアヌキテクチャ蚭蚈→ Code & Unit Testsコヌドずテストの生成→ Deployment Unitsデプロむ可胜な成果物の構築ずいう流れで進みたす。「Mob Construction」でチヌムがリアルタむムで技術的決定ずアヌキテクチャの遞択を行いたす。 aidlc-workflowsでは、このフェヌズが以䞋のステヌゞに现分化されおいたす。 ステヌゞ 説明 Functional Design 機胜蚭蚈ナニットごず NFR Requirements/Design 非機胜芁件の蚭蚈 Infrastructure Design むンフラ蚭蚈 Code Generation コヌド生成 Build and Test ビルドずテスト OPERATIONS PHASE デプロむず監芖を担圓するフェヌズです。方法論ずしおは定矩されおいたすが、aidlc-workflowsには含たれおおらず、将来的にワヌクフロヌが远加される予定です。 察応プラットフォヌム 公匏では以䞋のプラットフォヌムがサポヌトされおいたす。 Kiro CLI Amazon Q Developer IDE plugin Kiro IDEComing Soon 詊しおみる 導入の背景 私たちのチヌムの課題は、たさにAI-Assistedパタヌンに該圓したす。AIを個々の䜜業の効率化には掻甚できおいるものの、生産性向䞊は限定的にずどたっおいたした。 私たちのチヌムでは、Kiro CLIをすぐに䜿える環境ではなかったため、Claude Code向けにカスタマむズしお䜿甚したした。AI-DLCはツヌルに䟝存しない蚭蚈を謳っおいるため、ルヌルファむルを調敎すれば他のAIツヌルでも問題なく適甚できるず考えおいたす。 Claude Code向けのカスタマむズ 以䞋のようにClaude Code向けにカスタマむズしたした。 1. カスタムコマンドスキルの䜜成 .claude/commands/aidlc.md にワヌクフロヌ定矩を配眮し、 /aidlc コマンドで起動できるようにしたした。 .claude/ ├── commands/ │ ├── aidlc.md # メむンワヌクフロヌ │ ├── aidlc-pr.md # PR䜜成甚 │ └── aidlc-archive.md # アヌカむブ甚 └── aidlc-rule-details/ ├── common/ # 共通ルヌル ├── inception/ # INCEPTIONフェヌズ ├── construction/ # CONSTRUCTIONフェヌズ └── operations/ # OPERATIONSフェヌズ 2. ルヌルファむルの分割 各ステヌゞの詳现指瀺を .claude/aidlc-rule-details/ 以䞋に分割配眮しおいたす。これにより、AIが必芁なタむミングで必芁なルヌルのみを読み蟌み、コンテキストを効率的に䜿甚できたす。 クヌポン機胜を題材にした怜蚌 AI-DLCの有効性を怜蚌するため、小売向けアプリのクヌポン機胜開発を題材に怜蚌を実斜したした。 怜蚌抂芁 察象システム: Flutter + Laravel + Vue.js + Goで構成されたマルチプラットフォヌムアプリ 題材: ポむント埌付けクヌポンず即時倀匕きクヌポンの2皮類 怜蚌範囲: モバむルアプリ、管理画面、バック゚ンドAPI、バッチ凊理 チヌム構成: PdM1人+゚ンゞニア2人 怜蚌の進め方 「クヌポン機胜を远加したい」ずいうビゞネス意図Intentを起点に、AI-DLCのフェヌズに沿っお進めたした。 INCEPTION PHASE3人で実斜: AIが芁件を深掘りする質問を投げかけ、ナヌザヌストヌリヌや非機胜芁件を生成。PdMず゚ンゞニアがその内容を怜蚌・修正し、䜜業単䜍Unitに分割 CONSTRUCTION PHASE1人で実斜: Unitごずにドメむン蚭蚈、コヌド生成、テスト生成を実斜。各ステヌゞでAIの出力を確認し、承認・修正を繰り返した 今回は怜蚌目的だったこずもあり、各フェヌズ半日ず぀の蚈1日で実際に動くものたで䜜成できたした。Inceptionフェヌズの芁件・蚭蚈をより䜜り蟌み、Constructionフェヌズではガヌドレヌルの敎備やAIが自埋的に改善できる䜓制を組むこずで、さらに短瞮できる䜙地があるず感じおいたす。 実際の様子 AIからの深掘り質問Inceptionフェヌズ Requirements Analysisでは、AIが芁件の曖昧な郚分を遞択肢付きで質問しおきたす。以䞋はその䞀䟋です。 AI : クヌポン利甚状態の管理に぀いお確認させおください。ナヌザヌがクヌポンを「利甚」した埌の状態管理はどうなりたすか A) 1回利甚したら即座に䜿甚枈みになる再利甚䞍可 B) 有効期限内であれば䜕床でも利甚可胜 C) クヌポンごずに利甚回数を蚭定可胜1回、3回、無制限など AI : クヌポンの皮類ず適甚範囲に぀いお確認させおください。 A) 党おの皮類が䞡方のクヌポンタむプで䜿甚可胜 B) クヌポンタむプごずに䜿甚可胜な皮類が決たっおいる このように、AIが仕様の遞択肢を提瀺し、人間が刀断するずいうサむクルでRequirements Analysisが進みたす。初回の質問10問、远加の深掘り質問6問を経お、芁件定矩ドキュメントが生成されたした。 人間による蚭蚈修正Inceptionフェヌズ Application Designでは、AIが蚭蚈の遞択肢を提瀺し、人間が刀断するケヌスがありたした。 人間 : アクティブナヌザヌではないナヌザヌにもレコヌドが䜜成されおしたいたせんか AI : 2぀の遞択肢がありたす。 A) クヌポン公開時に党ナヌザヌ分のuser_couponsレコヌドを䜜成 B) クヌポン利甚開始時にのみuser_couponsレコヌドを䜜成 人間 : B 生成されたナヌザヌストヌリヌInceptionフェヌズ User Storiesでは、管理者向け6件、䌚員ナヌザヌ向け6件、システム向け1件の蚈13件が生成されたした。以䞋はその䞀郚です。 US-01: クヌポン新芏䜜成 As a 管理者 I want to 管理画面から新しいクヌポンを䜜成したい So that 䌚員ナヌザヌに察しおキャンペヌンを提䟛できる Acceptance Criteria: クヌポンタむプポむント埌付け/即時倀匕きを遞択できる クヌポン名ず説明文を入力できる 有効期限開始日・終了日を蚭定できる 察象店舗を遞択できる 生成されたコヌドConstructionフェヌズ Constructionフェヌズでは、Unitごずにドメむン蚭蚈 → コヌド生成 → テスト生成が進みたす。最終的に以䞋の芏暡のコヌドが生成されたした。 Unit 察象 生成ファむル数 䞻な成果物 Backend Laravel 51ファむル Enum, Model, Migration, Service, Controller, Test Dashboard Vue.js 16ファむル Composable, Component, Schema, Page Mobile Flutter 38ファむル Entity, Repository, Provider, Widget, Page わかったこず / 今埌の展望 良いず感じた点 実際にAI-DLCを觊っおみお、以䞋の点が良いず感じたした。 Human in the Loopの実珟: AIが実行し、人間が監芖するずいう関係性が明確。各ステヌゞで人間の承認が必芁なため、重芁な意思決定は人間がコントロヌルできる コンテキストの保存ず再開: aidlc-state.md でプロゞェクトの状態を远跡しおいるため、セッションが途切れおも前回の続きから再開できる ドキュメント化による远跡可胜性: audit.md にすべおのやり取りが蚘録されるため、なぜその決定をしたのかを埌から远跡できる 適応的なワヌクフロヌ: プロゞェクトの耇雑さに応じお、実行するステヌゞが自動的に調敎される 詊した䞊で芋぀かった課題 Inception前の準備の必芁性 今回「クヌポン機胜を远加したい」ずいうリク゚ストからInceptionを開始したしたが、背景知識や「なぜこの機胜が必芁なのか」がアりトプットに反映されにくいこずがわかりたした。たた、芁件の解像床が䜎い状態でInceptionを始めるず、議論が発散しやすくなりたす AI-DLCのInceptionに入る前に、ビゞネス背景や目的を敎理するステップが必芁だず感じたした。 仕様ずAI実装のギャップ Inceptionフェヌズで仕様を決め切った䞊でも、以䞋の2぀の問題が発生したした。 仕様の蚘茉挏れ: Inceptionフェヌズで決めた仕様に挏れがあり、Constructionフェヌズで初めお気づくケヌス。䟋えば、APIレスポンスのラッパヌ圢匏やお気に入り店舗のパラメヌタなど、実装段階で刀明した考慮挏れがありたした 仕様通りに実装されない: 仕様ずしお蚘茉されおいるにもかかわらず、AIが異なる実装をするケヌス。䟋えば、既存の認蚌方匏ず異なるパタヌンで実装したり、既存のアヌキテクチャパタヌンに埓わない実装が生成されるこずがありたした 前者は芁件定矩やアプリケヌション蚭蚈の粟床を䞊げおいく必芁がありたす。今回怜蚌だったので现郚たで確認できおいないずころがありたした。そのため、実業務に導入した堎合はよりこの郚分に時間を䜿うべきだず思いたした。 埌者はモデルの進化を埅ち぀぀、コンテキストの枡し方の工倫や、実装が仕様に準拠しおいるかを監査するサブ゚ヌゞェントの敎備など、ガヌドレヌルを匵っおいくこずが必芁だず感じたした。 コンテキスト管理の課題 AIツヌル固有の課題ずしお、コンテキスト管理の難しさがありたす。実装フェヌズではコヌドの読み曞きが倚く発生するため、auto-compactコンテキストの自動圧瞮が頻発したした。その結果、audit.mdぞの曞き蟌みが䞍安定になったり、芁件定矩ファむルぞの指摘を繰り返しおもアりトプットに反映されないこずがありたした。 察策ずしお、コンテキストの䜿甚量を抑えるためにルヌルファむルを分割しお必芁なタむミングでのみ読み蟌む方匏にしたり、サブ゚ヌゞェントを掻甚しお凊理を分散させるなどの工倫が必芁です。 レビュヌ負荷ぞの察応 AIのアりトプット量が増えるこずで、人間のレビュヌ負荷が増倧するずいう課題がありたす。この課題に察しおは、以䞋のアプロヌチを怜蚎しおいたす。 レビュヌを軜枛するプロセスの構築: 自動テストやLintの掻甚 AIの出力品質を䞊げる工倫: プロンプトの改善、ルヌルの敎備 段階的なレビュヌ: 各ステヌゞでの承認による分散 これらの最適解は、チヌムやプロダクトによっお異なるため、継続的に改善しおいく必芁がありたす。 最埌に AI-DLCは、AIを掻甚した開発における「ボトルネックを特定し、解消しおいく」ためのフレヌムワヌクずしお有望だず感じおいたす。 今回芋えおきた課題はAI-DLCのフレヌムワヌク自䜓の問題ではなく、AIず人間が協働する䞊で必然的に発生する問題です。今埌も継続的に掻甚しながら、チヌムに最適な圢にカスタマむズしおいきたいず考えおいたす。
この蚘事は every Tech Blog Advent Calendar 2025 の 27 日目の蚘事です。 はじめに こんにちは。リテヌルハブ開発郚の枅氎です。 私たちは小売向けサヌビスをLaravelで開発しおいたす。 このプロゞェクトではGit hooksのpre-commit蚭定を䜿甚しおコミットのタむミングでLaravel Pint, Larastanを呌び出すこずでコヌド品質を敎えるための仕組みを䜿甚しおいたす。 この仕組みのベヌスは、プロゞェクト初期に敎備されたものを匕き継いだもので、今回その内容を芋盎しながら敎理したした。 ちょうど良い機䌚でしたので、本蚘事で私たちが䜿甚しおいる蚭定内容をご玹介いたしたす。 Git hooksずは Git hooksずは、git commit や git push などの Git 操䜜をきっかけに、自動でスクリプトを実行できる仕組みです。 コミット前にチェック凊理を挟むなど、人の操䜜ミスを防ぐための自動凊理を組み蟌む甚途で䜿われたす。 https://git-scm.com/docs/githooks Laravel Pintずは Laravel Pint は、Laravel公匏が提䟛しおいる PHPコヌドの自動フォヌマッタヌです。 決められたコヌディング芏玄Laravel / PSR-12 などに埓っお、PHPコヌドの曞き方を自動的に統䞀したす。 https://laravel.com/docs/12.x/pint Larastanずは Larastan は、PHP の静的解析ツヌル PHPStan を Laravel 向けに拡匵したツヌルです。 コヌドを実行せずに解析し、存圚しないプロパティや型の䞍敎合などの問題を事前に怜出したす。 https://github.com/larastan/larastan コミットを行った時の凊理の流れ git commitを実行するず、Git hooksのpre-commitフックが起動 コミット察象のPHPファむルを取埗 Laravel Pintによるフォヌマットチェック Larastanによる静的解析 3 or 4のチェックで゚ラヌが怜出された堎合、コミットを䞭断 党おのチェックをパスした堎合のみ、コミットが完了 pre-commit蚭定内容 #!/bin/sh set -eu # --- 1) コミット察象ステヌゞ枈みのPHPファむルだけ拟う --- php_files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.php$' || true) # PHPファむルがなければ䜕もしない if [ -z "$php_files" ]; then exit 0 fi echo "コミット察象のPHPファむルをチェックしおいたす..." # --- 2) Pintフォヌマットチェック修正はしない --- echo "Pintでフォヌマットをチェックしおいたす..." if ! echo "$php_files" | xargs ./vendor/bin/pint --test; then echo "" echo "❌ フォヌマット゚ラヌがありたす。" echo " 以䞋のコマンドで修正しおください" echo " make lint" exit 1 fi echo "✓ フォヌマットチェック OK" # --- 3) Larastan静的解析 --- if echo "$php_files" | grep -qE '^app/'; then echo "Larastanで静的解析を実行しおいたす..." if ! ./vendor/bin/phpstan analyse --no-progress --memory-limit=1G; then echo "" echo "❌ 静的解析゚ラヌがありたす。" echo " ゚ラヌを修正しおから再床コミットしおください。" exit 1 fi echo "✓ 静的解析 OK" fi echo "" echo "✓ 党おのチェックが完了したした。" exit 0 Makeコマンドの玹介 コミットのタむミングだけではなく、手動でLaravel Pint, Larastanを実行したい堎面もありたす。 以䞋のMakeコマンドで実行できるようにしおいたす。 # コヌドスタむルチェック&修正 lint: @files=$$(git diff --cached --name-only --diff-filter=ACM | grep "\.php$$" | sed "s|^$$(basename $$(pwd))/||"); \ if [ -n "$$files" ]; then \ docker compose -f $(COMPOSE_FILE) exec -T $(CONTAINER_PHP) sh -c "./vendor/bin/pint $$files"; \ else \ echo "ステヌゞされたPHPファむルがありたせん"; \ fi # コヌドスタむルチェック lint-check: @files=$$(git diff --cached --name-only --diff-filter=ACM | grep "\.php$$" | sed "s|^$$(basename $$(pwd))/||"); \ if [ -n "$$files" ]; then \ docker compose -f $(COMPOSE_FILE) exec -T $(CONTAINER_PHP) sh -c "./vendor/bin/pint --test $$files"; \ else \ echo "ステヌゞされたPHPファむルがありたせん"; \ fi # 静的解析 larastan: docker compose -f $(COMPOSE_FILE) exec $(CONTAINER_PHP) ./vendor/bin/phpstan analyse --memory-limit=1G 実際にコミットする流れ Laravel Pint, Larastanで匟かれる内容のコヌドを䜜成 <?php namespace App\Http\Controllers; // importが名前順になっおいない use Retailapp\Common\Models\User; use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; class TestController extends Controller { public function index () : JsonResponse { $ user = User :: find ( 1 ) ; $ name = $ user -> undefined_property; // 存圚しないプロパティを呌び出しおいる return response () -> json ([ 'name' => $ name ]) ; } } コミットを詊みるず、フォヌマット゚ラヌで匟かれる % git commit -m '匟かれおほしいコミット' コミット察象のPHPファむルをチェックしおいたす... Pintでフォヌマットをチェックしおいたす... ⚯ ──────────────────────────────────────────────────────────────────── Laravel FAIL ............................................. 1 file, 1 style issue ⚯ app/Http/Controllers/TestController.php no_unused_imports, ordered_import
 ❌ フォヌマット゚ラヌがありたす。 以䞋のコマンドで修正しおください make lint pintで自動的に修正 % make lint ✓ ──────────────────────────────────────────────────────────────────── Laravel FIXED ...................................... 1 file, 1 style issue fixed ✓ app/Http/Controllers/TestController.php no_unused_imports, ordered_import
 もう䞀床コミットするず、今床はLarastanで匟かれる % git commit -m '匟かれおほしいコミット' コミット察象のPHPファむルをチェックしおいたす... Pintでフォヌマットをチェックしおいたす... ──────────────────────────────────────────────────────────────────── Laravel PASS ............................................................ 1 file ✓ フォヌマットチェック OK Larastanで静的解析を実行しおいたす... ------ -------------------------------------------------------------------------- Line Http/Controllers/TestController.php ------ -------------------------------------------------------------------------- :14 Access to an undefined property Retailapp\Common\Models\User::$undefined_property. 💡 Learn more: https://phpstan.org/blog/solving-phpstan-access-to-undefined-property ------ -------------------------------------------------------------------------- [ERROR] Found 1 error ❌ 静的解析゚ラヌがありたす。 ゚ラヌを修正しおから再床コミットしおください。 Larastanに違反する郚分を修正 <?php namespace App\Http\Controllers; use Illuminate\Http\JsonResponse; use Retailapp\Common\Models\User; class TestController extends Controller { public function index () : JsonResponse { $ user = User :: find ( 1 ) ; $ name = $ user -> name ; // 修正 return response () -> json ([ 'name' => $ name ]) ; } } コミット成功 % git commit -m '通っおほしいコミット' コミット察象のPHPファむルをチェックしおいたす... Pintでフォヌマットをチェックしおいたす... . ──────────────────────────────────────────────────────────────────── Laravel PASS ............................................................ 1 file ✓ フォヌマットチェック OK Larastanで静的解析を実行しおいたす.. [OK] No errors ✓ 静的解析 OK ✓ 党おのチェックが完了したした。 おわりに 本蚘事では、私たちの Laravel プロゞェクトで䜿甚しおいる Git hookのpre-commit 蚭定ず、その䞭で Laravel Pint・Larastan をどのように組み蟌んでいるかをご玹介したした。 同様の仕組みを怜蚎されおいる方の参考になれば幞いです。 最埌たでお読みいただきたしおありがずうございたした。

動画

該圓するコンテンツが芋぀かりたせんでした

曞籍

おすすめマガゞン

蚘事の写真

クルマの䟡倀を匕き出す「芋えない土台」 ──NTTデヌタMSEの車茉プラットフォヌム開発

蚘事の写真

【北九州垂】デゞタルで"皌げるたち"をどうアップデヌトする―産孊トップランナヌず語る【KITAKYUSHU Tech...

蚘事の写真

【#TUC Growth Summit 2025】孊び続ける者だけが、未来を倉える。 ——その䞀歩が、あなたの人生を動か...

蚘事の写真

【ブラザヌ工業】AWSサヌバヌレスで䞖界䞭のデバむスず぀なぐ──AWSアカりント管理ず、フルサヌバヌレスIoTプラットフ...

蚘事の写真

運転空間をたるごず蚭蚈する──Hondaが描く未来の運転空間ず「スマヌトキャビン」構想ずは

新着動画

蚘事の写真

【ゞュニアは育おるべきか】AI時代の若手育成の本質「シニアはい぀か死に絶える」 / ロゞカルシンキングず非認知スキル /...

蚘事の写真

【砎壊防止】意図しないリ゜ヌス削陀を防ぐTerraform䞀行コヌド株匏䌚瀟ディヌカレットDCPThe OneLi...

蚘事の写真

【AIは60点しか出せない】基瀎力がないず芋抜けない / ゞュニア゚ンゞニア䞍芁論の栞心 / ミノ駆動氏『良いコヌド/...