LearnAI

מצב זמני מול התמדה

נתונים

  • מצב (state).
  • זיכרון תהליך (process memory).
  • שמירה מעבר לחיי ההרצה (persistence).
  • פורמט נתונים מובנה (JSON).

מסר השיעור

תוכלו להבדיל בין נתון זמני לנתון שנשמר, ולבחור ראיה להבטחת השמירה.

שאלה לפתיחה

נטע ראתה במסך הערה לבקשת מקרן. בפתיחה נוספת נשאר מספר הבקשה וההערה נעלמה. האם תצוגה משותפת אומרת שגם מקור השמירה משותף?

בהרצה הראשונה ניצור הערה במשתנה ונקרא בקשה מקובץ. תהליך אחר יקרא אחריה את אותו קובץ. חזו אילו ערכים יחזרו: גם ההערה או רק תוכן הקובץ? לכל ערך הסבירו את המקור.

  • עדיין לא. פתיחת מסך אינה מקור: התהליך החדש קורא מהקובץ.

  • עדיין לא. הקלדה אינה שמירה: ההערה נשארה בזיכרון התהליך הראשון.

  • נכון. בתהליך החדש חוזר תוכן שנקרא מהקובץ. ההערה נוצרה רק בזיכרון ההרצה הקודמת. הופעה בפלט קודם אינה מספיקה: המקור מסביר מה יכול לחזור.

איך נברר ניסיון בלי תשובה בעזרת מזהה בקשה?

המזהה מחבר בירור לפריט או לניסיון הנכון, בלי לנחש לפי התצוגה.

מה בודקת הרשאה ומה בודק אימות קלט?

הרשאה קובעת אם הפונה רשאי לפעול; אימות בוחן התאמת נתונים לכללים.

למה צריך יותר ממונה בקשות כדי להבין משאבים?

גם פנייה יחידה יכולה לדרוש עבודה רבה, ולכן בוחנים גודל ומשאבים נוספים.

חזרה על השיעור ״הגבלת קצב ושימוש לרעה״

בכל מגבלת שימוש מציינים מה נספר, למי ובאיזה פרק זמן.

אות חריגה לבדו אינו מוכיח שימוש לרעה.

מקור הערך קובע מה יכול לשרוד

המסך מציג ערכים ממקורות שונים

נטע מקלידה הערה, ולצדה מופיע מספר הבקשה 31 שנקרא מקובץ. אף ששני הערכים מופיעים באותו מסך, הם מגיעים ממקורות שונים. ההערה נוצרה בהקלדה; המספר נקרא ממידע שנשמר קודם. כדי לדעת מה יחזור בפתיחה נוספת, בודקים את המקור של כל ערך. קובץ בפורמט הנתונים JSON מחזיק ערכים במבנה שהתוכנה יכולה לקרוא.

הערה בזיכרון שייכת להרצה הנוכחית

כל עוד נטע עורכת, התהליך מחזיק את נוסח ההערה בזיכרון שלו (process memory). הוא יכול להציג את הנוסח ולעדכן אותו עם ההקלדה. אם הנוסח נמצא רק בזיכרון הזה, תהליך חדש לא יקבל אותו. זהו מצב זמני (state) בדוגמה שלפנינו.

תהליך חדש קורא שוב את הקובץ

מספר הבקשה, 31, נקרא מקובץ JSON שהוכן לתרגיל. כשהתהליך השני מתחיל, הוא פותח בעצמו את אותו קובץ וקורא שוב את המספר. אין מעבר של משתנה מהתהליך הראשון לשני. הקובץ שנשאר זמין הוא שמאפשר לשניהם לקבל את אותו ערך.

הצגה אינה מוכיחה התמדה

ערך יכול להופיע במסך גם אם הוא קיים רק בזיכרון התהליך. לכן צילום של המסך אינו מוכיח שהערך יחזור בהרצה נוספת. כדי לבדוק שמירה, צריך לעקוב אחר כתיבה למקור מתאים ואחר קריאה מאותו מקור. כאן קוראים קובץ מקומי שהוכן מראש; במוצר אפשר לבחור מסד נתונים או מנגנון שמירה אחר. מסד נתונים הוא מקום מסודר שבו אפליקציה שומרת רשומות, כמו טבלה של בקשות ציוד, כדי שאפשר יהיה למצוא אותן, להוסיף אותן ולשנות אותן גם אחרי שהתוכנית נסגרה. אפשר לחשוב עליו כמו ארון תיוק מסודר: לכל בקשה יש מקום קבוע, ואפשר לשלוף אותה לפי שם או מספר בלי לעבור על כל הארון. בקורס הזה נלמד איך בונים מקום כזה ואיך שומרים על המידע שבו. בהמשך הקורס נאמר בקיצור המסד כשמתכוונים לאותו מקום בדיוק.

