לקראת המעבר לשפות תכנות מונחה עצמים

הוראת יסודות בתכנות פרוצדוראלי או בתכנות מונחה עצמים

הוכן ע"י עקיבא לביא

החומרים שלפניכם הוכנו על ידי משתתפי סמינר קיץ למורים מובילים תשס"ד.

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

 

תקציר

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

מבוא

בחוזר מפמ"ר מס' 3 תשס"ד ובחוזר מס' 1 תשס"ה [1] הופצה ההנחיה שהחל משנת הלימודים תשס"ז מתחילים בהחלפת שפות ההוראה במדעי המחשב לשפות Java ו- #C.  הודעות אילו לוו בהודעה הלא פורמלית שתוכניות הלימודים הקיימות ביסודות מדעי המחשב ובעיצוב תוכנה לא ישונו.

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

דעות

הבעיה הוצגה בצורה זו או אחרת בכל הזדמנות החל מאמצע 2004 ואילך. בסמינר הקיץ שנערך ע"י מחשב בשיתוף עם CRI המכון ליישומים בין תחומיים של מדעי המחשב על שם קרן קיסריה אדמונד בנג'מין דה-רוטשילד, נידון הנושא בכמה מיקרים וסוכם בסדנה שהועברה ע"י עופרה ברנדס. בסדנא נידונו דעות שונות וניתנו הפניות (רפרנסים) למאמרים בנושא. (ראה רשימה מצורפת [2]-[9]).

במאמרים שנתנו דנים בקורסים שנערכו במכללות ואוניברסיטאות. אומנם, לא ערכתי סקר ספרות יסודי, אך אין ספק שיש חומר רב. אסתפק במדגם שכאן שנותן תמונה די טובה. מהמאמרים שכאן, שאין אחידות דעים לגבי השיטה העדיפה. יש הטוענים בחום שחייבים להתחיל עם תמ"ע מכיוון שאחרי שלומדים ועובדים בשיטה הפרוצדוראלית קשה לעבור לשיטה חדשה לגמרי [2].  לעומתם יש הטוענים שלדעתם עדיף להתחיל בשיטה הישנה ורק אח"כ לעבור לתמ"ע [3]. אילו מקבלים תמיכה בדוקה מקנדים שבדקו והשוו קבוצות לימוד והגיעו למסקנה שעדיף בכלל להתחיל בפסקל [4]. אחרים טוענים שמבחינה עקרונית יש להתחיל במתודולוגיה של תמ"ע [5] ורק אחר כך לגשת לתכנות. הם אינם מדווחים על ניסויים השואתיים בנושא. מגוון שלם של דעות. כמעט לכל כיוון אפשרי.

הבדלי אוכלוסיות

הדעות שנסקרו מענינות אבל, אין בהן נתונים ומחקרים על הוראת מדעי המחשב בבתי הספר התיכוניים. הסיבה לכך היא שלימוד מדעי המחשב בתיכון מקובל כנראה רק בארץ. לעובדה זו השלכות משמעותיות על המשך הדיון. גיל התלמידים שמעניינים אותנו הוא בסביבות 16-17 (כיתה י' - י"א) ורובם הגדול סמוכים על שולחן הוריהם. לאוניברסיטאות בארץ ובחו"ל מגיעים תלמידים בגיל 18 ומעלה. במקרים רבים הם גרים מחוץ לבית ההורים, במעונות הסטודנטים, בדירה שכורה וכו'. הבדלים אילו משמעותיים לגבי ההתפתחות של התלמיד ודרך הבנתו את הבעיתיות של מערכות גדולות.

מה ההבדל ולמה תמ"ע

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

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

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

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

דיון ומסקנות

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

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

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

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

סיכום

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

מקורות

1.             חוזר מפקח מרכז (מספר 1 תשס"ה)

2.             “A tale of two paradigms”, Adienne Decker Department of Computer Science and Engineering, University at Buffalo, State University of New York, Buffalo, NY 14260,  Adrienne@cse.buffalo.edu.

3.             “Structured programming in Java”. Jeremy Gibbons, School of Computing and Mathematical Sciences, Oxford Brookes University, Gipsy Lane, Headington, Oxford OX3 OBP, UK. jgibbons@brookes,ac.uk

4.             “Back to Pascal: Retro but not backwards”. Katrin Becker, Department of Computer Science, University Drive NW Calgary, Alberta Canada T2N1N4. (2002) email: becker@cpsc.ucalgary.ca

5.             “Methodology first an language second: a way to teach Object-Oriented Programming”. Haivin Zhu, Department of Computer Science and Mathematics, Nipissing University, 100 College Drive, North Bay, Ontario P1B8L7, Canada Haibinz@nipissingu.ca.  MengChu Zhou Electrical and Computer Engineering Department New Jersey Institute of Technology, University Heights, Newark, NJ 07102 USA  zhou@ijit,edu.

6.             “Algorithms and Object-Oriented Programming: Bridging the Gap”. Paolo Bucci, Wayne Heym, Timothy J. Long, Bruce W. Weide, Department of Computer & Information Science, The OhionState University, Columbus, Ohio, 43210,  {bucci,heym,long,weide}@cis.ohio-state.edu

7.             “Teaching Java as a second programming language”. Sharon M. Tuttle, Humboldt State University, Department of Computer Science, Arcata, CA 95521-8299.(2001)  st10@humboldt.edu

8.             “Can C# Replace Java ni CS1 and CS2?”, Stuart Reges, Department of Computer Science, University of Arizona, Tucson, AZ 85712,   reges@cs.arizona.edu

9.             “Teaching programming to beginners-choosing the language si just the first step”, Roger Duke, Eric Salzman, Jay Burmeister, Josiah Poon and Leesa Murray, School of Computer Science and Electrical Engineering University of Queensland Australia. (1998) {rduke,eric,jay,Josiah,leesam}@csee.uq.edu.au 

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