Máte malú aplikáciu so zoznamom nákupov a potrebujete do nej dve veci: filter položiek a export zoznamu do CSV. Úlohy spolu takmer nesúvisia, a tak sa ponúka rozdeliť prácu medzi dvoch a mať obe časti hotové za pol hodiny namiesto hodiny. Jeden vykonávateľ dostane filter, druhý export, každý dostal vlastný pracovný priečinok, aby sa zmeny nemiešali. Vopred ste sa však nedohodli, ako obe časti chápu záznam zoznamu. Zdalo sa to samozrejmé.

O pol hodiny sú obe časti hotové. Ich vlastné kontroly prešli, spojenie prebehlo bez jediného konfliktu. Spoločný scenár však nefunguje: filter na obrazovke ukazuje tri riadky, no v exportovanom súbore je stĺpec prázdny. Dôvod je prostý. Jeden z vykonávateľov popri tom premenoval pole completed na done, lebo sa mu tak čítalo lepšie, a druhý o tom nevedel.

Samostatné priečinky oddelili súbory, ale rozhodnutia nezladili. Prejdime si to v troch krokoch: najprv zistíme, či má vôbec zmysel rozdeliť túto prácu, potom pridelíme oblasti zmien a dohodneme spoločné pravidlá a napokon overíme spojený výsledok, aby podobné prekvapenie nevyšlo najavo až na konci.

Skontrolujte závislosti

Prácu zvyčajne rozdeľujeme z dvoch dôvodov. Prvým je nezávislé skúmanie rôznych oblastí: súčasne zistiť, ako sa zobrazuje zoznam a ako sa vytvára export. Druhým je súbežná práca na častiach, ktorých hranice aj overiteľný výsledok už poznáme. Rozdelenie na "tu plán, tu realizácia, tu kontrola" samo osebe nevyžaduje troch účastníkov; jedna relácia to zvládne postupne. Pri malej úlohe je rozumné začať s jedným vykonávateľom.

Ak na rozdelenie dôvod máte, položte si ďalšiu otázku: ktorú časť práce B možno robiť, kým ešte nepoznáme výsledok A? Ak B úplne závisí od A, tieto kroky musia ísť za sebou. Niekedy môže B vopred pripraviť nezávislú časť, ale spojenie výsledkov aj tak musí počkať na A.

Tri situácie z toho istého príkladu so zoznamom nákupov:

Čo treba urobiťMožno začať súčasnePrečo
Zistiť, kde sa zoznam teraz filtruje, a čím sa vytvára exportánočítajú sa rôzne časti, závery od seba nezávisia
Pripraviť konečnú opravu, hoci príčina ešte nie je známapo overení príčinynajprv treba skúmať; rôzne overiteľné hypotézy možno skúmať súčasne
Napísať filter a exportpo dohode o spoločnom formáte záznamuobe časti používajú to isté pole; bez spoločnej dohody sa výsledky rozídu

Tretí riadok je najčastejšia pasca. Zdá sa, že keď filter žije v src/filter.js a export v src/export-csv.js, časti sú nezávislé, veď súbory sú rôzne. Obe však čítajú ten istý záznam a to isté pole completed. Scenár z úvodu článku zlyhal práve takto a rôzne súbory ho nezachránili. Nezávislosť sa týka správania a spoločných dohôd, nie počtu súborov s kódom.

Samotné rozdelenie môžete zveriť agentovi, ale bez spustenia vykonávateľov:

Rozdeľ úlohu na časti. Pri každej uveď vstupné údaje, výsledok,
závislosti a spôsob overenia. Označ, ktoré časti sa môžu začať hneď.
Vykonávateľov zatiaľ nespúšťaj.

Takúto odpoveď možno skontrolovať ešte pred spustením. Časti bez nevyriešených závislostí sú kandidátmi na súbežný štart. Prázdny stĺpec závislostí si radšej overte v projekte: agent si nemusel všimnúť spoločný model alebo nastavenie.

