עד כמה היכרות עם שפה תלויה ברמת ניסיון המקצועי שלכם?

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

אחד הדברים ששמתי אליהם לב הוא שבחלק משמעותי מהתפקידים ספציפית ב C++ - תמיד תעלה שאלה בסגנון של ״תבחני את הקוד הבא ותגידי מה הוא עושה״ כדי לבחון את ההיכרות שלי עם היבטים שונים של השפה - בעיקר ירושה על סוגיה, מהם הסוגים השונים של Constructors שקיימים בשפה, למה צריך virtual destructor, ומה ההבדל בין new / delete של C++ לעומת הקצאות הזכרון שהיא ירשה משפת סי.

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

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

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

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

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

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

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

vinney

Well-known member
לאחרונה אני מתראיינת ללא מעט תפקידים, ומכיוון שיש לי רקע מסוים בשפת C++ - אני מחפשת גם בה תפקידים.

אחד הדברים ששמתי אליהם לב הוא שבחלק משמעותי מהתפקידים ספציפית ב C++ - תמיד תעלה שאלה בסגנון של ״תבחני את הקוד הבא ותגידי מה הוא עושה״ כדי לבחון את ההיכרות שלי עם היבטים שונים של השפה - בעיקר ירושה על סוגיה, מהם הסוגים השונים של Constructors שקיימים בשפה, למה צריך virtual destructor, ומה ההבדל בין new / delete של C++ לעומת הקצאות הזכרון שהיא ירשה משפת סי.
וואו, מישהו עוד שואל כאלה דברים? לפחות לגבי ההבדלים בין ++C לC - אני לא מצפה מבוגרים טריים של ימינו לדעת את זה, אין שום סיכוי. לא יצא לי לראיין אנשים בארץ כבר הרבה זמן, אבל פה בארה"ב רמת הידע בתחומים האלה של בוגרים טריים היא אפסית. לעתים נדירות מגיע איזה מישהו שרושם שהוא proficient ב20 שפות תכנות בקו"ח שלו, ואז אני שואל משהו כזה רק כדי להוריד אותו טיפה מהעץ, אבל בגדול - זה פשוט לא משהו שאנשים יודעים עכשיו.

שזה בסדר, בטחון תעסוקתי בשבילנו :-D

כשאני מדבר עם אנשים שאשכרה יש להם נסיון ב++C - אני יותר מתעניין בעד כמה הם מעודכנים בתקנים החדשים, ומה נקודות התורפה הגדולות של השפה (ופה אני מצפה לשמוע "אני לא משתמש בnew/delete אף פעם").

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

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

ואתם יודעים מה? סביר להניח שכסטודנטית וכג׳וניורית, הייתי זוכרת את הפרט הזה. C++ היתה השפה שלימדו אותנו דרכה תכנות מונחה עצמים, ודרכה למדנו על מתודות וירטואליות, ועל איך עובדים איתן בשפה, כולל באמת ההתייחסות לטבלת המתודות הוירטואליות.
זאת שאלה מטומטמת. התשובה הנכונה היא שגודל האובייקט תלוי במימוש של הקומפיילר, וביישור הזכרון בארכיטקטורה של המחשב. כמובן שיש את הvtable וכל זה, אבל אם זה ממש חשוב לדעת את גודל האובייקט בדיוק של בית בודד - משתמשים בsizeof.
 
בעיניי, וכמי שמחשיב את עצמי מומחה בשפה הזו (ולפחות במידה מסוימת נחשב כך גם בעיני הסביבה) ואוהב אותה מאוד, חלק מהשאלות האלה הן שאלות עצלניות של מראיינים שלא יודעים לראיין אז הם בורחים לשאלות טכניות, כי אותן קל לנסח ולקבל תשובה שלרוב קל לומר עליה אם היא נכונה או שגויה.
המקום העיקרי שאני יכול לחשוב עליו שבו זה מעניין אם הבנאדם יודע על vptr הוא כדי לדבג ולהבין מאיפה מגיעה הדפסה מוזרה או ערכים מוזרים בזיכרון (כנראה כי עשו איזה casting מופרע ושגוי). לחלק מהשאלות האחרות, תלוי אם המשרה דורשת מומחיות ועומק של הבנה בשפה, או שמספיקה יכולת שימוש טובה בשפה עם best practices.

אגב, אם כבר תחרות טריוויה על השפה, int הוא לא בהכרח 4 בתים (גם אם זה המימוש הנפוץ כיום). במערכות 16 ביט הוא בדרך כלל היה 2 בתים, למשל. כמו כן, פונקציות וירטואליות לא בהכרח ממומשות על ידי vptr ו-vtbl. אין שום דבר בסטנדרט שמחייב דרך מימוש מסוימת. זו חלק מהסיבה שלקומפיילר מותר לעשות devirtualization כשיש לו מספיק מידע על הקוד (אז תיאורטית, אם המערכת מספיק סגורה, הוא גם יכול להשמיט לגמרי את ה-vptr).
 
