Nuo ko pradėjau rašyti pristatymo sistemą
Užteks plepėti. Pereinam prie proceso. Pateiksiu minimumą techninių terminų, kad būtų aišku, kaip tai atrodo bendrai.
Pradžioje turėjau štai ką: yra svetainė su pristatymais, joje aš dispečeris, yra vairuotojai, yra prekė, yra vitrina, yra užsakymai. Ir faktiškai — tai jau buvo veikiantis verslas, kuris mums nepriklausė.
Domenas ne mūsų. Serveris ne mūsų. Apskritai niekas ne mūsų.
Vienintelis dalykas, kurį turėjau — tai prieiga prie administratoriaus skydelio.
Normalioje situacijoje tai daroma taip: pasisodini užsakovą priešais save ir traukti iš jo verslo logiką. Kaip juda prekė — nuo sandėlio iki kliento ar atvirkščiai. Kaip juda pinigai. Visa kita — promo kodai, partnerystės nuorodos — tai jau antstatai, kurių pradžioje nereikia.
Bet mano užsakovas jau įžūlus. Jam tingu ką nors aiškinti. Man, atvirai pasakius, taip pat tingu tai iš jo traukti. Greitai paskaičiavau, kad tam užtruks mėnuo, ir nusprendžiau eiti kitu keliu.
Tiesiog ėjau tiesiai į priekį.
Atidariau Claude, įkėliau ten daugybę ekrano nuotraukų — svetainės vitriną, sąsajas, viską, ką mačiau — ir savo kalba paaiškinau, ką noriu gauti. Be formalumų, kaip yra.
Po to nuėjau į Claude Code ir daviau jam admin skydelio prisijungimo vardą ir slaptažodį. Jis pasileido, pakėlė naršyklę per Puppeteer ir gana ilgai kažką darė — vaikščiojo po puslapius, perėmė tinklo užklausas. Galiausiai jis surado visus API endpoints.
Jei išversti į žmonių kalbą — jis pasirinko raktus į visą projekto verslo logiką.
Ir būtent tuo momentu tapo aišku: man nereikia traukti logikos iš užsakovo. Ji jau visa yra sistemos viduje.
Atsirado galimybė ne tiesiog „pažiūrėti", kaip tai veikia, o ištraukti duomenų bazę ir išardyti sistemą visą. Paprašiau jį visą tai išanalizuoti ir įkėliau šią analizę atgal į Claude.
Toliau prasidėjo įdomiausia dalis.
Claude pats pasiūlė, kaip statyti darbą. Jis pasakė: sukurk projektą ir įkelk ten viską — vitrinos, admin skydelio ekrano nuotraukas, techninę informaciją apie API, visą analizę. Tai yra, surinkti bendrą „projekto žinojimą".
Po to jis tame pačiame chat'e parašė pilnavertę techninę užduotį. Pats pasirinko, kuo rašyti frontend, kuo rašyti backend, ir išdavė kūrimo planą 30-čiai dienų — su konkrečiomis užduotimis kiekvienai dienai.
Visa tai įkėliau atgal į projekto atmintį.
Toliau prasidėjo gryna mechanika. Įeidavau į projektą, imdavau dienos užduotį, kopijuodavau ją į naują chat'ą, gaudavau kodą ir atiduodavau jį į Claude Code, kuris jau rašė patį projektą.
Pirmos dienos praėjo be problemų. Paskui prasidėjo niuansai.
Pagrindinė problema — kiekvienas chat'as nematė kaimyninio. Bendra idėja jam buvo, bet kodas pradėjo gyventi savo gyvenimą. Jį nuvedė į šalį, struktūra pradėjo skęsti.
Tada pirmą kartą supratau, kad reikia duoti apribojimus. Ne tiesiog „rašyk kodą", o aiškiai sakyti: nelaužyk struktūros, pritaikyk prie jau esamo, laikykis rėmuose. Be to jis pradėjo spėlioti.
Pirmas dešimt dienų darėme backend — struktūrą, aplankus, logiką. Aš tuo metu apskritai nesupratau, ką būtent jis rašo.
Ir kažkuriuo momentu pagavau save ant paprastos minties: jei dabar visa tai sugrius — aš to nesurinksiu atgal.
Ir šiuo momentu prasideda nemalonus jausmas.
Tu jau per toli nuėjęs, kad sustotum.
Bet tuo pat metu tu apskritai nekontroliuoji, kas vyksta viduje.
Tu nesupranti kodo. Nesupranti architektūros. Nesupranti, kas būtent laiko sistemą.
Ir vienintelis dalykas, kurį turi — tai pojūtis, kad ji kol kas nesugriuvo.
Ir būtent ant šio pojūčio tu eini toliau.
Kažkur apie dešimtą dieną tapo pastebima, kad pradedu nukrypti nuo pradinio plano. Teko lipti atgal į „projekto žinojimą" ir jį taisyti, kad jis mažiau haliucinuotų.
Ir būtent tuo momentu susidūriau su konteksto suspaudimu. Kai sesija išauga, Claude Code suspaudžia istoriją — padaro iš jos trumpą santrauką, kad atlaisvintų vietą. Ir šioje santraukoje nusėda ne tai, ko tau reikia. Po tokio suspaudimo jį galėjo nunešti apskritai į kitą pusę. Tada dar nesupratau, kaip tai kontroliuoti.
Taip praėjo 30 dienų.
Faktiškai buvo parašytas visas projektas — front, back, logika. Kas ten viduje — neturėjau nė menkiausio supratimo.
Toliau viskas paprasta: domenas, serveris, deploy. Daviau komandą — paskelbti ir paleisti.
Ir ji pasileido.
Pamačiau svetainę, kuri buvo labai panaši į originalą. Prijungiau originalią duomenų bazę ir gavau galimybę gainioti visa tai ant realių klientų, kol kas neperkėlęs srauto.
Ir štai čia prasidėjo realybė.
Veikė beveik niekas. Bet svetainė buvo.
Ėjau pagal grandinę: registracija, užsakymas, statusai, logika. Pradėjau suprasti, ko trūksta: dispečerinė, sąsaja vairuotojams. Nenorėjau rašyti atskirų mobiliųjų programų, todėl padariau viską per Telegram mini apps — ten jis susitvarkė normaliai.
Toliau — bug'ai. Daug. Labai daug.
Tu tiesiog aprašai, kas neveikia, parodai, kaip turi būti, ir jis pradeda taisyti. Kartais pataiko, kartais sulaužo dar stipriau. Klasika — pataisė tris dalykus, ketvirtas sulaužo viską atgal.
Bet pamažu matosi, kad bug'ų darosi mažiau.
Paskui atsiranda įžūlumas — pradedi pridėti fičas: promo kodus, nuolaidas, partnerystės nuorodas. Ir kažkuriuo momentu tau pradeda atrodyti, kad ji veikia.
Tu kvieti žmogų. Jis užeina. Registruojasi. Daro užsakymą.
Ir grandinė praeina: užsakymas sukurtas, dispečeris gavo, vairuotojas pristatė, viskas užfiksuota sistemoje.
Ir tu sėdi ir netiki.
Toliau — perėjimas.
Pervedžiau domeną į savo serverį ir sinchronizavau duomenų bazę, kad seni vartotojai net nepastebėtų perėjimo.
Pirmas užsakymas atėjo maždaug po dešimties minučių. Paskui antras. Abu praėjo normaliai.
Šią būseną sunku aprašyti.
Po to prasidėjo tikras prod.
Bug'ų niekas nerašė. Visi tiesiog skambino ir rėkė. Norėjo grįžti atgal. Man, atvirai pasakius, buvo vis tiek. Tiesiog ėmiau problemas pagal prioritetą ir taisiau.
Mano draugo garbei — jis nė karto nespaudė. Tiesiog laukė.
O kai jam pasiūlė grįžti atgal, jis atsakė labai paprastai: sumokėkite keturiasdešimtinę už projektą ir mokėkite po penkis per mėnesį — ir mes grįšime.
Tuo pokalbis ir baigėsi.
Ir būtent tuo momentu tapo galutinai aišku:
tai apskritai ne apie kodą. ir ne apie neuroninius tinklus.
tai apie gebėjimą paimti chaosą ir nutempti jį iki veikiančios sistemos iki to momento, kol ji sugrius.
Pilnas projekto stack'as. Last-mile delivery.
Aš nežinojau, ką būtent parašiau.
Praėjus porai savaičių po paleidimo, pas mane atskrido dukra. Nuėjome pasitusinti, ji kažką apie mane pasakė, ir vienas vaikinas — IT specialistas — išėjo su manimi parūkyti.
Pradėjo klausinėti:
— kuo rašai? — koks stack'as? — kaip sutvarkyta?
Pasakiau sąžiningai: nežinau.
Išsitraukiau telefoną. Paklausiau Claude Code — kuo aš apskritai rašau?
Atsakymas mane sustabdė.
Kelias dienas jį perskaitinėjau. Paskui įkėliau visą projektą į NotebookLM ir pradėjau aiškintis, ką aš apskritai surinkau.
Žemiau — tai, ką jis man išdavė.
—
Backend NestJS 10 · TypeORM · PostgreSQL 16 · Redis 7 Auth: JWT + Passport + bcrypt WebSocket: Socket.IO + Redis adapter Validacija, rate limiting, cron, Swagger
33 moduliai · 35 esybės · ~150 endpoint'ų
—
Integracijos Email — Brevo SMS — savas Android-šliuzas WhatsApp — daugiamazgis šliuzas Push — Pushover Crypto — BTC, ETH, USDT, USDC, TRC-20
—
Frontend Vitrina — Next.js 14, SSR, en/ru/es ️ Admin skydelis — React 18 + Zustand Mini-app'ai (dispečeris, vairuotojas, pardavimai) — React 19
—
Telegram-botai — 3 vienetai Python 3.12 · aiogram · asyncpg · Redis
—
Infrastruktūra Docker multi-stage · GitHub Actions CI/CD · GHCR nginx (SSL, WebSocket, gzip) · Cloudflare 10+ servisų docker-compose
—
Aš to „nerinkau". Aš to „neprojektavau". Aš net pusės šių žodžių nežinojau.
Tiesiog sprendžiau užduotį.
Ir tik paskui supratau: surinkau sistemą, kurią paprastai daro kelių žmonių komanda.
—
Tai nereiškia, kad dabar galima nieko nesuprasti.
Tai reiškia kitką:
įėjimas nebe ten, kur jį anksčiau piešė.
Jei anksčiau reikėjo pirma išmokti stack'ą, o paskui kažką daryti —
tai dabar tu gali pirma padaryti,
o paskui aiškintis, ką būtent padarei.