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