Spočítajte čas do spoločného výsledku

Zrýchlenie sa zvyčajne meria jedným číslom: koľko času zabrala samotná práca. Počítať však treba čas do prijatia spoločného výsledku. Okrem samotnej práce sem patrí zadanie pre každého vykonávateľa, opätovné čítanie projektu každým z nich, čakanie, kontrola oboch výsledkov a ich spojenie.

Orientačný výpočet pre náš príklad. Čísla sú len na výpočet, nejde o meranie výkonu:

Čo počítameJeden vykonávateľ postupneDvaja vykonávatelia súčasne
Dodatočná príprava rozdelenia: dve zadania a dohoda medzi vykonávateľmi0 minút5 minút
Realizácia20 + 20 minút20 minút na obe časti
Kontrola výsledkov a spojenie10 minút15 minút
Spolu do prijatia výsledku50 minút40 minút
Spolu, ak sa jedna časť 15 minút prerábala pre rozdielne chápanie záznamu50 minút55 minút

Spoločná príprava úlohy je potrebná v oboch variantoch, preto ju v tomto výpočte neuvádzame. Úsporu desiatich minút zmaže jediná prerábka. Čím náročnejšie je spojenie, tým viac času musí súbežná práca ušetriť.

Okrem času sú tu ešte dve položky, na ktoré sa ľahko zabudne. Každý ďalší vykonávateľ si musí projekt znovu prečítať, čo spotrebúva zdroje, a podrobné zhrnutia po návrate zaberú miesto v spoločnej konverzácii. Dôležitejšia je však druhá položka: vaša pozornosť. Dva výsledky si musíte prečítať, porovnať a rozhodnúť, čo s nimi. Ak nestíhate čítať, čo prichádza, rýchlejšia práca vám nepomôže.

Takmer dvojnásobné zrýchlenie je možné pri dvoch porovnateľných, nezávislých častiach s malou réžiou. Samotný počet vykonávateľov ho však nezaručuje.

Duplicitná práca alebo kontrola

Duplicitnú prácu v správach nevidno. Dvaja vykonávatelia potichu otvoria tie isté súbory, obaja zisťujú, ako funguje záznam zoznamu, a každý poctivo napíše, že si preštudoval kód. Niekedy je však druhý priechod zámerný: predpoklad je kritický a chcete, aby ho skontroloval niekto, kto nevidel úvahy prvého. Od náhodnej duplicity sa takáto kontrola líši tým, že vopred určíte jej predmet, dôvod aj ďalší krok, ak sa odpovede rozídu. Bez posledného bodu sa z kontroly stane zbieranie názorov.

A teraz opačná situácia. Dvoch vykonávateľov sa spýtali, čo znamená completed v zázname zoznamu. Odpovedali rovnako: označuje kúpenú položku. Vyzerá to ako potvrdenie z dvoch strán.

V skutočnosti si obaja prečítali ten istý riadok v súbore README.md, napísaný pred rokom, hoci pole už dávno znamená v kóde niečo iné. Zhodol sa zdroj, nie záver.

Z toho vyplývajú dva užitočné návyky:

  • žiadajte ukázať, o čo sa odpoveď opiera: súbor, riadok, úryvok kódu. Nie parafrázu, ale niečo, čo si môžete sami otvoriť;
  • spoločný predpoklad overte osobitne a poriadne: čo robí kód a čo sa deje v scenári. Aj keď s ním všetci súhlasia.

Samostatné relácie nezaručujú nezávislosť chýb: spoločný zdroj vedie k spoločnému omylu. Keď sa odpovede rozídu, skúmajte podklady, nie počet hlasov: jeden môže vychádzať z aktuálneho kódu a dvaja zo zastaranej poznámky.

Hodnota poľa overená v kóde sa stane základom spoločného modelu, na ktorom sa dohodnete pred začiatkom. Ak rozdelenie stále vyzerá výhodne aj po všetkých troch kontrolách, prejdime k prideleniu oblastí.

