כיצד היום מלמדים לתכנת -- טעות או קידמה?

ב־24.2.2007, מאת ארתיום; פורסם תחת: פיתוח, תכנה ומחשבים; ‏20 תגובות

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

ניתן להוריד את הכתבה בפורמט pdf, וגם בפורמט TeX.


תקציר:

לפני הרבה שנים, כשעשיתי את הצעדים הראשונים שלי בתכנות, שיטת הלימוד הייתה שונה לחלוטין מהשיטה שאנחנו רואים אותה היום בבתי-הספר ובאוניברסיטאות. פעם, התחילו מהבסיס - מה זה מחשב, מִמה הוא מורכב, מה זה זכרון, מה זה בית (byte), הסבירו שקיימת שפת-הסף (בלי להיכנס לפרטים); ורק אז עברו ללמד איזושהי שפת תכנות - אז Pascal היה נפוץ בתור שפה ראשונה, הוא נוצר בדיוק למטרה זו - לימוד. היום, באוניברסיטאות מתחילים מ-Scheme (נגזרת של Lisp), שפת תכנות מאוד מיוחדת ששימושית בעיקר ביישומי בינה מלאכותית, בעלת תחביר זוועתי ולא אינטואיטיבי, היא מעולם לא תוכננה לשמש כשפת תכנות ראשונה. לאחר מכן, עוברים ל-Java שבה במתחילים ללמוד תכנות "אמתי", מכניסים מושגים של תכנות מונחה עצמים; ורק לקראת הסוף של שנה שניה מלמדים שפת C, כשפה שמשמשת לכתיבת פרויקט. שם, לראשונה מלמדים מושגים כגון הקצאה דינמית של זכרון, מצביעים ועוד.

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

האם אפשר להזניח את הבסיס?

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

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

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

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

תכנות מונחה עצמים - אופנה חדשה?

אחת הטענות בעד הכנסת Java כשפת תכנות ראשונה היא העובדה ש-Java היא שפה שתומכת ב-OOP2. יש עם זה שתי בעיות מהותיות:

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

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

שפת C היא שפה קשה / מורכבת / בסיסית מידי. האמנם?

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

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

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

מה יהיה?

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

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


הערות שוליים

... הפניה1
הכוונה היא by value ו-by reference.
... ב-OOP2
אני מעדיף להשתמש בקיצור OOP של מושג תכנות מונחה עצמים - Object Oriented Programming בהמשך.
... ומחיקה3
הכוונה להפעלה של constructor, copy constructor ו-destructor.

תגובות

nadavvin נדב, ב־24.2.2007, 15:49

אפשר סתם הצעה?

פורמט PDF הוא לא משתלב באופן הכי חלק מהאנטרנט ובנוסף לי לפחות הוא לא נוח מלקרוא מהPDF עצמו.

מה דעתך להמיר בעתיד גם לHTML עם latex2html?


עשיתי המרה כרגע.

ומלב הבעיה של כיווניות המסמך dir=ltr זה נראה בסדר.

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


תוספת גם הייתי צריך לשנות את הקידוד במיוחד ל utf-8

ארתיום, ב־24.2.2007, 16:19

נדב אתה צודק, אני פשוט התעצלתי להעביר את זה ל-html.

אבל אני לא חושב ש-latex2html הוא כלי שמתאים לעבודה עם עברית - לדוגמה לא לא מתרגם "abstract" מה שעושה ivritex.

עריכה: במיוחד בשבילך הוספתי HTML

איך ייצאת לדף אחד? לי זה חלק למספר דפים לפי החלקים.

שמעת על man?

