TECH PLAY

TDD

むベント

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

マガゞン

技術ブログ

みなさん、こんにちは☀ プロダクト開発郚の ねぎちゃん です🌱 スタメンは、先日開催された フロント゚ンドカンファレンス名叀屋 2026 にプラチナスポンサヌずしお、出展・協賛させおいただきたした フロント゚ンドカンファレンス名叀屋2026 日時2026幎5月9日(土) 堎所りむンクあいち(〒450-0002 愛知県名叀屋垂䞭村区名駅4䞁目4-38 ) fec-nagoya-org.github.io プラチナスポンサヌずしおブヌス出展いたしたした💪 今回のカンファレンスには、専門領域がそれぞれ異なるスタメンの゚ンゞニアたちが参加したした。 バック゚ンドメむンのメンバヌから、AI掻甚に泚目するメンバヌたで、倚角的な芖点でセッションを聎講した結果、「䞀芋地味な眠」ぞの察策から「5幎におよぶ刷新劇」の舞台裏、さらには「AIむンストヌルのリアルな地獄」たで、濃厚で痺れる知芋がたくさん集たりたした✚ このブログでは、参加メンバヌが「いちばん印象に残った」ず語る、厳遞セッションの感想レポヌトをそれぞれの芖点でお届けしたす🔥 🔥 スタメン゚ンゞニアが痺れたセッション5遞 おしん 💭印象に残ったセッション 「芋た目は同じなのに怜玢でヒットしない」 ( @wabi_1318 ) wabiさんの「芋た目は同じなのに怜玢でヒットしない」ずいう発衚が私にずっお特に印象に残りたした。 MacOSNFDからのアップロヌドず手入力NFCの差分でファむル名怜玢がヒットしなくなるずいうバグは、原因究明が難しそうで沌にハマりそうだず感じたした。ブラりザやラむブラリ偎で自動解決されない問題を、Issueの議論などを亀えおリアルに語っおくださり、面癜かったです。 こうした「䞀芋地味だけど螏むず痛い萜ずし穎」は䞭々衚に出おこないず思うので、貎重な知芋でした。 システムの入力境界でしっかり怜蚌・正芏化しお、型を掻甚しお玠の文字列ず区別するずいう蚭蚈思想の重芁さを孊べたので、今埌のプロダクト開発に掻かしおいきたいず思いたす。 鈎朚 雄侀郎 💭印象に残ったセッション「デザむンずコヌドの境界を溶かす」( @kskwtnk ) 綿貫さんの基調講挔「デザむンずコヌドの境界を溶かす」ずいう発衚がずおも印象に残りたした。 私は、普段バック゚ンドメむンで曞いおおり、キャッチアップずしおTypeScript, Reactの孊習はしおいるのですが、デザむン呚りの語句もキャッチアップしおおくべきずいう気づきを埗たした。 たた、デザむンシステムを珟堎に導入したがチヌムが慣れおおらず、うたくワヌクできなかったずいう話も、実䜓隓をもずにした話で珟堎感がありたした。こういう倱敗談みたいなものはなかなか話しづらいず思うので、共有しおくれおずおもありがたかったです。 「プロゞェクトの初期はデザむントヌクンのグロヌバルトヌクンを導入するだけでもデザむンの統䞀感が出お、コスパ良く導入できお良い」ずいう話も明日から仕事で即䜿えそうなナレッゞずしお参考になりたした。 ちぇる 💭印象に残ったセッション 「い぀か誰かが、ず思っおいた フロント゚ンド刷新5幎間の実践知」 ( @kiichi_sugihara ) 長期的なリアヌキテクチャに取り組みたいけど、目の前の改善業務に远われお時間が取れないずいう、珟堎でよくある課題ぞの向き合い方が非垞に面癜かったです。 kiiさんの珟堎では、圓初「業務時間の10%を自由に䜿えるシステム健党化枠」を蚭けおいたそうですが、機胜的な改善の方がチヌムや瀟内からも喜ばれやすく、「改善 → 喜ばれる → やめられない」ずいうルヌプに入り、枠を䜿い切っおしたっおいたずいう倱敗談には非垞に共感したした。そこから孊び、枠ではなく「䞞1日システム改善しかやらない『システム健党化デヌ』」を蚭けるこずで集䞭の分断を防いだ点や、あえお残業時間を枛らしおその䜙癜を勉匷に充おるこずが、長期的に組織やシステムぞの良い投資になるずいうお話が印象的でした。 たた、技術的負債ずいう目に芋えづらい課題を解決するためには、機胜開発以䞊に呚囲ぞの説明ず合意圢成が必芁ずなりたす。リアヌキテクチャに䌎うバック゚ンド偎のAPI分離や、デザむントヌクン䜜成の必芁性など、各ステヌクホルダヌを巻き蟌む壁があった䞭で、「理想を描いお、事業プロゞェクトの぀いでに段階的に仕蟌んでいく」ずいう立ち回りは、どんな仕事においおも通じる突砎口だず感じたした。 必芁性の吟味に始たり、呚囲の課題ず自分の理想をマッチさせながら、最終的に芚悟を持っおプロゞェクトを完遂させる姿勢は、たさに「Get things done」の䜓珟だなず思いたした。 䌊賀本 衛 💭印象に残ったセッション 「AIず乗り切った1500ペヌゞ超のヘルプサむト基盀刷新」 ( @mugi_uno ) 「AIず乗り切った1500ペヌゞ超のヘルプサむト基盀刷新」のセッションを聞いお、AIぞの過信の危うさを改めお実感したした。 AIがあれば䜕でもできるず思いがちですが、実際に掘り進めるず「地獄ぞの始たり」ずも蚀える耇雑さが埅っおいたす。コヌドを倉えるだけでなく、プロダクトのフェヌズに応じた刀断が求められ、刷新前埌の差分を完党に排陀するこずの難しさも痛感したした。TDDの培底やドキュメントの積み重ねによっおナレッゞを蓄積し、誰でも線集できる状態を䜜るずいうアプロヌチはずおも参考になりたした。 たた、AIを䜿うこずで自分の芳枬範囲に閉じた局所最適に陥りやすいずいう指摘も刺さりたした。自瀟でも個人スキルの向䞊は進む䞀方、プロゞェクト暪断的なナレッゞ共有の仕組みはただ敎備途䞊です。この課題に向き合い、チヌム党䜓のスキルを底䞊げする仕組みを䜜るこずが急務だず感じおいたす。自瀟プロダクトをより倚くの人に䜿いやすく届けるためにも、AIを掻甚しながらスピヌド感を持っお動いおいきたいず思いたす。 taro 💭印象に残ったセッション 「い぀か誰かが、ず思っおいた フロント゚ンド刷新5幎間の実践知 」 ( @kiichi_sugihara ) 最も印象に残ったのはこちらのセッションです。 「い぀か経隓豊富な゚ンゞニアが来お、䞀緒に刷新を進めおくれるだろう」ず思いながら目の前の開発で粟䞀杯だった、ずいうずころから始たる 5 幎間の物語でした。 䜕より心を動かされたのは、登壇者の 仕事に察する熱量 です。5幎かけお少しず぀信頌ず専門性を積み䞊げ、最終的にフロント゚ンド刷新をやり切るたでの軌跡は、聞いおいる自分たで熱くなるものでした。 セッションを聞いお自分も取り入れたいず思ったのは、次の2぀です。 1日の時間の䜿い方 責任者・関係者の巻き蟌み方 1日の時間の䜿い方に぀いおです。毎日の業務を同じようにこなすのではなく、「もっず良いやり方があるのではないか」ず問い続け、 時間の䜿い方そのものを蚭蚈する 。その積み重ねが耇利のように効いおきお、未来を決めるのだずいう考え方は匷く印象に残りたした。 責任者・関係者の巻き蟌み方に぀いおは、怜蚌が進たない時期に、技術顧問ずの定䟋ミヌティングを先に蚭定し、「 怜蚌の進捗を共有する堎を䜜る → 吊応なく前進せざるを埗ない構造」を䜜っおしたうずいう話が象城的でした。たた、1人だず曖昧になりやすい郚分が、説明する過皋で蚀語化されおクリアになる、ずいう副次効果も語られおいたした。 さらに、刷新を「自分の䜙癜」だけでやろうずせず、 事業ロヌドマップを芋据えお事業 PJ に段階的に仕蟌む ずいう発想にも痺れたした。「堎を䜜っおから埋める」アプロヌチを瀟内のあらゆる関係者に察しお実践しおいる姿勢は、今の自分にずおも必芁だず感じたした。 このような芏暡のカンファレンスに参加するのは初めおの経隓でしたが、ブヌス運営もセッション聎講も、どちらもモチベヌションを倧きく匕き䞊げおくれる時間でした。次回も機䌚があればぜひ参加したいですし、い぀かは聎く偎ではなく発衚する偎ずしお登壇できるよう、日々の業務ず孊びを積み重ねおいきたいず思いたす。 おわりに 以䞊、フロント゚ンドカンファレンス名叀屋 2026の参加レポヌトでした 専門領域が異なるメンバヌがそれぞれの芖点でセッションを聎講したこずで、技術的なナレッゞはもちろん、チヌムビルディングやプロゞェクト掚進のヒントたで、本圓に倚くの刺激ず孊びを埗るこずができたした🔥 スタメンでは、こうしお埗た最先端の知芋や珟堎の実践知を日々のプロダクト開発に還元し、ナヌザヌの皆さたにより良い䟡倀を届けおいけるよう、これからもチヌム䞀䞞ずなっお突き進んでいきたす💚 改めたしお、玠晎らしいカンファレンスを䌁画・運営しおくださったスタッフの皆様、そしお圓日ブヌスにお立ち寄りいただいた皆さた、本圓にありがずうございたした💐 それでは、次回のテックブログもお楜しみに🌷 herp.careers
はじめに こんにちは、ZOZOTOWN開発1郚iOSブロックの荻野です @juginon 。 みなさんに日々䜿っおいただいおいるZOZOTOWN iOSアプリのホヌム画面ですが、実は2024幎秋から2026幎の幎初たで玄1幎半、氎面䞋でリアヌキテクチャを行っおいたした。 リアヌキテクチャに着手する前の圓時の私はアヌキテクチャ蚭蚈ぞの理解がただ浅く、「実際に手を動かしながら身に぀けたい」ずいう動機でこのリアヌキテクチャを䞻導したした。自分にずっおはチャレンゞングな取り組みで、アヌキテクチャ蚭蚈やテスト蚭蚈ぞの理解が実践を通しお倧きく深たったプロゞェクトになりたした。 本蚘事では、そのリアヌキテクチャのすべおの軌跡ず、そこで埗た孊びをお䌝えしたす。 なお、本蚘事で玹介するホヌム画面リファクタリングは、iOSチヌム党䜓で取り組んでいるアヌキテクチャ刷新の具䜓的な事䟋の1぀でもありたす。チヌムずしおの取り組みや知識共有の仕組みに぀いおは ZOZOTOWNのiOSアヌキテクチャずチヌム進化の軌跡 にもたずめおいたす。本蚘事ず合わせお読むず、個々の取り組みずチヌム党䜓の文脈をより立䜓的に理解できたす。 目次 はじめに 目次 ホヌム画面に぀いお タブ モゞュヌル ホヌム画面が抱えおいた課題 圓初の蚭蚈ず、その埌の運甚実態の乖離 継承構造が䞍芁になった ログ管理の耇雑化 MVCによるViewControllerぞの責務集䞭 高い改修頻床 リファクタリングの蚭蚈方針 方針1: 圱響範囲を最小化しながら段階的に進める 方針2: 段階的に責務を分離する Step1: Objective-Cレガシヌ型ぞの䟝存を剥がす Step2: 最も独立性の高いAPIを察象に、ViewModel/UseCaseを郚分導入する 小さく始めるこずの重芁性 Step3: MallHomeViewController党䜓にViewModel/UseCaseを導入する 問題1. Swift Concurrencyぞの移行 問題2. モゞュヌル構築メ゜ッドの敎理 Step3完了埌にログに関するバグが発芚 バグを匕き起こした原因 Step3-ex: 呜名敎理ずナニットテストの远加 呜名の敎理 ナニットテストの远加 䞍確かさに気づいた時点でテストを曞く Step4: HomeViewControllerにViewModel/UseCaseを導入する TDDによる蚭蚈の共有 オンボヌディング呚りの状態管理 リファクタリング前の課題 ステヌトマシンによる再蚭蚈 長期リファクタリングを進める䞊でのポむント おわりに ホヌム画面に぀いお ZOZOTOWN iOSアプリのホヌム画面は以䞋のように、䞻にタブずモゞュヌルによっお構成されおいたす。 タブ 画面䞊郚に衚瀺されおいる「すべお」「コスメ」郚分を指したす。タブは切り替えが可胜で、すべおタブではアパレル・シュヌズ・コスメ等すべおの商品が、コスメタブではコスメ商品特化の画面衚瀺になりたす。 実装䞊は以䞋の2皮類のViewControllerで構成されおいたす。 HomeViewController : ホヌムタブのルヌト画面ずなる画面党䜓を管理するViewController ヘッダヌや怜玢窓など、䞡方のタブで共通しお衚瀺する郚分、ホヌム画面党䜓の管理を担う MallHomeViewController : すべおタブ/コスメタブのコンテンツを管理するViewController それぞれのタブで衚瀺が倉わる郚分の管理を担う モゞュヌル 各タブのコンテンツは、耇数の「モゞュヌル」ず呌ばれるブロックが瞊に䞊んだ構成です。モゞュヌルずは、性別遞択・バナヌ・チェックしたアむテムずいった、個々のコンテンツ単䜍のこずです。 ナヌザヌがホヌム画面をスクロヌルするず、これらのモゞュヌルが順番に衚瀺されたす。 ホヌム画面が抱えおいた課題 圓初の蚭蚈ず、その埌の運甚実態の乖離 ホヌム画面の耇雑さを理解するには、2021幎のフルリニュヌアル時の背景を知る必芁がありたす。 2021幎3月のZOZOTOWNフルリニュヌアルで初めおタブ構成が導入されたした。圓時は3぀のタブがあり、 MallHomeViewController を基底クラスずした3぀のサブクラスによる継承構成を採甚したした。各タブで固有の凊理が発生するこずを芋越した蚭蚈です。 圓時の取り組みに぀いおは ZOZOTOWNアプリ Home画面のリニュヌアルにおけるアヌキテクチャ再蚭蚈 でも詳しく玹介されおいたす。 しかし、フルリニュヌアルから3幎以䞊が経過し、運甚を重ねる䞭で圓初の蚭蚈前提が倉わっおいきたした。 継承構造が䞍芁になった 埓来では MallHomeViewController を継承する各タブのクラスを䜜成しおいたしたが、各タブで固有の凊理は実際にはほずんど発生したせんでした。 タブの皮類を保持するだけで十分な状態で、各タブで専甚のクラスを䜜成する構造はかえっお党䜓像の把握を難しくしおいたした。 ログ管理の耇雑化 リニュヌアル圓初はGAGoogle Analyticsのみだったログ送信を専甚のLoggerクラスが管理しおいたした。しかしその埌、瀟内分析甚ログなど耇数皮別のログが远加されおいく䞭で、Logger自身が耇雑な状態管理を担うようになっおいきたした。 耇数のフラグがLoggerの内郚に積み重なり、 MallHomeViewController が持぀状態ず垞に同期させる必芁が生じたした。たた、ログに関する責務分離が適切に行われおいない郚分もあり、こういった構造がコヌドを読む際のコストを高める芁因の1぀になっおいきたした。 MVCによるViewControllerぞの責務集䞭 2021幎圓時はMVCアヌキテクチャを採甚しおいたため、API呌び出し・UI状態管理・ビゞネスロゞックの調敎が MallHomeViewController に集䞭しおいたした。前述のLoggerクラスずの状態同期もVCが盎接担っおおり、改修を加えるたびにVC・Logger双方ぞの圱響を考慮しなければなりたせんでした。こうした積み重ねで行数は再び1000行を超えるたでに膚らんでしたっおいたした。 特に問題だったのは、UICollectionViewぞのデヌタ構築ず商品抌䞋時のログデヌタ䜜成が混圚する500行匱の巚倧なメ゜ッドです。どこを觊れば䜕が倉わるのか把握するだけで倧きなコストがかかる状態でした。 高い改修頻床 ZOZOTOWNのホヌム画面は平均月1ペヌスで改修案件が入り、倚い時期には3案件が同時䞊行で走るこずもありたす。 このリアヌキテクチャが開始しおから珟圚たででも、ホヌム画面のモゞュヌルを無限スクロヌルできる機胜や、モゞュヌル内のアむテムで動画を衚瀺する機胜など、芏暡の倧きな案件がリリヌスされおいたす。 圱響範囲の把握が困難なFat ViewControllerは、改修のたびにリスクを䌎い、チヌムの開発速床を䞋げる原因になっおいたした。 リファクタリングの蚭蚈方針 課題は明確でしたが、1000行超のVCを䞀気に曞き換えるのはリスクが高すぎたす。そこで以䞋の方針を立おたした。 なお、このリファクタリングは通垞の機胜開発ず䞊行しお進めおおり、皌働の玄2割をこの取り組みに充おながら進めおいたした。1幎半ずいう期間はそのためです。 方針1: 圱響範囲を最小化しながら段階的に進める 各ステップの圱響範囲を小さく保぀こずで、問題発生時の修正コストを抑えられ、PRの倉曎量も少なくなりレビュヌの負担を枛らせたす。たた各ステップを独立しおリリヌス可胜な単䜍ずするこずで、他案件の進行をブロックしたせん。 以䞊のメリットを意識しながら以䞋のステップで進める蚈画を立おたした圓初は4ステップ、結果ずしお5ステップになりたした。 ステップ 内容 Step1 Objective-Cレガシヌ型ぞの䟝存を剥がす Step2 最も独立性の高いAPIを察象に、ViewModel/UseCaseを郚分導入する Step3 MallHomeViewController党䜓にViewModel/UseCaseを導入する Step3-ex Step3完了埌にバグが発芚し、呜名敎理ずナニットテストを远加 Step4 HomeViewControllerにViewModel/UseCaseを導入する  ステップを蚭蚈する䞊でのポむントを3点玹介したす。 Step1を最初に行った理由 MallHomeViewController にはObjective-Cのレガシヌな型ぞの䟝存がありたした。MVVM化を先に進めるず、ViewModel/UseCaseはObjCの型を扱う蚭蚈になりたす。その埌ObjC䟝存を陀去するず、ViewModel/UseCaseの蚭蚈倉曎も必芁になり手戻りが発生したす。そのため、MVVM化の前段階ずしお䟝存の陀去を最初のステップずしたした。 MallHomeViewControllerから先に着手した理由 タブの䞭身を管理しおいる MallHomeViewController は、着手開始から間もなく埌続案件の改修が入る予定でした。そのため、それより前にMVVM化を完遂させるこずを優先したした。 Step2ずStep3を分けた理由 ホヌム画面では耇数のAPIを呌び出しおおり、最初から党APIを察象ずするずMVVM化の圱響範囲が倧きくなりすぎたす。たず独立性の高い䞀郚のAPIに絞っおViewModel/UseCaseを導入するこずで、アヌキテクチャの党䜓像を小さな倉曎で確認でき、問題が発生した際の修正コストも抑えられたす。 方針2: 段階的に責務を分離する UseCase → ViewModel → ViewControllerの順で責務を分離しおいき、最終的に以䞋の構成を目指したした。圓時のアヌキテクチャガむドラむンではUseCaseの採甚が定められおいたした。たたAPIリク゚スト・ログ送信・ビゞネスロゞックが耇合的に絡むホヌム画面の芏暡感においおも、ViewModelの肥倧化を防ぐうえで適切な蚭蚈刀断でした。 ここで玹介しおいる倧たかな党䜓方針は、以前チヌムメンバヌの なんしヌ さんが行った 商品詳现画面のリアヌキテクチャにおける進め方 を参考にしおいたす。 Step1: Objective-Cレガシヌ型ぞの䟝存を剥がす MallHomeViewController では、商品情報を衚瀺する郚分がObjective-Cで曞かれたレガシヌな型に䟝存しおおり、APIレスポンスからレガシヌな型ぞ倉換する䞍芁な䟝存がありたした。そのため、最初のステップはMVVM化でなく 䞍芁な䟝存の陀去 から始めたした。 以䞋の3段階で䟝存を剥がしたした。 商品の情報衚瀺においお必芁な情報を持぀UIModelを䜜成 APIレスポンスをそのUIModelに倉換するTranslatorを䜜成 Translatorは倖郚APIのレスポンス型をUIModelの型に倉換する責務を持぀ 倖郚APIの型定矩が倉曎されおもViewModelやVCぞ盎接圱響しない構造になる レガシヌな型を䜿わない新しいセルを実装し、移行 最終的に MallHomeViewController からObjective-Cレガシヌ型ぞの䟝存を完党に陀去したした。 Step2: 最も独立性の高いAPIを察象に、ViewModel/UseCaseを郚分導入する Step1でクリヌンな基盀ができたため、いよいよMVVM化に着手したす。蚭蚈蚈画で「最も独立性が高い」ず刀断した 䞖代別ランキングモゞュヌル から始めたした。 䞖代別ランキングモゞュヌルずは、ナヌザヌが䞖代~10代、20代などを遞択するず、その䞖代の人気アむテムがランキング圢匏で衚瀺されるモゞュヌルです。 ヘッダヌの䞖代遞択ボタンをタップしお切り替えるず、察応するランキングが再取埗・再衚瀺されたす。 以䞋の特城があったため、ホヌム画面のMVVM化における最初のステップずしお工数がかからず、アヌキテクチャの党䜓像を実装しながら理解できる最適な題材ず刀断し、着手したした。 䞖代別ランキング専甚の独立したAPIを持぀ ナヌザヌが䞖代を遞択したずきだけ曎新される 他のモゞュヌルの曎新ず独立しお動䜜する 小さく始めるこずの重芁性 Step2は党郚で7぀のPRを䜜成したした。UseCase䜜成→UIModel䜜成→ViewModel䜜成→ViewControllerからUseCase/ViewModelぞ凊理を移動する流れで修正を加えおいきたした。 巚倧なViewControllerを䞀気に曞き換えようずするず、倉曎が倧きくなりすぎおレビュヌが困難になり、バグ混入リスクも高たりたす。Step2でOpenした7぀のPRのほずんどが100行未満のコヌド远加に収たっおおり、レビュヌでの指摘もほずんどなくスムヌズにマヌゞできたした。 たた、Step2を通しお PRの分割方法 や 倉曎を加えるレむダヌの順番 が明確になり、次のステップであるモゞュヌル曎新党䜓のリアヌキテクチャぞの自信が぀きたした。倧芏暡なリファクタリングに着手する際は、最も独立性の高い郚分から始めるこずで、レビュヌでの問題怜知やバグ混入の防止に盎結したす。最初の小さなステップを通じおPRの分割方法や倉曎を加えるレむダヌの順番を把握しおおくず、埌続の倧きなステップをより自信を持っお進められたす。 Step3: MallHomeViewController党䜓にViewModel/UseCaseを導入する ホヌム画面では、䞖代別ランキングモゞュヌルの取埗API以倖に合蚈4぀のAPIを䞊行しお呌び出しおいたす。Step3ではそれらの䞻芁APIを呌び出しおいる郚分すべおにViewModel/UseCaseを導入したした。Step3はStep2のようにスムヌズには行かず、いく぀かの問題に盎面したした。代衚的な問題を玹介したす。 問題1. Swift Concurrencyぞの移行 圓時の MallHomeViewController では、䞀郚分のAPI呌び出しに BrightFutures を䜿っおいたした。このラむブラリは2022幎にEOLずなっおおり、チヌム内でも新芏実装では非掚奚ずしおいたため、このタむミングでSwift Concurrencyぞ移行したした。 Swift Concurrency察応に関しおもこのずきが初めおの経隓で、その䞭で色々ず孊びがありたした。 䞊行凊理によるビュヌ衚瀺時の衚瀺順担保 クロヌゞャベヌスのコヌドでは、耇数のモゞュヌル取埗APIを盎列で呌び出しおおり、すべおのレスポンスが揃っおから䞀括で描画しおいたした。Swift Concurrencyぞ移行しお䞊行呌び出しにしたこずで、どのAPIレスポンスが先に返っおくるかが䞍定になりたす。レスポンスを受け取った順にUIModelを積んでいく実装のたたでは衚瀺順が倉わっおしたいたすが、実装圓初はこの問題に気づいおいたせんでした。 UIModelの配列に垞に決たった順序で栌玍する実装に修正するこずで解決したした。すべおのAPIレスポンスが揃っおから正しい順序でたずめお描画するずいう基本的な流れは倉わらず、䞊行取埗による速床改善ず衚瀺順の保蚌を䞡立しおいたす。 withCheckedThrowingContinuation にキャンセルが䌝播しなかった 特定のAPI呌び出しにはタむムアりト凊理が必芁でした。 withThrowingTaskGroup を䜿い、 デヌタ取埗タスク ず 䞀定時間埌にタむムアりト゚ラヌを投げるタスク を䞊走させたした。どちらかが完了したら group.cancelAll() でもう䞀方をキャンセルする実装を採甚しおいたした。 しかし実際にはキャンセルが正しく機胜しおいたせんでした。通信が切断された状態でリロヌドを繰り返すず、タむムアりトが発生しお group.cancelAll() が呌び出されおいるにもかかわらず、ロヌディングが氞遠に続く䞍具合が発生しおいたした。 原因は、コヌルバック型のサヌドパヌティSDKを withCheckedThrowingContinuation でブリッゞしおいた郚分にありたした。このSDKは通信切断時にコヌルバックを呌び出さない堎合がありたす。タスクグルヌプのキャンセルは withCheckedThrowingContinuation 内には自動で䌝播したせん。コヌルバックが呌ばれない限り、continuationは解決されないたたずなりたす。 // 修正前: キャンセルが continuation に䌝播しない func fetchData () async throws -> Response { try await withCheckedThrowingContinuation { continuation in legacySDK.fetch { result in // 通信切断時はここが呌ばれない堎合がある // group.cancelAll() されおも continuation は resolve されないたた continuation.resume(with : result ) } } } // 修正埌: withTaskCancellationHandler を远加し、キャンセル時に continuation を resolve する func fetchData () async throws -> Response { let holder = ContinuationHolder() return try await withTaskCancellationHandler { try await withCheckedThrowingContinuation { continuation in holder.continuation = continuation legacySDK.fetch { result in holder.continuation?.resume(with : result ) } } } onCancel : { // タスクがキャンセルされたずき、onCancel で゚ラヌを投げお continuation を解決する holder.continuation?.resume(throwing : APIError.cancelled ) } } 察応方法は withTaskCancellationHandler を远加するこずでした。タスクがキャンセルされるず onCancel クロヌゞャが呌ばれ、そこでcontinuationに゚ラヌを投げるこずで、コヌルバックが返っおこない状態でもタスクを終了できたす。continuationぞの参照を class で保持しおいるのは、 onCancel クロヌゞャが別コンテキストで実行されるためです。 var ではSwift Concurrencyの譊告が出たす。 withCheckedThrowingContinuation はコヌルバック型APIを async/await に倉換する手段ずしお有効ですが、タスクキャンセルは自動では䌝播したせん。キャンセルに察応させるには withTaskCancellationHandler ず組み合わせお、 onCancel 時に明瀺的にcontinuationを解決する必芁がありたす。 問題2. モゞュヌル構築メ゜ッドの敎理 Step3の終盀では、ViewControllerに眮かれおいた500行匱の巚倧なモゞュヌル構築メ゜ッドを敎理したした。 このメ゜ッドには2぀の責務が混圚しおいたした。 UICollectionViewに衚瀺するデヌタ゜ヌスの䜜成VC偎の責務 商品抌䞋時のログ送信に必芁なモゞュヌル内䜍眮情報の蚈算VM偎の責務 埌者をViewModelぞ移動し、各モゞュヌルの同䞀性比范を可胜な構造ずするこずで、䜍眮情報を適切に取埗できるようにしたした。 やるこず自䜓は䞀文で曞けるようにずおもシンプルなものです。実装圓時の自分の認識も同様で、この敎理に関しおはスムヌズに進み、そのたたStep3をリリヌスしたした。 しかし、ここで今回のリアヌキテクチャにおける最倧の壁にぶ぀かっおしたいたす。 Step3完了埌にログに関するバグが発芚 Step3のリリヌス埌、モゞュヌルを管理しおいるチヌムから「カルヌセルバナヌのタップログで、バナヌの䜍眮が正垞に送られおいない」ずいう問い合わせが届きたした。 調査の結果、カルヌセルバナヌのタップ時のログに含たれる「バナヌの䜍眮」ずしお、 ホヌム画面党䜓におけるセクションの衚瀺䜍眮 を誀っお送信しおいたこずが刀明したした。本来送るべき倀は カルヌセル内のバナヌの䜍眮䜕枚目のバナヌか でした。 バグを匕き起こした原因 モゞュヌル/セクション/むンデックスなどの䜍眮に関する呜名の曖昧さ ホヌム画面は耇数のコンテンツを瞊に䞊べた構成です。「画面䞊の衚瀺順セクション䜍眮」ず「各コンテンツ内の䜍眮むンデックス」ずいう2皮類の"䜍眮"が存圚したすが、コヌド䞊でこれらを区別する呜名が䞍明確でした。 APIから取埗したレスポンス名/ログ送信甚パラメヌタヌ名/内郚で䜿甚しおいる倉数名のそれぞれの䜿い分けが曖昧なたた実装を積み重ねおおり、コヌドを読む際に混同しやすい状態でした。 ログの倀の正しさをテストで怜蚌できおいなかった 「ログが送信されるこず」は手動確認で怜蚌しおいたしたが、「送信されたログの倀の正しさ」たで怜蚌できおいたせんでした。 圓時はナニットテストが敎備されおいなかったため、コヌドレビュヌだけでは防ぎきれたせんでした。ナニットテストがあれば、このバグはリリヌス前に怜知できたはずです。 これらを怜知できなかった背景ずしお、Swift Concurrency察応での想定倖の工数による焊りず、ログの重芁床を甘く芋積もっおいたこずが挙げられたす。 Step3の終盀のPRはStep2ずは打っお倉わっお500行を超える倧きなPRになっおしたい、レビュアにも倧きな負担をかけおしたいたした。「小さく分割しお進める」ずいう圓初の方針を貫けなかった点も反省の1぀です。 Step3-ex: 呜名敎理ずナニットテストの远加 バグを迅速に修正した埌、Step3の延長ずしお呜名の敎理ずナニットテストを远加したした。 呜名の敎理 Step3でのバグ原因の1぀が「ログ送信コヌドの読みにくさ」にあったため、たず呜名を敎理しおからテストを曞くずいう順序を遞びたした。 モゞュヌル・セクション呜名の統䞀 UICollectionView䞊の抂念の呌び方ず倉数の型を敎理し、「モゞュヌル」ず「セクション」の䜿い分けルヌルを明確にしたした。 ログ送信の䜍眮情報に関する呜名統䞀 セクションの衚瀺䜍眮ずセクション内の商品䜍眮を衚す倉数名を、それぞれ明確に区別できる名前に統䞀したした。 ナニットテストの远加 バグを匕き起こしおしたったログ送信時のセクション䜍眮に関するテストをはじめずしお、モゞュヌルの取埗、性別倉曎、画面遷移、ラむフサむクルむベントなど倚数のシナリオをカバヌしたした。Step2, Step3でUseCaseをプロトコルでDIできる構造になっおいたため、Mockを䜿ったテストが曞けるようになっおいたす。 ナニットテストを新芏で曞いおいくのも初めおの経隓だったため、テストに関する知識が豊富なチヌムメンバヌにモブレビュヌを行っおもらいたした。 呜名敎理ずテスト远加を終えた時点で、MallHomeViewModelのテストカバレッゞは38から99に向䞊したした。 䞍確かさに気づいた時点でテストを曞く Step3では「アヌキテクチャを敎備しおからテストを曞けばいい」ずいう考えからバグを匕き起こしおしたい、その考えの危うさを実感したした。バグや䞍確かさに気づいたタむミングでテストを曞くこずで、結果的に次のステップを安心しお進める力になりたす。 Step4: HomeViewControllerにViewModel/UseCaseを導入する 最終ステップのStep4ではホヌム画面党䜓を管理しおいる HomeViewController のリアヌキテクチャを行いたした。このステップでは、Step3たでの倱敗ず孊びを掻かしお TDDテスト駆動開発 を採甚したした。たた、Step3でのPR分割の粒床ミスを螏たえ、レビュヌしやすい粒床でPRを䜜成しレビュアぞの負担も考慮したPR戊略を取りたした。 TDDによる蚭蚈の共有 Step4で特筆すべきは、 UseCase/ViewModelのテストケヌスをProtocol/実装より先に䜜成した こずです。UseCase/ViewModelのテスト雛圢䜜成 → テストケヌスの䜜成 → UseCase/ViewModelずProtocolの䜜成 → 実装、ずいう順番で進めたした。 このTDDアプロヌチが特に嚁力を発揮したのが、 ログ送信呚りの仕様敎理 でした。 HomeViewController のログ送信ロゞックは耇雑で、起動経路通垞起動・プッシュ通知・Deeplinkやタブ切り替えに応じおどのログをどのタむミングで送るかが倉わりたす。たた、同じ画面遷移でも耇数のラむフサむクルむベントが連続しお発火するため、ログの二重送信を防止する制埡も必芁です。このような仕様では実装者ごずに解釈が分かれやすく、Step3ず同じ蜍を螏む可胜性もありたした。 そこで実装に先立ち、起動経路ごずのログ送信フロヌをドキュメントずしお敎理し、 チヌムで仕様を合意した䞊でテストケヌスを蚭蚈する ずいうプロセスを螏みたした。ドキュメントには どの動線でどのログが䜕回送られるべきか を網矅的に蚘述し、それをそのたたテストの仕様ずしお共有したした。 テスト蚭蚈においお重芁な方針ずしお、 内郚のフラグ状態ではなくナヌザヌの動線単䜍でテストを蚘述する こずを採甚したした。䟋えば以䞋のようなシナリオをそのたたテスト名ずしお蚘述しおいたす。 通垞のアプリ起動でホヌム画面を衚瀺したずき、ログが1床だけ送信されるこず プッシュ通知でアプリを起動したずき、特定のログは送信しないこず Deeplinkでホヌム画面に遷移したずき、viewWillAppearでのログ送信はスキップするこず 「どの動線で䜕が起きるべきか」ずいう圢でテストを曞くこずで、テストが仕様曞ずしお機胜するようになりたす。内郚実装がリファクタリングで倉わっおも、動線ベヌスのテストはそのたた維持できるため、保守性も高たりたした。 テストを先に曞くこずで、「このUseCaseは䜕をすべきか」をチヌムで議論しながら蚭蚈を進めるこずができたした。Step3でロゞックの挏れがバグに぀ながったずいう反省が、ここで掻きおいたす。 オンボヌディング呚りの状態管理 HomeViewController は オンボヌディング 初回起動時の案内フロヌ呚りの状態管理も耇雑です。 リファクタリング前の課題 初めおZOZOTOWNアプリをむンストヌルしたナヌザヌは、ホヌム画面が衚瀺されるたでに耇数の案内画面を経由したす。 問題は、この䞀連のフロヌを管理するために 5぀以䞊のBoolフラグ が耇数のファむルにたたがっお散圚しおいたこずでした。䟋えば「ログむン画面の衚瀺が完了したか」「プッシュ通知蚱諟を衚瀺したか」「蚎求バナヌの衚瀺が必芁か」ずいったフラグが各所に分散しおいたした。それらを組み合わせた条件分岐によっお次の衚瀺内容が決たる構造になっおいたした。これにより、「今どのフラグがどの状態のずき䜕が起きるのか」を把握するだけでもかなりのコストがかかっおいたした。 このような耇雑さが原因の1぀ずなり、オンボヌディングに関する䞍具合が発生したこずもありたした。 ステヌトマシンによる再蚭蚈 Step4ではこのオンボヌディングフロヌをステヌトマシンずしお再蚭蚈したした。 オンボヌディングは以䞋の4぀の状態Stateず、それぞれを遷移させるむベントEventによっおモデル化されたす。 ViewModelはこの状態を賌読し、状態に応じおどの画面を衚瀺するかを宣蚀的に蚘述したす。 この蚭蚈により、「珟圚のフロヌのどこにいるか」が状態ずしお䞀点に集玄され、遷移のトリガヌずなるむベントも明瀺的になりたした。それたでのフラグの組み合わせによる暗黙的な状態管理から脱华し、コヌドを読むだけでオンボヌディングフロヌの党䜓像が把握できるようになりたした。 たた、「どのむベントでどの状態に遷移するか」をテストで盎接怜蚌できるようになりたした。将来的にオンボヌディングのステップが远加・倉曎されおも、状態遷移の定矩を修正するだけで察応できたす。 こうしお、玄1幎5か月にわたるホヌム画面リアヌキテクチャが完了したした。Step4に関しおは、ホヌム画面に起因する障害や問い合わせは発生したせんでした。 Step3で䜓隓したバグず、その埌段階的に敎備したテストが、実際の品質保蚌ずしお機胜しおいる結果だず感じおいたす。 ホヌム画面リアヌキテクチャ完了埌、埌続案件でホヌム画面を觊った他のメンバヌから「実装が楜になった」ずいうフィヌドバックをもらいたした。これは、責務が適切に分割されたこずで改修の圱響範囲が把握しやすくなったこずを瀺しおいたす。 たた、ログ呚りの修正が入ったずきも「テストで挙動が担保できるようになった」ずいう声がありたした。Step3で䜓隓したバグに察しお、Step3-ex以降で構築したテストが実際に機胜しおいる瞬間でした。 長期リファクタリングを進める䞊でのポむント 今回のリアヌキテクチャを通しおの孊びやポむントは各ステップで玹介したしたが、党䜓を通じお特に重芁だず感じた点ずしお、 蚭蚈ドキュメントの継続的な敎備 を挙げたす。 蚭蚈蚈画段階的なステップ蚈画、むンタフェヌス蚭蚈を文曞化しおおくこずは、長期にわたるプロゞェクトをチヌムで共有する土台になりたす。「なぜこの蚭蚈にしたか」が残っおいるこずで、埌続のステップでも䞀貫した刀断ができたす。たた、AIを掻甚したコヌディングが䞀般的になった珟圚では、蚭蚈方針が文曞化されおいるこずはより䞀局重芁です。AIぞの指瀺の粟床が䞊がるだけでなく、生成されたコヌドがプロゞェクトの蚭蚈意図ず䞀臎しおいるかの怜蚌にも圹立ちたす。 おわりに このリアヌキテクチャを振り返るず、最初は「アヌキテクチャに぀いおの理解を深めたい」ずいう動機から始たりたした。しかし実際には、「テストの重芁性」「段階的な倉曎の䟡倀」「倱敗を次に掻かすこず」ずいう、より本質的なこずを孊んだプロゞェクトになりたした。 特に、Step3埌のバグ発芚→Step3-exのテスト远加→Step4でのTDD採甚でバグ0を達成できたこずは、自分の成長を匷く実感できたポむントでした。 ZOZOTOWN iOSアプリのリアヌキテクチャはただ続いおいたす。このホヌム画面での経隓をチヌムの資産ずしお積み䞊げながら、より良いアプリを䜜り続けおいきたいず思いたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
こんにちは。゚ンタヌプラむズ第䞀本郚 戊略゜リュヌション 1 郚の英です。 普段はWebアプリやスマホアプリの案件などを担圓しおいたす。あず、趣味でAIを勉匷しおいたす。 䞖間ではClaude Codeが幅を利かせるなか、なぜかCodexにこだわり続けおいる私。 そろそろ流行りに乗らねばず思い、今回はClaude Codeの蚘事を曞いおみたす。 しかも、巷ではsuperpowersなんおものが話題になっおいるらしいじゃないですか。 ゚ンゞニアの英知を結集したAI駆動開発のベストプラクティス、superpowers。 これがあれば、Claude Code初心者の私でもプロ䞊みの開発ができるはずです。 この蚘事を曞き終わっおいるころには、きっずCodex掟からClaude掟に寝返っおいるでしょう。 では、さっそくやっおいきたしょう。 1.Claude Codeずは 2.superpowersずは 3.Claude Codeの初期セットアップ 4.superpowersのむンストヌル 5.superpowers-brainstorming 6.superpowers-using-git-worktrees 7.superpowers-writing-plans 8.superpowers-subagent-driven-development or executing-plans 9.superpowers-test-driven-development 10.superpowers-requesting-code-review 11.superpowers-finishing-a-development-branch 12. 動䜜確認 Plan2に぀いお さいごに Codexずの比范 開発効率ずコスト 採甚情報 1.Claude Codeずは Claude Codeは、Anthropic瀟が提䟛しおいるAIコヌディング゚ヌゞェント。 タヌミナル䞊で動䜜し、コヌドの生成・修正・調査・テスト実行などを察話圢匏で進めるこずができる。 「AIにコヌドを曞いおもらう」だけでなく、開発䜜業そのものを䞀緒に進めるこずができるツヌル。 2.superpowersずは superpowersは、Claude Codeをよりうたく掻甚するためのワヌクフロヌ集。 ブレスト、蚈画䜜成、TDD、コヌドレビュヌ䟝頌など、開発の各フェヌズで䜿える“型”が甚意されおいる。 Claude Codeに任せきりにするのではなく、人間ずAIがうたく圹割分担するためのベストプラクティス集。 これにより、Vibe CodingやSpec駆動開発の品質の底䞊げが期埅できる。 参考 superpowers ※MITラむセンス superpowersは以䞋のワヌクフロヌで構成されおいたす。 芁件を敎理する 䜜業環境を分ける 実装蚈画を立おる テストを曞きながら実装する(TDD) レビュヌする ブランチを仕䞊げる たず、 brainstorming で実装したい内容を敎理したす。 いきなりコヌドを曞き始めるのではなく、Claude Codeが質問をしながら、目的・仕様・代替案・懞念点を明確にしたす。 ここで固めた内容が、埌続の蚭蚈や実装蚈画の土台になりたす。 次に、 using-git-worktrees で䜜業甚の独立した環境を䜜成したす。 新しいブランチずworktreeを甚意するこずで、既存の䜜業環境を壊さずに実装を進められたす。 AIに実装を任せるうえで、安党に詊行錯誀できる状態を䜜る工皋です。 その埌、 writing-plans で実装蚈画を䜜成したす。 倉曎するファむル、実装手順、怜蚌方法を小さなタスクに分解したす。 READMEでは、プロゞェクト理解が浅いゞュニア゚ンゞニアでも進められるくらい明確な蚈画を䜜る、ず説明されおいたす。 After you've signed off on the design, your agent puts together an implementation plan that's clear enough for an enthusiastic junior engineer with poor taste 蚈画ができたら、 subagent-driven-development たたは executing-plans で実装を進めたす。 前者はタスクごずにサブ゚ヌゞェントを割り圓お、仕様準拠ずコヌド品質を確認しながら進める方匏です。 埌者は蚈画に沿っおバッチ単䜍で実行し、人間の確認ポむントを挟みながら進める方匏です。 実装䞭は、 test-driven-development によっおTDDの流れが重芖されたす。 テストを先に曞く、ただプロダクトコヌドがないのでテストが倱敗する、テストがグリヌン(正垞に通過)するように実装を远加しおいくずいうRED-GREEN-REFACTORの流れです。 期埅する振る舞いを先に定矩するこずで、AIが「それっぜく動くコヌド」を曞いお終わるのではなく、テストで確認可胜な圢で実装を進められたす。 タスクの合間には、 requesting-code-review でコヌドレビュヌを行いたす。 実装が蚈画に沿っおいるか、バグや蚭蚈䞊の問題がないかを確認したす。 重倧な問題がある堎合は、次に進む前に修正する流れになりたす。 最埌に、 finishing-a-development-branch で開発ブランチを仕䞊げたす。 テスト結果を確認し、マヌゞするのか、Pull Requestを䜜るのか、ブランチを残すのか、砎棄するのかを遞択したす。 䞍芁になったworktreeの片付けたで含めお、開発䜜業を完了させたす。 ぀たりsuperpowersは、 「考える → 分ける → 蚈画する → テストする → 実装する → レビュヌする → 仕䞊げる」 ずいう 堅実な開発プロセスをAI゚ヌゞェントに守らせるための仕組み です。 READMEにも “The agent checks for relevant skills before any task. Mandatory workflows, not suggestions.” ずあるように、匷制力を持ったワヌクフロヌずしお蚭蚈されおいたす。 3.Claude Codeの初期セットアップ 瀟内でClaude Enterpriseのラむセンスを貰ったばかりでたっさらな状態。 ずりあえず挚拶しおトヌクンを無駄遣いしおおきたす。 VSCodeにClaude Codeの拡匵機胜を入れたす。 ちなみに、CodexずClaude Codeのむンストヌル数ずレビュヌはこんな感じ。 Claude Codeのほうがシェアも評䟡も高い珟状。 むンストヌルが完了するず、ログむン方法を問われたす。 先ほどのClaude Enterpriseのアカりントでログむンしたす。 接続確認が衚瀺されるので、「承認する」を抌䞋したす。 認蚌コヌドが吐かれたので、VSCodeに戻っお貌り付けたす。 通りたした。䜕やら可愛らしいキャラクタヌが浮かんでいたす。 挚拶しお無駄にトヌクンを消費しおおきたしょう。 ちなみに圌は䜕ずいう名前なんだろうず調べおみたずころ、「Clawd(クロヌド)」ずいうそうです。 Crab(蟹)のキャラクタヌか。かわいいですね。よろしくね、Clawd。 次はタヌミナルで䜿うためのむンストヌル。 Pathを通し、むンストヌル確認。 さあ、初めおの起動だ。 タヌミナルの色合いを遞択したす。(Dark mode) ログむン方法を遞択したす。 認蚌に成功したした。 読み飛ばす人も倚いかもしれたせんが、ここにずっおも倧事なこずが曞いおありたす。 そんなmistakesを極力枛らすのがこれから玹介するsuperpowersですね。 今回は初めおの利甚なので、掚奚蚭定を遞択したす。 カレントディレクトリに察する暩限を聞かれおたす。ここは自由に操䜜しおいいのでYesを遞択したす。 セットアップが完了したした。 4.superpowersのむンストヌル 公匏のマヌケットプレむスからむンストヌルしたす。 このrepoだけでのむンストヌルを遞択したす。 superpowersを手に入れたした。 有効化したす。 5.superpowers-brainstorming さお、準備が敎ったのでAIずブレストしおみたす。 superpowers「䜕に぀いお議論したいんだい」 日本語もいけるのだろうか ただのToDoアプリじゃ぀たらないので、組織向けのタスク管理ツヌルをテヌマにしおみたす。 日本語で返っおきたした。 なるほど、モックを芋ながら方針を決めおいく方法があるそうです。せっかくなので䜿っおみたす。 brainstorming のスキルが読みたいず蚀っおいるので蚱可したす。 ブレストが始たりたした。 䞭芏暡を遞択したす。 ToDoタスクの振り方、ナヌスケヌスを問われおいたす。党郚必芁そうなので、そのように回答したす。 あずでClaude Codeが教えおくれるのですが、「䞀斉12人」は「䞀察倚」の誀字ずのこず。 タスクのリマむンド方法ですが、自動を遞択しおみたす。 通知方法はサヌビス内にしたしょう。 認蚌はサヌビス独自を遞択したす。 デプロむ先はAWSを想定しおいるのでクラりドを遞択したす。 タスクの進捗確認をできる人ですが、耇数遞択可ずのこずで3぀遞択しおみたす。 スコヌプが広すぎるようで、MVPを聞かれおいたす。 たあいったん䞀斉送信の実装から入っおほしいですね。 ※MVPMinimum Viable Product これは絶察に聞かれるず思っおいたした。完了の定矩です。 ここはサヌビス䞊で「察応枈み」を抌させる仕組みで良いでしょう。 蚭蚈の確認が始たりたした。 デモアプリでMulti-AZはリッチすぎたすが、プロダクト開発に䜿えるか評䟡したいので、リッチな構成でいきたしょう。 「違和感ないです。」ず回答したす。 次はデヌタモデルです。 Assignmentずいう䞭間テヌブルで人ずタスクを玐づけおいたすね。そしおここでステヌタス管理もしおいたす。 Notificationで通知レコヌドを管理する構成になっおいたす。良いず思いたす。 リマむンドは耇数回発生する可胜性があるため、このテヌブルで管理したす。 良い蚭蚈ですね。自分で蚭蚈するにしおもこうするず思いたす。 兌務ずかあるずややこしくなりたすが、今回はシンプル構成でいきたしょう。 次はナヌスケヌスのレビュヌです。 ちょっず、初期開発では䞍芁な郚分があるので省略を䟝頌したす。 次は認蚌・認可呚りの確認です。 ここの実装を削りたいので指瀺したす。 次ぱラヌハンドリング呚りの確認。 次はテスト戊略です。 初期開発ずしおは十分すぎる蚈画だず思いたす。 ここたでの内容を蚭蚈曞にたずめおくれるようです。 蚭蚈曞の䜜成が始たりたした。 6.superpowers-using-git-worktrees ロヌカルにgitを入れおもらい、writing-plansに匕き継ぎたす。 7.superpowers-writing-plans 匕継ぎが終わりたした。 今回はPlan1ずPlan2に分かれ、Plan1でMVPを開発し、Plan2の方でデプロむ呚りを蚈画しおいるようです。 ちなみに、ここたでの䜜業をccusageで確認。玄$7でした。 $7か...個人利甚だず厳しいな...。 8.superpowers-subagent-driven-development or executing-plans 次はこの蚈画を実行に移しおもらいたす。 進め方は1぀の゚ヌゞェントで逐次実行するか、サブ゚ヌゞェントを駆䜿しおパラレルに開発するかが遞べたす。 今回はフルパワヌが芋たいので、サブ゚ヌゞェントを遞択したす。 サブ゚ヌゞェントのスキルが読み蟌たれたした。 9.superpowers-test-driven-development こっから、基本的にはYesを叩く䜜業になるのでスクショは䞀郚割愛したす。 (AI゚ヌゞェントに蚱可する暩限を確認し぀぀) Task 0.1が完了したした。ここたで30分くらい。 業務PCにdockerが未むンストヌルだったため、ここで人間偎にボヌルが枡っおきたした。 ご䞁寧に手順たで蚘茉しおくれおいるので、察応しおAI゚ヌゞェントにボヌルを戻したす。 むンストヌルが完了したので、続きを䟝頌したす。 wslのバヌゞョンが叀くおDockerが起動できずに人間に返っおきたので、察応しお続きを䟝頌したす。 ロヌカルでPostgres起動、接続確認たできたした。ここたで40分くらいでしょうか。 TDD甚の環境セットアップが始たりたした。 環境のセットアップが終わったので、ここからサブ゚ヌゞェントを駆䜿しおコヌディング郚分を進めおもらいたす。 サブ゚ヌゞェントでの開発に関するスキルが読み蟌たれたした。 パスワヌド認蚌郚分の仮実装が終わったようです。 TDDでテストコヌド→プロダクトコヌドの順番でコヌディングが進んでいるこずがファむルからもわかりたす。 テストコヌドにはハッシュ化、パスの怜蚌の正垞系、異垞系が曞かれおたす。 ちょっずテストが少ない気もしたすが、あずで䌏線回収するのでスルヌしおください。 10.superpowers-requesting-code-review 郚品の開発のたびに、コヌドレビュヌを呌んでいたすね。 画像の䞭倮付近にテスト品質に関する蚘茉がありたす。 先ほどのテストケヌスはこの芳点に通過する品質になっおいるこずがわかりたす。 Test quality — Does the test verify behavior (not implementation)? Does it cover both happy path and one negative case (wrong password)? Does it avoid mocking the thing being tested? 次は暩限郚分のTDDが始たりたした。 先に今回の3぀の暩限でのテストケヌスを䜜成しおいるこずがわかりたす。 倱敗テストの䜜成、倱敗確認、実装、成功確認ずいうRED-GREENのサむクルを繰り返しお開発が進んでいきたす。 コヌドレビュヌで、prisma偎の暩限ずアプリ内での暩限で重耇管理になるから、この曞き方はやめおほしいずレビュヌで指摘を受けおたすね。 そのむシュヌをもずに実装者が修正に入っおたす。 なんだか、チヌム開発っぜくなっおきたしたね。 11.superpowers-finishing-a-development-branch Plan1のPhase1が終わったタむミングで、finishing-a-development-branchのスキルを読たせたした。 マむグレヌションテストを通しおくれたした。 12. 動䜜確認 動䜜確認方法を聞いお、その通りに起動したす。 ログむン画面が開いたのでログむンしおみたす。 ログむンできたした。 ただ最小限の機胜しかないので、匕き続き開発を続けたす。 党䜓でPhase7のうち、ただPhase1の状態です。 Phase2はタスク䜜成呚り。 1時間かからないくらいで、Phase2が完了。 Phase3は通知呚りの実装。 Phase4はリマむンダヌ呚りの実装。 Phase5はダッシュボヌド呚りの実装。 Phase6はE2Eテストの環境構築。 E2Eを実行したずころ、1ä»¶passしお、2ä»¶failedになりたした。 結果をコピペしお、Claude Codeに返したす。 2ä»¶passしお、1ä»¶failedになっおいたした。 再床、゚ラヌログをClaude Codeに連携しお修正を䟝頌したした。 再実行したろころE2Eにすべお合栌したした。 ちなみに、E2Eの1぀目の䞭身はこんな感じです。 「䟝頌䜜成 → 担圓者が察応枈みにする → 䟝頌者が進捗を確認する」䞀連の業務フロヌをブラりザ䞊で確認するテストになっおいたす。 2぀目はこんな感じ。 郚眲管理者向けダッシュボヌドのE2Eテストです。 「DBを初期化→ナヌザヌを䜜成→タスクを盎接DBに䜜成→2人分の割り圓おを䜜成→郚眲管理者でログむン→ダッシュボヌドを開く→衚瀺を怜蚌(棚卞、1/2 が芋えるこず)」ずいう流れになっおいたす。 3぀目はこんな感じ。 リマむンダヌ機胜のE2Eテストです。 「DBを初期化→ナヌザヌを䜜成→タスクを盎接DBに䜜成→担圓者ぞの割り圓おを䜜成→リマむンダヌAPIを実行→担圓者でログむン→通知画面を確認」ずいう流れになっおいたす。 E2Eに通過したこずを䌝えるず、Phase7に取り掛かりたした。 数時間埌、Plan1がすべお完了したした。 ちなみに、ここたでかかったコストは玄$98(≒1侇5千円)でした。 Plan2に぀いお AWSぞのデプロむはCodexでも容易にできるので、今回の蚘事では割愛させおいただきたす。 そのあたりの暩限移譲呚りに぀いおは 過去の蚘事 を参照しおください。 さいごに Codexずの比范 Codexず比べお蚈画立おお自埋的に走る胜力が高い Codexず比べおコストが高い 自走しおくれるから1日圓たりの䜜業量が倚い 蚈画を立おるこずにもトヌクンを消費する サブ゚ヌゞェントを䜿うず皀にハングする ハングした際にはctrl+oで状態を確認し、ctrl+cで止めおから、再実行を䟝頌する必芁があった。 さらに、この際にsuperpowersのサむクルから倖れるこずがあった。 この堎合、以䞋のように呜什しおsuperpowersのフロヌに匷制的に戻しおもらう必芁があった。 プロンプトハングしおいるから䞀時停止したした。superpowersのスキルを確認しおTDDでの開発を継続しおください。 開発効率ずコスト ここたで玄12日間でした。(ほかの䜜業をしながら裏で動かしただけ) コストも12䞇円皋床でした。 BtoC/BtoB案件の䞀般的な開発ではプロダクトの初期開発にかなりの時間ずコストがかかりたす。(技術的に぀たるこずが倚々ある) これが倧幅に削枛できるず思うず、人力開発の時代にはもう戻れないなず感じたす。 採甚情報 先日Xで「JTCでは瀟内のAI利甚が進んでおらず働きにくい」みたいなのが話題になっおたしたが、匊瀟はこの数幎間で各皮AIツヌルのラむセンスや申請呚りがかなり敎備され、めちゃくちゃ働きやすいです。AIを䜿っお仕事したいSIの方はぜひご怜蚎ください。。 ↓ のスタヌを抌しおいただけるず嬉しいです。励みになりたす。 最埌たで読んでいただき、ありがずうございたした。 ゚ンタヌプラむズ第䞀本郚では䞀緒に働いおくださる仲間を募集䞭です。以䞋のリンクからお願いしたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 䞭途採甚-゚ンタヌプラむズ第䞀本郚 新卒採甚-゚ンタヌプラむズ第䞀本郚 執筆 英 良治 (@hanabusa.ryoji) レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 

動画

曞籍