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

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

היום למדתי: ההבדל בין URL ל URI

22/04/2022

לא להאמין שהעברתי חיים שלמים בלי לדעת את זה, אבל אם גם אתם פתאום לא בטוחים אז הגעתם למקום הנכון. קודם כל משמעות ראשי התיבות דומה - URL הוא Uniform Resource Locator ו URI הוא Uniform Resource Identifier. ההבדל ביניהם הוא עדין אבל חשוב:

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

https://schema.org/Person
foo://example.com:8042/over/there?name=ferret#nose
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
urn:isbn:0-486-27557-4
https://stackoverflow.com/questions/4913343/what-is-the-difference-between-uri-url-and-urn
data:,Hello%20World

חלק מה URI-ים מתיחסים למסמך ספציפי ברשת ומסבירים איך להגיע אליו. למשל ה URI הזה:

https://stackoverflow.com/questions/4913343/what-is-the-difference-between-uri-url-and-urn

הוא קישור ל Stack Overflow. הוא סוג של "מצביע" לדף בפרוטוקול https. מזהים כאלה נקראים URL-ים, כי הם מספקים דרך לאתר (to locate) את המשאב שהם מזהים. הרבה פעמים, וזה קצת מבלבל, ה URI יהיה בעצם כתובת אינטרנט של דף שלא באמת קשור לדבר שהוא מזהה. לדוגמה ב HTML 4 מסמך היה מתחיל בשורה:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">

אבל לדפדפנים לא היה אכפת אם הייתם טועים בכתובת האינטרנט שמופיעה שם. הסיבה שיש כתובת אחרי ה DOCTYPE היא רק בשביל לזהות את הגירסה של ה HTML, ובעצם השורה מתפקדת בתור URI ולא URL - אף אחד לא משתמש בה כדי לקרוא את המסמך שנמצא בה. אותו סיפור קורס ב XML Namespaces וגם במזהים של schema.org.

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

למידע נוסף שווה לקרוא את הפוסט הזה מהבלוג של auth0 שעוזר לחדד את ההבדל בין המושגים: https://auth0.com/blog/url-uri-urn-differences/

הדרישה שלא כותבים במודעת הדרושים

21/04/2022

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

"מבין או מבינה את הסיפור"

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

  1. מה המטרות של הקוד הזה

  2. מה האילוצים שהקוד צריך להתמודד איתם

  3. מה היו האילוצים של מי שכתבה את הקוד

  4. איזה חלקים שם בכוונה ומה שם בטעות

  5. מה הולכות להיות הבעיות בקוד הזה בעתיד הקרוב

  6. איזה בעיות סביר להניח שיהיו לקוד הזה בעתיד היותר רחוק

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

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

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

שמונה דוגמאות ל Ruby One Liners משורת הפקודה ביוניקס

20/04/2022

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

המשך קריאה

אין בעיה של מקום

19/04/2022

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

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

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

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

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

  1. אנחנו נשמור עליך נתונים X, Y ו Z.

  2. הנתונים יישמרו לתקופה של Y שנים.

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

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

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

פיתרונות פשוטים, פיתרונות מסובכים וקיפאון

18/04/2022

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

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

כמה חודשים אחרי זה נתקלתי בהם שוב - נו, שאלתי, "איך הלך עם ההתאמה של create-react-app?", והתשובה היתה קצת מפתיעה. החלק הצפוי הוא שהם באמת ניסו את הרעיון שלי לעשות התאמה של cra לצרכים שלהם וויתרו על זה די מהר. העסק היה מסובך מדי ותמיד היו דברים חשובים יותר לעשות. ברור שזה אחלה פיתרון אם זה היה עובד, אבל הוא דורש יותר מדי עבודה.

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

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

אבל הם לא היו צריכים.

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

חמש תשובות יותר טובות מ"נראה אחלה"

17/04/2022

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

  1. מתי הספקת לעשות את כל הריפקטורינג הזה?

  2. בשביל מה היית צריכה לגעת במודול ההוא - הוא עבד מעולה קודם

  3. וואו איך הכל נטען כל כך מהר!

  4. למה לקח כל כך הרבה זמן לבנות כזה פיצ'ר פשוט? אנחנו לא צריכים את כל הבדיקות האלה בשביל זה יש QA

  5. התיעוד נראה מעולה

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

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

סיבות (ששמעתי במקרה) להיות עצמאי

16/04/2022

  • רק בתור עצמאי הצלחתי לעבוד במה שאני רוצה באמת

  • בתור שכיר במקצוע שלי הייתי מרוויח רבע

  • רציתי לבחור איזה פרויקטים אני לוקח ועל מה אני עובד

  • רציתי לבחור עם איזה אנשים אני עובד (ועם מי אני לא עובד)

  • נמאס לי שאני עושה את כל העבודה והבוס לוקח את כל הקרדיט

  • חיפשתי דרך לבלות יותר זמן עם הילדים

  • חיפשתי הכנסה נוספת

  • תמיד חלמתי להקים עסק שיצליח בגדול

  • כולם במשפחה שלי עצמאיים

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

שתי דרכים להגדיר תורים ב RabbitMQ

15/04/2022

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

המשך קריאה

אבל זה עבד לי בבוקר

14/04/2022

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

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

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

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

  2. שימרו לכל פרויקט סט בדיקות אוטומטיות ומכונה שיכולה להריץ בדיקות אלה.

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

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

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

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