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

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

טיפ npm: השלמה אוטומטית של פקודות מ package.json

21/10/2019

לקח לי שניה וחצי להתאהב באפשרות של הגדרת קיצורי דרך באמצעות בלוק scripts בקובץ package.json, ואז עוד יומיים וחצי להתעצבן על עצמי שאני לא זוכר אף אחד מהקיצורים שהגדרתי. אם גם לכם זה קורה תשמחו לשמוע ש npm עצמו כבר מגיע עם מנגנון של השלמה אוטומטית שמתממשק ישירות ל bash שלכם.

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

npm completion >> ~/.bashrc

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

$ npm run <Tab>

נקבל השלמה אוטומטית מתוך הסקריפטים שמוגדרים בבלוק scripts ב package.json.

קריא למי שמבין

20/10/2019

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

print''.join(list(open('../fd/0'))[1:])[-26:]

השורה פשוט לא נכתבה בשביל שיבינו אותה. היו שם מטרות אחרות.

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

(rows == good_line).all(axis=1).any()

ואולי עדיף לכתוב לולאה במקום. ההבדל הגדול בין שתי השורות - במקרה הראשון קריאות לא היתה המטרה, ולכן גם אם אתם מכירים טוב אם print, list ו open עדיין יהיה קשה להבין מה קורה שם. במקרה השני הקוד קריא למי שמבין. אם אתם מכירים טוב את numpy ובפרט את הפונקציות all ו any שלו, לא תהיה לכם שום בעיה להבין מה השורה עושה. סיכוי טוב שזה יהיה אפילו יותר ברור מאשר הלולאה המקבילה.

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

הרגלי עבודה

19/10/2019

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

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

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

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

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

שטויות שחשוב לשים לב אליהן במבחן מעשי

18/10/2019

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

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

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

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

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

  4. כדאי להיזהר מ Over Engineering. לכתוב עשרות קלאסים וירושות בשביל משימה קטנה כנראה ישאיר רושם שאתם אנשים שאוהבים לסבך דברים.

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

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

בהצלחה!

כמה זמן זה לוקח?

16/10/2019

כמה זמן צריך בשביל לבנות תיק עבודות טוב?

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

כמה זמן לוקח ללמוד משהו מספיק לעומק כדי לעבור ראיון עבודה?

כמה זמן לוקח בשביל נטוורקינג טוב? בשביל שיכירו אותך בתור פרילאנס מומלץ?

כמה זמן לוקח עד שמישהו ימליץ עליך לחבר?

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

כמה זמן לוקח עד שהפרויקט הקטן שלך יתחיל להכניס כסף?

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

כמה זמן לוקח לבנות קורס אונליין טוב?

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

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

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

הפתעה לא נעימה

15/10/2019

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

You can turn Fraudulent Website Warning off (in Settings > Safari) as long as you're willing to accept less vigilance against sketchy pages. The issue is really that Apple activates the feature by default without alerting users, and that it doesn't specify just where Tencent operates

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

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

נ.ב. לינק לאחד המקורות בנושא (מאמר של מאת'יו גרין): https://blog.cryptographyengineering.com/2019/10/13/dear-apple-safe-browsing-might-not-be-that-safe/.

תבחרי סיפור

14/10/2019

״שנה שלמה למדתי בשביל העבודה הזאת. היה ממש קשה אבל אני שמחה שהתמדתי - יש לי היום עבודה טובה ששווה את המאמץ״.

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

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

אוי לא! יש טעות באינטרנט...

13/10/2019

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

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

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

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

  4. אתרי שאלות כמו Stack Overflow ו Quora הם מקור ידע מעולה אבל שימו לב שאתם קוראים תשובה עדכנית ואת כל ההערות הרלוונטיות.

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

"מה בנית?" לעומת "מה את מסוגלת לבנות?"

12/10/2019

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

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

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

What is a closure, and how/why would you use one?

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

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

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