Baby Monitor Timmy sākās ar vienkāršu ideju: mazuļa uzraudzības lietotni, kas mājās respektē privātumu. Nekādu ierakstu mākonī un nekādu nevajadzīgu datu plūsmu ārpus bērnistabas. Daudzi nezina, ka Timmy veidoju viens pats Cīrihē, un GitHub Copilot ir mans ļoti ātrais programmēšanas pārinieks.
Cilvēka un MI darba process
Pienākumu sadalījums ir skaidrs: es nosaku funkcijas un prioritātes un pieņemu arhitektūras lēmumus. Copilot palīdz ar īstenošanu: rakstīt kodu, pievienot testus, lokalizēt kļūdas un sagatavot izlaiduma darbības.
Mans tipisks sprints aptuveni izskatās šādi:
- Funkcijas apraksts: Es aprakstu, kas funkcijai jādara, tostarp robežgadījumus un ierobežojumus.
- Īstenošana: Copilot piedāvā kodu un ievēro projektā jau izmantotās pieejas.
- Testēšana: Automatizētie pilnā cikla testi darbojas divos emulatoros un pārbauda reālo savienojumu starp mazuļa un vecāka ierīci.
- Izplatīšana: Kad testi ir veiksmīgi, Android un iOS versijas tiek sagatavotas izplatīšanai attiecīgajos lietotņu veikalu un testēšanas kanālos.
Šis cikls atkārtojas funkcijām un kļūdu labojumiem. Es pats nerakstu katru rindu, bet es lemju, ko veidot, kāpēc to veidot un vai ieteikums ir piemērots Timmy.
No idejas līdz WebRTC
Galvenais tehniskais uzdevums jau sākumā bija skaidrs: reāllaika audio un video starp diviem tālruņiem. WebRTC bija acīmredzama izvēle, taču tā integrēšana ar Flutter nav vienkārša: ICE kandidātiem, SDP saskaņošanai, TURN rezerves risinājumam un DataChannels ir jāsadarbojas pareizajā secībā.
Copilot palīdzēja man soli pa solim savienot šīs daļas: iestatīt vienādranga savienojumu, saglabāt pareizo kritisko secību (DataChannel pirms piedāvājuma, onTrack pirms setRemoteDescription) un izvietot signalizāciju Firebase Firestore. Katrai daļai bija jādarbojas divos emulatoros, pirms devos tālāk.
Droša savienošana pārī ar ECDH
Viena no vissvarīgākajām funkcijām bija drošās savienošanas pārī sistēma. Divām ierīcēm jāizveido savstarpēja uzticēšanās, nepaļaujoties uz centrālo serveri, kas apliecinātu to identitāti. Risinājums: ECDH P-256 atslēgu apmaiņa caur Firebase kopā ar vizuālu verifikācijas numuru (SAS), kas atklāj starpnieka uzbrukumus.
Copilot palīdzēja ieviest kriptogrāfisko ķēdi: atslēgu ģenerēšanu, publisko atslēgu apmaiņu, kopīgā noslēpuma atvasināšanu, SAS aprēķināšanu un AES-256-GCM šifrēšanu visiem turpmākajiem signalizācijas datiem. Es nesūtu savienošanas pārī atslēgu uz aizmugursistēmu; par Firestore dokumenta identifikatoru tiek izmantota tikai tās SHA-256 jaucējvērtība.
Drošības audits: ievainojamību atrašana un labošana
Man MI atbalstīta izstrāde nav tikai ātrāka rakstīšana. Tā palīdz arī sistemātiski meklēt kļūdas. Mērķtiecīgā drošības audita sprintā Copilot izanalizēja koda bāzi un atrada sešas problēmas , kas man bija jānovērš:
- Trūkstoša ievaddatu validācija signalizācijas datos
- Iespējamas sacīkstes situācijas ICE kandidātu apstrādē
- Novecojuši sesijas dati, kas netika pienācīgi iztīrīti
- Pārāk pieļaujoši Firestore drošības noteikumi
- Nav izvērtēta sertifikātu piesaiste
- Nepietiekama kļūdu apstrāde TURN akreditācijas datu iegūšanas procesā
Visas sešas problēmas tika novērstas tajā pašā sprintā. Te Copilot ir spēcīgs: tas izlasa daudz failu, salīdzina modeļus un atzīmē vietas, kuras man jāizpēta rūpīgāk.
Iteratīvie sprinti: kā lietotne attīstījās
Timmy auga ātri, bet skaidri norobežotos sprintos. Daži atskaites punkti:
- v1.8: Pilnīga savienošanas pārī pārveide — veco tiešās atslēgas pieeju aizstāja 4 rakstzīmju kods + ECDH P-256 caur Firebase.
- v1.10: Drošības nostiprināšanas sprints — sešu ievainojamību audits un labojumu cikls.
- v1.11: Tumšais režīms visos ekrānos, kā arī sākumlapa un emuārs, ko tagad lasāt.
- v1.12: Plaša vecāka ekrāna pārveide, nakts redzamības režīms un kustības noteikšana, analizējot kameras kadrus.
Katrs sprints ievēro vienu pamatprincipu: aprakstīt mērķi, pārskatīt ieteikumus, automātiski testēt un pēc tam nodot testētājiem.
E2E testēšana dažādās ierīcēs
Mazuļa uzraugu nevar pienācīgi testēt vienā ierīcē. Man vajadzīga viena mazuļa ierīce un viena vecāka ierīce. Projekts sākās ar diviem vienlaikus darbinātiem Android emulatoriem, un tagad šo ciklu papildina lokālas iOS simulatora un īstu ierīču pārbaudes. Automatizētais Android testēšanas skripts joprojām:
- Instalē lietotni abos emulatoros
- Veic savienošanu pārī abās ierīcēs
- Pārbauda, vai ir izveidoti audio un video savienojumi
- Testē rācijas funkciju, kameras vadību un citas iespējas
Tā kā abiem emulatoriem ir viena IP adrese (10.0.2.15), tiešs vienādranga savienojums, izmantojot STUN, nav iespējams. Katram testa izpildījumam jāiet caur Cloudflare TURN releju. Tas ir kaitinoši, taču noderīgi: sarežģītākais savienojuma ceļš tiek pārbaudīts katru reizi.
Ko es iemācījos
Veidojot pilnvērtīgu lietotni ar MI programmēšanas pārinieku, es iemācījos dažas lietas:
- Arhitektūra ir svarīgāka nekā jebkad. Skaidras vienošanās un labi dokumentēta koda bāze palīdz MI piedāvāt konsekventu kodu. Neskaidrība ātri kļūst dārga.
- Testēšana ir obligāta. MI ģenerētajam kodam nepieciešama tikpat rūpīga testēšana kā cilvēka rakstītam kodam. Automatizētie E2E testi atklāja problēmas, kuras manuālā testēšanā būtu bijis viegli nepamanīt.
- Cilvēks turpina kontrolēt procesu. Katrs arhitektūras lēmums, katrs drošības kompromiss un katra produkta robeža paliek manā ziņā. MI paātrina īstenošanu, bet neaizstāj spriestspēju.
- Ātrums ļauj sasniegt kvalitāti. Tā kā funkcijas tiek izlaistas stundās, nevis dienās, paliek vairāk iterāciju noslīpēšanai un kļūdu labošanai. Ātri ne vienmēr nozīmē labi.
Skats nākotnē
Baby Monitor Timmy turpina attīstīties. iOS versijas izlaišana gaidāma drīzumā; pēc tam sekos papildu sensoru funkcijas un pastāvīga drošības nostiprināšana. Darba process paliek līdzīgs: es nosaku virzienu un robežas, bet Copilot palīdz ātri īstenot un pārbaudīt.
Drošībai svarīgie pamatelementi tagad ir skaidri nodalīti publiskajā baby-monitor-timmy-core repozitorijā. Tur ir arī dokumentēti arhitektūras lēmumi par savienošanu pārī, signalizāciju un aizmugursistēmas saskarnēm.