Baby Monitor Timmy ایک سادہ خیال سے شروع ہوا: ایسا بیبی مانیٹر جو گھر میں رازداری کا احترام کرے۔ کوئی کلاؤڈ ریکارڈنگ نہیں، اور بچے کے کمرے سے ڈیٹا باہر لے جانے والے کوئی غیر ضروری راستے نہیں۔ بہت سے لوگوں کو یہ بات معلوم نہیں: میں Timmy کو زیورخ میں اکیلے بناتا ہوں، اور GitHub Copilot میرا بہت تیز رفتار پیئر پروگرامر ہے۔
انسان اور AI کا ورک فلو
تقسیم بالکل واضح ہے: فیچرز کی وضاحت، ترجیحات طے کرنا اور آرکیٹیکچر کے فیصلے میں کرتا ہوں۔ Copilot عمل درآمد میں مدد دیتا ہے: کوڈ لکھنے، ٹیسٹ شامل کرنے، بگز کو محدود کرنے اور ریلیز کے مراحل تیار کرنے میں۔
میرا ایک عام اسپرنٹ تقریباً یوں ہوتا ہے:
- فیچر کی تفصیل: میں بتاتا ہوں کہ فیچر کو کیا کرنا چاہیے، جس میں غیر معمولی صورتیں اور پابندیاں بھی شامل ہوتی ہیں۔
- عمل درآمد: Copilot کوڈ تجویز کرتا ہے اور پروجیکٹ کے موجودہ طریقوں کے مطابق چلتا ہے۔
- ٹیسٹنگ: خودکار اینڈ ٹو اینڈ ٹیسٹ دو ایمولیٹرز پر چلتے ہیں اور بچے اور والدین والی ڈیوائسز کے درمیان حقیقی کنکشن کو جانچتے ہیں۔
- تقسیم: ٹیسٹ پاس ہونے پر Android اور iOS بلڈز درست اسٹور اور ٹیسٹنگ ٹریکس کے لیے تیار کی جاتی ہیں۔
یہ چکر فیچرز اور بگ فکسز کے لیے دہرایا جاتا ہے۔ میں ہر سطر خود نہیں لکھتا، مگر میں فیصلہ کرتا ہوں کیا بنایا جائے، کیوں بنایا جائے، اور آیا کوئی تجویز Timmy کے لیے موزوں ہے یا نہیں۔
تصور سے WebRTC تک
مرکزی تکنیکی کام ابتدا ہی سے واضح تھا: دو فونز کے درمیان ریئل ٹائم آڈیو اور ویڈیو۔ WebRTC واضح انتخاب تھا، مگر اسے Flutter کے ساتھ شامل کرنا آسان نہیں: ICE candidates، SDP negotiation، TURN fallback، اور DataChannels کو درست ترتیب میں ساتھ کام کرنا ہوتا ہے۔
Copilot نے ان حصوں کو قدم بہ قدم جوڑنے میں میری مدد کی: peer connection سیٹ اپ کرنا، اہم ترتیب درست رکھنا (offer سے پہلے DataChannel، setRemoteDescription سے پہلے onTrack)، اور signaling کو Firebase Firestore پر رکھنا۔ آگے بڑھنے سے پہلے ہر حصہ دو ایمولیٹرز پر چلنا ضروری تھا۔
ECDH کے ساتھ محفوظ پیئرنگ
سب سے اہم فیچرز میں سے ایک محفوظ پیئرنگ سسٹمتھا۔ دو ڈیوائسز کو اپنی شناخت کی تصدیق کے لیے کسی مرکزی سرور پر انحصار کیے بغیر باہمی اعتماد قائم کرنا ہوتا ہے۔ حل: Firebase کے ذریعے ECDH P-256 key exchange، جس کے ساتھ ایک بصری تصدیقی نمبر (SAS) ہے جو man-in-the-middle حملوں کو پکڑتا ہے۔
Copilot نے کرپٹوگرافک سلسلہ نافذ کرنے میں مدد کی: key generation، public key exchange، shared secret derivation، SAS computation، اور بعد کے تمام signaling ڈیٹا کے لیے AES-256-GCM encryption۔ میں pairing key بیک اینڈ کو نہیں بھیجتا؛ صرف اس کا SHA-256 hash ہی Firestore document identifier کے طور پر استعمال ہوتا ہے۔
سیکیورٹی آڈٹ: کمزوریاں تلاش کرنا اور درست کرنا
میرے لیے AI کی مدد سے ڈیویلپمنٹ صرف تیزی سے ٹائپ کرنا نہیں ہے۔ یہ منظم انداز میں بگز ڈھونڈنے میں بھی مدد دیتی ہے۔ سیکیورٹی آڈٹ کے ایک مرکوز اسپرنٹ میں Copilot نے کوڈ بیس کا تجزیہ کیا اور چھ مسائل تلاش کیے جنہیں مجھے ٹھیک کرنا تھا:
- signaling ڈیٹا پر input validation کی کمی
- ICE candidate handling میں ممکنہ race conditions
- پرانا session data جو صحیح طور پر صاف نہیں ہو رہا تھا
- Firestore کے سیکیورٹی قواعد جو ضرورت سے زیادہ کھلے تھے
- certificate pinning سے متعلق ضروری غور کی کمی
- TURN credential flow میں ناکافی error handling
چھوں مسائل اسی اسپرنٹ میں درست کر دیے گئے۔ Copilot کی طاقت یہی ہے: بہت سی فائلیں پڑھنا، پیٹرنز کا موازنہ کرنا، اور ان جگہوں کو نشان زد کرنا جنہیں مجھے زیادہ غور سے دیکھنا ہو۔
بار بار کے اسپرنٹس: ایپ کیسے بہتر ہوئی
Timmy تیز لیکن واضح حدود والے اسپرنٹس کے ذریعے بڑھا۔ چند سنگِ میل:
- v1.8: پیئرنگ کا مکمل نیا ڈیزائن — Firebase کے ذریعے 4-character code + ECDH P-256 نے پرانے direct-key طریقے کی جگہ لے لی۔
- v1.10: سیکیورٹی مضبوط بنانے کا اسپرنٹ — چھ کمزوریوں کا آڈٹ اور انہیں درست کرنے کا چکر۔
- v1.11: تمام اسکرینز پر ڈارک موڈ، ساتھ ہی وہ ہوم پیج اور بلاگ جو آپ ابھی پڑھ رہے ہیں۔
- v1.12: والدین کی اسکرین میں بڑی تبدیلی، نائٹ وژن موڈ، اور کیمرہ فریم تجزیے کے ذریعے حرکت کی شناخت۔
ہر اسپرنٹ ایک ہی بنیادی انداز پر چلتا ہے: ہدف بیان کریں، تجاویز کا جائزہ لیں، خودکار ٹیسٹ کریں، پھر ٹیسٹرز کو بھیجیں۔
ڈیوائسز کے درمیان E2E ٹیسٹنگ
آپ ایک ڈیوائس پر بیبی مانیٹر کو صحیح طرح ٹیسٹ نہیں کر سکتے۔ مجھے ایک بچے کی ڈیوائس اور ایک والدین کی ڈیوائس درکار ہوتی ہے۔ پروجیکٹ کا آغاز بیک وقت چلنے والے دو Android ایمولیٹرز سے ہوا تھا، اور اب اس عمل میں مقامی iOS simulator اور حقیقی ڈیوائس کی جانچ بھی شامل ہے۔ خودکار Android test script اب بھی:
- دونوں ایمولیٹرز پر ایپ انسٹال کرتا ہے
- دونوں ڈیوائسز پر پیئرنگ کے مراحل سے گزرتا ہے
- تصدیق کرتا ہے کہ آڈیو اور ویڈیو کنکشن قائم ہو گئے ہیں
- push-to-talk، کیمرہ کنٹرول اور دیگر فیچرز ٹیسٹ کرتا ہے
چونکہ دونوں ایمولیٹرز ایک ہی IP address شیئر کرتے ہیں (10.0.2.15)، اس لیے STUN کے ذریعے براہِ راست peer-to-peer کنکشن ناممکن ہے۔ ہر ٹیسٹ رن کو Cloudflare TURN relay سے گزرنا ہوتا ہے۔ یہ پریشان کن ہے، مگر مفید بھی: ہر بار سب سے پیچیدہ کنکشن راستہ ٹیسٹ ہو جاتا ہے۔
میں نے کیا سیکھا
AI پیئر پروگرامر کے ساتھ ایک مکمل ایپ بنانے سے میں نے چند باتیں سیکھیں:
- آرکیٹیکچر پہلے سے بھی زیادہ اہم ہے۔ واضح اصول اور اچھی طرح دستاویزی کوڈ بیس AI کو یکساں کوڈ تجویز کرنے میں مدد دیتے ہیں۔ ابہام جلد مہنگا پڑتا ہے۔
- ٹیسٹنگ پر سمجھوتہ نہیں ہو سکتا۔ AI سے بنے کوڈ کو بھی انسان کے لکھے کوڈ جتنی سخت ٹیسٹنگ درکار ہوتی ہے۔ خودکار E2E ٹیسٹس نے ایسے مسائل پکڑے جو دستی طور پر آسانی سے نظر انداز ہو جاتے۔
- انسان عمل میں شامل رہتا ہے۔ ہر آرکیٹیکچرل فیصلہ، ہر سیکیورٹی سمجھوتا، اور پروڈکٹ کی ہر حد میرے اختیار میں رہتی ہے۔ AI عمل درآمد کو تیز کرتا ہے، مگر فیصلہ سازی کی جگہ نہیں لے سکتا۔
- رفتار معیار کو ممکن بناتی ہے۔ جب فیچرز دنوں کے بجائے گھنٹوں میں جاری ہوتے ہیں، تو نفاست اور بگ فکسنگ کے لیے مزید iterations باقی رہتے ہیں۔ تیز ہونے کا مطلب خودبخود اچھا ہونا نہیں۔
آگے کی طرف
Baby Monitor Timmy مسلسل بہتر ہو رہا ہے۔ iOS ریلیز قریب ہے؛ اس کے بعد مزید sensor features اور سیکیورٹی کو مسلسل مضبوط کرنا ہوگا۔ ورک فلو ویسا ہی رہے گا: سمت اور حدود میں طے کرتا ہوں، Copilot تیزی سے عمل درآمد اور جانچ میں مدد کرتا ہے۔
سیکیورٹی سے متعلق اہم building blocks اب واضح حدود کے تحت عوامی baby-monitor-timmy-core repositoryمیں موجود ہیں۔ پیئرنگ، signaling اور backend interfaces سے متعلق آرکیٹیکچر کے فیصلے بھی وہیں دستاویزی ہیں۔