Baby Monitor Timmy-ը սկսվեց պարզ գաղափարից՝ մանկական մոնիտոր, որը հարգում է տան անձնական տարածքը։ Ամպում ձայնագրություններ չկան, մանկասենյակից դուրս տանող տվյալների անհարկի ուղիներ էլ չկան։ Շատերը չեն տեսնում, որ ես Timmy-ը ստեղծում եմ որպես անհատական նախագիծ Ցյուրիխում, իսկ GitHub Copilot իմ շատ արագ զույգ ծրագրավորողն է։
Մարդու և ԱԲ-ի աշխատանքային հոսքը
Բաժանումը հստակ է․ ես եմ սահմանում գործառույթները, առաջնահերթությունները և ճարտարապետական որոշումները։ Copilot-ն օգնում է իրագործման հարցում՝ կոդ գրելով, թեստեր ավելացնելով, սխալների շրջանակը նեղացնելով և թողարկման քայլերը նախապատրաստելով։
Ինձ մոտ սովորական սպրինտը մոտավորապես այսպես է ընթանում․
- Գործառույթի նկարագրություն․ Նկարագրում եմ, թե գործառույթն ինչ պետք է անի՝ ներառյալ եզրային դեպքերն ու սահմանափակումները։
- Իրագործում․ Copilot-ն առաջարկում է կոդ և հետևում նախագծում արդեն ընդունված կանոններին։
- Թեստավորում․ Ավտոմատացված end-to-end թեստերը գործարկվում են երկու էմուլյատորի վրա և ստուգում երեխայի ու ծնողի սարքերի իրական կապը։
- Տարածում․ Երբ թեստերն անցնում են, Android և iOS տարբերակները նախապատրաստվում են համապատասխան խանութների և փորձարկման ալիքների համար։
Այս ցիկլը կրկնվում է նոր գործառույթների և սխալների շտկումների համար։ Ես անձամբ չեմ գրում յուրաքանչյուր տողը, բայց ես եմ որոշում՝ ինչը պետք է ստեղծվի, ինչու պետք է ստեղծվի, և արդյոք առաջարկը համապատասխանում է Timmy-ին։
Գաղափարից մինչև WebRTC
Կենտրոնական տեխնիկական խնդիրը հենց սկզբից պարզ էր՝ երկու հեռախոսի միջև իրական ժամանակում ձայն ու տեսանյութ փոխանցելը։ WebRTC-ն ակնհայտ ընտրություն էր, սակայն այն Flutter-ի հետ միացնելը պարզ չէ․ ICE թեկնածուները, SDP բանակցումը, TURN պահեստային տարբերակը և DataChannel-ները պետք է ճիշտ հերթականությամբ աշխատեն միասին։
Copilot-ն օգնեց ինձ այդ մասերը քայլ առ քայլ միացնել․ կարգավորել peer connection-ը, պահպանել կարևոր հերթականությունը (DataChannel-ը՝ offer-ից առաջ, onTrack-ը՝ setRemoteDescription-ից առաջ), և ազդանշանավորումն իրականացնել Firebase Firestore-ով։ Ամեն մաս պետք է աշխատեր երկու էմուլյատորի վրա, նախքան առաջ անցնելը։
Անվտանգ զուգակցում ECDH-ով
Ամենակարևոր գործառույթներից մեկը անվտանգ զուգակցման համակարգնէր։ Երկու սարք պետք է փոխադարձ վստահություն հաստատեն՝ առանց կենտրոնական սերվերի, որը կհաստատի նրանց ինքնությունը։ Լուծումը՝ Firebase-ով ECDH P-256 բանալիների փոխանակում՝ համակցված տեսողական ստուգման համարի (SAS) հետ, որը բացահայտում է միջնորդի միջոցով կատարվող հարձակումները։
Copilot-ն օգնեց իրականացնել ծածկագրային շղթան՝ բանալիների ստեղծում, հանրային բանալիների փոխանակում, ընդհանուր գաղտնիքի ստացում, SAS-ի հաշվարկ և AES-256-GCM կոդավորում հետագա բոլոր ազդանշանավորման տվյալների համար։ Ես զուգակցման բանալին backend չեմ ուղարկում․ Firestore փաստաթղթի նույնացուցիչ է օգտագործվում միայն դրա SHA-256 հեշը։
Անվտանգության աուդիտ․ խոցելիությունների հայտնաբերում և շտկում
ԱԲ-ի օգնությամբ մշակումն ինձ համար պարզապես ավելի արագ տպագրություն չէ։ Այն օգնում է նաև սխալները համակարգված որոնել։ Անվտանգության կենտրոնացված աուդիտային սպրինտի ընթացքում Copilot-ը վերլուծեց կոդային բազան և գտավ վեց խնդիր որ պետք էր շտկեմ․
- Ազդանշանավորման տվյալների մուտքային ստուգման բացակայություն
- ICE թեկնածուների մշակման հնարավոր մրցակցային պայմաններ
- Հնացած սեսիայի տվյալներ, որոնք պատշաճ չէին մաքրվում
- Firestore-ի չափազանց թույլ անվտանգության կանոններ
- Սերտիֆիկատի pinning-ի վերաբերյալ նկատառումների բացակայություն
- TURN հավատարմագրերի հոսքում սխալների ոչ բավարար մշակում
Բոլոր վեցը շտկվեցին նույն սպրինտի ընթացքում։ Այստեղ է Copilot-ի ուժեղ կողմը՝ շատ ֆայլեր կարդալը, օրինաչափությունները համեմատելը և այն տեղերը նշելը, որոնք պետք է ավելի ուշադիր ստուգեմ։
Կրկնվող սպրինտներ․ ինչպես զարգացավ հավելվածը
Timmy-ը զարգացավ արագ, բայց հստակ սահմանված սպրինտներով։ Ահա մի քանի կարևոր փուլեր․
- v1.8․ Զուգակցման ամբողջական վերանախագծում — Firebase-ով 4 նիշանոց կոդ + ECDH P-256-ը փոխարինեցին հին՝ ուղղակի բանալու մոտեցմանը։
- v1.10․ Անվտանգության ամրապնդման սպրինտ — վեց խոցելիությունների աուդիտի և շտկման ցիկլը։
- v1.11․ Մուգ ռեժիմ բոլոր էկրաններում, ինչպես նաև գլխավոր էջն ու բլոգը, որն այժմ կարդում եք։
- v1.12․ Ծնողի էկրանի մեծ վերանորոգում, գիշերային տեսողության ռեժիմ և շարժման հայտնաբերում՝ տեսախցիկի կադրերի վերլուծությամբ։
Յուրաքանչյուր սպրինտ հետևում է նույն հիմնական ընթացքին․ նկարագրել նպատակը, վերանայել առաջարկները, ավտոմատ թեստավորել, ապա ուղարկել փորձարկողներին։
E2E թեստավորում տարբեր սարքերում
Մանկական մոնիտորը ճիշտ չես կարող թեստավորել մեկ սարքով։ Ինձ պետք է մեկ երեխայի սարք և մեկ ծնողի սարք։ Նախագիծը սկսվեց երկու Android էմուլյատորների միաժամանակյա գործարկմամբ և այժմ այդ ընթացքը լրացնում է տեղային iOS սիմուլյատորով ու իրական սարքով ստուգումներով։ Android-ի ավտոմատացված թեստային սցենարը դեռևս՝
- Հավելվածը տեղադրում է երկու էմուլյատորների վրա
- Երկու սարքում անցնում է զուգակցման ընթացքը
- Ստուգում է, որ ձայնային և տեսահաղորդման կապերը հաստատվել են
- Թեստավորում է խոսելու համար սեղմելու գործառույթը, տեսախցիկի կառավարումը և այլ հնարավորությունները
Քանի որ երկու էմուլյատորներն ունեն նույն IP հասցեն (10.0.2.15), STUN-ի միջոցով ուղիղ peer-to-peer կապն անհնար է։ Յուրաքանչյուր թեստային գործարկում պետք է անցնի Cloudflare TURN ռելեյով։ Դա անհարմար է, բայց օգտակար․ ամեն անգամ թեստավորվում է կապի ամենաբարդ ուղին։
Ինչ եմ սովորել
ԱԲ-ի զույգ ծրագրավորողի հետ ամբողջական հավելված ստեղծելն ինձ մի քանի բան սովորեցրեց․
- Ճարտարապետությունն ավելի կարևոր է, քան երբևէ։ Հստակ կանոնները և լավ փաստագրված կոդային բազան օգնում են ԱԲ-ին հետևողական կոդ առաջարկել։ Անորոշությունը շատ արագ թանկ է դառնում։
- Թեստավորումը քննարկման ենթակա չէ։ ԱԲ-ի ստեղծած կոդը նույն խիստ թեստավորումն է պահանջում, ինչ մարդու գրած կոդը։ Ավտոմատացված E2E թեստերը բռնեցին խնդիրներ, որոնք ձեռքով ստուգելիս հեշտ էր բաց թողնել։
- Մարդը մնում է գործընթացում։ Յուրաքանչյուր ճարտարապետական որոշում, անվտանգության յուրաքանչյուր փոխզիջում և արտադրանքի յուրաքանչյուր սահման մնում է ինձ վրա։ ԱԲ-ն արագացնում է իրագործումը, բայց չի փոխարինում դատողությանը։
- Արագությունը նպաստում է որակին։ Քանի որ գործառույթները թողարկվում են օրերի փոխարեն ժամերի ընթացքում, ավելի շատ կրկնություններ են մնում մանրակրկիտ մշակման և սխալների շտկման համար։ Արագը ինքնին լավ չի նշանակում։
Ապագային նայելով
Baby Monitor Timmy-ը շարունակում է զարգանալ։ iOS-ի թողարկումը մոտ է, իսկ դրանից հետո կավելանան սենսորային նոր գործառույթներ և անվտանգությունը կշարունակի ամրապնդվել։ Աշխատանքի ընթացքը կմնա նման․ ես եմ սահմանում ուղղությունն ու սահմանները, իսկ Copilot-ն օգնում է արագ իրագործել և ստուգել։
Անվտանգությանը վերաբերող կառուցվածքային բաղադրիչներն այժմ տեղակայված են հստակ սահմանների մեջ՝ հանրային baby-monitor-timmy-core պահոցում։ Այդտեղ նաև փաստագրված են զուգակցման, ազդանշանավորման և backend-ի միջերեսների ճարտարապետական որոշումները։