بدأ Baby Monitor Timmy بفكرة بسيطة: جهاز لمراقبة الطفل يحترم الخصوصية في المنزل. لا تسجيلات سحابية ولا نقل غير ضروري للبيانات إلى خارج غرفة الطفل. وما لا يعرفه كثيرون أنني أبني Timmy كمشروع فردي في زيورخ، و GitHub Copilot هو شريكي البرمجي فائق السرعة.
سير العمل بين الإنسان والذكاء الاصطناعي
التقسيم واضح: أحدد الميزات، وأرتب الأولويات، وأتخذ القرارات المعمارية. يساعد Copilot في التنفيذ: كتابة الكود، وإضافة الاختبارات، وحصر نطاق الأخطاء، وتحضير خطوات الإصدار.
تبدو دورة العمل المعتادة لدي تقريبًا هكذا:
- وصف الميزة: أصف ما ينبغي أن تفعله الميزة، بما في ذلك الحالات الاستثنائية والقيود.
- التنفيذ: يقترح Copilot الكود ويلتزم بالقواعد والأنماط المعتمدة في المشروع.
- الاختبار: تعمل اختبارات شاملة تلقائية على محاكيين وتتحقق من الاتصال الفعلي بين جهاز الطفل وجهاز الوالدين.
- التوزيع: عند نجاح الاختبارات، تُجهّز نسخ Android وiOS للمتجر وقنوات الاختبار المناسبة.
تتكرر هذه الدورة للميزات وإصلاحات الأخطاء. لا أكتب كل سطر بنفسي، لكنني أقرر ما الذي يتم بناؤه، ولماذا يتم بناؤه، وما إذا كان الاقتراح يناسب Timmy.
من الفكرة إلى WebRTC
كانت المهمة التقنية الأساسية واضحة منذ البداية: نقل الصوت والفيديو في الوقت الفعلي بين هاتفين. كان WebRTC الخيار الواضح، لكن دمجه مع Flutter ليس بسيطًا: يجب أن تعمل مرشّحات ICE، وتفاوض SDP، واللجوء الاحتياطي إلى TURN، وقنوات البيانات معًا بالترتيب الصحيح.
ساعدني Copilot على تجميع هذه الأجزاء خطوة بخطوة: إعداد اتصال الندّ بالندّ، والحفاظ على الترتيب الحاسم الصحيح (إنشاء DataChannel قبل العرض، واستدعاء 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 العام. وهناك أيضًا توثيق لقرارات البنية المعمارية المتعلقة بالاقتران والإشارات وواجهات الخلفية.