Baby Monitor Timmy მარტივი იდეით დაიწყო: ბავშვის მონიტორი, რომელიც სახლში კონფიდენციალურობას პატივს სცემს. ღრუბელში ჩაწერები არ არის და ბავშვის ოთახიდან მონაცემები ზედმეტი გზებით არ გადის. რასაც ბევრი ვერ ხედავს: Timmy-ს ციურიხში მარტო ვქმნი და GitHub Copilot ჩემი ძალიან სწრაფი პროგრამირების პარტნიორია.
ადამიანი–AI-ის სამუშაო პროცესი
როლები მკაფიოდ არის გაყოფილი: ფუნქციებს მე განვსაზღვრავ, პრიორიტეტებს ვადგენ და არქიტექტურულ გადაწყვეტილებებს ვიღებ. 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-ით
ერთ-ერთი ყველაზე კრიტიკული ფუნქცია იყო უსაფრთხო დაწყვილების სისტემა. ორმა მოწყობილობამ ერთმანეთის მიმართ ნდობა ისე უნდა დაამყაროს, რომ მათი იდენტობის დასადასტურებლად ცენტრალურ სერვერს არ დაეყრდნოს. გამოსავალია ECDH P-256 გასაღებების გაცვლა Firebase-ის მეშვეობით, ვიზუალური გადამოწმების ნომერთან (SAS) ერთად, რომელიც „შუაში მდგომი პირის“ ტიპის შეტევებს ამოიცნობს.
Copilot დამეხმარა კრიპტოგრაფიული ჯაჭვის იმპლემენტაციაში: გასაღების გენერირება, საჯარო გასაღებების გაცვლა, საერთო საიდუმლოს მიღება, SAS-ის გამოთვლა და AES-256-GCM შიფრაცია ყველა შემდგომი სიგნალიზაციის მონაცემისთვის. დაწყვილების გასაღებს backend-ზე არ ვაგზავნი; Firestore დოკუმენტის იდენტიფიკატორად მხოლოდ მისი SHA-256 ჰეში გამოიყენება.
უსაფრთხოების აუდიტი: მოწყვლადობების აღმოჩენა და გამოსწორება
AI-ის დახმარებით პროგრამული უზრუნველყოფის შექმნა ჩემთვის მხოლოდ სწრაფად აკრეფას არ ნიშნავს. ის სისტემურად ხარვეზების მოძიებაშიც მეხმარება. უსაფრთხოების აუდიტის მიზნობრივ სპრინტში Copilot-მა კოდის ბაზა გააანალიზა და აღმოაჩინა ექვსი პრობლემა , რომლებიც უნდა გამომესწორებინა:
- სიგნალიზაციის მონაცემების შეყვანის ვალიდაციის ნაკლებობა
- შესაძლო race condition-ები ICE კანდიდატების დამუშავებისას
- მოძველებული სესიის მონაცემები, რომლებიც სათანადოდ არ იწმინდებოდა
- Firestore-ის უსაფრთხოების ზედმეტად ნებადამრთველი წესები
- სერტიფიკატის pinning-თან დაკავშირებული საკითხების გამოტოვება
- შეცდომების არასაკმარისი დამუშავება TURN credentials-ის პროცესში
ექვსივე პრობლემა იმავე სპრინტში გამოსწორდა. აქ არის Copilot ძლიერი: ბევრ ფაილს კითხულობს, შაბლონებს ადარებს და მონიშნავს ადგილებს, რომლებიც უფრო ყურადღებით უნდა შევამოწმო.
განმეორებადი სპრინტები: როგორ განვითარდა აპი
Timmy სწრაფი, თუმცა მკაფიო საზღვრებით გაწერილი სპრინტებით გაიზარდა. რამდენიმე მნიშვნელოვანი ეტაპი:
- v1.8: დაწყვილების სრული გადამუშავება — Firebase-ის მეშვეობით 4-სიმბოლოიანმა კოდმა და ECDH P-256-მა ძველი, პირდაპირ გასაღებზე დაფუძნებული მიდგომა ჩაანაცვლა.
- v1.10: უსაფრთხოების გამყარების სპრინტი — ექვსი მოწყვლადობის აუდიტი და გამოსწორების ციკლი.
- v1.11: მუქი რეჟიმი ყველა ეკრანზე, ასევე მთავარი გვერდი და ბლოგი, რომელსაც ახლა კითხულობთ.
- v1.12: მშობლის ეკრანის მნიშვნელოვანი განახლება, ღამის ხედვის რეჟიმი და მოძრაობის ამოცნობა კამერის კადრების ანალიზით.
ყველა სპრინტი ერთსა და იმავე ძირითად სქემას მიჰყვება: მიზნის აღწერა, შემოთავაზებების გადახედვა, ავტომატური ტესტირება და შემდეგ ტესტერებისთვის გამოშვება.
E2E ტესტირება მოწყობილობებს შორის
ბავშვის მონიტორს ერთ მოწყობილობაზე სათანადოდ ვერ დატესტავ. მჭირდება ერთი მოწყობილობა ბავშვის მხარეს და ერთი — მშობლის მხარეს. პროექტი ერთდროულად გაშვებული ორი Android ემულატორით დაიწყო, ახლა კი ამ პროცესს ადგილობრივ iOS სიმულატორსა და რეალურ მოწყობილობებზე შემოწმებაც ავსებს. Android-ის ავტომატური ტესტირების სკრიპტი კვლავ:
- აყენებს აპს ორივე ემულატორზე
- ორივე მოწყობილობაზე გადის დაწყვილების პროცესს
- ამოწმებს, რომ აუდიო და ვიდეო კავშირები დამყარდა
- ტესტავს push-to-talk-ს, კამერის მართვასა და სხვა ფუნქციებს
რადგან ორივე ემულატორი ერთსა და იმავე IP მისამართს იყენებს (10.0.2.15), პირდაპირი peer-to-peer კავშირი STUN-ის საშუალებით შეუძლებელია. ყოველი ტესტი Cloudflare TURN relay-ის გავლით უნდა შესრულდეს. ეს შემაწუხებელია, მაგრამ სასარგებლოც: კავშირის ყველაზე რთული გზა ყოველ ჯერზე იტესტება.
რა ვისწავლე
სრულფასოვანი აპის AI პროგრამირების პარტნიორთან ერთად შექმნამ რამდენიმე რამ მასწავლა:
- არქიტექტურა ახლა უფრო მნიშვნელოვანია, ვიდრე ოდესმე. მკაფიო წესები და კარგად დოკუმენტირებული კოდის ბაზა AI-ს თანმიმდევრული კოდის შეთავაზებაში ეხმარება. გაურკვევლობა სწრაფად ძვირი ჯდება.
- ტესტირება აუცილებელია. AI-ის მიერ გენერირებულ კოდს ისეთივე მკაცრი ტესტირება სჭირდება, როგორც ადამიანის დაწერილს. ავტომატურმა E2E ტესტებმა გამოავლინა პრობლემები, რომელთა ხელით შემოწმებისას გამოტოვებაც ადვილი იქნებოდა.
- ადამიანი პროცესში რჩება. ყოველი არქიტექტურული გადაწყვეტილება, უსაფრთხოებასთან დაკავშირებული ყოველი კომპრომისი და პროდუქტის ყოველი საზღვარი ჩემთან რჩება. AI აჩქარებს იმპლემენტაციას, მაგრამ განსჯას ვერ ანაცვლებს.
- სიჩქარე ხარისხს უწყობს ხელს. რადგან ფუნქციები დღეების ნაცვლად საათებში გამოდის, მეტი გამეორებითი ეტაპი რჩება დახვეწისა და ხარვეზების გამოსასწორებლად. სწრაფი ავტომატურად კარგს არ ნიშნავს.
მომავლისკენ
Baby Monitor Timmy განვითარებას განაგრძობს. iOS-ის გამოშვება ახლოსაა; შემდეგ დაემატება სენსორებთან დაკავშირებული ფუნქციები და გაგრძელდება უსაფრთხოების გამყარება. სამუშაო პროცესი მსგავსი რჩება: მიმართულებასა და საზღვრებს მე ვადგენ, Copilot კი სწრაფ იმპლემენტაციასა და შემოწმებაში მეხმარება.
უსაფრთხოებასთან დაკავშირებული ძირითადი კომპონენტები ახლა მოთავსებულია მკაფიო საზღვრებში საჯარო baby-monitor-timmy-core რეპოზიტორიაში. იქვეა დოკუმენტირებული არქიტექტურული გადაწყვეტილებები დაწყვილების, სიგნალიზაციისა და backend-ის ინტერფეისების შესახებ.