בין Implicit ל Explicit

11/05/2021

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

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

1. איך נראה ההבדל בין Implicit ל Explicit

שפת התכנות python נחשבה יותר Explicit מ perl קודם כל בגלל הכוונה המוצהרת של כותבי שתי השפות, וכמובן בגלל חלק מהבחירות הטכניות בעיצוב השפות. כבר הסעיף השני ב Zen של פייתון קובע ש:

Explicit is better than implicit.

ובצד השני לארי וול, היוצר של פרל, כותב ש:

Natural language is naturally punctuated by the pitches, stresses and pauses we use to indicate how words are related. So-called ``body language'' also comes into play here. Some of this punctuation is written in English, but much of it is not--or is only approximated. Some computer language designers seem to think that punctuation is evil; I doubt their English teachers would agree.

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

דוגמה לבחירה טכנית תהיה לולאת ה foreach של שתי השפות, כאשר ב perl יש לנו את:

for(<"*.txt">) {
    say
}

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

from glob import glob

for filename in glob("*.txt"):
    print(filename)

ב perl כתבתי פחות סימנים והשפה השלימה את הדברים שדילגתי עליהם. בפרט ב perl לא הייתי חייב לבחור שם למשתנה הרץ בלולאה אבל ב python הכרחי לבחור אחד.

במעבר ל Front End ריאקט היא ספריה יותר Explicit מ Vue וב Back End ריילס היא Implicit ו Django הרבה יותר Explicit. לפעמים אותו כלי יכול לתת לנו ממשקי עבודה שונים, לדוגמה עבודה עם גיט דרך ממשק גרפי לרוב תדרוש ממני לציין דברים הרבה פחות במפורש בהשוואה לעבודה דרך ממשק ה CLI. פיתוח קובץ Makefile הוא תהליך הרבה יותר Explicit מאשר פתיחת פרויקט חדש ב Visual Studio ובניה מתוך הממשק הגרפי.

2. אז מה יותר טוב?

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

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

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

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

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

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