2019-09-14

האם תואר אקדמי במדעי-המחשב הוא עדיין רלוונטי?

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

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


התוכניות הנחשבות (בארה"ב) ללימודי מדעי-המחשב. המעוזים שיהיו האחרונים של התואר האקדמי?


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

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

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

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

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

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

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


אבל אולי בעצם "לימודים אקדמיים הם לעומק - ולימוד במקום העבודה הוא ספציפי לצורך המיידי, ללא עומק"?
אני רוצה להתייחס לטיעון הנפוץ, ולא-מדויק הזה:
  • ה"עומק" הוא הרבה פעמים שם קוד לתאוריה לא מעשית, או "לבסיס" כ"כ low level שהוא פשוט לא רלוונטי לרוב הגדול של העוסקים במקצוע. למדנו באוניברסיטה תקשורת והתמקדנו בפרוטוקולים הנמוכים (שכבה פיסית עד IP), אבל כמעט כל הנדסת התוכנה היא סביב HTTP כאשר רק מעטים מתעסקים באמת ב IP (שלא לדבר על שכבות נמוכות יותר). אין בעיה היום לפתוח את האינטרנט וללמוד מהו ARP או איך נעשה Routing ב Ethernet.
  • גם כשלמדתי באקדמיה נושאים מסוימים - את העומק האמיתי שלי השלמתי בתעשייה. לפעמים התאוריה האקדמית הייתה מנותקת מדי מהמציאות בכדי להיות שימושית. לקחתי קורס מורחב בבסיסי-נתונים, אבל את העקרונות החשובים שלהם - למדתי רק בתעשייה. כנ"ל לגבי מערכות הפעלה, ונושאים נוספים.
  • חוק תכנותיקה אחד קובע שחצי מהידע שלנו בתחום יהפוך ללא רלוונטי כל עשור. בכל מקרה, עלינו ללמוד כל הזמן - ויעיל יותר להתמקד בלמידה לאחר שבחרנו תחום ואנו יכולים לבחור את הידע הספציפי. יש הבדל גדול בין כתיבת מערכות (System/Infrastructure), לכתיבת מערכות נתונים (Enterprise Systems), כתיבה ב Frontend או ב Backend. שום "לימודי עומק" באקדמיה - לא "יצילו" אותנו מהצורך בלמידה מתמדת.
  • בני-אדם קולטים ידע טוב יותר מתוך צורך ממשי. כל הבניית התוכן בצורת "מבואות ויסודות" - הוא פשוט לא צורת הוראה יעילה. הדרך הנכונה היא להתחיל בלימוד משהו מעשי - ורק בהמשך להגיע ליסודות ולמבואות.
  • יותר ויותר מקומות עבודה היום יתנו לכם היום את החופש ללמוד ולהתפתח ע"פ בחירתכם, וינגישו לכם גם לימודי-עומק. תפקידם של הלימודים האקדמיים כ"מספקי העומק" הולך ומתפוגג גם מהבחינה הזו.

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


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



הזמנה שקיבלתי, לעשות תואר Master אונליין בשנה. שימו לב שזו אוניברסטית Salford ולא Stanford ...


מה הידע הנדרש?


מה באמת מהנדס תוכנה ממוצע צריך לדעת כיום?
  • שפת תכנות אחת לפחות (עדיף מאוד שתיים, בכדי לקבל פרספקטיבה!) - יש בתואר, למרות שלרוב לא מגיעים במהלך התואר לעומק משמעותי בשפה.
  • תרגול בכתיבת קוד - יש בתואר, אך לא מספיק. אין בעצם כמעט פידבק משמעותי על הקוד שנכתב - ולכן זו במעט למידה ב"ריק" [א].
  • מבני-נתונים וסיבוכיות - מכוסה היטב (עם מקום קל לשיפור). זהו נושא חשוב, אבל בשל הספריות העשירות היום - שימוש מעשי בידע הופך לפחות נפוץ עם השנים (בתקופת ה ++C - היה צורך כמעט-יומיומי בידע הזה).
  • בסיסי נתונים, תקשורת - מכוסה בצורה חלקית עד סבירה, תלוי במוסד. פעמים רבות אלו קורסי בחירה - וחבל, כי רוב המהנדסים יידרשו לידע בתחומים הללו.
  • בדיקות אוטומטיות - נראה שמכוסה הצד הטכני היבש, ופחות המתודולוגי. זה עדיין תחום שלומדים אותו במקום העבודה.
  • מקביליות - כנראה מכוסה, לרוב באופן תאורטי מדי. גם זה ידע חשוב, אם כי לא בשימוש יומיומי נפוץ.
  • דוגמאות למבנים מעניינים בתוכנה, ארכיטקטורות, דפוסי-עיצוב (Design Patterns) - מכוסה ברמות שונות. מהנדסים צעירים נוטים בצורה גורפת להשתמש בדפוסי-עיצוב באופן לא מושכל ומוגזם - ולסבך את המערכת.
  • עקרונות של הנדסת תוכנה - DRY, POLA, High Cohesion/Low-coupling, SOLID/GRASP, וכו׳ - לרוב מכוסים בצורה בינונית עד סבירה, עם דגש חסר פרופורציות ל DRY (העיקרון הקל ביותר להסביר).
  • קריאות ופשטות של תוכנה - העניין בהחלט מוזכר, אך גם בהחלט לא נלמד. רוב או כל הקוד שהסטודנטים כותבים לא דורש תחזוקה, ולא זוכה לפידבק משמעותי. שוב: עבודה ב"ריק".
  • התנהלות והתארגנות אישית - כיצד לארגן את העבודה בצורה הגיונית, ניהול פרויקטים בסיסי, התנהלות ארגונית, כיצד להשפיע על אנשים אחרים, וכו'. לתואר אקדמי אין נגיעה לעולם העשיר הזה (למרות שיש כאן לא מעט ידע תאורטי שניתן ללמוד).
  • נושאים טכניים מגוונים שונים כמו: סטטיסטיקה בסיסית, מערכות הפעלה, חומרת המחשב, וכו' - פעמים רבות נלמד במהלך התואר, אם כי מהסיכומים היה נראה לי שהמיקוד לא כ"כ מעשי. בהחלט אלו נושאים שאפשר להשלים מאוחר יותר. רוב הנושאים הללו ישמשו רק חלק מהמהנדסים - במהלך חייהם המקצועיים.
התנהלות והתארגנות אישית הוא כנראה הנושא הגדול והחסר ביותר למהנדסים צעירים. חלקם דווקא מגיעים עם רמת התנהלות לא רעה, ידע שספגו בבית או בחיים עוד קודם למקום העבודה הראשון. לכאורה אין ציפייה למיומנויות או ידע בתחום מתואר אקדמי, וכך הבוגרים - תמיד עומדים בציפיות או אפילו מפתיעים לטובה.

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



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


אז מה עושים?


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

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

====

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

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

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


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

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

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

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

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


אז מה עושים, כמה סיכון כדאי לקחת? אולי הסיכון הזה בעצם לא כ"כ גדול?

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


שיהיה בהצלחה!


---

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