משך החיים נקבע לפי הצורך

כשמתכננים שמירה מעבר לחיי התהליך (persistence), מגדירים לכמה זמן המידע נחוץ. מצב של הסבר פתוח עשוי להידרש רק עד שסוגרים את המסך. בקשת ציוד שאושרה צריכה להיות זמינה גם בהמשך. לכן לא מבטיחים לשני סוגי המידע אותו משך שמירה.

מצב ההסבר בתצוגת המוצג

באתר מוזיאון מתלבטים אם לשמור את מצב פתיחת ההסבר ליד כל מוצג בין ביקורים.

איזו החלטה צריכה להקדים את המימוש?

  • עדיין לא. מקום ההצגה אינו קובע כמה זמן הערך צריך לשרוד.

  • נכון. התמדה נבחרת לפי ההבטחה למשתמש.

  • עדיין לא. פורמט נבחר אחרי שמחליטים כמה זמן הערך נחוץ.

הבטחה ברורה קובעת מה לבדוק

כתבו תחילה מה המוצר מבטיח למשתמש. האם הטיוטה אמורה להיעלם כשסוגרים את המסך? האם בקשה שנשלחה צריכה לחזור בפתיחה הבאה? ההבטחה קובעת מה לשמור ואיך לבדוק זאת. בלי הבטחה מפורשת, אפשר לעבור בדיקה טכנית ועדיין לאבד מידע שהמשתמש ציפה למצוא.

מנסחים התחייבות

צוות קטלוג ספרייה קיבל דרישה עמומה: לשמור את התקדמות הקטלוג.

איזה משפט יהפוך את הדרישה לבדיקה מוגדרת?

  • עדיין לא. תצוגה מיידית אינה מגדירה עד מתי הטיוטה צריכה להיות זמינה.

  • נכון. זהו תנאי משך חיים שאפשר לבדוק.

  • עדיין לא. שם מנגנון אינו תנאי הצלחה למשתמש.

כל התחלה מחדש בודקת אירוע אחר

חלון נוסף, תהליך חדש והפעלת מחשב מחדש בודקים אירועים שונים. חלון יכול להיעזר במידע שנשאר בדפדפן, ותהליך שרת חדש יכול לקרוא מסד משותף. הפעלת מחשב מחדש מוסיפה תנאים שלא נבדקים רק בהחלפת תהליך. בתרגיל הופעלו שני תהליכי Python בזה אחר זה; אין בו בדיקת הפעלה מחדש של המחשב.

חלון נוסף

בבדיקת אתר הזמנת חדרים נפתח חלון נוסף באותו דפדפן והבחירות הופיעו בו.

איזה תיאור ניסוי יהיה מדויק?

  • נכון. לאירועי הפעלה שונים תנאים שונים.

  • עדיין לא. בניסוי לא הופעל מחדש המחשב.

  • עדיין לא. בניסוי הופעלו תהליכים באותה סביבה.

רענון דורש זיהוי של הרכיב

המילה ״רענון״ אינה אומרת איזה זיכרון התאפס. שאלו איזה רכיב התחיל מחדש ולאיזה רכיב שייך המשתנה. רענון העמוד עשוי להשאיר את השרת ואת הנתונים שלו פעילים. לעומת זאת, משתנה של תהליך שהסתיים אינו זמין לתהליך החדש, אלא אם אפשר לקרוא את ערכו ממקור מתאים.

המקור מסביר את ארבעת הרגעים

עקבו אחר ארבע הפעולות: קובץ התרגיל מוכן מראש; התהליך הראשון קורא ממנו ויוצר גם הערה בזיכרון; התהליך הזה מסתיים; ותהליך חדש קורא את הקובץ מחדש. התהליך החדש אינו יוצר את ההערה שנוצרה בקוד של הראשון. משום כך ההערה מוצגת בו כערך ריק, אף שמספר הבקשה נקרא שוב בהצלחה.

קריאה מקובץ מוכן אינה בדיקת כתיבה

הפלט מלמד מאין הגיעו הערכים בשתי הקריאות. הוא אינו מראה שטופס במוצר כתב את הקובץ, משום שהקובץ הוכן קודם. גם כתיבה שנקטעה והתאוששות מכשל חומרה לא נבדקו. טענה על כל אחד מאלה דורשת בדיקה נפרדת שמתאימה לאירוע ולמנגנון השמירה.

