Baby Monitor Timmy با یک ایده ساده شروع شد: مانیتور کودکی که به حریم خصوصی در خانه احترام میگذارد. نه ضبط در فضای ابری، نه مسیرهای غیرضروری برای خروج داده از اتاق کودک. چیزی که خیلیها نمیبینند این است که Timmy را بهتنهایی در زوریخ میسازم و GitHub Copilot برنامهنویس همراه بسیار سریع من است.
فرایند کار انسان و هوش مصنوعی
تقسیم کار روشن است: قابلیتها را من تعریف میکنم، اولویتها را تعیین میکنم و درباره معماری تصمیم میگیرم. Copilot در پیادهسازی کمک میکند: نوشتن کد، افزودن تست، پیدا کردن دقیقتر باگها و آمادهسازی مراحل انتشار.
یک اسپرینت معمولی برای من تقریباً اینطور پیش میرود:
- شرح قابلیت: توضیح میدهم قابلیت باید چه کاری انجام دهد؛ از جمله حالتهای خاص و محدودیتها.
- پیادهسازی: Copilot کد پیشنهاد میدهد و از قراردادهای موجود پروژه پیروی میکند.
- تست: تستهای خودکار سرتاسری روی دو شبیهساز اجرا میشوند و اتصال واقعی دستگاه کودک و والد را بررسی میکنند.
- انتشار: وقتی تستها موفق باشند، بیلدهای Android و iOS برای فروشگاه و کانالهای تست مناسب آماده میشوند.
این چرخه برای قابلیتها و رفع باگها تکرار میشود. من همه خطوط کد را خودم نمینویسم، اما تصمیم میگیرم چه چیزی ساخته شود، چرا ساخته شود و آیا یک پیشنهاد با Timmy همخوانی دارد یا نه.
از ایده تا WebRTC
کار فنی اصلی از همان ابتدا روشن بود: صدا و ویدیوی لحظهای بین دو گوشی. WebRTC انتخاب واضحی بود، اما یکپارچهکردنش با Flutter ساده نیست: کاندیداهای ICE، مذاکره SDP، مسیر جایگزین TURN و DataChannelها باید به ترتیب درست با هم کار کنند.
Copilot کمک کرد این بخشها را قدمبهقدم کنار هم بگذارم: راهاندازی اتصال همتا، حفظ ترتیب حساس مراحل (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 همچنان:
- اپ را روی هر دو شبیهساز نصب میکند
- فرایند جفتسازی را روی هر دو دستگاه انجام میدهد
- بررسی میکند که اتصال صدا و ویدیو برقرار شده باشد
- قابلیت فشار برای صحبت، کنترل دوربین و دیگر قابلیتها را تست میکند
از آنجا که هر دو شبیهساز یک آدرس IP مشترک دارند (10.0.2.15)، اتصال مستقیم همتابههمتا از طریق STUN ممکن نیست. هر بار اجرای تست باید از رله Cloudflare TURN عبور کند. آزاردهنده است، اما مفید: پیچیدهترین مسیر اتصال هر بار تست میشود.
چیزهایی که یاد گرفتم
ساخت یک اپ کامل با یک برنامهنویس همراه هوش مصنوعی چند نکته به من یاد داد:
- معماری از همیشه مهمتر است. قراردادهای روشن و یک کدبیس با مستندات خوب، به هوش مصنوعی کمک میکنند کدی یکدست پیشنهاد دهد. ابهام خیلی زود پرهزینه میشود.
- تست قابل چشمپوشی نیست. کد تولیدشده با هوش مصنوعی به همان تستهای سختگیرانهای نیاز دارد که کد نوشتهشده توسط انسان نیاز دارد. تستهای خودکار E2E مشکلاتی را پیدا کردند که بهراحتی ممکن بود در بررسی دستی از چشم دور بمانند.
- انسان در چرخه میماند. هر تصمیم معماری، هر مصالحه امنیتی و هر مرز محصول با من میماند. هوش مصنوعی پیادهسازی را سریعتر میکند، اما جای قضاوت را نمیگیرد.
- سرعت، کیفیت را ممکن میکند. چون قابلیتها بهجای روزها در چند ساعت منتشر میشوند، زمان بیشتری برای تکرار، پرداخت نهایی و رفع باگ باقی میماند. سریعبودن خودبهخود بهمعنای خوببودن نیست.
نگاهی به آینده
Baby Monitor Timmy همچنان در حال پیشرفت است. انتشار iOS نزدیک است؛ پس از آن قابلیتهای حسگر بیشتر و تقویت مداوم امنیت میآیند. روند کار مشابه میماند: من جهت و مرزها را تعیین میکنم و Copilot کمک میکند سریع پیادهسازی و بررسی شوند.
اجزای سازنده مرتبط با امنیت اکنون زیر مرزهای روشن در مخزن عمومی baby-monitor-timmy-coreقرار دارند. تصمیمهای معماری مربوط به جفتسازی، سیگنالدهی و رابطهای بکاند نیز همانجا مستند شدهاند.