# מערך שיעור: Kafka רב-שפתי — C# ו-Python📋 מערך מרצה

משך: 2 שעות אקדמיות (90 דקות).

מטרת השיעור: הסטודנטים יראו בפועל ש-Kafka לא תלוי בשפה, כהכנה לפרויקטים הצוותיים הרב-שפתיים בהמשך הקורס.

בסוף השיעור הסטודנטים צריכים: לכתוב Consumer בסיסי בPython שמאזין לTopic שProducer ב-C# יצר, ולהסביר את מושג ה-Message Contract.

דגש קריטי: זהו שיעור-גשר ליחידת ה-Python/Pandas הבאה — אין ציפייה לידע Python מוקדם, רק תחביר מינימלי לצורך Consumer בסיסי.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | הזכירו JSON כLanguage-Agnostic מהיחידה הראשונה |
| הרעיון: Kafka לא תלוי-שפה | 15 דקות | Producer C#, שאלה: איך Python "מדבר" איתו? |
| הדגמה חיה: Python Consumer | 30 דקות | כתיבה משותפת, תחביר בסיסי מוסבר תוך כדי |
| Message Contract | 15 דקות | הדגישו את החשיבות של תיאום שדות JSON |
| Consumer Group שונה = גם מקבל | 15 דקות | קישרו לשיעור הקודם |
| תרגול מודרך | 10 דקות | תרגיל 1 |

---

## דגשים להעברת השיעור

- הסטודנטים כנראה לא מכירים Python syntax עדיין — כתבו את הConsumer בPython **יחד** על הלוח/מסך, שורה-שורה, עם הסבר קצר לכל שורה (import, dict access עם `[]`, f-strings) — לא להניח היכרות מוקדמת.
- הדגישו שהמטרה כאן היא **לא** ללמד Python לעומק (זה מגיע ביחידה הבאה) — רק להראות שKafka עובד זהה מכל שפה.
- Message Contract שווה דיון קצר על תיעוד — איך צוות אמיתי היה מתעד/משתף מבנה JSON בין שירותים בשפות שונות (README משותף, JSON Schema, וכו').

---

## מושגים

**Language-Agnostic Protocol** — לא תלוי בשפת מימוש.
**Message Contract** — ההסכם על מבנה ההודעה.

---

## תרגיל חשיבה

**שאלת פתיחה:** "בפרויקט הצוותי שמגיע בהמשך הקורס, חבר בצוות שלכם יכתוב שירות בPython וחבר אחר בC#. אם תשנו שדה בהודעת JSON בלי לתאם, מה קורה לצד השני?"

**מהלך:** הובילו לתובנה: השירות השני (בשפה אחרת) לא יקבל שגיאת קומפילציה שמתריעה — הוא פשוט "לא ימצא" את השדה שציפה לו (`KeyError` בPython, או ערך `null`/`default` ב-C#), לרוב בזמן ריצה. זו בדיוק הסיבה שMessage Contract חייב להיות מתועד ומוסכם מראש בין הצוות, לא "מוסכם בעל פה".

**מה המרצה מראה בסוף:** שנו שדה בProducer C# (למשל שינוי שם `Total`→`TotalAmount`) בלי לעדכן את הConsumer בPython, והריצו — הראו את השגיאה/ההתנהגות המפתיעה שנוצרת. תקנו את שני הצדדים יחד ותנו לזרימה לעבוד תקין מחדש.