Priraďte zodpovedného za každú oblasť

Pravidlo pre súbežnú prácu je jednoduché: jedna oblasť zmien má jedného zodpovedného. Nie "na tento súbor nesmú siahnuť dvaja", ale "kým bežia tieto dve úlohy, zapisuje sem on". Je to dočasná dohoda, nie vlastnosť projektu.

Druhá polovica pravidla je dôležitejšia a častejšie sa na ňu zabúda. Aj spoločný výsledok má svojho zodpovedného: človeka, ktorý spojí časti a rozhodne, či je celok hotový. Ak spojenie nikomu nepridelíte, zostane na tom, kto skončil posledný - a ten vie o cudzej polovici najmenej.

Pred spustením si prezrite projekt a overte, či sú potrebné časti už nejako oddelené. Ak nie, nie je to dôvod na veľký refaktoring kvôli súbežnej práci. Ten sa sám stane najväčšou úlohou dňa a potom už nebude čo rozdeľovať.

Pri našom zozname nákupov by rozdelenie vyzeralo takto:

OblasťKto meníPodmienka
src/filter.js, tests/filter.test.jsVykonávateľ AFiltruje záznamy podľa dohodnutého poľa completed
src/export-csv.js, tests/export-csv.test.jsVykonávateľ BExportuje odovzdanú množinu záznamov v dohodnutom formáte
src/item-model.jsZodpovedný za spojenieSpoločný model záznamu je dohodnutý pred začiatkom; zmeny sa konzultujú so všetkými, ktorí od neho závisia
src/app.js, tests/filter-export.test.jsZodpovedný za spojenieZapojí obe časti a overí export filtrovaného zoznamu
package.json, package-lock.jsonZodpovedný za spojenieVykonávatelia popri práci nepridávajú nové závislosti

Tabuľka rozdeľuje zodpovednosť za zmeny, nie prístupové práva: spoločné súbory môže čítať každý, kto ich potrebuje.

Riadok o package.json tam nie je zo zlomyseľnosti: npm install mení oba súbory naraz, takže dve súbežné inštalácie ľahko spôsobia konflikt a dve verzie tej istej knižnice prinesú prekvapenie pri zostavení. Ak knižnicu potrebujú obaja, vykonávatelia oznámia, čo treba a prečo. Rozhodnutie urobí jeden človek a zmenu vykoná raz.

Dohodnite sa na spoločnom modeli vopred

Rozdelenie podľa súborov bez spoločnej dohody nefunguje dobre. Filter aj export vychádzajú z rovnakého modelu záznamu. Nižšie je náčrt ich rozhraní, nie spustiteľný príklad: implementácie funkcií tu nie sú. Vopred sme sa dohodli aj na tom, že poradie záznamov sa zachová, vstupné pole záznamov sa nemení a booleovské hodnoty sa do CSV zapisujú ako true/false. Pravidlá escapovania CSV zostávajú nezmenené.

// jeden záznam zoznamu: tieto tri polia sú dohodnuté vopred a nepremenúvajú sa
const item = { id: 41, title: "oat milk", completed: false };

// filter.js vráti hotovú množinu záznamov, nič neformátuje ani neexportuje
filterItems(items, mode);   // mode: "all", "active", "completed"

// export-csv.js prijíma už filtrovanú množinu a sám nič nefiltruje
exportCsv(items);           // vráti reťazec CSV so stĺpcami id,title,completed

Všimnite si, že dohoda sa netýka názvov súborov, ale vstupov a výstupov. "Export dostane už filtrovaný zoznam" znie ako drobnosť, no práve táto veta určuje, kto z dvojice zodpovedá za výber záznamov. Bez nej môžu obaja rozumne predpokladať, že výber je na ich strane, a do súboru sa potom dostane buď všetko, alebo sa filtre použijú dvakrát.

