הפשטה כמושג מרכזי בהוראת מדעי המחשב: סקר ספרות

גישת "הפשטה-תחילה" להפשטת נתונים ואלגוריתמים

פ. מצ'ניק

Machanik, P. (1998). The abstraction-first approach to data abstraction and algorithms. Computers & Education, 31, 135-150.

 

כל החומרים עומדים לרשותכם וניתן להשתמש בהם להוראה ללא תשלום.

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

 

תקציר

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

 

מבוא

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

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

לדביר המחבר, למרות שתכנות מונחה עצמים לא היה רעיון חדש, הכרתו כגישה מקובלת בזרם המרכזי הייתה יחסית חדשה [הערה: מדובר בשנת 1998, ב. הברמן]. כתוצאה מכך, התלבטויות הקשורות לארגון הלמידה ולסדר שימוש בחומרי למידה בקורס היו שכיחות. יתרה מזאת, הרבה ספרי C++ לא הציגו כלל שימוש חוזר בקוד, ומנגנוני הפשטה (classes, templates) הוצגו בשלב מאוחר, או כאמצעי למימוש מהיסוד.

 

ארגון קורס "הפשטת נתונים ואלגוריתמים" בגישת הפשטה-תחילה

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

בהתאם להנחת יסוד זו, המחבר מציג גישת הפשטה-תחילה להוראת קורס מבני נתונים ואלגוריתמים בשפת תכנות C++. המחבר דן במעבר מהוראת הקורס "תכנות מתקדם" בסביבה פרוצדורלית (Modula-2) להוראת קורס משודרג "הפשטת נתונים ואלגוריתמים" בסביבה מונחית עצמים (C++). 

המחבר טוען שהקורס החדש שתכנן תאם את רוח ההמלצות שלACM/IEEE curriculum  (אם כי בשינוי סדר הצגת המושגים), ולאכזבתו, לא היה בנמצא באותה תקופה ספר ללימוד C++ שארגון החומר בו תאם המלצות אלו, למרות ששפת C++ תפסה את מקומה בזרם המרכזי באותה תקופה

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

 

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

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

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

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

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

גישת מונחית-עצמים מוצגת תחילה כבלתי תלויה בשפת תכנות תוך שימוש בדיאגרמות Booch (Booch, 1991).

 

כתיבת קוד ומימוש: ההיכרות עם קוד מונחה-עצמים תיעשה בהקשר של בניית תוכניות באמצעות בלוקים כתובים מראש של קוד (המשמשים כאבני בניין) במקום הגישה המסורתית של פיתוח מן היסוד. רק כאשר הרעיון של מחלקות ועצמים מבוסס היטב, התלמידים יכירו ספריות ומסגרות. מומלץ להיעזר בשלב זה ב"צעצועים" כלי עזר ייעודיים להוראה (toy libraries and frameworks). בשלב הבא מוצגים templates להעברת הרעיון של "טיפוסים לא שלמים" (incomplete types). בשלבים המוקדמים של הקורס התלמידים נדרשים לכתיבה מעטה בלבד של קוד, אולם מצפים מהם להוכיח בחירה מוצלחת של מחלקות ו- templates לצורך שימוש חוזר.

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

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

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

 

גישת הפשטה-תחילה לעומת גישת מלמעלה-למטה (top-down)

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

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

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

 

סיכום

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

·         מושגים צריכים להיות מוצגים בסדר אשר מציג, מחזק, ומשריש הרגל של שימוש חוזר כבר מההתחלה.

·         פיתוח מהיסוד צריך להיתפס כיכולת מתקדמת יותר, הנלמדת רק לאחר הבנת שימוש חוזר ותיכון בהקשר של הרעיון – "אתה יכול לתכנן לצורך שימש חוזר". 

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

 

חזרה לעמוד הראשי