בעיניי, וכמי שמחשיב את עצמי מומחה בשפה הזו (ולפחות במידה מסוימת נחשב כך גם בעיני הסביבה) ואוהב אותה מאוד, חלק מהשאלות האלה הן שאלות עצלניות של מראיינים שלא יודעים לראיין אז הם בורחים לשאלות טכניות, כי אותן קל לנסח ולקבל תשובה שלרוב קל לומר עליה אם היא נכונה או שגויה.
המקום העיקרי שאני יכול לחשוב עליו שבו זה מעניין אם הבנאדם יודע על vptr הוא כדי לדבג ולהבין מאיפה מגיעה הדפסה מוזרה או ערכים מוזרים בזיכרון (כנראה כי עשו איזה casting מופרע ושגוי). לחלק מהשאלות האחרות, תלוי אם המשרה דורשת מומחיות ועומק של הבנה בשפה, או שמספיקה יכולת שימוש טובה בשפה עם best practices.
בתפקידים שאני פונה אליהם - אין צורך במומחיות הזו.

תראה, אני מבינה את הצורך בשאלות מהסוג הזה דווקא בסי פלאס פלאס - בין השאר כי רוב התוכניתנים בימינו רגילים לעבוד בשפות שכוללות garbage collection וניהול זכרון רחוק מתשומת הלב שלהם - במיוחד מתכנתים שלא למדו שפות שדורשות את ניהול הזכרון כשהם למדו לתואר / עצמיאת / קורס הסבה. זה לא רק עניין של לזכור לעשות delete בסוף, אלא למשל לזכור למה צריך virtual destructor, או אפילו להכיר איך עובדים smart pointers - קונספט שלמיטב זכרוני היה קיים עוד הרבה לפני שהוא נכנס לשפה ב C++11 באופן רשמי אלא פשוט מומש על ידי לא מעט חברות שהשתמשו בשפה.

הנקודה היא שבעיני חשוב לשאול על פיצ׳רים שהיו בשימוש על ידי המתכנת לאורך השנים, לא לבחון עד כמה הוא זוכר בע״פ את ה specs של כל שפה.
אגב, אם כבר תחרות טריוויה על השפה, int הוא לא בהכרח 4 בתים (גם אם זה המימוש הנפוץ כיום). במערכות 16 ביט הוא בדרך כלל היה 2 בתים, למשל. כמו כן, פונקציות וירטואליות לא בהכרח ממומשות על ידי vptr ו-vtbl. אין שום דבר בסטנדרט שמחייב דרך מימוש מסוימת. זו חלק מהסיבה שלקומפיילר מותר לעשות devirtualization כשיש לו מספיק מידע על הקוד (אז תיאורטית, אם המערכת מספיק סגורה, הוא גם יכול להשמיט לגמרי את ה-vptr).
אני מניחה שהשאלה לרוב מיועדת לראות היכרות עם מימושים מודרניים, לא מה נעשה במערכות חריגות או ישנות.
 
אולי לא הייתי מספיק ברור, מה שאני אומר זה שהמראיין ציפה לתשובה מסוימת, אבל אפשר היה להראות לו שגם הוא לא באמת מכיר את השפה בתשובה שמציינת את זה ש"במערכת מצויה כיום ובדרך כלל יהיה כך וכך אבל..."

לגבי החלק הראשון, לדבר על מצביעים חכמים ועל virtual d-tor (שקשורות ל-best practices ואיך בפועל נכתוב קוד) אלה שאלות הרבה יותר רלוונטיות מאשר לדבר על new מול malloc (עזוב אותי באמש'ך, בספ"פ נשתמש ב-new וזהו, למי אכפת למה היה צריך להמציא משהו חדש במקום malloc?) ובטח על גודל של אובייקט
 

Lucifer LightBringer

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

לגבי החלק הראשון, לדבר על מצביעים חכמים ועל virtual d-tor (שקשורות ל-best practices ואיך בפועל נכתוב קוד) אלה שאלות הרבה יותר רלוונטיות מאשר לדבר על new מול malloc (עזוב אותי באמש'ך, בספ"פ נשתמש ב-new וזהו, למי אכפת למה היה צריך להמציא משהו חדש במקום malloc?) ובטח על גודל של אובייקט
היי, צריך להראות שיש התקדמות בטכנולוגיה.......
 

BravoMan

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

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

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

BravoMan

Active member
לפני שנים נתקלתי בסרטון ב-youtube של מישהו שמראיין אנשים למשרות Java והוא התלונן על כך שכמעת אף מועמד שהציג את עצמו כ-Senior אצלו לא הכיר מה זה WeakReference ולמה זה טוב, למרות שלא מדובר כלל וכלל בפיצ'ר איזוטרי של השפה.

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

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

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

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

טוב, אולי זה לא הניסוח הכי נכון לבעיה, אבל זה מה שעולה לי כרגע...

שנה טובה לכולם!
 
למעלה