Ešte pred začiatkom sa dohodnite aj na tom, ako výsledok prijmete. Spoločný scenár pre náš príklad: záznamy 41 a 43 majú completed: true, záznam 42 má false. Režim "completed" má zobraziť 41 a 43 v pôvodnom poradí a CSV tie isté dva záznamy s hlavičkou id,title,completed a hodnotou true v poslednom stĺpci. Scenár prejde oboma časťami naraz a zachytí presne tú chybu, ktorou sa článok začal.

Ešte jedna vec k zmene samotnej dohody. Ak sa počas práce ukáže, že treba zmeniť spoločný formát, nejde o drobnú úpravu jedného súboru. Treba znova posúdiť všetky úlohy, ktoré od formátu závisia, pretože časť hotovej práce mohla vychádzať z pôvodnej verzie.

Samostatné pracovné priečinky (git worktree) nenahrádzajú dohodu. Fyzicky oddeľujú zmeny, čo je užitočné: kontrola v spoločnom priečinku môže zahrnúť nedokončené zmeny susednej úlohy a potvrdiť stav, ktorý žiadny vykonávateľ samostatne neoveril. Priečinok však nevie dohodnúť formát záznamu a porty, lokálne databázy a ďalšie externé zdroje zostávajú spoločné. Nesledovaný súbor .env v novom priečinku predvolene vôbec nie je: kopíruje sa tam, napríklad cez .worktreeinclude.

Zadajte každému stručnú úlohu

Zadanie nemusí byť dlhé. Zvyčajne stačí sedem bodov: cieľ, od ktorej verzie začať, vlastné súbory, spoločné dohody, overiteľný výsledok, čo vrátiť v odpovedi a čo urobiť, ak bude potrebná cudzia oblasť.

Cieľ: filter zoznamu zobrazuje všetky záznamy, iba nedokončené alebo iba dokončené.
Začnite od: posledného commitu hlavnej vetvy, v ktorom je dohodnutý model záznamu.
Vaše súbory: src/filter.js a tests/filter.test.js.
Spoločná dohoda: pole completed zostáva booleovské, názvy polí nemeníme;
filter vracia pole záznamov a nič neexportuje.
Výsledok: testy filtra prechádzajú; pri množine troch záznamov každý režim
vráti očakávaný zoznam.
Vráťte: zoznam skutočne zmenených súborov, výstup testov,
verziu, na ktorej ste ich spustili, a otvorené otázky.
Ak bude potrebné zmeniť src/item-model.js alebo src/app.js: zastavte sa,
opíšte, akú zmenu potrebujete a prečo, a počkajte na odpoveď.

Zadanie pre druhého vykonávateľa má rovnakú štruktúru: vlastnú dvojicu súborov, rovnaký formát záznamu, vlastný overiteľný výsledok a rovnaký postup pri prekročení hranice. Netreba ho tu celé opakovať.

A teraz odpoveď. Mala by obsahovať skutočný zoznam zmenených súborov a skutočný výstup kontrol. Napísať "cudzích súborov som sa nedotkol" je ľahké a čím naliehavejšie o to požiadate, tým skôr sa táto veta v odpovedi objaví. Overujte zoznam zmien, nie formuláciu. Hranica v zadaní je dohoda, nie zákaz: text požiadavky agentovi nebráni zapisovať do súborov, prístupové práva sa nastavujú osobitne.

Keď časť práce robí subagent

V Claude Code pracuje subagent vo vlastnom kontextovom okne. Bežný subagent nevidí vašu konverzáciu a riadi sa opisom úlohy, ktorý pripraví Claude; variant fork prevezme celý rozhovor. Preto je lepšie uviesť spoločné dohody a kritériá priamo v zadaní. Vráti sa zhrnutie: ľahko sa číta, ale neukazuje, čo presne sa v súboroch zmenilo, a samo zaberie miesto v hlavnej konverzácii. Viac: dokumentácia subagentov.

Znova sa dohodnite na prekrytí

