Baby Monitor Timmy започна с проста идея: бебефон, който уважава личното пространство у дома. Без записи в облака и без излишни пътища за данните извън детската стая. Много хора не знаят, че разработвам Timmy сам в Цюрих, а GitHub Copilot е моят много бърз партньор за програмиране.
Работният процес между човека и AI
Разделението е ясно: аз определям функциите, подреждам приоритетите и вземам архитектурните решения. Copilot помага с изпълнението: писане на код, добавяне на тестове, стесняване на причините за бъгове и подготовка на стъпките за издаване.
Един типичен спринт при мен горе-долу изглежда така:
- Описание на функцията: Описвам какво трябва да прави функцията, включително граничните случаи и ограниченията.
- Изпълнение: Copilot предлага код и следва установените конвенции на проекта.
- Тестване: Автоматизирани end-to-end тестове се изпълняват на два емулатора и проверяват реалната връзка между бебешкото и родителското устройство.
- Разпространение: Когато тестовете минат, се подготвят версии за 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.
Одит на сигурността: откриване и отстраняване на уязвимости
Разработването с помощта на AI не означава за мен само по-бързо писане. То помага и за систематично търсене на бъгове. В рамките на фокусиран спринт за одит на сигурността Copilot анализира кодовата база и откри шест проблема които трябваше да поправя:
- Липсваща проверка на входните данни за сигнализация
- Възможни състояния на съревнование при обработката на ICE кандидатите
- Остарели данни за сесии, които не се изчистваха правилно
- Прекалено разрешаващи правила за сигурност във Firestore
- Липса на оценка дали е необходимо фиксиране на сертификати
- Недостатъчна обработка на грешки при TURN идентификационните данни
И шестте бяха поправени в същия спринт. Тук Copilot е силен: чете много файлове, сравнява модели и отбелязва местата, които трябва да прегледам по-внимателно.
Итеративни спринтове: как се разви приложението
Timmy се разви чрез бързи, но ясно ограничени спринтове. Някои важни етапи:
- v1.8: Цялостно преработване на сдвояването — 4-символен код + ECDH P-256 през Firebase замениха стария подход с директен ключ.
- v1.10: Спринт за повишаване на сигурността — одитът на шестте уязвимости и цикълът по отстраняването им.
- v1.11: Тъмен режим на всички екрани, плюс началната страница и блога, който четете в момента.
- v1.12: Основно обновяване на родителския екран, режим за нощно виждане и засичане на движение чрез анализ на кадрите от камерата.
Всеки спринт следва един и същ основен модел: описвам целта, преглеждам предложенията, тествам автоматично и след това изпращам версията на тестери.
E2E тестване между устройства
Не можете да тествате правилно бебефон само на едно устройство. Трябват ми едно бебешко устройство и едно родителско устройство. Проектът започна с два Android емулатора, работещи едновременно, а сега допълва този процес с проверки на локален iOS симулатор и реални устройства. Автоматизираният Android тестов скрипт все още:
- Инсталира приложението на двата емулатора
- Преминава през сдвояването и на двете устройства
- Проверява дали са установени аудио и видео връзки
- Тества функцията „натисни, за да говориш“, управлението на камерата и други функции
Тъй като двата емулатора споделят един и същ IP адрес (10.0.2.15), директна peer-to-peer връзка чрез STUN е невъзможна. Всеки тест трябва да мине през релейния сървър Cloudflare TURN. Това е досадно, но полезно: най-сложният път за свързване се тества всеки път.
Какво научих
Създаването на цялостно приложение с AI партньор за програмиране ме научи на няколко неща:
- Архитектурата е по-важна от всякога. Ясните конвенции и добре документираната кодова база помагат на AI да предлага последователен код. Неяснотите бързо стават скъпи.
- Тестването не подлежи на компромис. Кодът, генериран от AI, се нуждае от същото строго тестване като написания от човек код. Автоматизираните E2E тестове уловиха проблеми, които лесно биха останали незабелязани при ръчно тестване.
- Човекът остава в процеса. Всяко архитектурно решение, всеки компромис със сигурността и всяка граница на продукта остават моя отговорност. AI ускорява изпълнението, но не замества преценката.
- Скоростта дава възможност за качество. Тъй като функциите се пускат за часове вместо за дни, остава повече време за итерации, изпипване и поправяне на бъгове. Бързото не означава автоматично добро.
Какво предстои
Baby Monitor Timmy продължава да се развива. Излизането на версията за iOS наближава; след това предстоят допълнителни функции, използващи сензорите, и непрекъснато подобряване на сигурността. Работният процес остава подобен: аз задавам посоката и границите, а Copilot помага за бързото реализиране и проверка.
Компонентите, важни за сигурността, вече се намират зад ясно определени граници в публичното хранилище baby-monitor-timmy-core. Там са документирани и архитектурните решения за сдвояването, сигнализацията и интерфейсите към бекенда.