Baby Monitor Timmy пачаўся з простай ідэі: відэаняня, якая паважае прыватнасць дома. Ніякіх запісаў у воблаку, ніякіх непатрэбных шляхоў перадачы даных з дзіцячага пакоя. Чаго многія не бачаць: я ствараю Timmy як самастойны праект у Цюрыху, і GitHub Copilot — мой вельмі хуткі напарнік па праграмаванні.
Як працуюць разам чалавек і ШІ
Падзел выразны: я вызначаю функцыі, расстаўляю прыярытэты і прымаю архітэктурныя рашэнні. Copilot дапамагае з рэалізацыяй: піша код, дадае тэсты, дапамагае лакалізаваць памылкі і рыхтуе крокі да рэлізу.
Звычайны спрынт у мяне выглядае прыкладна так:
- Апісанне функцыі: Я апісваю, што мусіць рабіць функцыя, у тым ліку нестандартныя выпадкі і абмежаванні.
- Рэалізацыя: Copilot прапануе код і прытрымліваецца існых правілаў праекта.
- Тэставанне: Аўтаматызаваныя скразныя тэсты запускаюцца на двух эмулятарах і правяраюць рэальнае злучэнне паміж дзіцячай і бацькоўскай прыладамі.
- Распаўсюджванне: Калі тэсты праходзяць, зборкі Android і iOS рыхтуюцца для патрэбнай крамы і каналаў тэставання.
Гэты цыкл паўтараецца для новых функцый і выпраўленняў памылак. Я не пішу кожны радок сам, але вырашаю, што будзе створана, чаму гэта трэба ствараць і ці падыходзіць прапанова для Timmy.
Ад ідэі да WebRTC
Галоўная тэхнічная задача была зразумелая ад пачатку: аўдыё і відэа ў рэальным часе паміж двума тэлефонамі. WebRTC быў відавочным выбарам, але інтэграваць яго з Flutter няпроста: кандыдаты ICE, узгадненне SDP, рэзервовае злучэнне праз TURN і DataChannels павінны працаваць разам у правільнай паслядоўнасці.
Copilot дапамагаў мне паступова злучыць гэтыя часткі: наладзіць peer connection, захаваць крытычную паслядоўнасць (DataChannel перад offer, onTrack перад setRemoteDescription) і размясціць сігналізацыю ў Firebase Firestore. Кожная частка мусіла працаваць на двух эмулятарах, перш чым я ішоў далей.
Бяспечнае спалучэнне з ECDH
Адной з самых крытычна важных функцый была сістэма бяспечнага спалучэння прылад. Дзве прылады павінны ўсталяваць узаемны давер, не абапіраючыся на цэнтральны сервер, які пацвярджаў бы іх асобу. Рашэнне: абмен ключамі ECDH P-256 праз Firebase разам з візуальным нумарам праверкі (SAS), які выяўляе атакі «чалавек пасярэдзіне».
Copilot дапамог рэалізаваць крыптаграфічны ланцужок: генерацыю ключоў, абмен публічнымі ключамі, атрыманне агульнага сакрэту, разлік SAS і шыфраванне AES-256-GCM усіх наступных даных сігналізацыі. Я не адпраўляю ключ спалучэння на бэкенд; толькі яго хэш SHA-256 выкарыстоўваецца як ідэнтыфікатар дакумента Firestore.
Аўдыт бяспекі: пошук і выпраўленне ўразлівасцяў
Распрацоўка з дапамогай ШІ для мяне — гэта не толькі хутчэйшы набор кода. Яна таксама дапамагае сістэмна шукаць памылкі. Падчас мэтанакіраванага спрынту па аўдыце бяспекі Copilot прааналізаваў кодавую базу і выявіў шэсць праблем якія мне трэба было выправіць:
- Адсутнасць праверкі ўваходных даных сігналізацыі
- Магчымыя гонкі ў апрацоўцы кандыдатаў ICE
- Састарэлыя даныя сесіі, якія не ачышчаліся належным чынам
- Занадта дазвольныя правілы бяспекі Firestore
- Недастатковая ўвага да пінінгу сертыфікатаў
- Недастатковая апрацоўка памылак у працэсе выдачы ўліковых даных TURN
Усе шэсць былі выпраўленыя ў тым жа спрынце. Тут Copilot асабліва моцны: ён чытае шмат файлаў, параўноўвае шаблоны і пазначае месцы, якія мне трэба ўважліва праверыць.
Ітэрацыйныя спрынты: як развівалася праграма
Timmy рос праз хуткія, але выразна абмежаваныя спрынты. Некалькі вех:
- v1.8: Поўная перапрацоўка спалучэння прылад — 4-знакавы код + ECDH P-256 праз Firebase замянілі стары падыход з прамым ключом.
- v1.10: Спрынт па ўзмацненні бяспекі — цыкл аўдыту і выпраўлення шасці ўразлівасцяў.
- v1.11: Цёмная тэма на ўсіх экранах, а таксама галоўная старонка і блог, які вы зараз чытаеце.
- v1.12: Вялікае абнаўленне бацькоўскага экрана, рэжым начнога бачання і выяўленне руху праз аналіз кадраў камеры.
Кожны спрынт ідзе па адной базавай схеме: апісаць мэту, прагледзець прапановы, аўтаматычна пратэставаць, а потым адправіць тэстарам.
E2E-тэставанне на розных прыладах
Нельга належным чынам пратэставаць відэаняню на адной прыладзе. Мне патрэбныя дзіцячая і бацькоўская прылады. Праект пачынаўся з двух адначасова запушчаных эмулятараў Android, а цяпер гэты цыкл дапаўняюць праверкі ў лакальным сімулятары iOS і на рэальных прыладах. Аўтаматызаваны скрыпт Android па-ранейшаму:
- Усталёўвае праграму на абодва эмулятары
- Праходзіць спалучэнне на абедзвюх прыладах
- Правярае, што аўдыё- і відэазлучэнні ўсталяваны
- Тэстуе push-to-talk, кіраванне камерай і іншыя функцыі
Паколькі абодва эмулятары маюць адзін IP-адрас (10.0.2.15), прамое злучэнне peer-to-peer праз STUN немагчыма. Кожны запуск тэсту мусіць праходзіць праз рэтранслятар Cloudflare TURN. Гэта нязручна, але карысна: кожны раз тэстуецца найбольш складаны шлях злучэння.
Чаму я навучыўся
Стварэнне поўнай праграмы з ШІ-напарнікам па праграмаванні навучыла мяне некалькім рэчам:
- Архітэктура важнейшая, чым калі-небудзь. Ясныя правілы і добра задакументаваная кодавая база дапамагаюць ШІ прапаноўваць паслядоўны код. Неадназначнасць хутка становіцца дарагой.
- Тэставанне не абмяркоўваецца. Код, згенераваны ШІ, патрабуе такога ж строгага тэставання, як і код, напісаны чалавекам. Аўтаматызаваныя E2E-тэсты выявілі праблемы, якія лёгка было б не заўважыць пры ручной праверцы.
- Чалавек застаецца ў працэсе. Кожнае архітэктурнае рашэнне, кожны кампраміс у бяспецы і кожная мяжа прадукту застаюцца за мной. ШІ паскарае рэалізацыю, але не замяняе чалавечага меркавання.
- Хуткасць дапамагае якасці. Калі функцыі выходзяць за гадзіны, а не за дні, застаецца больш ітэрацый на дапрацоўку і выпраўленне памылак. Хутка — не заўсёды добра.
Што далей
Baby Monitor Timmy працягвае развівацца. Рэліз для iOS ужо блізка; пасля яго з'явяцца дадатковыя функцыі датчыкаў і далейшае ўмацаванне бяспекі. Працэс застаецца падобным: я задаю кірунак і межы, а Copilot дапамагае хутка рэалізоўваць і правяраць.
Важныя для бяспекі кампаненты цяпер знаходзяцца ў выразна акрэсленых межах у публічным рэпазіторыі baby-monitor-timmy-core. Там таксама задакументаваныя архітэктурныя рашэнні наконт спалучэння прылад, сігналізацыі і бэкенд-інтэрфейсаў.