Baby Monitor Timmy sai alguse lihtsast ideest: beebimonitorist, mis austab kodus privaatsust. Pilvesalvestisi pole ja tarbetuid andmevooge lastetoast välja samuti mitte. Paljud aga ei tea, et arendan Timmyt üksinda Zürichis ning GitHub Copilot on mu väga kiire paarisprogrammeerija.
Inimese ja AI töövoog
Rollijaotus on selge: mina määratlen funktsioonid, sean prioriteedid ja teen arhitektuuriotsused. Copilot aitab teostusega: kirjutab koodi, lisab teste, aitab vigade põhjusi täpsustada ja valmistab ette väljalaske etappe.
Minu tüüpiline sprint näeb ligikaudu selline välja:
- Funktsiooni kirjeldus: Kirjeldan, mida funktsioon tegema peab, sealhulgas erijuhud ja piirangud.
- Teostus: Copilot pakub koodi ja järgib projekti olemasolevaid tavasid.
- Testimine: Automaatsed E2E-testid töötavad kahes emulaatoris ja kontrollivad tegelikku ühendust beebi- ja vanemaseadme vahel.
- Levitamine: Kui testid läbivad, valmistatakse Androidi ja iOS-i järgud ette vastavate poe- ja testkanalite jaoks.
See tsükkel kordub funktsioonide ja veaparanduste puhul. Ma ei kirjuta iga rida ise, kuid otsustan, mida arendatakse, miks seda arendatakse ja kas pakutud lahendus sobib Timmyga.
Kontseptsioonist WebRTC-ni
Keskne tehniline ülesanne oli algusest peale selge: reaalajas heli ja video kahe telefoni vahel. WebRTC oli ilmselge valik, kuid selle Flutteriga integreerimine ei ole lihtne: ICE-kandidaadid, SDP läbirääkimine, TURN-i varulahendus ja DataChannelid peavad töötama õiges järjekorras.
Copilot aitas mul need osad samm-sammult kokku panna: seadistada partnerühenduse, säilitada kriitiliste toimingute õige järjekord (DataChannel enne offer’it, onTrack enne setRemoteDescription’it) ning viia signaliseerimine Firebase Firestore’i. Iga osa pidi enne edasiliikumist töötama kahes emulaatoris.
Turvaline sidumine ECDH-ga
Üks kõige kriitilisemaid funktsioone oli turvaline sidumissüsteem. Kaks seadet peavad looma vastastikuse usalduse, ilma et nad toetuksid keskserverile, mis nende identiteeti kinnitaks. Lahendus: ECDH P-256 võtmevahetus Firebase'i kaudu koos visuaalse kontrollnumbriga (SAS), mis tuvastab vahendusründeid.
Copilot aitas rakendada kogu krüptograafilise ahela: võtmete loomise, avalike võtmete vahetamise, ühissaladuse tuletamise, SAS-i arvutamise ja kõigi hilisemate signaliseerimisandmete AES-256-GCM-krüptimise. Ma ei saada sidumisvõtit taustasüsteemi; Firestore’i dokumendi identifikaatorina kasutatakse ainult selle SHA-256 räsi.
Turvaaudit: haavatavuste leidmine ja parandamine
AI-toega arendus ei tähenda minu jaoks ainult kiiremat trükkimist. See aitab ka süsteemselt vigu otsida. Keskendunud turvaauditiga sprindis analüüsis Copilot koodibaasi ja leidis kuus probleemi mida pidin parandama:
- Puudulik sisendi valideerimine signaliseerimisandmetes
- Võimalikud võistlusseisundid ICE-kandidaatide käsitlemisel
- Aegunud seansiandmed, mida ei puhastatud korralikult
- Liiga leebed Firestore'i turvareeglid
- Sertifikaadi sidumise vajaduse arvestamata jätmine
- Ebapiisav veakäsitlus TURN-i autentimisandmete töövoos
Kõik kuus parandati sama sprindi jooksul. Siin on Copilot tugev: ta loeb palju faile, võrdleb mustreid ja märgib kohad, mida pean lähemalt uurima.
Iteratiivsed sprindid: kuidas rakendus arenes
Timmy arenes kiirete, kuid selgelt piiritletud sprintide käigus. Mõned verstapostid:
- v1.8: Sidumise täielik ümberkujundamine — vana otsevõtmelahendus asendati Firebase’i kaudu toimiva 4-märgilise koodi ja ECDH P-256 võtmevahetusega.
- v1.10: Turvalisuse tugevdamise sprint — kuue haavatavuse audit ja parandustsükkel.
- v1.11: Tume režiim kõigil ekraanidel ning avaleht ja blogi, mida praegu loed.
- v1.12: Vanemaekraani põhjalik uuendus, öönägemisrežiim ja liikumise tuvastamine kaamera kaadrite analüüsi abil.
Iga sprint järgib sama põhimustrit: kirjelda eesmärk, vaata soovitused üle, testi automaatselt ja saada siis testijatele.
E2E-testid eri seadmetes
Beebimonitori ei saa korralikult testida ühe seadmega. Vajan üht beebiseadet ja üht vanemaseadet. Projekt algas kahe samaaegselt töötava Androidi emulaatoriga ning nüüd täiendavad seda töövoogu kohalikud iOS-i simulaatori ja pärisseadme kontrollid. Automaatne Androidi testiskript teeb endiselt järgmist:
- Installib rakenduse mõlemasse emulaatorisse
- Läbib sidumisprotsessi mõlemas seadmes
- Kontrollib, et heli- ja videoühendus on loodud
- Testib rääkimisnuppu, kaamera juhtimist ja muid funktsioone
Kuna mõlemal emulaatoril on sama IP-aadress (10.0.2.15), ei ole otsene seadmetevaheline ühendus STUN-i kaudu võimalik. Iga testkäivitus peab minema läbi Cloudflare’i TURN-relee. See on tüütu, kuid kasulik: nii testitakse iga kord kõige keerulisemat ühendusteed.
Mida ma õppisin
Täieliku rakenduse loomine AI-paarisprogrammeerijaga õpetas mulle mõndagi:
- Arhitektuur on tähtsam kui kunagi varem. Selged tavad ja hästi dokumenteeritud koodibaas aitavad AI-l pakkuda ühtset koodi. Ebaselgus muutub kiiresti kulukaks.
- Testimise osas ei saa järeleandmisi teha. AI abil loodud koodi tuleb testida sama rangelt kui inimese kirjutatud koodi. Automaatsed E2E-testid leidsid probleeme, mis oleksid käsitsi testides võinud kergesti märkamata jääda.
- Inimene jääb alati protsessi kaasatuks. Iga arhitektuuriotsus, iga turvalisusega seotud kompromiss ja iga tootega seotud piirang jääb minu vastutada. AI kiirendab teostust, kuid ei asenda otsustusvõimet.
- Kiirus võimaldab kvaliteeti. Kuna funktsioonid valmivad tundide, mitte päevadega, jääb rohkem aega viimistlemiseks ja vigade parandamiseks. Kiirus üksi ei taga head tulemust.
Edasi vaadates
Baby Monitor Timmy areneb edasi. iOS-i versioon on peagi valmis; pärast seda lisanduvad uued andurifunktsioonid ja turvalisuse pidev tugevdamine. Töövoog jääb sarnaseks: mina määran suuna ja piirid, Copilot aitab kiiresti teostada ja kontrollida.
Turvalisuse seisukohalt olulised ehitusplokid on nüüd selgelt piiritletud ja asuvad avalikus baby-monitor-timmy-core’i repositooriumis. Seal on dokumenteeritud ka sidumise, signaliseerimise ja taustasüsteemi liideste arhitektuuriotsused.