בשבועות האחרונים אני עוקב אחר משתמש טוויטר אנונימי שהוא מתכנת מנוסה/ ראש צוות המחפש עבודה. הוא כותב על החוויה שלו כמחפש עבודה בתקופת מיתון. מן הסתם הציוצים שלו הם ציוצי פריקה מאד אישיים שגם נוטים להיות תקיפים כי זה המקום שבו הוא פורק את התסכולים שלו – אבל התסכולים שלו משותפים להרבה מתכנתים, כולל אני למשל – במיוחד בנוגע לראיונות הטכניים.
יש לא מעט ביקורת על ראיונות טכניים בתעשיה ובמיוחד ראיונות טכניים למועמדים מנוסים יותר. כאשר נותנים למתכנתים מנוסים ראיונות המתאימים יותר לג׳וניורים. למשל פתירת חידות קוד פשוטות. בדרך כלל ניתן להתכונן לראיונות כאלו בקלות אבל זה מתסכל ומרגיז מתכנתים מנוסים.
מהצד השני, מעסיקים ומראיינים די לא מוצאים את הדרך להבין מה היכולת של מתכנת מנוסה ואם הוא מתאים לצוות. יש כאלו שמנסים לתת שאלות ארכיטקטורה (שגם אליהן ניתן להתכונן) אבל בדרך כלל שאלות כאלו אינן משקפות את הידע שיש למתכנתים בתכנות ממש ולא רק במידול או בניית מערכת. לפעמים פשוט גם אין מי שינסח או ידע להעריך נכונה שאלות כאלו.
בגלל שיחסית קל להתכונן לראיונות כאלו, יכול להיווצר false positive – מישהו שמאד טוב בראיון הקוד אבל בפועל הידע הטכני שלו במה שנדרש לפרויקט היא דלה ולצערי לא חסרים סיפורים על אנשים שמאד טובים בפתרון כתיבת קוד אך יש להם בעיות טכניות אחרות והם לא מצליחים בתפקיד. מהצד השני, false negative – מישהו שיכול לא להיות טוב בראיון הקוד למרות שהוא יכול להתאים או שבכלל יסרב לעשות אותו. זה הרבה פחות נורא מ false positive אבל עדיין מעצבן.
אני יכול לקטר אבל אני מעדיף לכתוב את השיטה שעובדת מעולה עבורי לראיון מתכנתים בכירים ואותה יישמתי בלא מעט חברות שעבדתי בהן וייעצתי להן. אולי זה יעזור למראיינים אחרים או למנהלים שצריכים להתוות תהליך גיוס טכני. את השיטה הזו גנבתי כמעט במלואה מחברת Automattic אבל שיכללתי אותה מעט.
ניתן להפעיל את הראיון הטכני הזה במבחני בית או בראיונות פנים אל פנים. כמובן שמדובר בשלב אחד מבין כמה. אני לא מתיימר להכתיב עבורכם את תהליך המיון והניהול אלא לספר על מה שעובד עבורי כאשר אני מבצע בדיקת יכולות טכניות למתכנתים ומתכנתות עם ניסיון של שנים רבות.
המערכת
המועמד מקבל ריפוזיטורי של מערכת כלשהי שקרובה ככל האפשר לתחום שבו אני מראיין אותו. זו יכולה להיות מערכת פייתון, פול סטאק או מערכת סטטית של פרונט אנד. מה שחשוב הוא שזה יהיה קרוב לטכנולוגיה העיקרית של העבודה שלו (יש מקומות שיש בהם כמה טכנולוגיות או טכנולוגית לגאסי, אז תצטרכו לבחור). מה שחשוב הוא שמדובר במערכת של ממש – כלומר עם:
- בדיקות (יוניט, אינטגרציה ו-e2e)
- דיפלוימנט לסביבה כלשהי.
- README כלשהו עם הוראות התקנה והפעלה לוקלית.
- תהליך CI, לינטרים וכל הג׳אז הזה.
במערכת יש באג אחד מאד בולט. מה שחשוב הוא שזה משהו שממש ממש קל למצוא ואפילו עם הערת TODO של fix it. זה אחד השלבים הקריטיים ביותר.
בנוסף, וכאן כן תצטרכו עבודה של מתכנת או מתכנתת שיודעים מה הם עושים, יש במערכת שלל של באגים. אני אתן דוגמה למערכת ריאקט סטטית שהשתמשתי בה:
- בעיות אבטחה: היו בה בעיות של XSS Injection – לפחות שלוש מהן. שלושה מודולים מיושנים, טוקנים גלויים בקוד.
- בעיות ביצועים: ריקורסיות שאין בהן צורך. פונקציות סינכרוניות שאפשר בקלות להמיר לאסינכרוניות.
- בעיות של נוסח קוד: הגדרות הלינטר היו שבורות, שמות לא קוהרנטיים, רווחים מוזרים, דברים שניתן לפתור עם auto fix וכאלו שלא.
- באגים פונקציונליים אחרים אבל כאלו שלא מהותיים ממש.
- בדיקות שנופלות ולא עובדות וקל לתקנן. למשל יוניט שנופל כי הוא לא עושה import נכון, e2e שמשתמש בסלקטורים לא טובים וכך הלאה.
- דיפלוימנט שבור שאינו עובד – במקרה הזה פשוט הצבתי משתנה סביבה עם שגיאת כתיב ו שגיאות בgithub actions.
- שגיאות כתיב, נוסח ובכלל טירוף בדוקומנטציה.
מה שחשוב הוא שיהיו שגיאות רבות שיקח למתכנת או מתכנתת, גם מנוסה, זמן רב לפתור אותן. זמן רב ארוך יותר מזמן המבחן. בין אם מדובר במטלת בית ובין אם מדובר במטלה פנים מול פנים.
נוסח המבחן
כשהמתמודד או המתמודדת מגיעים, יושבים איתם עד שיפתור את הבאג הפשוט. מטרת הבאג הפשוט היא לא לראות אם המועמדים מבינים בקוד אלא לראות שהם on track. כלומר הצליחו לעשות git clone, הצליחו לפתוח את ה-IDE ויודעים להסתדר איתו. חשוב להבהיר שזה שלב חימום ולוודא שבאמת השלב הזה נעשה ויש למועמדים קוד, הם מריצים את הקוד לוקלית ומצליחים לפתור את הבאג הפשוט.
השלב השני הוא יותר מורכב – בשלב הזה מבהירים למועמדים שיש עוד בעיות בקוד ומוקצב להם זמן מסוים לפתור את הבעיות. יש להדגיש כי:
- אין ציפיה לפתור את כל הבעיות ואין דרך לעשות כן.
- יש חשיבות לסדר פתירת הבעיות, לתהליך האנליזה וכו׳.
- יש לבצע git commit מסודר עם commit message אחרי כל פתרון בעיה (קריטי במטלת בית)
המדידה
מועמדים סבירים יצליחו לפתור כמה בעיות. ההנחה היא שמתכנת מנוסה ידע לפתור חלק מהבעיות ופה מתחילה בעצם ההערכה בהתאם למה שמחפשים ולצוות. אין כאן 0 או 1 (למעט מועמדים שלא מצליחים לפתור אפילו בעיה אחת) אלא הערכה שלכם.
אם אתם מחפשים מתכנתים יסודיים, אז בוודאי תעדיפו כאלו שעשו רשימה מסודרת של הבעיות ותעדפו אותן. כאלו שעשו קומיטים מסודרים עם הסבר מדויק. אם אתם מחפשים מתכנתים שנוטים יותר לאבטחה, תעדיפו את אלו שידעו לבדוק את האבטחה קודם. מתכנתים שאוהבים תשתיות? הם יטפלו קודם בלינטר.
הדיון על הפתרון צריך להיות סביב ההעדפה של המועמדים – האם הם ביצעו הערכה או רצו קדימה? מדוע הם בחרו לפתור בעיה אחת ולא בעיה אחרת שהם ראו? אם הם תיקנו את הלינטר קודם – למה קודם הם לא נגעו בבדיקות? אם קודם הם תיקנו את הבדיקות ואז את הלינטר, אז למה ככה ולא ההיפך? התשובות האלו חושפות גם את הכישורים הטכניים של המועמדים אבל גם את נטיות הלב וצורת העבודה שלהם ואז ניתן לראות את ההתאמה שלהם לתפקיד.
למשל:
מועמדים שקודם מסתערים קדימה ופותרים באגים פונקציונליים – זה מעולה לתפקיד מתכנת מוביל במערכת שצריכה עבודה מהר.
מועמדים שמבצעים בדיקה מקיפה ומסתכלים על תשתיות קודם? זה מעולה לתפקיד מתכנת בכיר שיכול להוציא פרויקט בעייתי מהבוץ.
מועמדים שהולכים קודם כל על האבטחה? מצוין לפרויקטים שצריכים בהם מתכנתים כאלו.
זה נותן תמונה טובה בהרבה מ״צור לי אלגוריתם של סדרת פיבונאצ׳י וכו׳״. גם מהניסיון שלי – מתכנתים נהנים יותר לפתור בעיות כאלו. במיוחד כשאין עובר או לא עובר – יש התאמה לתפקיד או חוסר התאמה לתפקיד.
אני יוצא מנקודת הנחה שאין מי שמתאים לכל תפקיד (אני לא מתאים לכל תפקיד, גם כמתכנת) ויש קשת של נסיון טכני באספקטים רבים. אני למשל מתמקד יותר באבטחה, לינטרים ובדיקות מאשר בעיות ביצועים – למה? כי בזה אני מבין יותר וזו נטיית הלב הטבעית שלי.
מדובר במבחן טכני ארוך שגם מצריך משאבים לבדיקה, אבל מצד שני – גיוס של מתכנתים מנוסים זה תהליך ארוך גם כך. פשוט השיטה הזו, לפי דעתי וטעמי, היא טובה בהרבה מהשיטה הקלאסית. גם למראיין וגם למרואיין. כשעברתי תהליך דומה באוטומטיק, ממש נהניתי מהפרויקט הזה. כמראיין, אני נהנה לדבר עם המועמדים על מה שעשו ולבחון את ״המזג התכנותי״ שלהם.
יש כמה חסרונות למבחן. לא מדובר במבחן קל ליישום או לכתיבה, מועמדים לעתים חושדים בכל מיני טריקים ושטיקים או שמנסים לפתור את כל הבעיות שיש (גם אם מבהירים להם מראש את המטרה), יש תיעדוף למתכנתים שיודעים לתכנן ומכירים נושאים מורכבים (שזו ההגדרה שלי למתכנתים בכירים) ונדרש גם זמן רב לבחון את הבעיה. אבל לדעתי היתרונות במבחנים מסוג זה הם גדולים במיוחד עם מתכנתים שיש להם ניסיון של שנים רבות והם עבדו בסוגי מערכות רבות ובאספקטים שונים.
13 תגובות
מעניין מאוד,
בגדול זה אומר שאני צריך להשקיע בלכתוב repo כזה באיזה 4 שפות שונות… ואז איכשהו לקוות שהמועמד לא ידליף אותו (קרה פעם?)
זה חתיכת השקעה, אני אני מבין למה זה עדיף על שאלות בסגנון ליטקוד
מבחן מעולה, השתמשנו בכאלו תרגילים בד"כ לשיפור אנשים ולא בהכרח לעומדן.
בנוסף למבחן, קודם המראיין צריך ללמוד קצת על המועמד דרך רפוסיטוריים ציבוריים שיש לו, פרוייקטים, אתרים או OSים וזה למה חשוב לכל מתכנת לקחת את ההתמקצעות שלו בתור קריירה ולא לקוות שהעבודה תתן קורסים בחינם.
יוסי, שידליף. שימו את כל התקלות ב"רידמי" של הריפו.
זה מה שרן אומר, גם עם ידע מושלם, סיטואציה שאפילו, במיוחד במציאות העסקית אין, המועמד יצטרך "לתת את הדין" ולהצדיק את הבחירה שלו ואז מתפתח דיון שלם על למה הבחירה נעשתה כפי שנעשתה? האם בדיעבד הייתה נבחרת בחירה שונה? וכמובן, אחרי שהכל נידון עד זרא יש גם את הקטע הקטן, הלא מהותי הזה של איכות הקוד שהוגש (כשגם על הקוד עושים דיון, כמובן!
מצידי שהבנדוד מצד החנווני השכונתי פתר את התרגיל עבור המועמד.
אם הבנדוד הזה זמין מתי שצריך אותו, אבל ה-API שלו זה המועמד – אחלה.
אחרת, המועמד לא ידע להסביר את הקוד ש"הוא" כתב ויפול על סעיף שקרן, שזה, לפחות בספר שלי, סעיף שאומרים לכ"א לשים את המועמד עם סימן שחור עליו!)
כתבה מצויינת, תאורטית נהדר.
יכול להיות שזו גישה שמצריכה המון משאבים מכלל הארגון, פגעעה ברמת גניבה או פוסט בגלסדור, תפקיד לצוות אחר מצריך פרויקט דאמי אחר וכו׳.
לכתוב ולבדוק 5 מועמדים עלול לקחת חודש לראש צוות ו 3 ימים לכל מועמד. אז כמו שכתבת….נטיית לבך איזה לביצועים אלה לאיכות הדאטא
מהניסיון שלי הכתיבה של המערכת היא זו שלוקחת זמן רב. הבדיקה עצמה יכולה להיות מינימלית – כשעתיים מצד המועמד וכשעה וחצי שיחה.
יש כאן משהו קצת לא הוגן. אולי הנטיה הטבעית של מועמד היא לגשת קודם לבעיות אבטחה למשל, כי זו היתה הציפיה בתפקיד האחרון שלו. אבל אם רק תסביר לו את סדר העדיפויות שלך ואת הציפיות שלך עבור התפקיד הזה, הוא יוכל לבצע את זה מצוין. למה לפספס מועמדים טובים רק בגלל שזה מה שיעשו בדיפולט שלהם? הרי כשיתחילו את התפקיד, אתה תערוך תיאום ציפיות מסודר, נכון?
כן, אפשר לקחת את זה למקומות לא הוגנים. מצד שני, זה לגמרי תלוי במראיין ובמה שהוא צריך. אני תמיד בעד להסביר כמה שיותר על התהליך ולהיות שקוף בנוגע למה שרוצים ומה מצפים. אבל זה תלוי במראיין.
אגב, למרבה הצער, לא מעט מועמדים חוששים מכל מיני מלכודות. גם כשאני מבהיר להם את הראיונות הם חושבים שצריך לפתור את כל הבעיות (וכתבתי גם במאמר).
כן!!!!!!!! סוף סוף!!!!!!!
עד לא מזמן הייתי נותן מבחן שמבקש לבנות משהו לא גדול אבל שמרגיש דומה לעבודה שהיית עושה לו היית מועסק אצלנו.
לאחרונה עלה חשש שהקוד יעבור קצת יותר מדי GPT במהלך המימוש (למרות שלדעתי אם זה משהו שאתה משתמש בו בעבודה בכל מקרה, מה ההבדל?), ולכן עברתי לראיונות של Pair Programming.
בעוד שאני מוצא שזה גם תהליך מאוד אפקטיבי לבחינת מועמד – אתה רואה איך היא עובדת, יכול לכוון הרחק מדברים לא חשובים או לסבך את הבעייה בזמן אמת כשנראה שזה קל להם מדי – יש פה גם עניין של סקיילביליות – זה עדיין דורש לשבת עם מישהו שעה וחצי, שעתיים.
בכל מקרה, מדובר בעוד גישה שלדעתי יש הרבה פחות אנטגוניזם בתגובה אליה, מועמדים יוצאים בתחושה יותר טובה בסוף, ואני מקבל מידע רלוונטי.
בדיוק . ראיון צריך להיות כמה שיותר קרוב לעולם האמיתי.
לא צריך מבחנים/אודישנים בכלל. זו שיטה מסתכלת. צריך לקבור אותה. לפחות 60% מהתעשייה נגד השיטה, אך חוששים לצאת נגדה ונגד המערכת.
גם לא צריך יותר מ2 ראיונות.
מספיקים שני ראיונות עם שאלות (בעל פה) רלוונטיות לתוכן התפקיד ולנסיון של אותו מועמד.
הגיע הזמן שכולנו נפנים זאת.
מאמר מצוין, לקחתי.
תודה רבה 🙏
אחלה מאמר
נותן כיוונים אחרים
אני אחשוב איך להתאים לארגון שלנו