מבוא למדעי המחשב בשפת C++/C

ברוכים הבאים

מבוא

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

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

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

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

צדו השני של המטבע הוא שלהתרשמותי אך מעטים 'אינם בנויים' או 'אינם מתאימים' לתחום המחשבים. מטֵבע הדברים יש מי שהדברים הולכים לו פחות בקושי, ויש מי שהם הולכים לו יותר בקושי, אולם, לדעתי, לא נדרש כשרון ייחודי כלשהו, ורוב מי שיתאמץ מספיק, ויתַרְגל מספיק, בסוף גם יצליח. ראיתי כבר לא מעט תלמידים שנראו לי בינוניים בכישוריהם, אך עם כוח רצון עז, ששרדו, ולעומתם תלמידים מבריקים שלא הייתה להם הנכונות לשאת בעול הסיזיפי לעיתים וְויתרו. בהֵקְשר זה אני רוצה גם לומר שאם אתם רואים מישהו יושב מול המחשב עם חיוך נינוח על השפתיים, תוך שהוא מפזר לצדדים הערות מזלזלות על התכנית שיש לכתוב דעו שהוא: (א) משקר, או (ב) כבר היה בעבר במקום בו אתם מצויים עתה, ועל-כן עתה הוא כבר קדימה יותר; כל כמה שזה נראה לכם לא אפשרי, תוך זמן מה גם אתם תתייחסו לתכניות שנראות לכם עתה מחסום בלתי עביר, כאל משימה פשוטה למדי.

בנוגע לכתיבת תכניות. מהיכרותי את טבע האדם, והסטודנט, אני יודע שעת תלמיד מתבקש להתמודד עם תרגיל חדש, על חומר שזה עתה נלמד, הוא, בדרך כלל, פועל בשיטת שלושת השלבים: (א) הוא מציץ בדף התרגיל, ומזדעזע קשות מאכזריותו של מי שניסח אותו. (ב) הוא דוחף את דף התרגיל עמוק ככל שניתן לתִיקו, ומשתדל, בדרך כלל בלי הצלחה יתרה, לשכוח ממנו לכמה זמן, עד שהוא יירגע מהתרגיל הקודם. (ג) מספר ימים לפני מועד ההגשה הוא שולף בכאב לב את דף התרגיל ומנסה להתמודד אִתו; אך אז כבר אין די זמן לאתר את המורה ולהתייעץ עמו, יש לעבוד בשעות בהם הדעת כבר אינה צלולה, ומקַדם הלחץ כבר בשיאו, במיוחד שמסביב כבר נשמעים דיבורים של תלמידים שלכל הפחות נשמעים כמי שכמעט סיימו את העבודה על התרגיל. כאן עלי להזהירכם משני כשלים נוספים: (א) לעולם אל תעתיקו תרגיל, אל 'תציצו' בתרגיל של חבר 'רק כדי לקבל רעיונות', ואל תעבדו עם חבר ששולט בחומר טוב מכם וש- 'רק יסייע לכם'. אתם יורים כך לעצמכם כדור ברגל! מורה הקורס עייף מלשבת ב-'משפטי שלמה' כאלה או אחרים בהם עליו להכריע מי כתב תכנית כלשהי, ובאיזה מידה הוא עשה זאת באופן עצמאי. מנגד, כמיטב יכולתנו אנו מנטרים את הנושא ובמידת הצורך מקשים את לבנו, ומענישים בחומרה את מי ששגה. (ב) לעולם אל תתנפלו על המחשב טרם שכתבתם את התכנית בנחת על דף עם עפרון ומחק. רק אחרי שכתבתם, תיקנתם, שיניתם, ואתם משוכנעים שהפעם יצאה תחת ידכם יצירת מופת שאפילו מחשב אכזרי ייאלץ להודות שהיא מושלמת, הדליקו את המחשב. סביר להניח שתגלו שעדיין יש בתכניתכם שגיאות רבות, אך מנגד שיש בה כבר גם גרעין של תכנית סבירה שניתן לשפץ. התנפלות על המחשב עם תכנית שלא נבדקה על-ידכם בראשכם שוב ושוב, היא מתכון לתסכול, זעם, ובמקרה הטוב לתכנית מסורבלת שנראית כמו טלאי על טלאי (ובמקרה הרע לקטסטרופה). הקפידו עד מאוד להגיש את כל התרגילים הניתנים לכם. הניסיון מלמד שתלמיד שלא הגיש שני תרגילים רצופים יכול לראות את עצמו כמי שמצוי עם יותר מאשר רגל אחת בחוּץ.

