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

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

לאט אבל בטוח

17/05/2018

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

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

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

לאט אבל בטוח עובד, אבל לאט.

מרחק בלימה

15/05/2018

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

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

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

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

אפקט הרשת של שפות תכנות

14/05/2018

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

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

לדוגמא כדי לכתוב אפליקציות ל iPhone צריך לדעת Swift או Objective C מה שמעלה את הערך של שפות אלו. כדי לכתוב אפליקציות לאנדרואיד תרצו לדעת Java או Kotlin מה שמעלה את הערך של שפות אלו. כשיצאה PhoneGap (והיום עם גדילתה של React Native) היא איפשרה כתיבה של יישומי Mobile באמצעות שפת JavaScript - מה שהפך את JavaScript להרבה יותר פופולרית.

ובחזרה לעתיד - מייקרוסופט הודיעה השבוע שתאפשר כתיבת פונקציות JavaScript מתוך אקסל. התחביר כמובן ES6. אלקטרון מאפשר להשתמש ב JavaScript ES6 כדי לבנות יישומים לשולחן העבודה. React Native ו PhoneGap מאפשרים פיתוח יישומי Mobile עם ES6 וכמובן כל הדפדפנים וכל ה Web Frameworks הפופולריים תומכים תמיכה מלאה ב JavaScript ES6. אם הייתי מחפש שפה עם אפקט רשת טוב ללמוד היום זו כנראה תהיה JavaScript ES6.

אימות קלט בצד הלקוח

13/05/2018

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

לא קלה דרכנו

12/05/2018

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

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

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

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

חידת מהירות בפייתון

11/05/2018

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

def rot1(a, n, k):
    return [a[(i+k) %n] for i in range(n)]
def rot2(a, n, k):
    for _ in range(k):
        a = a[1:] + [a[0]]
    return a
def rot3(a, n, k):                                
    res = a[:]
    for _ in range(k):
        temp = res[0]
        del(res[0])
        res.append(temp)
    return res

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

In [52]: rot1([1,2,3,4,5], 5, 4)
Out[52]: [5, 1, 2, 3, 4]

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

In [38]: timeit rot1(arr, len(arr), 10)
134 µs ± 2.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [37]: timeit rot2(arr, len(arr), 10)
52.9 µs ± 972 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [36]: timeit rot3(arr, len(arr), 10)
5.79 µs ± 56 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [58]: timeit rot1(arr, len(arr), len(arr) * 5)
123 µs ± 577 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [59]: timeit rot2(arr, len(arr), len(arr) * 5)
23.9 ms ± 141 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [60]: timeit rot3(arr, len(arr), len(arr) * 5)
1.26 ms ± 33.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

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

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

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

In [62]: timeit np.roll(na, len(arr) * 5)
12.2 µs ± 190 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [63]: timeit np.roll(na, 10)
14 µs ± 76.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

מה תיקחי איתך לעבודה הבאה?

10/05/2018

שורה לקורות חיים? חברים? ידע ומיומנות? אולי קוד וכלי עבודה?

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

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

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

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

אם התשובה שלך לשאלה היא רק שורה בקורות חיים, אולי כדאי להתחיל להתאמץ יותר.

20 * 30 = ?

08/05/2018

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

עכשיו למספרים:

  1. מסלול קורס תכנות Bootcamp יכול לעלות עד עשרים אלף ש"ח (במחירים של היום כמחיר סופי ללקוח). שלושים כפול עשרים למי שתהה לגבי הכותרת נותן 600. בדקתי במחשבון. אני מזכיר - המדינה תשלם לאקספריס ולבין תחומי סכום כפול מזה.

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

  3. המסלול דורש מכל תלמיד שמונה חודשים של השקעה Full Time במסלול בלי אפשרות לעבודה תוך כדי ובמלגת קיום של 2,000 ש"ח בחודש.

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

יש לכם מיליון ומאתיים אלף ש"ח מיותרים? למה שלא תתנו אותם לואסים אבו סאלם - המייסד של מיזם לופ ללימודי תכנות לילדים במגזר הערבי. התלמידים מגיעים למרכזים שלהם כל יום אחרי בית הספר ולומדים לתכנת (וגם משלמים תשלום חודשי כמו על חוג). בראיון איתו ואסים מספר שהם לימדו באזור ה 8,000 ילדים עד כה. זה הקישור לראיון וממליץ גם לכם לקרוא: https://www.themarker.com/technation/1.6032020

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