נדב - הערה חשובה, תקרא טוב טוב

  • אם יש לך משהו להגיב - תשתדל להגיב בתגובה אחת.
  • המנע לשאול שאלות שלא קשורות באופן ישיר לנושא הפוסט. אם יש לך משהו חשוב להגיד שהוא לא קשור באופן ישיר לנושא, אתה מוזמן לשלוח מייל. הדיון בפוסט הוא דיון על פוסט עצמו - לימוד תכנות -ולא על latex2html
  • ההודעות שלך אוחדו.
    nadavvin נדב, ב־24.2.2007, 17:32

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

    מגמת מחשבים למדו גם אבל ההבדל שהם למדו אסמבלר יותר לעומק ועשו דברים הרבה יותר מדהימים.

    השיעורים לא היו קשים ודיי נהניתי בהם.

    זה הרי מאוד טבעי שילמדו בשתי המגמות את זה.

    כרגע ביררתי עם מיטל, ולמרבה ההפתעה, והיא במגמת מחשבים, לא לימדו אותם!

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

    גם עכשיו שאני בעיקר מפתח בPHP אני אפילו מנתח מה קורה מאחורי הכלאים כמו שמארך ממוש בסופו של דבר כרשימה וכו'.

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

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

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

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

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

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

    ארתיום, ב־24.2.2007, 17:41

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

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

    ד"א בת"א מלמדים הכל על לינוקס. כך שדווקא אין לי בעיות עם זה.

    nadavvin נדב, ב־24.2.2007, 17:57

    "ד“א בת“א מלמדים הכל על לינוקס. כך שדווקא אין לי בעיות עם זה."

    גם באונברסיטה העברית.

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

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

    נ.ב. מצטער על פעולות העריכה הרבות שאני גורם לך.

    nadavvin נדב, ב־24.2.2007, 18:06

    ועוד דבר.

    כשהתחלתי ללמוד לתכנת למדתי ביוד על ויזואל בייסיק.

    מבנה המחשב ואסמבלר למדנו רק י"א. (אם כי שערים לוגים למדתי ביוד).

    האם זה אומר שהוכתמתי?

    שעכשיו אני לא יודע מה זה זיכרון, מצביעים וכו'?

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

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

    אז בסופו של דבר את יסודות המחשב באמת למדנו, והעובדה שעבדנו על ג'אווה לא פגעה בזאת.

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

    תייש, ב־24.2.2007, 19:40

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

    nadavvin נדב, ב־24.2.2007, 23:58

    "אלא מתוך ידיעה שזה מקצוע מבוקש והרווח בו גדול."

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

    להיות מתכנת זה לא קל, ורק מי שאוהב את זה ממשיך.

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

    MBD, ב־26.2.2007, 0:42

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

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

    ארתיום, ב־26.2.2007, 8:39

    שלום, MBD, (הגיע הזמן שתגיב למשהו ;) )

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

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

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

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

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

    גורושיט איגור, ב־23.9.2007, 19:09

    כשמישהו מדבר על שפת תכנות(במקרה הזה Scheme או Lisp) כדאי שילמד את השפה כמו שצריך(מה שלא עושים נכון במסגרת האוניברסיטה). גם אני למדתי את השפה(Scheme) בכיתה י במסגרת מגמה של מדעי המחשב, ההתרשמות הראשונית שלי מהשפה היתה שהיא בעלת תחביר זוועתי ושלא באמת ניתן לכתוב בשפה זו משהו מעשי. עברו 8 שנים ולפני כשנה וחצי חזרתי ולמדתי את השפה כמו שצריך(יש הרבה חומר מעולה בשפה האנגלית) ועכשיו אני יודע שזו אחת השפות היותר יפות וטובות שראיתי ולא פחות פרקטית משפות אחרות. ובקשר לתחביר השפה(לScheme לא ממש יש תחביר) הוא זוועתי כשמנסים לחשוב בJAVA ולכתוב בScheme. מי שלא באמת מבין מה זה Macro בScheme לא באמת מבין את השפה! ולא Macro בScheme זה לא כמו Macro בC ממש ממש לא! Scheme כן תוכננה בשביל לימוד.(Lisp לא) Scheme יכולה לשמש כשפת תכנות לכל דבר שבו משתמשים היום בJava וגם לעשות את זה טוב יותר, והיא לא רק לישומים של בינה מלאכותית.

    ארתיום, ב־24.9.2007, 10:58

    אני כן מסכים עם זה ש-Scheme או lisp הן שפות מיוחדות יפות ומאוד שימושיות. אבל זה נכון עבור תחומים מסויימים כמו בינה מלאכותית שבהם יש צרכים ביוחדים -- ועבור הצרכים שלה Lisp פותחה.

    הבעיה היא שברוב מקרי העולם האמיתי scheme/list לא מתאימים. לא בגלל שלא ניתן לעשות איתן הרבה אלא בגלל שהייעוד שלה הוא שונה.

    איגור גורושיט, ב־5.10.2007, 21:13

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

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

    היתרון היחיד של JAVA הוא פופולאריות(כלומר הרבה קוד שכבר כתבו) שום דבר אחר. דרך אגב JAVA פותחה עבור המפתח הממוצע ולכן היא כל כך פופולארית. אז מי שרוצה להיות ממוצע שישתמש בJAVA ובVB.

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

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

    ארתיום, ב־6.10.2007, 14:17
    אם תרצה אני יכול להפנות אותך למקורות שמהם תוכל ללמוד שפות עלו בצורה נכונה

    אני אשמח לקבל הפניות למקורות כאלה, זברים כאלה תמיד מעניינים אותי :)

    איגור גורושיט, ב־23.11.2007, 4:11

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

    How to Design Programs הספר מלמד את יסודות התכנות ועל ארגון נכון של קוד בשפת scheme. הספר שונה מרוב הספרים האחרים על שפה זו(ועל תכנות בכלל) בכך שהוא מציג את הנושא בגישה הרבה יותר פרקטית. www.htdp.org

    Structure and Interpretation of Computer Programs אם אתה אוהב את הצד התאורטי יותר של מדעי המחשב יש ספר נוסף. הרמה גבוה יותר מהספר הקודם ואם יש לך בסיס טוב בscheme אתה יכול לקפוץ על הספר הזה. למרות שהספר לא מניח שיש לקורא ידע קודם בתכנות נתקלתי באנשים רבים אם עבר בתכנות(בשפות פופולאריות) שהתקשו לקרוא את הספר. http://mitpress.mit.edu/sicp/full-text/book/book.html

    אם תרצה מקורות נוספים או עזרה שלח לי מייל ואני אשמח לעזור. בנוסף אשמח מאוד לשמוע מה התרשמותך מהשפה לאחר שתקרא ספרים אלה ואולי אפילו לראות פוסט בנושא :).

    עוד הארה קטנה: לדעתי כשלומדים תכנות ישנם 3 גישות מרכזיות: 1. להתחיל משפה גבוה מאוד(לדוגמה scheme) ולרדת למטה. לדוגמה scheme->java->c->asm 2. להתחיל משפה סף ולעלות למעלה. לדוגמה asm->c->java->scheme 3. להחיל מהעמצע לרדת למטה ולעלות למלעה. asmjava. וזה פחות או יותר מה שקורה היום ברוב מוסדות הלימוד בארץ וגם ברוב המוסדות בחו"ל.

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

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

    איגור גורושיט, ב־23.11.2007, 4:22

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

    ארתיום, ב־23.11.2007, 10:37

    שלום איגור, קודם כל תודה על הקישורים והמקורות בנושא Lisp/scheme אני אשמח לעבור עליהם.

    לגבי הגישות: אני חושב שהגישה השניה מלמטה למעלה היא הכי טובה, אבל הייתי אומר את זה קצת אחרת:

    בשלב ASM לא חייבים ללמד ASM או קודם ממש אלא להסביר מה זה אומר באופן כללי.

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

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

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

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

    איגור גורושיט, ב־23.11.2007, 16:38

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

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

    יואש, ב־10.4.2009, 22:56

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

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

    ארתיום, ב־10.4.2009, 23:09

    כך שאני יכול להבטיח לך שהדור הבא של המתכנתים לא יהיה פגום כולו :)

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

    הוסף תגובה:

     
     כתובת דוא"ל לא תוצג
     

    ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

    חובה לאפשר JavaScript כדי להגיב.

    דפים

    נושאים