בקורס זה נלמד את שפת ++ C או ליתר דיוק חלק משפה זאת. שפת ++ C היא שפה עשירה מאוד, ועל כן בזמן המוקצה לקורס זה לא נוכל, וגם לא נזדקק, להיכרות מלאה עמה. יחד עם זאת אני ממליץ לתלמיד השקדן, בהמשך הדרך, אחרי שהיכרותו עם המרכיבים הבסיסיים של השפה תשתפר, לקרוא בספרים, וללמוד את היבטים נוספים של השפה, וכל המרבה הרי זה משובח. בפרט ובמיוחד לא נכיר חלק לא מבוטל של השפה המאפשר תכנות בגישה הקרויה 'תכנות מונחה עצמים' (Object Oriented Programming). בקורס זה נתמקד בגישה תכנותית הקרויה 'תכנות מודולארי' (Modular Programming). נראה לנו כי מכיוון שבעולם התכנות קיימות פרדיגמות שונות, והתכנות המודולארי הוא פרדיגמה חשובה, אזי מתאים להיכנס לעולם התכנות דרך שער זה, ואת הגישה מונחית העצמים להותיר לקורס המשך, בפרט לכזה במבני נתונים, בו גם טבעי לתכנת עם אובייקטים. מנגד, בַקורס לא נסתפק רק בהיכרות עם שפת ++ C אלא נשאף לרכוש את מיומנות התכנות המודולארי. מניסיוני, רכישת צורת החשיבה המודולארית היא אחד האתגרים המרכזיים הניצבים בפני התלמיד, אחרי שהוא התגבר על האתגר הבסיסי של השימוש בפקודות שמעמידה לרשותו השפה.

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

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

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

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

אחת ההתלבטויות המרכזיות שעמדו בפני עת ניגשתי לכתוב ספר זה הייתה הבאה: אני מטיף לתלמידי השְכם והערב כי הנכס החשוב ביותר עִמו הם יכולים לצאת משערי האקדמיה הוא היכולת לקרוא חומר כתוב באנגלית. אני מוסיף כי הם יילמדו בבית-ספרנו נושאים רבים, מגוונים, ומעשירים. אחר הם ייבחנו על אותם נושאים, ואז הם יישכחו את תלמודם. מה אם כן יישאר לַתלמידים? מה הם בכל אופן יילמדו? הם יילמדו ללמוד. הם יעשירו את צורת החשיבה שלהם, ובדרך מסתורית כלשהי החומר הרב שהם יילמדו, ואחר יישכחו, יקֵל עליהם ללמוד נושאים אחרים לגמרי, אשר יעסיקו אותם אחרי תום לימודיהם. אולם הבסיס לַיכולת ללמוד, הוא היכולת לקרוא; וכאשר במקומותינו אומרים 'היכולת לקרוא' אין הכוונה לקרוא את התנ"ך בשפת המקור (מעשה יפה כשלעצמו, אך לא רלוונטי לענייננו), אלא הכוונה היא לקרוא חומר טכני הכתוב באנגלית. ובכן, מחד גיסא אני מטיף לרכישת מיומנות הקריאה באנגלית, ומאידך גיסא אני מציע לתלמידים חומר בעברית. זו אכן דילמה. להגנתי אני אומר כי בסמסטר הראשון של שנת הלימודים הראשונה מגיעות לתלמידים הקלות והנחות מתוקף מעמדם כ- 'אפרוחים'. הנחות שהולכות ובטלות ככל שהם גדלים. עלי להודות שאיני חש שלם לחלוטין עם טענה זאת, ועל כן אני קורא לכם: למרות שהספר שלפניכם כתוב בעברית, לִמדו ובעיקר הִתרגלו לקרוא חומר באנגלית. זה מאוד חשוב!

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

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

דרך צלֵחה.

תודות והפצרות

כתיבתו של ספר זה התאפשרה רק תודות לדורות של תלמידים שהניחו את זְקנם (מרצונם, או שלא מתוך בחירה) תחת תערו של כותב שורות אלה, ואִפשרו לו לרכוש ולשכלל את ניסיונו. על-כן ראשונים לכל ראויים הם לתודתי. כמו כן רציתי להודות למורים הרבים שלימדו לצדי לאורך השנים, ותרמו לנושאים המוצגים בספר זה. בפרט אודה ל: דני ברנד, קלרה קדם, שוקי שגיב, מיכל פרנס, תמר וילנר, והצעירים חסרי המנוחה דן צפריר וגיל בז'רנו שגם הקציעו את שליטתי שלי בשפת ++C. ברבות השנים נוספו לקודמים גם: זיו בלשאי, מוטין פריימן, דני זובין שקידמוני עוד צעד. לבסוף אודה למוסדות להשכלה גבוהה השונים בהם שהיתי, ועודני שוהה, ושאפשרו לי להגיע עד הלום. שפע של תודות גם לפרופ' מישל ברקוביאר, שללא ההצעות, ההפצרות, והעידוד שלו, הסרטונים והאתר לא היו נוצרים.

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

א. שגיאות כתיב, כתב, ניסוח או שפה.

ב. חומר שאינו מוסבר בצורה די בהירה.

ג. חומר שאינו מוסבר כלל וראוי היה שיוסבר.

ד. חומר שמוסבר אולי כהלכה אך באופן שגוי!

הערות תתקבלנה בברכה באמצעות הדואר האלקטרוני:

yoramb@hac.ac.il

יורם ביברמן