MeCoder הכניסה לעולם התכנות


קוד פתוח

open-source code icon

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

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

מה זה קוד פתוח?

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

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

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

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

איך זה עובד?

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

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

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

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

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

lodash Github page header

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

loadsh Github page readme

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

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

lodash Github page subheader

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

  1. תחילה עליי להעתיק את הקוד של הפרויקט על מנת שאוכל לעבוד עליו. פעולת העתקת הקוד נקראת clone
  2. כעת עליי ליצור ענף עבודה חדש. סינית, אה? אז ככה, הפרויקט משול לעץ כאשר בסיס הקוד המרכזי שלו הוא הגזע אשר בדרך כלל נקרא master. ברגע שאני רוצה לעבוד על שינויי קוד אני מייצר ענף מהגזע הזה ונותן לו שם אחר. מבחינת הקוד זה כאילו העתקתי את כל הפרויקט תחת שם אחר
  3. כעת עליי לערוך את השינויים הדרושים ולשלוח את הענף שלי (עם השינויים כמובן) ל-Github
  4. כעת משהשינויים שלי נגישים לכולם, אני מבקש ממי שמנהל את הפרויקט שיכניס את השינויים שערכתי. לפעולה זאת קוראים Pull Request או בקיצור PR. בדרך כלל לפרויקטים גדולים יש המון PR פתוחים כאשר לא כולם מתקבלים. במקרה שלנו אין לפרויקט הזה אף PR, ניתן לראות זאת בסמוך למקום בו מצוין כמה issues יש לו
  5. ברגע שפתחתי PR כל אחד יכול להעיר הערות על הקוד אותו הצעתי, דבר שיוביל או לדיון על אותן הערות או לשינויים בקוד עצמו. בסופו של דבר, רק למנהל הפרויקט ולמי שהוא נתן הרשאה לכך יש את הסמכות לקבל את הקוד ולשלבו בבסיס הקוד של הפרויקט, או לחלופין לפסול את הקוד המוצע ולסגור את ה-PR למורת רוחו של המציע.
    לתהליך הזה קוראים Code Review או פשוט Review.

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

lodash Github page contributers count

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

פרויקטים המנוהלים ע״י חברות

באופן די מעניין, לא מעט חברות מנהלות פרויקטים של קוד פתוח. נכון, אלו הם ספריות קוד שהם בעצמם משתמשים בהם, אך עדיין - מדוע הם מחליטות לפרסם את הקוד הזה לכל העולם? תבינו, לנהל פרויקט קוד פתוח בקנה מידה גדול, כלומר כזה שיש לו לא מעט כוכבים (לייקים להזכירכם…) וקהילה סביב אותו פרויקט, דורש לא מעט משאבים מבחינת המתכנתים של אותה חברה.
יש חברות גדולות שיש להן צוותים שלמים שמתעסקים בספריית קוד פתוח, ויש גם חברות שיש להם עובד ספציפי שמנהל את כל פרויקטי הקוד הפתוח שלהן. חלק מהמתכנתים הללו הם אושיות תכנות ששווה לעקוב אחריהן בטוויטר, כגון Kent C.Dodds או Ken Wheeler שאף היה כאן בארץ במסגרת כנס React Next 2016.

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

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

  1. ״אם הרבה אנשים משתמשים בספרייה שלי, אז הם למעשה גם בודקים אותה״, וכך החברה מרוויחה בדיקות איכות (QA) בחינם. זוכרים את ה-issues? אז בדיוק שם אנשים מעלים באגים או בעיות אחרות בספרייה
  2. ״אם אצליח לערב את הקהילה בפרויקט שלי אז סביר להניח שחלק מהמתכנתים ירצו לתרום לפרויקט קוד כלשהו״. בין אם לתיקון באג, להוספת פונקציונליות חדשה או כל דבר אחר. למעשה החברה מרוויחה כאן כוח תכנותי בחינם.
    אני מודה שאני חושב שהסיבה זו היא הכי פחות סבירה, משום שהעלות של ניהול פרויקט גדול כקוד פתוח ככל הנראה עולה על החיסכון שמגיע עם קוד החינם.
  3. ״אם מתכנתים יראו איזה קוד מעולה אנחנו כותבים אצלנו בחברה, הם ירצו לעבוד אצלנו״. כן, יחסי ציבור בקהילת המתכנתים זה דבר חשוב. לא פעם אני רואה בטלוויזיה שמראיינים איזה מנכ״ל של חברת הייטק ישראלית, ללא שום תוכן אמיתי, פשוט כי החברה רוצה לשווק את עצמה למתכנתים ישראלים מוכשרים. צריך להבין שלגייס מתכנתים טובים זה דבר לא פשוט בכלל. מתכנתים גרועים ובינוניים יש בלי סוף, אותם לא צריך הרבה בשביל לגייס. לעומת זאת בשביל להשיג מתכנת ברמה גבוהה חברות ישקיעו הרבה מאמץ, זמן וכסף.

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

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

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

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

איך לתרום לפרויקטים של קוד פתוח?

קודם כל, חשוב לציין שמרבית הפרויקטים הגדולים מקטלגים את ה-issues שנפתחים לפי רמת הקושי שלהם, כך שחלק מה-issues יתויגו כמתאימים למתחילים.
אם נסתכל על הפרויקט Webpack שהוא פרויקט קוד פתוח גדול, מוערך ובעל שימוש נרחב ביותר בעולם ה-Web, נראה שיש לו כמה מאות issues. בלחיצה על ה-issues נגיע למסך המפרט את כל אותם issues, ואם נלחץ על labels קיימת אפשרות לסנן את כל ה-issues לפי רמות קושי. כפי שמופיע בצילום המסך נבחר באפשרות "D0: My First Commit״ אשר תציג לנו רק את אותן בעיות אשר פתרונן פשוט יחסית ומתאים לאלו שזוהי תרומת הקוד הראשונה שלהם.

webpack Github issues page

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

סיכום

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