Skôr či neskôr niekto narazí na hranicu cudzej oblasti. Vykonávateľ B zistí, že bez úpravy src/app.js nemožno export nikam zapojiť: tlačidlo exportu sa nevolá.

Dobrá odpoveď obsahuje dôvod, potrebnú zmenu a závislosť. Zapojenie v src/app.js už patrí zodpovednému za spojenie, takže B môže dokončiť svoj modul a odovzdať požiadavku na zapojenie. Ak bez spoločnej zmeny nemôže pokračovať vo svojej časti, závislá práca sa pozastaví.

Ďalej sú dve možnosti. Zodpovedný za spojenie upraví spoločný súbor sám, pretože táto oblasť patrí jemu. Alebo ju výslovne pridelí vykonávateľovi B, no najprv overí, že pôvodný vlastník do súboru práve nezapisuje. Odovzdanie bez zastavenia práce by vytvorilo presne tú situáciu, pred ktorou rozdelenie chráni.

Určite nenúťte vykonávateľa obchádzať hranicu. Požiadavka "nedotýkaj sa app.js, vymysli niečo" zvyčajne vedie ku kopírovaniu cudzej logiky do vlastného súboru alebo k ďalšej vrstve, ktorú potom nikto nevie vysvetliť. Tabuľka je formálne dodržaná, ale v projekte vznikla druhá verzia pravdy o tom, ako funguje export.

Spojte správanie, nielen súbory

Pred spojením potrebuje zodpovedný poznať tri veci: od ktorej verzie vychádzala každá časť, čo a na ktorej verzii overil každý vykonávateľ a ktoré súbory sa naozaj zmenili. To všetko už má byť v odpovediach na zadanie a zoznam súborov treba porovnať so skutočnými zmenami.

Potom časti spojíte a nasleduje to hlavné: spustíte spoločný scenár, na ktorom ste sa dohodli vopred. Prekážať môžu dve veľmi odlišné veci.

Textový konflikt. Časti odlišne zmenili tú istú oblasť, odstránili alebo premenovali súbor a Git ich nedokázal zlúčiť automaticky. Konflikt vyriešte a potom overte výsledné správanie.

Významová nekompatibilita. Nikto neupravoval ten istý riadok, text sa spojí bez problémov a žiadne hlásenie o konflikte sa neobjaví. Práve sem patrí náš prípad s premenovaním: filter číta done, export číta completed a dostane prázdnu hodnotu. Kontroly oboch častí pritom prejdú, každá overuje vlastnú časť a vlastné údaje.

Čisté zlúčenie neznamená kompatibilitu

Zlúčenie bez konfliktov nedokazuje, že správanie je kompatibilné. Spoločný scenár môžete spustiť cez rozhranie alebo testom prepojenia funkcií; lokálne kontroly ho nenahradia.

Dve pracovné časti sa spoja a overia spoločným scenáromVykonávateľ AVykonávateľ BZodpovedný za spojenieSpoločný scenárfilter a export spoluspojí častisrc/filter.jssrc/export-csv.js
Časti spojí jeden zodpovedný a až spoločný scenár ukáže, či sú kompatibilné

Na schéme sa pozrite na spodnú šípku. Horná polovica znázorňuje to, čo sa zvyčajne myslí rozdelením práce: dve nezávislé časti v samostatných súboroch. Záver o pripravenosti je o úroveň nižšie, v scenári, ktorý prejde oboma časťami naraz. Kým ním neprejdete, máte dva lokálne výsledky, ale žiadny spoločný. Ak pravidlá projektu vyžadujú úplnú sadu kontrol, spoločný scenár ju nenahrádza.

Potvrďte spoločné rozhodnutie

Po spojení zodpovedný za spoločný výsledok vyberie ďalší krok. Napríklad:

  1. Prijať spoločný výsledok: scenár prejde, zmeny sú zrozumiteľné a kritériá splnené.
  2. Vrátiť konkrétnu časť na úpravu a pomenovať, čo presne nesedí a s čím. Nie "export je akýsi zvláštny", ale "export číta pole, ktoré už v modeli neexistuje".
  3. Prehodnotiť samotné rozdelenie: znížiť počet vykonávateľov alebo zoradiť časti za sebou.

