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

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

שיקולי תקציב

07/11/2021

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

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

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

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

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

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

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

חמש תוכניות coconut כדי להכיר שפה חדשה

06/11/2021

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

$ pip install coconut

ואחרי ההתקנה אפשר ליצור תוכניות קוקונאט בתוך קבצים עם סיומת coco או להפעיל את ה interpreter עם הפקודה coconut ולהריץ ביטויי קוקאנט. ויש גם סביבת הרצה נוחה בענן בקישור: https://cs121-team-panda.github.io/coconut-interpreter/.

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

המשך קריאה

איך זה נשבר

05/11/2021

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

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

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

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

שתי דוגמאות ל Vue Hooks כדי להבין איך זה עובד

04/11/2021

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

המשך קריאה

רעיונות שלא עזרו לי להצליח כפרילאנסר

03/11/2021

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

המשך קריאה

לא באמת חדש

02/11/2021

שתי הזדמנויות לעבודה יותר יעילה-

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

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

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

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

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

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

הזמנה לוובינר: צעדים ראשונים עם קוברנטס

01/11/2021

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

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

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

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

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

  2. העלאת גירסה ב Zero Downtime Deployments.

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

  4. אבסטרקציה של Cron Jobs ומעקב אחרי הג'ובים שרצו או נכשלו.

  5. ניהול אוטומטי של "סודות".

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

סך הכל אחרי שמתרגלים העבודה עם קוברנטס היתה לי (ותהיה לכם) קלה יותר מאשר העלאת קונטיינרים ידנית לשרת או עבודה עם docker-compose.

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

https://www.tocode.co.il/workshops/107

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

נתראה בחמישי, ינון

הדבר שלא עשית

31/10/2021

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

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

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

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

תרגיל אחד מספיק

30/10/2021

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

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

קסום.

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

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

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

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

29/10/2021

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

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

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

המשך קריאה