שלוש סיבות שהתוכנית שלך לא עובדת

08/12/2021

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

1. כי אתה לא יודע איך לבקש

סיבה ראשונה היא שאנחנו פשוט מבקשים לא נכון. אם אני רוצה לגרום ל Node.JS ליצור עץ תיקיות מתוך תיקיית /tmp שמתחיל בתיקיה שנקראת foo, ממשיך בתיקיה בשם bar ומסתיים בתיקיה בשם buz ואני מפעיל את הפקודה הבאה בשביל זה:

const fs = require('fs');
fs.mkdirSync('/tmp/foo/bar/buz');

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

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

2. כי אתה לא יודע מה לבקש

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

אם בסיפור מקודם נרצה לייצר את עץ התיקיות "במקום הרגיל" במקום בתוך תיקיית /tmp אנחנו עלולים להתפתות לכתוב קוד שנראה ככה:

const fs = require('fs');
fs.mkdirSync('foo/bar/buz');

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

3. כי אתה מבקש דברים לא הגיוניים

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

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

מה עושים? מתאמנים על איתור ותיקון תקלות ב-3 ערוצים:

  1. לומדים טוב יותר את שפת התכנות וה API שאתם עובדים בהם כדי להבין איך לבקש את מה שאתם באמת רוצים.

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

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