Tinklaraštis

Kaip kuriu Baby Monitor Timmy su „GitHub Copilot“

DI padeda man dirbti greičiau. Tačiau atsakomybė už Timmy vis tiek lieka man.

Baby Monitor Timmy gimė iš paprastos idėjos: sukurti kūdikio stebėjimo programėlę, kuri namuose gerbtų privatumą. Jokių įrašų debesijoje, jokio nereikalingo duomenų perdavimo iš vaikų kambario. Ko daugelis nežino: Timmy kuriu vienas Ciuriche, o GitHub Copilot yra mano itin greitas programavimo porininkas.

Žmogaus ir DI darbo eiga

Atsakomybės aiškiai atskirtos: apibrėžiu funkcijas, nustatau prioritetus ir priimu architektūros sprendimus. Copilot padeda įgyvendinti: rašyti kodą, pridėti testų, susiaurinti klaidų paiešką ir paruošti leidimo veiksmus.

Mano įprastas sprintas maždaug atrodo taip:

  1. Funkcijos aprašymas: Aprašau, ką funkcija turi daryti, įskaitant kraštinius atvejus ir apribojimus.
  2. Įgyvendinimas: Copilot siūlo kodą ir laikosi esamų projekto taisyklių.
  3. Testavimas: Automatiniai visos sistemos testai vykdomi dviejuose emuliatoriuose ir patikrina tikrą ryšį tarp kūdikio ir tėvų įrenginių.
  4. Platinimas: Kai testai praeina, paruošiamos „Android“ ir „iOS“ versijos tinkamai parduotuvei ir testavimo kanalams.

Šis ciklas kartojasi kuriant funkcijas ir taisant klaidas. Ne kiekvieną eilutę rašau pats, bet nusprendžiu, kas bus kuriama, kodėl tai kuriama ir ar pasiūlymas tinka Timmy.

Nuo idėjos iki WebRTC

Pagrindinė techninė užduotis nuo pat pradžių buvo aiški: garso ir vaizdo perdavimas realiuoju laiku tarp dviejų telefonų. WebRTC buvo akivaizdus pasirinkimas, tačiau jį integruoti su „Flutter“ nėra paprasta: ICE kandidatai, SDP derybos, TURN atsarginis sprendimas ir „DataChannels“ turi veikti kartu tinkama tvarka.

Copilot padėjo man žingsnis po žingsnio sujungti šias dalis: užmegzti lygiarangį ryšį, išlaikyti teisingą svarbių veiksmų seką („DataChannel“ prieš pasiūlymą, „onTrack“ prieš „setRemoteDescription“) ir įgyvendinti signalizavimą per „Firebase Firestore“. Prieš eidamas toliau, kiekvieną dalį turėjau paleisti dviejuose emuliatoriuose.

Saugus susiejimas naudojant ECDH

Viena svarbiausių funkcijų buvo saugaus susiejimo sistema. Du įrenginiai turi pradėti pasitikėti vienas kitu be centrinio serverio, kuris patvirtintų jų tapatybę. Sprendimas – ECDH P-256 raktų apsikeitimas per „Firebase“ ir vaizdinis patvirtinimo skaičius (SAS), padedantis aptikti tarpininko atakas.

Copilot padėjo įgyvendinti visą kriptografinę grandinę: raktų generavimą, viešųjų raktų apsikeitimą, bendros slaptosios reikšmės gavimą, SAS apskaičiavimą ir visų vėlesnių signalizavimo duomenų šifravimą naudojant AES-256-GCM. Susiejimo rakto į serverį nesiunčiu; kaip „Firestore“ dokumento identifikatorius naudojama tik jo SHA-256 maišos reikšmė.

Saugumo auditas: pažeidžiamumų radimas ir taisymas

Man DI padedamas kūrimas nėra vien greitesnis spausdinimas. Jis taip pat padeda sistemiškai ieškoti klaidų. Per kryptingą saugumo audito sprintą Copilot išanalizavo kodų bazę ir rado šešias problemas kurias reikėjo ištaisyti:

Visos šešios problemos buvo ištaisytos per tą patį sprintą. Čia Copilot stiprus: jis perskaito daug failų, palygina šablonus ir pažymi vietas, kurias turiu atidžiau patikrinti.

Iteraciniai sprintai: kaip vystėsi programėlė

Timmy augo per greitus, bet aiškiai apibrėžtus sprintus. Keletas etapų:

Kiekvienas sprintas vyksta pagal tą patį pagrindinį modelį: aprašau tikslą, peržiūriu pasiūlymus, automatiškai testuoju, tada pateikiu testuotojams.

E2E testavimas skirtinguose įrenginiuose

Kūdikio stebėjimo programėlės negalima tinkamai ištestuoti viename įrenginyje. Man reikia vieno įrenginio prie kūdikio ir vieno įrenginio tėvams. Iš pradžių projekte vienu metu veikė du „Android“ emuliatoriai, o dabar šį ciklą papildo vietinio „iOS“ simuliatoriaus ir tikrų įrenginių patikros. Automatinis „Android“ testavimo scenarijus vis dar:

  1. Įdiegia programėlę abiejuose emuliatoriuose
  2. Atlieka susiejimą abiejuose įrenginiuose
  3. Patikrina, ar užmegztas garso ir vaizdo ryšys
  4. Testuoja tiesioginio kalbėjimo funkciją, kameros valdymą ir kitas funkcijas

Kadangi abu emuliatoriai naudoja tą patį IP adresą (10.0.2.15), tiesioginis lygiarangis ryšys per STUN neįmanomas. Kiekvienas testas turi vykti per „Cloudflare TURN“ retransliavimo serverį. Tai erzina, bet yra naudinga: kiekvieną kartą išbandomas sudėtingiausias ryšio kelias.

Ką išmokau

Kurdamas visavertę programėlę su DI programavimo porininku išmokau keletą dalykų:

Žvelgiant į priekį

Baby Monitor Timmy toliau tobulėja. „iOS“ versija jau beveik paruošta; po jos atsiras papildomos jutiklių funkcijos ir bus toliau stiprinamas saugumas. Darbo eiga lieka panaši: aš nustatau kryptį ir ribas, o Copilot padeda greitai įgyvendinti ir patikrinti.

Saugumui svarbūs komponentai dabar yra aiškiai atskirti viešoje baby-monitor-timmy-core saugykloje. Joje taip pat dokumentuoti architektūros sprendimai, susiję su susiejimu, signalizavimu ir sąsajomis su galine sistema.


Daugiau straipsnių