Tretí variant je v poriadku, nie je to zlyhanie. Signály, že je čas prehodnotiť zostavu, sa objavia pomerne rýchlo:

  • spoločný formát záznamu sa stále mení a zakaždým treba prerobiť obe časti;
  • vykonávatelia na seba čakajú, takže závislosť existovala, len ju nikto nepomenoval;
  • výsledky prichádzajú rýchlejšie, než ich stíhate čítať.

Posledný signál je najnepríjemnejší, pretože navonok vyzerá ako úspech. A jedno vydarené rozdelenie ešte nie je pravidlo: výsledok agenta sa môže od spustenia k spusteniu líšiť, preto sa oplatí dôležitý záver zopakovať na porovnateľnej úlohe.

Aj čiastočný výsledok je platný. Filter môže byť hotový a overený, export nie; zapíšte to presne takto: jedna z dvoch častí. Spoločná úloha pritom zostáva otvorená. Nemožno ju považovať za dokončenú len preto, že polovica funguje, a dôsledné rozdelenie na tom nič nemení.

Overte si to

Dve situácie. Najprv si odpovedzte sami a potom si odpovede skontrolujte.

Príčina chyby ešte nie je známa.
Export občas vytvorí prázdny súbor a láka vás hneď zadať opravu dvom vykonávateľom. Začnite reprodukciou a skúmaním problému. Ak sa objavia rôzne overiteľné hypotézy, môžete ich zadať dvom vykonávateľom. Dve navrhnuté opravy bez podloženia však úlohu nevyriešia: každú treba spojiť s príčinou a overiť v pôvodnom scenári.

Súbory sú rôzne, ale číslo rovnaké.
Filter počíta množstvo tovaru v kusoch, export vypisuje to isté množstvo v baleniach. Kontroly oboch častí prešli, no čísla na obrazovke a v súbore sa nezhodujú. Nie je to chyba v kóde: ani jedna časť neprekročila svoju hranicu. Chýba dohoda o mernej jednotke. Tú treba zaznamenať v spoločnom modeli ešte pred začiatkom. Zodpovedný za spojenie upraví src/item-model.js a potom sa spoločný scenár spustí znova.

Čo z toho zvládne Claude Code

Agent navrhne predbežné rozdelenie, ako v úvode článku, a z vašich bodov zostaví súvislé zadanie. Užitočný je aj v ďalších troch situáciách, no rozhodnutie zostáva na vás:

  • Náčrt mapy oblastí. Požiadajte ho, aby prešiel projekt a navrhol, ktoré súbory sa menia pre ktorú časť úlohy, vrátane ciest. Je to len náčrt: zodpovedného za každú oblasť určíte vy.
  • Spojenie a spoločný test. Agent spojí časti, ukáže úplný zoznam zmien a spustí spoločný scenár. Potom si všetky zmeny prezrite sami.
  • Sporné miesto. Dve sebavedomé vysvetlenia ešte neznamenajú prijaté rozhodnutie. Žiadajte podklady, súbor a riadok; kto mení spoločný súbor, už vopred určuje tabuľka, nie presvedčivejšie znejúca odpoveď.

Všetko sa napokon opiera o jedno rozhodnutie a dve poverenia. Rozhodnutie: či sa oplatí prácu rozdeliť. Každý ďalší vykonávateľ musí priniesť úžitok, ktorý vyváži prípravu, kontrolu a spojenie jeho práce. Poverenia: jeden zodpovedný za každú oblasť zmien a jeden za spoločný výsledok. V príbehu so zoznamom nákupov chýbalo práve toto: dohoda o poli completed aj človek, ktorý spustí filter a export spolu. Nástroje preberú mechanickú časť práce, ale človek musí rozhodnúť, či výsledné správanie naozaj zodpovedá zadaniu.