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

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

להתאמן בבית

04/09/2020

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

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

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

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

מבחינת כלי פיתוח גיטהאב וגיטלאב מספקים מנגנוני CI/CD חינמיים לגמרי כך שאפשר לבנות Pipeline לתוכנה שבניתם בבית שיהיה טוב כמו ה Pipelines שתמצאו בתעשיה.

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

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

תתחילו בלחפש את השאלות

03/09/2020

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

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

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

יוטיוב מלא במדריכי "איך לבנות אפליקציית React ו Node.JS מאפס", "איך לכתוב פאקמן ב Python" או "איך להתקין ולהגדיר את ה vimrc המושלם". כשאתם חדשים לגמרי לנושא אלה בדיוק סוג המדריכים שתרצו לצפות בהם. אני מוצא שכמעט תמיד ברגע שאני מצליח לכתוב תוכניות פשוטות אני אלמד הרבה יותר טוב אם אשבור את הראש על שאלות מעניינות או אחפש בעצמי את הסטאפ המושלם.

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

כלי טוב מדי

02/09/2020

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

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

וזאת בדיוק הסיבה ללמוד להשתמש ב cut.

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

const numbers = [1, 2, 3, 4];
const plus = (a, b) => a + b;
const square = x => x * x;
const result = numbers.map(square).reduce(plus);
console.log(result);

על פני:

const numbers = [1, 2, 3, 4];
let result = 0;

for (let i=0; i < numbers.length; i++) {
  result += numbers[i] * numbers[i];
}

console.log(result);

ובדיוק מהסיבה הזאת אני מעדיף את const על פני let.

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

הכלי הטוב מדי מביא איתו יותר עומס ומסתיר את הדבר שבאמת רצינו לעשות.

טיפ יוניקס - מחיקת תיקיה עם מינוס בשם שלה

01/09/2020

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

rails new hello-world

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

rails new --help

וכאן מתחילות הבעיות.

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

rails new --hlep

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

$ ls -l

drwxrwxr-x 2 ynon ynon 4096 Aug 31 20:57 --hlep

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

$ rm -rf --hlep

rm: unrecognized option '--hlep'
Try 'rm ./--hlep' to remove the file '--hlep'.
Try 'rm --help' for more information.

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

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

$ rm -rf -- --hlep

צעדים ראשונים עם react-testing-library

31/08/2020

ספריית react-testing-library היא היום הדרך המקובלת לכתוב בדיקות ליישומי ריאקט. קוד rtl נוצר כל פעם שאנחנו בונים אפליקציה חדשה עם create-react-app וגם הסקריפטים הדרושים להריץ אותו. בואו נראה איך להתחיל להשתמש בספריה כדי לכתוב בדיקות ולמה זה כדאי.

המשך קריאה

כמה טיפים מדליקים לשימוש בפקודה date

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

המשך קריאה

לינוקס: עשר שנים אחרי

29/08/2020

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

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

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

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

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

גם הקונפליקט שהיה פעם בין KDE ל Gnome נראה שנעלם. יש לי היום יישומי Gtk וגם יישומי Qt על המכונה וממילא למנהל החלונות שלי (i3) נראה שלא אכפת מכלום.

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

ונסיים בפירסומת קטנה - אם יש לכם Linux או שאתם עובדים בסביבת יוניקס בעבודה ורוצים לשפר את הפרודוקטיביות משורת הפקודה תשמחו לשמוע שביום חמישי אעביר וובינר בדיוק על זה ובו אראה איך להתקין, להגדיר ולעבוד עם כלי שורת פקודה מרכזיים ביניהם zsh, vim ו tmux. פרטים והרשמה בקישור: https://www.tocode.co.il/workshops/102

חדש באתר - סביבות פיתוח אונליין לקורסים

27/08/2020

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

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

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

ואז הגיע גיטפודיו.

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

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

  1. בקורס ריאקט תקבלו סביבת פיתוח בענן שכוללת את כל תיקיית הדוגמאות של הקורס. בשביל להריץ דוגמה תשתמשו ב webpack-dev-server בדיוק כמו שאני מראה בקורס וכל דוגמה מגיעה במבנה של פרויקט מלא עם קובץ הגדרות ה webpack.config.js שלה. זה בדיוק מה שתקבלו כשתעבדו על פרויקט בעולם האמיתי (וכמובן אפשר להוריד את כל הדוגמה אליכם למחשב).

  2. בקורס Node.JS תקבלו סביבת פיתוח בענן שכוללת את התקנת הגירסה של node איתה עבדתי בקורס יחד עם אפשרות קלה להתקין ולהוסיף עוד ספריות עם npm install, גם אם בבית יש לכם חסימה באינטרנט. תוכלו להריץ שרת מתוך סביבת הפיתוח של גיטפודיו ולהתחבר אליו מתוך הדפדפן, בלי קשר להגדרות הפיירוול על המחשב המקומי שלכם.

  3. בקורס Python תקבלו סביבת פיתוח בענן שכוללת את גירסת הפייתון שאני השתמשתי בה בקורס, תוכלו להריץ כל אחת מהדוגמאות וגם להוסיף נקודות עצירה מתוך ה VS Code שמותקן כחלק מהסביבה.

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

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

שתי סיבות שבגללן קשה ללמוד בעולם האמיתי

26/08/2020

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

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

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

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

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

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