תקציר: החלפת מערכת מיושנת המבוססת על Excel באפליקציית ווב מודרנית. תחילת הפיתוח: פברואר 2026. בפרודקשן: החל מ-1 בספטמבר 2026. סטטוס: המערכת יציבה בפרודקשן ופועלת ללא תקלות; פיתוח פיצ'רים ומודולים
נוספים נמשך.
הקשר והבעיה
לאחר שהתחלתי לעבוד מול מרכז מדעי לפיזיקה וכימיה, גיליתי שהארגון עובד על מערכת ישנה המבוססת
על Excel. המערכת קרסה כל הזמן, נתקעה תחת עומס, וגרמה לכך ששינויים תפעוליים יומיומיים היו
כואבים ומועדים לטעויות.
היקף הפעילות:
26 בתי ספר שותפיםעד 50 שיעורים ביום105 קבוצות לימודמעבדות ייעודיותחילופי מורים תכופים, ביטולים ודחיות שיעוריםהזמנות ציוד
בדיוק בשל כך החלטתי לבנות מערכת שתהפוך את ניהול לוח הזמנים והמשאבים לאמין וצפוי יותר. בזמני
הפנוי מחוץ לעבודתי העיקרית פיתחתי מוצר עצמאי משלי — Scheduling System,
ובאמצע אוגוסט, ממש לפני תחילת שנת הלימודים החדשה, פרסתי והגדרתי עותק ייעודי של המערכת עבור
המרכז, ללא תשלום, כדי להקל על העבודה היומיומית של הקולגות.
הניסיון שלי עם בסיסי נתונים relational גיבש את העיקרון הארכיטקטוני המרכזי של הפרויקט: שינויים
בלוח הזמנים ובמשאבים צריכים להיות מטופלים כטרנזקציות, לא כעריכה פשוטה של טבלאות.
שלמות הנתונים הועברה לרמת בסיס הנתונים, היסטוריית השינויים נעשתה בלתי ניתנת לשינוי דרך
Audit Log, והארכיטקטורה מאפשרת לשחזר בבטחה את מצב לוח הזמנים ליום נתון.
התפקיד שלי
ארכיטקטורת מערכת ובסיס נתונים — תכננתי ארכיטקטורת בסיס נתונים מרובת סכמות, מודל הרשאות לפי תפקיד, לוגיקת פתרון קונפליקטים גמישה (חילוף מורה, העברת שיעור בין חדרים), פריסת מערכת שעות שנתית משבלונה שבועית עם שיבוץ חדרים אוטומטי לפי כללים מוגדרים, העברתי את כל האינווריאנטים העסקיים המרכזיים לרמת בסיס הנתונים (אילוצי טווחי-זמן מסוג GiST המונעים הזמנה כפולה), תמונות מצב טרנזקציוניות של סשני עריכה, ותורי אירועים.
שילוב קטלוג ציוד — שילבתי קטלוג ציוד אינטראקטיבי, כך שניתן לעקוב אחר הזמנת המורה לאורך כל שלבי הטיפול במערכת (dashboard המורה, dashboard הלבורנט, פאנל הניהול, והתראות הדוא"ל).
עיצוב UX וממשק — תכננתי ממשק משתמש פשוט ואינטואיטיבי.
לוחות תצוגה בזמן אמת — תכננתי לוחות תצוגה לתלמידים ולמורים (לוח המורים מציג מידע תפעולי נוסף).
DevOps ותשתיות — קונטיינריזציה ב-Docker, Nginx, פריסה דרך AWS EC2 + Cloudflare Tunnel, גיבויים אוטומטיים ל-S3, pipeline שליחת מיילים טרנזקציוני דרך Resend (עם אפשרות לשנות דינמית כללים עסקיים דרך פאנל הניהול).
Disaster Recovery — פיתחתי ובדקתי תהליך שחזור לאחר קריסה מוחלטת של המערכת (הקריסה דומתה לפי התהליך הבא: מחיקה מלאה של מופע השרת המקורי, יצירת אחד חדש (עדכון המערכת, התקנת הרכיבים הנדרשים), פריסת עותק חדש מ-GitHub + שחזור הגיבוי האחרון של בסיס הנתונים). בעקבות הבדיקה נכתב מדריך שחזור מפורט, שלב אחר שלב.
סקירת המערכת
4
סכמות בסיס נתונים (campus / laboratory / notifications / settings)
31
טבלאות בסכמת בסיס הנתונים
43
פונקציות PL/pgSQL — לוגיקה עסקית בבסיס הנתונים
655
קומיטים לאורך 9 חודשי פיתוח
391
בדיקות רגרסיה אוטומטיות לפני כל דיפלוי
24/7
זמינות מערכת הפרודקשן
מערכת ERP לניהול לוח הזמנים והפעילות התפעולית:
תבנית שנתית + לוח זמנים שנתי שנוצר אוטומטית
עריכת לוח זמנים ברמת היום עם freeze / unfreeze / rollback
חילופי מורים
ביטולים ודחיות שיעורים
יצירת שיעורים חדשים ופעילויות נוספות
תהליך הזמנת ציוד מעבדה
תור בקשות (עיקרון "חלון אחד")
התראות אימייל על כל אירוע מרכזי — שינויים בלוח הזמנים, שינוי חדר, מינוי מורה מחליף, ביטול שיעור, הזמנות ציוד, אישור בקשות, וכן התראות תפעוליות למנהלים
PostgreSQL — נבחר בזכות תמיכה native ב-EXCLUDE USING GIST. הדבר מאפשר
ברמת מנוע בסיס הנתונים לוודא היעדר חפיפות בין טווחי זמן, ולמנוע אוטומטית race conditions
בבקשות מקבילות.
לוגיקה בבסיס הנתונים — העברת האינווריאנטים לבסיס הנתונים יצרה מקור אמת
יחיד ושלמות נתונים ללא תלות בנקודת הכניסה (API, סקריפטים ברקע, או session ישיר של מנהל).
Node.js + Express — שער API דק וללא state (Thin API Gateway), המוגבל
לאימות ולניתוב בקשות, ללא שכפול לוגיקה עסקית.
Vue 3 + PrimeVue — קיצר את זמן ההגעה לשוק (time-to-market) הודות
לאקוסיסטם מוכן של רכיבי UI מורכבים למסכי ניהול.
Cloudflare Tunnel — בידד את התשתית לפי עקרון Zero Trust, וביטל לחלוטין
את הצורך בחשיפת IP ציבורי או פתיחת פורטים נכנסים.
מבנה הפרויקט:
מבנה ה-repository — המערכת תוכננה מהיום הראשון עם הפרדה ברורה בין
האפליקציה, לוגיקת בסיס הנתונים, והתשתית.
המערכת בחיים האמיתיים:
לוח תצוגה בחדר המורים — בשידור חי, על קיר המרכז החינוכי.
לוח תצוגה לתלמידים — בשידור חי, על קיר המרכז החינוכי.
Production monitoring — המערכת נמצאת תחת ניטור זמינות חיצוני מתמשך. זמן
פעילות של 100% ב-30 הימים האחרונים; 99.995% מאז 1 בספטמבר 2026 — האירוע היחיד, השבתה בת
5 דקות, היה השבתה מתוכננת בזמן פריסת גרסה חדשה (מיגרציית בסיס נתונים ואתחול מחדש של
קונטיינרים ה-backend/frontend). מאז — ללא תקלות.
תשתית שליחת מיילים — ההתראות נשלחות דרך דומיין מאומת באמצעות ספק דוא"ל
טרנזקציוני (Resend), המבטיח מסירה אמינה ואימות תקין (SPF/DKIM).
ממשק המערכת
לחצו על כל צילום מסך כדי לפתוח אותו בגודל מלא.
גאנט יומי — לוח הזמנים החי של היום לפי חדרים. קידוד צבעים לפי מקצוע,
הדגשת מחליפים, ומחוון זמן נוכחי.
תבנית שנתית (Basic Schedule) — מקור האמת. שינויים ממנה מופצים בבטחה
ללוח הזמנים השנתי שנוצר, בעזרת אלגוריתם דו-שלבי.
לוח בקרה למורה — סביבת עבודה אישית: שיעורים קרובים, בקשות ציוד, היסטוריית
חילופים, ולוח זמנים אישי.
לוח בקרה למנהל — ה"חלון האחד" המרכזי. מורים רק מגישים בקשות; מנהלים
בודקים, מתאימים, ומיישמים את השינויים.
לוח בקרה ללבורנט — תצוגה תפעולית: הזמנות ציוד והערות ליום נבחר.
Audit Log — היסטוריה בלתי ניתנת לשינוי לחלוטין של כל פעולה משמעותית.
אפילו סופר-אדמין לא יכול לערוך או למחוק רשומה.
כללי שליחת מיילים — למי לשלוח על מה. כל סוג אירוע (בקשה חדשה, אישור,
הזמנת ציוד, חילוף, תחזוקת שרת...) ניתן לנתב בנפרד לתפקידים נבחרים ולמשתתפי האירוע (יוצר
הבקשה, מורה השיעור, המחליף, המורה בפועל) — מוגדר ממסך "בקרה", עם מתג כללי לעצירה מיידית
של כל השליחה.
תיבת דואר אמיתית של המערכת — התראות נכנסות ממוינות אוטומטית לפי סוג האירוע
(הזמנת ציוד, ביטול שיעור, שינוי חדר, חילופי מורה...) לתיקיות נפרדות, כל אחת עם כתובת שולח
משלה.
אישור הזמנת ציוד — עם קודי פריטים וקישורים ישירים לספריית החומרים של
חמד"ע.
לוח תצוגה לתלמידים — מסך ציבורי המציג את לוח הזמנים החי.
תרבות הנדסית — קוד ותיעוד
אחד העקרונות המרכזיים בפרויקט: לוגיקה והחלטות מוסברות ישירות בקוד — לא רק מה
הפונקציה עושה, אלא גם למה היא קיימת ומה ישבר אם יופר האינווריאנט.
1. הפרדה ברורה בין מבנה ללוגיקה עסקית
schema.sql — כלל מפורש: הקובץ הזה מכיל רק מבנה. הלוגיקה העסקית חיה
בקבצים המודולריים.
2. בחירת חדר לפי כללים עסקיים מפורשים
campus._find_room() — כללי עדיפות לחדרים עבור פיזיקה וכימיה מתועדים
ומקודדים ישירות בשאילתה.
year_schedule.sql — בכותרת הקובץ מוסבר תפקידה של כל פונקציה מרכזית,
וזרימת ה-freeze / unfreeze של יום.
3. בקרת איכות ואימות אינווריאנטים
391 בדיקות רגרסיה אוטומטיות (ברמת ה-API ובסיס הנתונים) שרצות לפני כל דיפלוי — בודקות את
תהליכי אישור הבקשות, חילופי מורים, מנגנון הקפאה/שחזור של יום, מניעת התנגשויות בלוח הזמנים
(EXCLUDE USING GIST), הזמנות ציוד, ומטריצת כללי ההתראות.
4. משמעת שחרורים ותפעול
כל אחד מכ-20 שחרורים לפרודקשן במהלך 9 חודשים עובר לפי אותו פרוטוקול: חזרה כללית של המיגרציה על
עותק טרי של בסיס הפרודקשן, תמונות Docker מתויגות :rollback לפני בנייה מחדש, גיבוי
ממש לפני החלת השינויים, ויומן שחרור כתוב על השרת. חלון המעבר בפועל של הקונטיינרים — בין 13 ל-55
שניות.
תוכנית ההתאוששות מתקלה מוחלטת לא נבדקה רק בתיאוריה: המחזור המלא (מחיקת ה-volume → אתחול נקי
מאפס → שחזור דאמפ פרודקשן אמיתי לבסיס נתונים זמני) הורץ מקצה לקצה, וטבלאות מפתח (עובדים,
שיעורים, בקשות, הרשאות) נבדקו שורה-שורה מול בסיס הנתונים החי.
5. הטמעה וניהול שינויים
כדי שהמעבר מאקסל המיושן יעבור בצורה חלקה, בניתי אסטרטגיית הטמעה הדרגתית:
מעורבות מוקדמת והדגמות. בשלבי הפיתוח הצגתי לצוות באופן קבוע אבות-טיפוס
עובדים, והסברתי בדוגמאות מוחשיות כיצד המערכת תחסוך להם טרחה שגרתית ובלבול יומיומי. האדישות
הראשונית הפכה במהירות לציפייה אמיתית להשקה.
הסתגלות הדרגתית שבועיים לפני פתיחת השנה. עקבתי מקרוב אחר תגובות העובדים
והערכתי את מידת הפתיחות שלהם לשינוי. כשראיתי שרוב הצוות מגיב בחיוב, פניתי למנהל המרכז עם
הצעה: לא לסבך את המעבר בעבודה כפולה ומקבילה בשתי מערכות, שכן הזנה כפולה רק תיצור תסכול ולחץ
מיותר. המערכת החדשה יצאה באופן אובייקטיבי פשוטה ונוחה בהרבה מהקודמת, ולכן הצעתי להתחיל את שנת
הלימודים ישירות עליה — והמנהל הסכים. כדי שהצוות יספיק להתרגל, באמצע אוגוסט נפתחה לכולם גישה
ל"סביבת ניסיונות" (Sandbox), שבה כל אחד יכול היה ללחוץ בחופשיות על הממשק ולהכיר את האזור האישי
שלו. במקביל, לוח השעות החדש שודר בכל מסכי המסדרון במרכז — שבועיים לפני 1 בספטמבר, כדי שהצוות
יתרגל ויזואלית לפורמט החדש.
הדרכה מעשית. קיימתי מספר סבבי הדרכה למורים וללבורנטים: כיצד בנוי האזור
האישי, איך להזמין ציוד למעבדה בשני קליקים, לבקש העברת שיעור ולעקוב אחר סטטוס הבקשות בזמן אמת.
כבוד להרגלים ולהערות על גבי נייר. לקחתי בחשבון שלחלק מהלבורנטים והמורים נוח
יותר להחזיק דף ביד — לסמן בעיפרון ניסויים שהוכנו או לכתוב הערות שוליים. פונקציונליות זו (סימון
מוכנות ציוד, הערות לשיעור) הוטמעה גם במערכת עצמה — חלק מזינים זאת ישירות לממשק, וחלק מסמנים
תחילה על הנייר ולאחר מכן מעדכנים במערכת. לכן הוספתי אפשרות ייצוא לאקסל, לצורך הדפסה מאוחרת
יותר, של המידע המוצג על המסך.
תוצאה. הודות לממשק אינטואיטיבי, אפילו החלק השמרני ביותר בצוות השתלב במערכת
כמעט ללא שאלות. כבר בסוף ספטמבר (חודש הלימודים הראשון), המערכת נטמעה באופן מלא וטבעי בכל
תהליכי העבודה היומיומיים של המרכז המדעי.
תוצאות
המערכת פועלת בהצלחה בפרודקשן החל מספטמבר 2026
עומדת בעומס התפעולי היומיומי האמיתי של המרכז
אינווריאנטים קריטיים (קונפליקטים בלוח הזמנים, הרשאות גישה, audit) נאכפים ברמת בסיס
הנתונים
היסטוריה מלאה ובלתי ניתנת לשינוי של כל פעולה משמעותית