Baby Monitor Timmy התחיל מרעיון פשוט: מוניטור תינוק שמכבד את הפרטיות בבית. בלי הקלטות בענן ובלי נתיבי מידע מיותרים שיוצאים מחדר התינוק. מה שאנשים רבים אינם רואים הוא שאני בונה את Timmy כפרויקט של אדם אחד בציריך, ו- GitHub Copilot הוא שותף התכנות המהיר מאוד שלי.
תהליך העבודה בין אדם לבינה מלאכותית
החלוקה ברורה: אני מגדיר פיצ'רים, קובע סדרי עדיפויות ומקבל החלטות ארכיטקטוניות. Copilot עוזר במימוש: כתיבת קוד, הוספת בדיקות, איתור ממוקד של תקלות והכנת שלבי ההפצה.
ספרינט טיפוסי אצלי נראה בערך כך:
- תיאור הפיצ'ר: אני מתאר מה הפיצ'ר אמור לעשות, כולל מקרי קצה ואילוצים.
- מימוש: Copilot מציע קוד ופועל לפי המוסכמות הקיימות בפרויקט.
- בדיקות: בדיקות מקצה לקצה אוטומטיות רצות על שני אמולטורים ובודקות את החיבור האמיתי בין המכשיר שבצד התינוק למכשיר שבצד ההורה.
- הפצה: כשהבדיקות עוברות, מכינים גרסאות Android ו-iOS לחנות המתאימה ולמסלולי הבדיקה המתאימים.
המחזור הזה חוזר על עצמו עבור פיצ'רים ותיקוני באגים. אני לא כותב בעצמי כל שורת קוד, אבל אני מחליט מה בונים, למה בונים אותו, והאם הצעה מתאימה ל-Timmy.
מהרעיון ל-WebRTC
המשימה הטכנית המרכזית הייתה ברורה מההתחלה: אודיו ווידאו בזמן אמת בין שני טלפונים. WebRTC הייתה הבחירה המתבקשת, אבל השילוב שלה עם Flutter אינו פשוט: מועמדי ICE, משא ומתן על SDP, מעבר ל-TURN כמסלול חלופי ו-DataChannels צריכים לעבוד יחד בסדר הנכון.
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. שם מתועדות גם ההחלטות הארכיטקטוניות הנוגעות לצימוד, לאיתות ולממשקי צד השרת.