30 בנובמבר 2020

איך מתקדמים מ-Junior ל-Senior ?

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

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

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


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

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

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

ברור שמספר 0 בוותק מעיד על חוסר מקצועיות מובהק. אך מספרים בין 2-5 או אפילו בין 5-10 יכולים להטעות.

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

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

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


ותרשו לי לסבך מעט את השאלה. מהי דרגתו של מפתח וותיק, שכבר הוגדר בתור סניור בקבוצת הפיתוח שלו - בתוך קבוצת פיתוח חדשה, בשפת פיתוח ובטכנולוגיה שאינו מכיר ? למשל, מפתח C וותיק שעובר לתפקיד מפתח Web Front end או מפתח JavaScript שעבר לפיתוח Firmware ?

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

בנקודה הזו הדיון מתפצל - 

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


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

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

הוא לרוב יצטרך ליווי צמוד בכל דבר קטן ויתקשה בביצוע משימות פשוטות כמו לעשות commit. 

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

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

אי אפשר לתת לו לעשות code review לאחרים ובאופן כללי יש לו הרבה מה ללמוד על תכנות נכון או על סביבות פיתוח.


ומתי נהפכים לסניור ? תלוי לפי איזה סטנדרטים. 

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

לפי ההגדרה הזו, אני יכול לומר לכם שפגשתי לא מעט מתכנתי ג'וניור עם ניסיון של 5 שנים ויותר.

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

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

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

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

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

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

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

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


אז מיהו מפתח סניור ?

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

הוא עבד במספר ארגונים, זו לא העבודה הראשונה שלו. 

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

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

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

הוא מכיר עקרונות עבודה של Version Control ולא רק מול GitHub.

פיתח מול יותר מ-DB אחד ולא רק SQL.

הוא יודע לכתוב קוד נקי, קל להבנה, קל לשדרוג ומוכן ל-UnitTest.

הוא מכיר עקרונות SOLID וגם כמה Design Patterns.

הוא שמע על Uncle Bob ומכיר עקרונות של Clean Code.

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

הוא לא מתבייש להודות כשנתקע או כשעשה שגיאה.

הוא יודע להציג Design לקוד שלו, גם ב-UML.

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

הוא יודע לכתוב תיעוד ברור בקוד במקומות שנדרש ולא יותר.

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

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

יש כאלה שיוסיפו שהוא גם יכול להיות Tech Lead ולהדריך אחרים אבל נראה לי זה מתאים לרמות הגבוהות יותר כמו Staff או Principal.

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


אז שורה תחתונה, איך מתקדמים מג'וניור לסניור ? 

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

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


עובדים אצלכם בפייתון 2 ? תלמד פייתון 3.

אתם מפתחים בסביבת Windows ? תלמד לפתח בסביבת Linux.

אתה עובד מול Console ? תלמד לפתח מול Web Interface.

תקועים אצלכם עם SQL  ? תלמד לעבוד מול NoSql.

מפתח ב-Angular ? למד React או Vue.

אתה עובד solo בתפקיד ואין אצלכם עוד מפתחים לעבוד איתם ? תרום לקוד פתוח.

למד איך לעשות Code Refactoring טוב. 

למד עקרונות פיתוח נכון: Clean Code, Design Pattern, SOLID

התנסה בשפת תכנות נוספת שלא דומה בכלל לשפת התכנות שאתה שולט בה.

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

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

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


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


מפתחים חסרי תרבות - פרק 47

תגובה 1: