הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
איך ללמוד תכנות בגיל צעיר?
כשהייתי בן 11 הורים שלי קנו לנו מחשב קטן ZX Spectrum עם מעבד Zilog Z80 מ־48KB של זכרון. "מערכת ההפעלה" שלו הייתה BASIC פשוט, הוא התחבר לטלוויזיה, התוכנה נשמרה ונטענה מקלטות. אומנם קיבלנו את המחשב בתחילת שנות ה־90 אבל בפועל זו הייתה טכנולוגיה של שנות ה־80. כך או אחרת זה הדליק את העניין שלי ושל אחי בתוכנה התווה את הדרך המקצועית של שנינו. למדתי עליו תכנות בסיסי והאסמבלי של Z80 הוא הראשון (ובעצם היחיד) שלמדתי לעומק.
קצת נוסטלגיה
עבר המון זמן. אבל תמיד אהבתי את המחשב הקטן ההוא. שחקתי עם אמולטורים שלו כמו fuse ואפילו בניתי תוכנה עבורו. אפילו חשבתי לקנות אחד ישן - אבל תמיד זה העלה שאלות - חיבור למסכים, אלטרוניקה של שנות ה־80 עם קבלים שלרוב נהרסו ועוד כל מיני שיקולים.
אבל לאחרונה יצאה מחשב "מחודש" הנקרא "The Spectrum" שמעשה מדמה את המחשב הישן נראה בדיוק כמוהו אבל עובד עם טכנולוגיה מודרנית - מאפשר לטעון טכנה מדיסק־און־קיי ומתחבר למסך עם HDMI. אחרי הרהורים קצרים הזמנתי אחד מ־Amazon צרפת ו... לא התאכזבתי. באמת, מחשב קטן וגאוני. מהר מאוד כתבתי בשבילו כמה משחקים פשוטים ב־BASIC למשל Snake. הראיתי את המחשב לבתי הגדולה. הראיתי כמה פקודות פשוטות. כתבתי לידה משחק פשוט בו תפוסים קוביה שנופלת
1 BORDER 1
5 LET row=0
6 LET score=0
10 LET p=16
20 LET col=15
25 LET row=0
30 PRINT AT row,col;"#"
40 LET row=row+1
100 PRINT AT 20,p;"^"
105 LET psave=p
110 IF INKEY$="p" AND p<31 THEN LET p=p+1
120 IF INKEY$="q" AND p>0 THEN LET p=p-1
130 IF psave<>p THEN PRINT AT 20,psave;" "
140 PRINT AT row-1,col;" "
145 IF row>20 AND p=col THEN LET score=score+1: PRINT AT 21,0;"Score ";score;
150 IF row>20 THEN LET row=0: LET col=INT (16*RND)+7
200 GO TO 30
הפתיעה אותה כמה קל זה היה אז במחשבי 8bit הפשוטים לכתוב דברים כאלה. הייתי רוצה לתת גם לילדים שלי להיחשף לעולם התוכנה. ולמרות שברור לי מחשב כזה הוא נפלא למשימות האלה, אני לא חושב שזה רעיון טוב ללמיד את הטכנולוגיה של שנות השמונים.
אז מה האלטרנטיבות הים?
אני רציתי סביבה בה אפשר לבנות דברים פשוטים כאלה בלי "לפתוח חלונות" לטפל באלף הגדרות ממשק וכד'. משהו שלילד (וגם מבוגר) יהיה קל וכיף להיכנס.
לפני שתגידו Scratch - אני מכיר - אבל הבעיה שלי עם Scratch ש"שפת התכנות" מזעזעת. לא הצלחתי להתחבר. וגם כשנתתי לבתי הגדולה היא לא המשיכה הרבה עם זה. אולי בגלל שאני גם לא הצלחתי.
פתחתי דיוק בנושא בקבוצת פייסבוק של משתמשי ZX Spectrum שוודאי יבינו את הכוונה שלי:
- שפת תכנות קלה יחסית
- אפשרות הפעלה של הכל דרך ide (שלא אצטרך ללמד גם שורת פקודות)
- קל מאוד להגיע לתוצאות מהירות
ועלו מספר אפשרויות:
- love2d עם Lua
- pygame-zero עם Python
- processing עפ שפת תכנות מבוססת Java
- כמובן אותו ה־Scratch
התחלתי לחקור ופתחתי פרוייקט שכולל קוד המקור של כולם (מלבד Scratch)
מטרה - לכתוב משחק פשוט בו כדור נופל ממקום אקראי ומנסים תפוס אותו עם המשטח שמזזים אותו בעזרת מקשים. אם תופסים הניקוד עולה ומוצג למשתמש. הנה דוגמה של המחשק שבניתי ב־pygame zero:
ניסיון ראשון Processing
זה היה הניסיון הראשון שלי אהבתי את ה־IDE המובנה. אבל שפת התכנות הייתה משהו דמוי Java אבל לא באמת. ראיתי שיש plugin שמאפשר לכתוב בפייתון ניסיתי ואז גיליתי שאם יש לי שגיאה בקוד אין לי שום דרך לראות מה ואיפה זה קרה וגם הבנתי שהתמיכה בפייתון כבר לא מפותחת יותר. הייתה אפשרות לעבוד גם עם JavaScript אבל אז המשחק נפתח בדפדפן. ואם יש שגיאה היא מדווחת ברמת הדפדפן.
בהחלט לא משהו שאני אתן לילד.
ואז התאהבתי ב־Love2d
מדובר בשפת Lua ופרויקט Love2d שמאפשר לכתוב משחקים ב־Lua. ראיתי שיש IDE פשוט שנקרא ZeroBrane Studio שעובד יפה ויודע להפעיל את love2d ישירות מתוכו.
מה שבעיקר אהבתי זה פשטות של שפת Lua. עד עכשיו לא יצאה לי לכתוב בה שום דבר. הנה כמה דברים שאהבתי:
- השימוש במילות מפתח כמו if/else/end לניהול הבלוק (קצת כמו בפסקל או Basic) ולא ברווחים או סוגריים מסולסלים.
- בלי גישה Object Oriented - משהו שלא יתאים לילד שזה עתה מתחיל ללמוד.
- לולאות פשוטות כמו
for i=1,10 do
שמתחילות ב־1 ומסתיימות ב־10. בעיקר קל יותר למישהו שלומד מה זה לולאת for בפעם הראשונה.
כתבתי את המשחק המדובר ב־Lua כרגע באמת האופציה הטובה בעיניי.
מצאתי שני חסרונות עיקריים:
- קצת מסובך להשתמש ב־love2d וגם debugger.
- אפס תיעוד בעברית
השני באמת בעיה לילד שרוצה לחקור.
בכל זאת Python עם PyGame Zero?
כתבתי גם פה את המשחק בקלות והתקנתי PyCharm. בהתחלה ניסיתי להריץ דרך pgzrun שאוטומטית מריץ את הלולאה ראשית ועושה import ל־pzgame אבל אז הבנתי שאני לא יכול לדבג ב־pycharm בצורה כזה, אז עברתי לעבודה ישירות דרך python. אבל זה היה די פשוט.
מה שכן אהבתי שמחיקת המסך היא מפורשת (ב־love2d אם רוצים לשמור צריך לעשות פעולה מיוחדת), מעבר לזה יש את כל השטויות של פייתון...
טוב בואו ננסה את הסריטה שוב
למה התחלתי לבדוק את Love/PyGameZero? כי הרגשתי ש־scratch זה פשוט יותר מידי מטומטם. ילד יכול ללמוד לכתוב if/then/else או לכתוב ביטוי מתמטי. לא צריך בלוקים. לא הצלחתי ללמוד את זה התעצבנתי.
אז לקחתי את עצמי לידיים ובניתי את המשחק ב־scratch. ראה תמונות במסך בהמשך. מה אני יכול להגיד.
- אני שונא בניית קוד דרך בלוקים. פשוט מעצבן
- מודל ריצה מאוד לא ברור (הלולאות לכל ספרייט רצים בנפרד?)
- יכולות הציור של ספרייטים המובנות ממש מקלות
- החיבור בין אובייקט לסקריפט זה נראה לי רעיון ממש גרוע. טוב נו.
מה שכן אני מבין למה נותנים לילדים ללמוד את זה. פשוט יותר קל לשחק עם זה לבד. נקודה למחשבה...
אז למה לא? חיפשתי איך בונים משחק הנחש ב־scratch והבנתי עד כמה מודל התכנות הוא "מעוות". כשבונים את הנחש מנהלים בד"כ רשימת המקומות בהם יש גוף ואז מוחקים מהרשימה לפי המיקום. פה לדוגמה משכפלים את ה"קוביה" והיא נשארת שם לזמן קבוע לפי score. בקיצור צורת חשיבה ממש "סרוטה" - מה שעוד פעם מחזק למה אני לא מלהב מזה.
בלי לראות מדריך איך עושים snake לא הייתי מגיע לזה.
שורה תחתונה
באתי לחפש פתרונות אבל נשארתי עם יותר שאלות
ברור לי יתרון של Scratch מבחינת ההנגשה
היתרון הנוסף שיש המון חומר בעברית - סרטונים וחוגים
החסרון הוא שילדים בגיל 10 כבר לא מטומטמים שאין שום סיבה שלא יוכלו לכתוב את הקוד בצורת טקסט. מעבר לזה המעבר מ־scratch לשפת תכנות נרמלית יהיה הרבה יותר מאתגר.
החסרון השני כמובן זו חשיבה "מעוותת" לפתרון בעיות בשפה נורמלית היה נפתר בקלות.
אני ממש אהבתי את lua ואת love2d כשפה ראשונה - פשוטה וקלילה אבל אפס תיעוד בעברית זו בעיה (אולי להשתמש בתרגום אוטומטי?).
- היתרון הגדול ביותר של pygame zero + python שלומדים שפה מאוד שימושית. יש מעט יותר חומר בעברית וזה באמת כלי רב שימושי. השאלה אם רף הכניסה לא גבוה מידי
תמונות מסך מ־Scratch..
כי אפשר לשמור את הקוד ב־github ולקשר אליו
תגובות
A bit off-topic, but I'm surprised that you didn't work with Lua. I think it's a much better scripting language than python. I personally hate the 1-based indexing and the verbose syntax (i'd rather it be more C-like), but both of these might be a better fit for beginners. From programmer's perspective: lua's scoping > python's scopes; metatables > classes; numbers aren't object; tiny footprint and faster execution.
כי בד"כ lua עובד כ־embedded language לא משהו בפני עצמו (כי גם הספריה הסטנדרטית שלו מאוד דלה) לכן לא יצא לי עד היום - כי פשוט לא היה צורך.
לואה היא שפה הרבה יותר פשוטה וקטנה.
מסכים לחלוטין - אחת הסיבות שאני מעדיף python/numpy במקום matlab/octave זה אינדקס מ־0 - מלבד כמובן העובדה שזו שפה הרבה יותר טובה.
אבל לילד נראה לי הרבה יותר קל להבין עבודה מ־1 ולא מ־0.
גם בפייתון מספר הוא לא אובייקט. אבל הבעיה זו הספריה. אין מה לעשות לפיתון יש ספרייה עשירה מאוד וגם יש כמה דברים מאוד שימושיים כמו שימוש במשהו בסגנון
משהו מאוד קריטי לחישובים
Ah no. In python everything is an object. Even floats, ints, bools and Nones are all objects; represented in memory as structs with a PyObject header preceding the actual data. They are immutable, and are interned (so not every operation involves an allocation), but they are still objects. That's one of many reasons python is so much slower than it could have been.
Yes, python wins over lua because of its eco-system. But I attribute it to an unfortunate twist of history. I'd so much rather have a simpler language with emergent complexity, over a complicated one with tons of syntax sugar.
Also, forgot to mention: lua's stackful coroutines > python async/await model. This one is also very useful in gamedev.
הבנתי את הנקודה שלך. בסוף אנחנו משתמשים בשפה לעשות את העבודה. באם היא טובה או פחות. יש שפות גרועות יותר יש שפות טובות יותר ויש שפות שהעולם משתמש בהן
:-)
לגבי ללמד ילדים ממש התלבטות קשה בין Scratch לבין Lua+Love2d לבין Python+PyGameZero
הוסף תגובה:
חובה לאפשר JavaScript כדי להגיב.