ביצי הפתעה – מה ולמה

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

מאפיין נסתר של Slack

בתוכנה Slack, כאשר נכנסים לתפריט המאפיינים, רואים אפשרות בחירה מסקרנת. מה שקורה אחר כך נראה כך:


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

מתיחת אחד באפריל של Stack Overflow

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

הזן של פייתון

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

>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
view raw 05_python_this hosted with ❤ by GitHub

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

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

אגב, קל לפספס את הבדיחה הנסתרת בשורה הבאה:

There should be one-- and preferably only one --obvious way to do it.

החתימה של מארק זביקובסקי

כולנו מכירים את הסיומת exe לקבצי חלונות, שמגלה שהקובץ הוא בר הרצה. מאחורי הסיומת הזאת מסתתרים כמה סוגי קבצים, ואחד מהם הוא DOS MZ executable. מקור השם הוא משני הביטים הראשונים בקובץ שאינם מקודדים פקודות או נתונים של התוכנית אלא הם תמיד 77 ו-90, שבקידוד ASCII פירושם MZ. אלו הם ראשי התיבות של מארק זביקובסקי, יהודי כמובן, שתכנן את הפורמט הזה ורצה להשאיר בו את חותמו האישי. כתוצאה מכך, שני התווים הללו משמשים במערכות רבות לקביעת סוג הקובץ – אם הקובץ מתחיל בתווים MZ די בכך שהמערכת תתייחס לקובץ הזה כאל קובץ הרצה של חלונות.

HTTP Status Code 418

גם מי שאינם מתכנתים מכירים את הסטטוס בקוד 404 שתיאורו הוא ״Not Found״, שאומר שמשאב מסוים (בדרך כלל עמוד אינטרנט) לא נמצא. רשימת הסטטוסים שמוגדרים בסטנדרט של HTTP כוללים קודים רבים, כמו 200 שתיאורו הוא בפשטות ״OK״, או 401 שמשמעותו הוא שהמשתמש אינו מזוהה.כשמתבוננים בתיאור של הסטטוס 418 מגלים שהוא ״I'm a teapot״, או בעברית ״אני קנקן תה״. הסטטוס הזה נולד ממסמך RFC שנוצר בראשון באפריל 1998, ומאז הוא חלק מהסטנדרט. כך מתואר הסטטוס בתיעוד של מוזילה:

הכתובת http://www.error418.net ניגשת לשרת שמממש את הפורט הזה ואומר שהוא קנקן תה ולכן הוא איננו מוכן להכין קפה.

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

בחזרה לעתיד בפייתון

לפעמים נתקלים באיסטר אגס מוצלחים פחות שיכולים ליצור בעיות. בפייתון 3.8 שוחרר תיקון לבאג בהגדרת איסטר אג שאם לא היה מתגלה בזמן היה יכול לגרום לבעיות.
כאשר רוצים להציג בפייתון שינוי שיש לו פוטנציאל להשפעה משמעותית, משחררים אותו תחילה כאפשרות אופציונלית שנמצאת בחבילה הווירטואלית __future__. למשל, אחד השינויים הבולטים בין פייתון 2 לפייתון 3 היה ההמרה של print שהיה statement (מילת מפתח, כמו if או return) להיות פונקציה, מה שאיפשר לה לקבל פרמטרים. כדי להפוך את ההמרה להדרגתית ולאפשר לכתוב קוד פייתון 2 עם print כפונקציה, אפשר להמיר את ההתנהגות על ידי שימוש בחבילה הווירטואלית המתאימה.

>>> print(1, 2)
(1, 2)
>>> print(1, 2, sep=',')
File "<stdin>", line 1
print(1, 2, sep=',')
^
SyntaxError: invalid syntax
>>> from __future__ import print_function
>>> print(1, 2, sep=',')
1,2

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

>>> from __future__ import print_function
>>> print_function.__dict__
{'mandatory': (3, 0, 0, 'alpha', 0), 'optional': (2, 6, 0, 'alpha', 2), 'compiler_flag': 65536}

נתבונן כעת בקוד הבא, הפעם בפייתון 3:

>>> 0 != 1
True
>>> from __future__ import barry_as_FLUFL
>>> 0 != 1
File "<stdin>", line 1
0 != 1
^
SyntaxError: with Barry as BDFL, use '<>' instead of '!='
>>> 0 <> 1
True
view raw 05_python_flufl hosted with ❤ by GitHub

זהו איסטר אג שנוצר באחד באפריל 2009, והוא משנה את הסינטקס של השפה כך שבמקום אופרטור אי השוויון != משתמשים באופרטור <>. כמו כל future, מוגדר באיזו גירסה ההתנהגות תהפוך למנדטורית והיא תהפוך להיות חלק מהשפה.

>>> from __future__ import barry_as_FLUFL
>>> barry_as_FLUFL.__dict__
{'optional': (3, 1, 0, 'alpha', 2), 'mandatory': (3, 9, 0, 'alpha', 0), 'compiler_flag': 262144}

כאשר הפיצ׳ר יצא בגירסת פייתון 3.1, היה נראה שגירסה 3.9 היא מספיק רחוקה כדי להגדיר אותה לגירסה בה ההלצה הזאת תהפוך להיות חלק מהשפה. לקראת שחרור גירסה 3.8 מישהו שם לב לכך. והתיקון? להגדיר את הגירסה המנדטורית להיות 4.0.
גם אם הבאג הזה היה נשכח ולא מתוקן בגירסה 3.8, לא סביר שגירסה 3.9 הייתה יוצאת עם <> כאופרטור אי השוויון ושוברת כל קוד פייתון 3 שקיים. סביר יותר להניח שהפיצ׳ר הזה היה מוחרג איכשהו. אלא שנראה שגם זה היה עלול להיות מחיר גבוה מדי עבור בדיחת אחד באפריל.

לסיום

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

2 תגובות בנושא “ביצי הפתעה – מה ולמה

הוסיפו את שלכם

נשמח לשמוע מה אתם חושבים על המאמר

ערכת עיצוב: Baskerville 2 של Anders Noren.

למעלה ↑

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

נרשמת בהצלח. בתודה, הגמל.

שגיאה בלתי צפויה, אנא נסה שוב.

camelCase will use the information you provide on this form to be in touch with you and to provide updates and marketing.