כך נראית בעיית הבנה
נתבונן בתוכנית הבאה בפייתון שמחשבת את ה sh256 של הקובץ /etc/passwd
:
import hashlib
from pathlib import Path
data = Path("/etc/passwd").read_text().encode("utf8")
print(hashlib.sha256(data).hexdigest())
וכן העובדה שהקוד עובד רק מחמירה את המצב.
התוכנית קוראת את הקובץ בתור טקסט, כלומר לוקחת את הביטים שרשומים בקובץ ובונה מהם מבנה נתונים של מחרוזת שיישמר בזיכרון של פייתון. אחרי זה התוכנית מקודדת את המחרוזת בחזרה לביטים ואותם שומרת במשתנה data. אם היתה בעיה בקידוד בזמן קריאת הקובץ, התוכנית היתה מתרסקת באמצע - אפילו שאף אחד לא היה צריך את הטקסט וכל מטרת הקריאה היא לקבל את הביטים עצמם.
אז איך מגיעים לכתוב קוד כזה? נו זה קל, מתחילים עם:
import hashlib
from pathlib import Path
data = Path("/etc/passwd").read_text()
print(hashlib.sha256(data).hexdigest())
מקבלים את הודעת השגיאה:
TypeError: Strings must be encoded before hashing
ועושים מה שהמחשב ביקש. מה שהמחשב לא יודע זה שאנחנו בכלל לא צריכים את ה String, ואפשר היה לדלג עליו ולקבל ישר את הביטים:
import hashlib
from pathlib import Path
data = Path("/etc/passwd").read_bytes()
print(hashlib.sha256(data).hexdigest())
בעיית הבנה נוצרת בדיוק כשאנחנו עוקבים אחרי הוראות במקום להבין את המשמעות של אותן הוראות. לא תמיד קל לזהות אותן, אבל כלי AI לפעמים יכולים לעזור. במקרה שלנו שלחתי את התוכנית המקורית ל Chat GPT וביקשתי הצעות איך לשפר אותה. זאת הגירסה המשופרת שקיבלתי:
import hashlib
from pathlib import Path
file_path = "/etc/passwd"
try:
with open(file_path, 'rb') as file:
file_content = file.read()
hash_value = hashlib.sha256(file_content).hexdigest()
print(f"SHA-256 Hash of '{file_path}': {hash_value}")
except FileNotFoundError:
print(f"Error: File '{file_path}' not found.")
except PermissionError:
print(f"Error: Permission denied while trying to read '{file_path}'.")
except Exception as e:
print(f"Error: {e}")
רוב השיפור לא היה רלוונטי לבעייה הספציפית שלי (כי Chat GPT), אבל דווקא בקריאת הקובץ הוא שם לב שעדיף לוותר על ההמרה לטקסט. הדבר החשוב הוא להשתמש בכל הכלים מסביבנו כדי להבין מה בדיוק אנחנו עושים ומה בדיוק אחרים עושים, ולאט לאט לסגור פערי הבנה כדי לשפר כל תוכנית שנכתוב בעתיד.