הבלוג של ינון פרק

טיפים קצרים וחדשות למתכנתים

מוטיבציה

07/02/2021

בין הסיבות שאנשים מוצאים כדי ללמוד טכנולוגיה חדשה יש לנו:

  1. כדי להתקבל לעבודה.

  2. כי במקום העבודה התחילו פרויקט בטכנולוגיה זו.

  3. כדי להשתלב בפרויקט בטכנולוגיה זו בעבודה.

  4. כי יש ציור של חד-קרן בדף הבית.

  5. כי כל החברים שלי מדברים על זה.

  6. כי כולם ברדיט מדברים על זה.

  7. כי אני חושב שזה יעזור לי להיות מתכנת טוב יותר.

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

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

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

לא בליגה שלי

06/02/2021

אחד הפרדוקסים המעניינים של לימודים קורה כשאני מנסה ללמוד חומר שהוא לא בליגה שלי. לדוגמה היתה לי תלמידה שבקושי הצליחה לכתוב תרגילי FizzBuzz פשוטים אבל סיפרה שלפני שהגיעה אליי היא היתה בקורס בו היא כתבה שרת ווב להעברת אימייל שכלל קוד Front End, קוד Back End והתממשקות עם SMTP.

איך אפשר לכתוב קוד כל כך מתוחכם בקורס אחד, ולא להצליח לכתוב דברים מאוד פשוטים בקורס אחר?

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

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

בואו נכתוב משחק Pong פשוט עם הספריה Pyxel ב Python

05/02/2021

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

המשך קריאה

שלושים דקות זוז

04/02/2021

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

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

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

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

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

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

מתכנתים טובים / קוד טוב

03/02/2021

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

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

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

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

פשוט תראה לי איך עושים את זה

02/02/2021

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

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

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

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

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

function Numbers(props) {
    return (
        <ul>
            {Array.from({ length: 10 }).map((x, i) => <li>i + 1</li>)}
        </ul>
    );
}

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

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

function Numbers(props) {
    const numbers = [];
    for (let i=1; i <= 10; i++) {
        numbers.push(<li>{i}</li>);
    }

    return (
        <ul>{numbers}</ul>
    );
}

וגם זה עבד! אפילו שלא יקבל שום נקודות ב Stack Overflow ואף אחד לא יכתוב שום פוסט שימליץ על השיטה.

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

function Numbers(props) {
    const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    const listItems = numbers.map(x => <li>{x}</li>);

    return (
        <ul>{listItems}</ul>
    );
}

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

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

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

שתי בעיות עם הערכות זמנים

01/02/2021

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

... שלושה ימים מאוחר יותר

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

... שבוע מאוחר יותר

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

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

שלושה סוגי כלים

31/01/2021

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

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

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

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

למידה טבעית

30/01/2021

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

בואו נתחיל עם זה - "איך באמת אנחנו לומדים ביום יום?" . אפשר לקחת דוגמה פשוטה מהחיים למשל של לימוד מילה חדשה בשפה:

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

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

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

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