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

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

בוא אני אסביר לך איך זה עובד

19/12/2020

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

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

הדרכה אפקטיבית מתחילה בהקשבה:

  1. מה אתה מנסה לעשות?

  2. איך חשבת לגשת לזה?

  3. מה ניסית בינתיים?

  4. למה לדעתך זה לא עבד?

  5. מה הדבר הבא שחשבת לנסות?

  6. אולי תנסה גם את זה?

אבל מי יקרא את זה בכלל?

18/12/2020

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

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

  1. מתכנת רואה בעיה

  2. מתכנת מחפש בגוגל פיתרונות

  3. מתכנת מוצא פיתרון שעובד

  4. מתכנת ממשיך לבעיה הבאה

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

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

איך לשתף קוד באמצעות חבילות npm

17/12/2020

כולכם כבר יודעים להפעיל npm install כדי להתקין חבילות מהרשת, גם עבור פיתוח Backend ב node.js וגם עבור פיתוח Front End. אבל מה אתם עושים כשצריך לשתף קוד שלכם בין פרויקטים?

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

המשך קריאה

למה קשה כל כך לסיים פרויקט תוכנה

16/12/2020

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

כי כל קומה שהם מסיימים בבניין היא קומה שהם סיימו. פה זה נגמר.

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

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

מותר להתחרט

15/12/2020

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

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

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

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

זה לא עוזר לחשוב יותר חזק

14/12/2020

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

האמת כמובן יותר מורכבת.

בימים הטובים של CSS לפני כל ה border-radius היה פופולרי בראיונות עבודה לבקש מהמועמד לצייר div ים פינות עגולות. הפיתרון היה לבנות 4 div-ים אחד בתוך השני ולהגדיר לכל אחד תמונת רקע אחרת, ואני לא מאמין שמישהו היה מגיע לזה בלי להכיר את הטריק קודם. זה פשוט לא עוזר לשבת ולחשוב יותר חזק.

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

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

תאימות אחורה

13/12/2020

כך נראה חלק מלוג הקומיטים האחרונים בספריית ini, ספריה לעבודה עם קבצי ini ב JavaScript:

* 20e950e Use Object.create(null) to avoid default object property hazards
* a2c5da8 (tag: v1.3.8) 1.3.8
* af5c6bb Do not use Object.create(null)
* 8b648a1 don't test where our devdeps don't even work
* c74c8af (tag: v1.3.7) 1.3.7
* 024b8b5 update deps, add linting
* 032fbaf Use Object.create(null) to avoid default object property hazards

שימו לב מלמטה למעלה לקומיטים שקשורים ל Object.create:

  1. קומיט 032fbaf עבר להשתמש ב Object.create(null)

  2. קומיט af5c6bb חוזר ל Object.create רגיל

  3. וקומיט 20e950e חוזר ל Object.create(null)

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

עכשיו מה קרה? אנשים שקיבלו את הספריה רצו לבדוק אם באמת יש שדה מסוים בקונפיגורציה, אבל בשביל לא להתבלבל עם המאפיינים המובנים של JavaScript השתמשו בקוד שנראה כך:

config.hasOwnProperty(blah)

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

והקומיט האחרון שחוזר ל Object.create(null) ? נו, זאת בדיוק הסיטואציה שבגללה פותחים גירסה 2 של הספריה ושוברים תאימות אחורה.

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

פיתרון מוסבר ל Advent Of Code 2020 יום 5

12/12/2020

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

המשך קריאה

קירות דימיוניים

11/12/2020

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

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

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

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

במקרה הגרוע ביותר

10/12/2020

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

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

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

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

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

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

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

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

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