Baby Monitor Timmy se je začel s preprosto idejo: elektronska varuška, ki spoštuje zasebnost doma. Brez posnetkov v oblaku in brez nepotrebnega pošiljanja podatkov iz otroške sobe. Marsikdo ne ve, da Timmy razvijam samostojno v Zürichu, pri tem pa GitHub Copilot je moj zelo hiter programerski partner.
Sodelovanje človeka in umetne inteligence
Delitev je jasna: jaz določam funkcije, postavljam prednostne naloge in sprejemam arhitekturne odločitve. Copilot pomaga pri izvedbi: pisanju kode, dodajanju testov, iskanju vzrokov za napake in pripravi korakov za izdajo.
Moj običajni sprint je približno takšen:
- Opis funkcije: Opišem, kaj mora funkcija narediti, vključno z robnimi primeri in omejitvami.
- Izvedba: Copilot predlaga kodo in upošteva obstoječe smernice projekta.
- Testiranje: Samodejni celoviti testi se izvajajo na dveh emulatorjih in preverjajo dejansko povezavo med otroško in starševsko napravo.
- Distribucija: Ko so testi uspešni, se različici za Android in iOS pripravita za ustrezni trgovini in testne kanale.
Ta cikel se ponavlja pri novih funkcijah in popravkih napak. Ne napišem vsake vrstice sam, vendar odločam, kaj se razvije, zakaj se razvije in ali predlog ustreza Timmyju.
Od zamisli do WebRTC
Osrednja tehnična naloga je bila od začetka jasna: zvok in video v realnem času med dvema telefonoma. WebRTC je bila očitna izbira, vendar integracija s Flutterjem ni preprosta: kandidati ICE, pogajanje SDP, nadomestna povezava TURN in DataChannels morajo delovati skupaj v pravilnem zaporedju.
Copilot mi je pomagal te dele postopoma povezati: vzpostaviti povezavo med vrstniki, ohraniti pravilno ključno zaporedje (DataChannel pred offer, onTrack pred setRemoteDescription) in signalizacijo postaviti v Firebase Firestore. Vsak del je moral delovati na dveh emulatorjih, preden sem nadaljeval.
Varno povezovanje z ECDH
Ena najpomembnejših funkcij je bila sistem varnega povezovanja. Dve napravi morata vzpostaviti medsebojno zaupanje, ne da bi se zanašali na osrednji strežnik, ki bi jamčil za njuno identiteto. Rešitev je izmenjava ključev ECDH P-256 prek Firebasea v kombinaciji z vizualno številko za preverjanje (SAS), ki zazna napade s posrednikom.
Copilot je pomagal uresničiti kriptografsko verigo: ustvarjanje ključev, izmenjavo javnih ključev, izpeljavo skupne skrivnosti, izračun SAS in šifriranje AES-256-GCM za vse poznejše signalizacijske podatke. Ključa za povezovanje ne pošiljam zalednemu sistemu; kot identifikator dokumenta Firestore se uporablja samo njegova zgoščena vrednost SHA-256.
Varnostni pregled: iskanje in odpravljanje ranljivosti
Razvoj s pomočjo umetne inteligence zame ni le hitrejše tipkanje. Pomaga tudi pri sistematičnem iskanju napak. Med namenskim sprintom za varnostni pregled je Copilot analiziral kodno bazo in našel šest težav ki sem jih moral odpraviti:
- Manjkajoče preverjanje vhodnih podatkov pri signalizacijskih podatkih
- Morebitni tekmovalni pogoji pri obravnavi kandidatov ICE
- Zastareli podatki seje, ki se niso pravilno čistili
- Varnostna pravila Firestore, ki so bila preveč ohlapna
- Pomanjkljivo upoštevanje pripenjanja potrdil
- Nezadostno obravnavanje napak pri pridobivanju poverilnic TURN
Vseh šest sem odpravil v istem sprintu. Tu je Copilot močan: bere veliko datotek, primerja vzorce in označi mesta, ki jih moram podrobneje pregledati.
Iterativni sprinti: kako se je aplikacija razvijala
Timmy je rasel skozi hitre, vendar jasno omejene sprinte. Nekaj mejnikov:
- v1.8: Popolna prenova povezovanja — 4-znakovna koda in ECDH P-256 prek Firebasea sta nadomestila stari pristop z neposrednim ključem.
- v1.10: Sprint za utrditev varnosti — pregled šestih ranljivosti in njihovo odpravljanje.
- v1.11: Temni način na vseh zaslonih ter domača stran in blog, ki ga berete zdaj.
- v1.12: Velika prenova starševskega zaslona, način nočnega vida in zaznavanje gibanja z analizo sličic kamere.
Vsak sprint sledi istemu osnovnemu vzorcu: opišem cilj, pregledam predloge, samodejno testiram in nato različico pošljem preizkuševalcem.
E2E-testiranje na različnih napravah
Elektronske varuške ni mogoče pravilno testirati na eni sami napravi. Potrebujem eno otroško in eno starševsko napravo. Projekt se je začel z dvema emulatorjema Android, ki sta delovala hkrati, zdaj pa ta postopek dopolnjujejo lokalna preverjanja v simulatorju iOS in na fizičnih napravah. Samodejni testni skript za Android še vedno:
- Namesti aplikacijo na oba emulatorja
- Vodi skozi povezovanje na obeh napravah
- Preveri, ali sta zvočna in video povezava vzpostavljeni
- Preizkusi govor s pritiskom gumba, upravljanje kamere in druge funkcije
Ker imata oba emulatorja isti naslov IP (10.0.2.15), neposredna povezava med vrstniki prek STUN ni mogoča. Vsak preizkus mora potekati prek releja Cloudflare TURN. To je nadležno, vendar koristno: vsakič se preizkusi najbolj zapletena pot povezave.
Kaj sem se naučil
Razvoj celotne aplikacije z umetno inteligenco kot programerskim partnerjem me je naučil nekaj stvari:
- Arhitektura je pomembnejša kot kdaj prej. Jasne smernice in dobro dokumentirana kodna baza pomagajo umetni inteligenci predlagati dosledno kodo. Nejasnosti hitro postanejo drage.
- Testiranje je nujno. Koda, ki jo ustvari umetna inteligenca, zahteva enako temeljito testiranje kot koda, ki jo napiše človek. Samodejni E2E-testi so odkrili težave, ki bi jih pri ročnem preverjanju zlahka spregledal.
- Človek ostaja vključen. Vsaka arhitekturna odločitev, vsak varnostni kompromis in vsaka meja izdelka ostajajo v mojih rokah. Umetna inteligenca pospeši izvedbo, ne nadomesti pa presoje.
- Hitrost omogoča kakovost. Ker funkcije objavim v urah namesto dneh, je na voljo več ponovitev za dodelavo in odpravljanje napak. Hitrost sama po sebi še ne pomeni kakovosti.
Pogled naprej
Baby Monitor Timmy se nenehno razvija. Izdaja za iOS je blizu; nato sledijo dodatne funkcije s senzorji in nadaljnja utrditev varnosti. Potek dela ostaja podoben: jaz določim smer in meje, Copilot pa pomaga hitro izvesti in preveriti.
Varnostno pomembni gradniki so zdaj jasno razmejeni v javnem repozitoriju baby-monitor-timmy-core. Tam so dokumentirane tudi arhitekturne odločitve o povezovanju, signalizaciji in vmesnikih zalednega sistema.