לכל שלב דרושה ראיה משלו

הפרידו שלוש שאלות: מה קיים עכשיו בזיכרון התוכנה, מה נכתב למקור שאמור להישאר, ומה תהליך חדש מצליח לקרוא ולהציג. הצלחה בהצגה אינה מוכיחה כתיבה, והצלחה בכתיבה אינה מוכיחה שהקריאה החדשה תקינה. לכל שלב אספו את הראיה שעונה עליו.

מיון ראיות

בודקת קיבלה שלוש ראיות: ערך בזיכרון, תיעוד כתיבה ותוצאה של קריאה חדשה.

איך נכון לארגן את דוח הבדיקה?

  • עדיין לא. נוכחות בזיכרון אינה מראה שמירה מעבר לתהליך.

  • עדיין לא. בלי הכתיבה אין ראיה שהמידע נשמר.

  • נכון. כל ראיה עונה לשלב אחר בהבטחה.

מקום השמירה מגביל את ההבטחה

כשאומרים שנתון נשמר, ציינו היכן ובאילו תנאים. תיקייה זמנית עלולה להימחק כשהסביבה מוחלפת. כשאומרים כאן סביבה שנמחקת, הכוונה למקום הרצה זמני שמוסר כולו בהחלפה, יחד עם הקבצים שבתוכו. קובץ במחשב אחד אינו בהכרח נגיש במחשב אחר. לכן גם פתרון שמבוסס על קובץ צריך להיבדק בסביבת ההפעלה שבה ישתמשו בו.

מי יכול לקרוא את הארכיון?

קובץ הארכיון נכתב במחשב האוצרת, אך לא הוגדרה דרך לקוראים מורשים ממחשבים אחרים.

איזו שאלה תפעולית צריך להוסיף להבטחה?

  • נכון. מיקום ותנאי גישה הם חלק מהמשמעות של שמירה.

  • עדיין לא. כותרת אינה קובעת היכן ישמר המידע ומי יקרא אותו.

  • עדיין לא. קובץ מקומי אינו משותף בין מחשבים, וזו אינה שאלה תפעולית.

שמירה צריכה לשרת את הקוראים המורשים

במערכת הציוד לא רק נטע צריכה לקרוא את הבקשות; גם משתמשים מורשים אחרים זקוקים להן. קובץ שנמצא במחשב שלה בלבד עלול שלא לענות על הצורך. הגדירו מי יקרא את המידע, מאיזה מקום ובמשך כמה זמן. רק אז בחרו את הטכנולוגיה ואת דרך הקריאה המשותפת.

מצב זמני מאפשר עריכה וביטול

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

עריכה בלי התחייבות

מעצבת מסלול סיור מנסה סדר חדש ורוצה לבטל אותו לפני פרסום.

איזה תפקיד מתאים למצב זמני כאן?

  • נכון. מצב זמני יכול לשרת פעולה רצויה.

  • עדיין לא. החלפה מיידית אינה ניסוי שאפשר לבטל.

  • עדיין לא. מצב זמני אינו נועד לפרסום סופי.

מעקב אחרי מקורות מחדד את הבדיקה

בפלט הראשון ההערה נוצרה בזיכרון, ואילו מספר הבקשה ומזהה הציוד נקראו מהקובץ. בפלט השני שני המזהים נקראו שוב, וההערה לא נוצרה מחדש. מעקב כזה מסביר את ההבדל בין התוצאות ומאפשר לבקש מהסוכן בדיקה ממוקדת של השמירה.

הפלט מחבר ערך למקורו

הפלט התקבל משני תהליכים נפרדים של Python 3.12.14. לשני התהליכים ניתן אותו JSON סינתטי; הקובץ נפתח במצב קריאה בלבד. סינתטי כאן פירושו שהמידע הומצא לצורך התרגיל ואינו שייך לאדם אמיתי. התהליך הראשון יצר הערה זמנית בזיכרון; השני התחיל מחדש ולא יצר אותה.

restart-result.txt

תהליך ראשון: הערת טיוטה בזיכרון = bring_adapter; מזהה בקשה מהקובץ = 31; מזהה ציוד = 7.
תהליך חדש: הערת טיוטה בזיכרון = null; מזהה בקשה מהקובץ = 31; מזהה ציוד = 7.
הקובץ נכתב מראש כחומר תרגול ונקרא בשני התהליכים.
לא בוצעו הפעלה מחדש של המחשב או בדיקת התאוששות מכשל.

בשורה הראשונה מופיעה bring_adapter, תווית שמשמעותה להביא מתאם. ההערה הזאת נוצרה בזיכרון התהליך הראשון. המספרים 31 ו־7 באותה שורה נקראו מהקובץ. לפני שמשווים תוצאות, הצמידו לכל אחד משלושת הערכים את המקור שלו.

בהרצה החדשה ההערה מוצגת כ־null: התהליך התחיל בערך ריק ולא קרא אותה ממקור שנשמר. מספר הבקשה ומזהה הציוד, לעומת זאת, נטענו שוב מהקובץ. ההבדל קשור ליצירה ולטעינה של הנתונים, ולא לעיצוב כפתור שיכול להציגם.

שורת ההכנה אומרת שהקובץ היה כתוב מראש. לכן הראיה מבססת קריאה של תוכן קיים בשני תהליכים. היא אינה מבססת כתיבה דרך טופס, גיבוי או שחזור אחרי כשל. גיבוי הוא עותק שמור של מידע שאפשר לחזור אליו אם המקור נפגע, ושחזור הוא החזרת המידע מאותו עותק למקום שבו משתמשים בו. את שניהם נלמד לעומק בשיעור ״גיבוי, שחזור וראיית הצלחה״. השתמשו בפלט רק לתחום שנבדק בו.

כדי לתכנן בדיקת שמירה במוצר, בחרו ערך חדש וציינו איזה רכיב יכתוב אותו ולאן. אחר כך הגדירו מה יופעל מחדש ומאין ייקרא הערך. השוו את הערך שנשלח לשמירה לזה שנקרא לאחר ההפעלה. בשלב הזה מכינים את הבדיקה; את ההרצה מבצעים בהמשך בסביבה מתאימה.

מקרה ליישום

רשימת קניות צריכה לחזור בפתיחה נוספת, אך סימון רגעי של פריט נעלם במכוון בסגירת המסך. מה זמני כאן, ואיזו בדיקה תוכיח את השמירה של הרשימה?

הצגת הסבר למקרה

אפשר להשאיר את הסימון בזיכרון המסך בהתאם להבטחה. לרשימה צריך להראות שמירה וקריאה אחרי פתיחה נוספת, עם רכיב שנסגר ומקור שנשאר. כך מבדילים בין היעלמות מתוכננת לפגיעה בהבטחה.

בקשו מהסוכן מקום, משך חיים ואירוע איפוס לכל ערך, עם הפרדה בין טיוטה לבקשה שהתחייבו לשמור.

בקשו ערך סינתטי שחזר מהמקור הצפוי אחרי התחלה חדשה של הרכיב. הבהירו אם נבדקה כתיבה או רק קריאת קובץ מוכן.

מיון ערכים לפי מקורם

מיינו ערכים לפי מקורם ולפי האירוע שנבדק.

  • מצאו מאין הגיע כל ערך.
  • בחרו מה הוכח על תהליך חדש באותה סביבה.

הערה קיימת רק במשתנה שנוצר בהרצה הראשונה.
31 מגיע מאותו קובץ בכל אחת משתי הקריאות.

בדיקת ידע

בחרו תשובה אחת בכל שאלה. לאחר השליחה יופיע משוב לכל בחירה.

איך המספר חוזר בהרצה חדשה כשההערה ריקה?
איזו הבטחה הניסוי עדיין אינו מבסס?
קובץ נמצא בסביבה שנמחקת בהחלפה. מה נברר כדי להבטיח שמירה אחרי החלפה?

סיכום השיעור

  • מוצאים לכל ערך את המקור ואת משך החיים שלו.
  • מציינים מה מתחיל מחדש ומה נדרש להישאר.
  • בודקים כתיבה וקריאה חדשה באמצעות ראיות נפרדות.
  • המידע ברגע נתון הוא מצב (state).
  • ערכי הרצה מוחזקים בזיכרון תהליך (process memory), ושמירה מעבר לחייה נקראת התמדה (persistence).
  • במערכת הקבצים, המידע מאורגן ביחידות שנקראות קבצים.
  • בקובץ הנתונים של התרגיל, בפורמט JSON, null מסמן ערך ריק.
בדיקה עצמית: האם תוכלו להסביר את המסקנות?

בשיעור הבא נבחן איך מזהים את אותה רשומה כשמשנים את שמה או את סדר הרשומות.

חזרה לרשימת השיעורים