יום שלישי, 21 בינואר 2014

תואר החלומות ב"הנדסת תוכנה"

היי,

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

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

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

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

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

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



נושאים



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

לפני שאתם "קופצים" על מה שנאמר על קורס האלגוריתמים (נושא טעון), עברו על השקף הבא:


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

לגבי האלגוריתמים והמתמטיקה: אנו מאמינים שזהו נושא חשוב לאלגוריתמאים / חוקרים, שמהווים לא יותר מ5% מסך אנשי התוכנה. לשאר אנשי התוכנה - אין שימוש ממשי בידע זה. גם ידע מתמטי עמוק, כדרך אגב, ניתן כיום להשלים מהבית בעזרת Coursera / iTunesU ואחרים.



התוכנית


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

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



התמונה הגדולה של התוכנית


הנה כמה רעיונות שרציתי להעביר:


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


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


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

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


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


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



סיכום

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


34 תגובות:

  1. נראה לחלוטין מוכוון טכנולוגיה, אמרת ואני מסכים - שיש דברים שניתן ללמוד עצמאית/תוך כדי עבודה, אם כך מדוע קורס על HTML+CSS ? אחד הדברים הקלים ביותר ללמידה עצמית.
    בנוסף, עם כל הכבוד לניסיון, לעולם לא תקבל את כל המידע באופן מסודר ומובנה, לכן אני חושב שהבסיס חייב להיות רחב ופחות להתמקד בפלטפורמה כזו או אחרת ( למה אנדרואיד? במה זה שונה מקורס JAVA? בטוח שיהיה פיגור משמעותי עם הזמן אחרי הגרסאות שגוגל מוציאה, אז מדוע לטרוח?), דוגמאות:
    - קורס אלגוריתמים בסיסי ומבוזרים.
    - תכנות OO ופונקציונלי
    - Design patterns, כי הרי השפה לא באמת משנה פה.
    - מערכות הפעלה ( כי זה הבסיס! ) כולל נגיעה במה זה CPU, GPU, זיכרון פיזי/לוגי, אחסון לסוגיו, תהליכים ותהליכונים, סינכרון ומקביליות וכו'. התרגול חייב להיות ב CPP ועל הדרך הרווחת שפת בסיס.
    - כל נושא העימותים, עבודה בצוות, פיתוח קריירה - מדוע כל זה שונה מכל תואר או עבודה אחרת? גם עובד במפעל נדרש ליכולות אלו אז מדוע לבזבז שעות תואר חשובות על כך? אם זה כ"כ חשוב שהאונ'/מכללה תעשה סדנאות העשרה ומי שזה מספיק חשוב לו שיגיע. תאר לך קורס שמעביר מרצה בנושא עימותים לקצין במילואים שלומד לתואר ראשון, איך בדיוק הוא מחדש לו? הרי זה לא שווה ערך לד"ר למדעי המחשב המרצה לאותו קצין בנושא אלגוריתמים.

    עד כאן.
    בהצלחה.

    השבמחק
    תשובות
    1. היי קובי,

      תודה על התגובה המפורטת!

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

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

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

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

      ככה ב2 דקות אתן כמה ספרים שהייתי שמח לו היו מלמדים אותי / מהנדסים צעירים - ברעיונות העיקריים שיש להם להעביר:
      1. השפעה: http://goo.gl/k97RMx
      2. עימותים: http://goo.gl/7vWO1o
      3. כללי: http://goo.gl/mhQYdI
      4. דינמיקה ארגונית: http://goo.gl/knFtSX
      5. עבודה בצוות: http://goo.gl/tUWkeu

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

      ליאור

      מחק
  2. בתור בוגר יחסית טרי של הנדסת תוכנה בבן גוריון (סיימתי ב2011) אני מסכים עם רוב הדברים שכתבת פה, מתמטיקה באמת לא מועילה הרבה בפועל בתעשייה(אולי למדעני מחשב שיעשו מחקר), ויש הרבה קורסים של תכנון, ניתוח וOOP, מערכות מידע וכו' שהחבר'ה שלמדו מדעי המחשב נקי לא עשו וכן נתנו לי דברים שהשתמשתי בהם בתעשייה..

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

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

    השבמחק
    תשובות
    1. היי אדם,

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

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

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

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

      ליאור

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

    השבמחק
    תשובות
    1. היי,

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

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

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

      לעניין ה HTML + CSS: הקפצתי פה הרבה אנשים עם זה. לא ייחסתי לשורה זו חשיבות רבה, אבל אנסה להגן עליה בכל זאת:
      א. הסיכוי שתתקל ב HTML + CSS במהלך הקריירה - גדול בהרבה מהסיכוי שתתקל במשווואה אלגברית.
      ב. גם נושא פשוט זה, אפשר ללמוד לצורה שטחית או בצורה מעמיקה. מספיק להסתכל על ספרייה כמו bootstrap כדי להבין לאן אפשר לקחת "CSS פשוט". נסה לייצר holy grail layout ללא flex layout - והנה לך תרגיל לוגי מאתגר. הכוונה שלי הייתה ללמד נושא זה בצורה יסודית כדי להבין את מנגנוני ה layout השונים - שמתמודדים עם בעיית העמדה שחוזרת על עצמה במשך שנים במערכות UI - ועדיין אין לה פתרון יחיד. כמו כן HTML5 הוא עולם בפני עצמו...
      ג. שים לב שלנושא זה הוקצאה מעט תאוריה והרבה תרגול.

      ליאור

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

      ו-HTML לומדים מאתרים. ללמוד את זה באוניברסיטה זה בזבוז זמן.

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

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

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

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

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

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

      מחק
  5. לדעתי אי אפשר בלי מתמטיקה, למרות שזה לא פרקטי למקצוע יש לה יתרונות חשובים ביותר שמאוד קל להשיג רק באמצעותה :
    1. מתמטיקה זה פילוסופיה !
    2. היא מלמדת איך לחשוב ודורשת מיומנות של אינטגרציה (אני יודע חיבור, אני יודע כפל, אם אני יודע לחשוב אני אוכל לפתור את התרגיל הבא : (1+2) * 3 = ? )
    3. היא מאפשרת לסנן את האנשים האיכותיים מהבררה (למרות שגם פסיכומטרי עושה את זה).
    4. הבנת תהליך לוגי פילוסופי שאינו תלוי ב"אפיון" מסויים הוא חזק יותר, ומאפשר לך לבצע השלכה ורדוקציה לעולם האמיתי (למרות שזה מרגיש שזה בא לך טבעי בעצם למדת את זה שם).

    טל.

    השבמחק
    תשובות
    1. היי טל,

      תודה על התגובה!

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

      האם זה *משתלם* להשקיע כרבע עד שליש מהתואר בלימוד "פילוסופיה"?
      אם לאנשים יש Passion - שיקחו מתמטיקה כקורס בחירה (אוסיף זאת כאופציה בהעשרה 1 ו 2 - אני מכבד זאת מאוד). שילמדו זאת מעבר בזמנם הפנוי.
      לחייב זאת - נראה לי כבזבוז גדול של זמנם של הסטודנטים להם passion גדול בתחומים אחרים, ולא כ"כ במתמטיקה טהורה.

      ליאור

      מחק
  6. המבנה שייצרת מתאים כדי לייצר תוכניתנים ל 10 שנים הקרובות.
    תואר במדעי המחשב אמור לתת יסודות ל 40 שנה בתחום.
    האם עוד 10 שנים #C ו Javascript יהיו שמושיים? ספק.
    OOP ו functional - כניראה שכן
    תחשיב לאמדה ותורת הקטגוריות - בטוח

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

    השבמחק
    תשובות
    1. היי צח,

      בתור מישהו שסיים תואר לפני 10-11 שנה, ארצה לבדוק את אקסיומת 40 השנה:
      * התעסקתי בתואר לא מעט בפויינטרים ב CPP - וסוף סוף השתלטתי עליהם. אז?
      * למדתי קורסים בהנדסת תוכנה. "מפל המיים" היה המודל הקלאסי והעתידי. עוד כמה שנים - תתקשה למצוא מקום עבודה שעובד בדיוק לפיו.
      * תורגלנו המון ביעילות ו"קיצור שורות" - אבל היום אנו רוצים להאריך בכדי ליצור קוד קריא יותר.
      * למדתי Design Patterns ותכנון מראש, שפעם היו best practice והיום הם שנויים במחלוקת. קרי: "טוב, אבל..."
      * למדתי על מערכות הפעלה וארגון קבצים על דיסק פיסי: platters, segments וכו'. SSD, in-memory ווירטואליזציה טרפו את רוב הערך של ידע זה.

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

      ליאור

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

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

      בעניין יעילות וקיצור שורות - האם באמת שווה לבלבל בין time / space efficiency לבין *צורת כתיבת הקוד*?
      אגב גם צורת כתיבת קוד ארוכה ומפורזת היא שגויה, וקוד צריך להיות הקצר ביותר שהינו קריא וברור.

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

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

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

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

    השבמחק
    תשובות
    1. מסכים.

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

      מדוע אי-אפשר לגשר בין הגישות ולמצוא משהו באמצע? כיצד מכללות בארה"ב מצליחות (כך נראה לי) לעשות זאת?

      ליאור

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

    השבמחק
  9. אני מסכים איתך שכמות המתמטיקה בתואר כנראה מוגזמת, יחד עם זאת נראה לי שלקחת את זה רחוק מדי לכיוון פרקטי. כמו שכתב כאן מישהו למעלה אוניברסיטה לא אמורה להיות קורס תכנות.
    נושאים תאורטיים הם הבסיס להבנה ומחשבה מעמיקה. גיוון בנושאים נאמר קורס בux לעומת קורס במערכות מבוזרות לעומת קורס בתכן לוגי לעומת מבוא לסטטיסטיקה - וכו יעזרו לסטודנט צעיר להבין במה הוא ירצה להתעמק ולעסוק בהמשך. ללמוד וJavascript ואח״כ java לא יתן כ״כ הרבה ערך. התפקיד של אוניברסיטה, להבדיל מקורס, הוא לפתוח אופקים ולעודד מחשבה.
    בצד המעשי הייתי מוסיך פרויקט פיתוח משמעותי עם התעשייה או לפרויקט open source בכל שנה

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

    השבמחק
  11. היי
    יש תכונה מעניינת בלימודים, שהם אייסולייטד מעבודה, והם באופן אינהרנטי לא עבודה. זהו פער שהוא חלק מההגדרה. כלומר, ההרגשה הזאת, שקיים פער תהיה תמיד - קשה להכין מישהו למשהו בצורה מנותקת - זה נכון שאפשר להפוך את הלימודים לעבודה ואז כביכול הטענה שלי היא לא נכונה מיסודה, אבל אז הכל ייפול על המעסיקים, וזה לא מצב נעים - בנוסף, נכנסת ההבנה שלפעמים שווה להשקיע במשהו ולשאת ממנו פרי לא בצורה ישירה ולא מיד. כלומר, אם תלמד מפתחים את התיאוריה של עיבוד תמונה, האם זה לא יהפוך את הדבר לזמין יותר לתעשיה? אפילו אם זה דורש רקע רחב. ושים לב שאתה לא מסוגל לעשות את זה בלי שלמדת קורסים מתמטיים שיביאו אותך למצב שתוכל ללמוד עיבוד תמונה כמו שצריך (בצורה רגורוזית סבירה).
    סקוט הנזלמן (http://www.hanselman.com) דיבר פעם על זה שמפתח צריך להכיר לפחות רמת אבסטרקציה אחת מתחת למה שהוא משתמש בו; סקוט נתן דוגמה ממש טובה. הטבעת של אישתו נפלה לחור בכיור. מיד אישתו באה אליו בבהלה - מבחינתה היא משתמשת בכיור כל יום, אבל היא לא יודעת מה קורה כשהטבעת נכנסה לחור - זה סוג של חור שחור והטבעת נעלמה מבחינתה. סקוט אמר, שהוא מבין טיפה במה שקורה בכיור, הוא יודע שהוא יכול לפרק את המסננת שנמצאת למטה ולמצוא את הטבעת (ובסוף הוא מצא), אבל מבחינתו ברגע שהצינור נכנס לקיר - משם זה כמו חור שחור שהוא לא מבין בו.
    עכשיו, בוא נניח שאנחנו חיים בעולם שכל הקוד בו הוא פתוח (זאת הנחה לא נכונה, אבל היא תעזור לי לקבל תחושה)
    בעולם כזה, כשכל הקוד נגיש לנו, יהיו תשתיות תכנה שמבוססות על מאמרים אקדמים, יהיו תשתיות שמבוססות על התשתיות האלה, וכך הלאה. בוא תרשה לי להשתמש במונח פקג׳ במקום תשתית, כי הוא יוצר אצלי התניה שלילית (אני צריך לעבוד על זה :-) ). נראה לי שברור לכולנו, שיש כאן משהו אקספוננציאלי - יש יותר אנשים שמשתמשים בפקג׳ בסיסי מאשר אנשים שעובדים על פקג׳ים בסיסיים, כי כמות הדברים שניתן לעשות עם פקג׳ בסיסי היא גדולה. לא היתה משמעות לפקג׳ (בקוד פתוח) אם לא היו לו יותר משני משתמשים (כלומר שתי תלויות). אפשר לקחת לדוגמה את node.js, שם כמות האנשים שעובדים על node היא נמוכה משמעותית מכמות המפתחים של פקג׳ים וכמות הפקג׳ים הולכת וגדלה (וכך גם כמות התלויות בפקג׳ים אחרים). זה נכון שאפשר להשתמש בפקג׳ בלי להבין איך מימשו אותו- אבל מפתח טוב יודע להסתכל מתחת לכיור, והוא יודע אפילו לתרום לקוד בפול רקווסט, הוא לא רק משתמש בו. כי אם כולם היו רק משתמשי פקג׳ים אז אף אחד לא היה יוצר אותם.
    השאלה האם באמצעות התוכנית שלך אתה מאפשר את המגוון והעומק הזה, אני לא אומר שכולם צריכים להתעסק באלגוריתמיקה, אבל כדאי שהם ידעו להסתכל מתחת לכיור, והם צריכים את המיומנות הבסיסית, שלוקח זמן לפתח (גם המתמטית וגם האלגוריתמית).

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

    סך הכל אני לא יודע אם זה כיוון טוב או לא (התכנית שלך), אבל אלה התחושות שלי

    השבמחק
    תשובות
    1. תודה דורון על התגובה.

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

      כיצד זה מסתדר? משום מה אנשים חשבו שהכוונה שלי היא להוריד את הרמה / "לחפף". זו בכלל לא הכוונה. אני מסכים מאוד עם מטפורת הטבעת בכיור - שאהבתי.

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

      העברתי לאחרונה בעבודה קורס השלמה "תאורטית" לעובדים אצלנו (העברתי אותו גם מחוץ לעבודה) על פיתוח לווב (שרת או לקוח - אולי מכאן הייתה לי קצת הטייה).
      הרבה מפתחים שהם בוגרים או מצטיינים של אוניברסיטאות מובחרות - לא מבינים איך האינטרנט עובד. הם למדו את מבנה ה pakcets של IP, אבל הם לא למדו על congestion control של TCP או על HTTP. לא על CDNs או על proxies. לא על Load balancers. לא על HTTPS.
      חלק מידע הוא "כמעט שם", אבל לבוגרי אוניברסיטה חסר ה"מייל האחרון" - והם מתקשים לרכוש אותו לבד. על שלא עושים tracert - לא נראה לי שלאנשים נופל האסימון איך routing של IP שהם למדו בצורה תאורטית עובד. זה לא ידע רדוד ולא "קורס בסלע", אני מניח שזו "שכבת הפשטה אחת" מתחת לעבודה השוטפת :)

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


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

      ליאור

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

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

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

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

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

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

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

    6) HCI ממש לא רלוונטי לסמסטר ראשון או בכלל.

    אם נסתכל על שנה ב:
    1) מבני נתונים ויעילות – כל אחד מהם הוא קורס נפרד. ואם אתה רוצה לדבר על "יעילות", זה בכלל נכנס כחלק מקורס בסיסי במתמטיקה דיסקרטית או במבוא למדעי המחשב תחת סעיף "סיבוכיות".

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

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

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

    5) HTML – בשביל מה זה טוב? כל מי שלומד הנדסת תוכנה חייב ללמוד את זה? איזה מוזר אתה.

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

    2) תכנות מערכות מידע ותוכנה לעולם העסקי – אוסף של buzzwords שיכולים להכנס לקורס אחד, וגם זה כקורס בחירה.

    3) התמודדות עם עימותים (עאלק) – שוב פעם ה- fetish למדעי ההתנהגות או מנהל עסקים. תעשה בזה תואר נפרד כדי שיתייחסו לזה ברצינות.

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

    סמסטר ד:
    1) תכנון ותכנות – ניסית לדחוס עוד כמה buzzwords לא ברורים בקורס אחד עד שניים, בלי שום משמעות מאחוריהם.
    2) יסודות מנהל עסקים וניהול קריירה – שוב אותו fetish לא מוסבר למדעי ההתנהגות ו/או מנהל עסקים. למי שרוצה להתעסק בהנדסת תוכנה ולא להתעסק בשטויות, זה ממש לא רלוונטי.

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

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

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

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

    המוטו של הכנס בכנרת הוא: "אופקים חדשים - מתעסוקה לקריירה". אני מזמין את כל הכותבים והקוראים של בלוג זה להשתתף. זה איננו כנס אקדמי, וקולה של התעשייה חשוב ומשמעותי. לפרטים: http://software.kinneret.ac.il

    השבמחק
    תשובות
    1. היי עומר,

      תודה על התגובה.

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

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

      לא מצאתי שום חיזוק לטענה שקורסים כגון אוטומטים, חישוביות, מבנה מהדרים וכו' תורמים ליכולות ה design או התכנון המערכתי של מהנדסים. האם יש לך חיזוק אמפירי לטענה?
      המבחן הכי פשוט שלי: רבים מהמתכנתים שאני עובד איתם הם מצטיינים שלמדו את הקורסים האלו באוניברסיטאות המכובדות - ועדיין הם מפיקים תכנונים מסודרים, אינטלגנטים - ולא משמעותיים. לימוד של כמה עקרונות SOLID ותרגול במשך כמה פרוייקטים - יכול לשפר את המצב בצורה משמעותית.
      הנדסת תוכנה וניהול פרוייקטים - קיוויתי לכסות ב"תפעול תוכנה". אני למשל, עשיתי קורס שלם בניהול פרוייקטים בו השוונו בין GANNT, PERT ועוד שיטה - לא קשור בכלל לשום פרוייקט תוכנה שראיתי בחיי. הספר "!Manage IT" (מסדרת pragmatic programmer) -היה דווקא דיי שימושי. מעבר לזה ישבתי באותו החדר, כמה שנים, עם מנהלי פרוייקטים שונים - ועדיין קשה לי לחשוב על מידע משמעותי ומעורר-חשיבה שלא ניתן לכסות ב2 הרצאות בנושא. לא בגלל שזה נושא לא חשוב / עמוק - אלא בגלל שזה נושא מאוד ספציפי לאירגון בו הוא מתרחש.

      אני חושב שדווקא יש פגות תוקף מסויימת למספר נושאים שנחשבים "נצחיים" - רק תסתכל כמה הנחות היסוד של הנדסת תוכנה כמקצוע השתנו בעשור וחצי האחרון מאז כניסתה של תנועת ה agile. שמהנדס יבדוק קוד או יתעסק ב delivery? - על לפני עשור זה נחשב כמעט Anti-Pattern. "הכנה למזגן?" - עד לפני עשור זה נחשב סממן להנדסה "נכונה".
      באוניברסיטה היה לי חבר שירד לו ציון במבחן כי כתב קוד ב 4 שורות ולא 3 כפי שנתבקש. הערעור "יותר קל לקרוא את זה; אפשר לשים breakpoint" (היה לו ניסיון תכנותי קודם) - נדחה. זה שינוי תפיסה (יעילות --> קלות תחזוקה) ולא עקרון נצחי.
      זה לא מזיק ללמוד גם רעיונות שעבר זמנם - אפשר ללמוד מכך לא מעט, אולם יותר חשוב מבחינתי הוא להגיע מוקדם יותר לכתיבת קוד משמעותית שתתן הקשר ומשמעות לכל הידע התאורטי שנצבר.


      ליאור

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

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

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

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

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

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

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

      מחק
  14. אני מציע בתור אלטרנטיבה את הרשימה הזאת: http://matt.might.net/articles/what-cs-majors-should-know/
    היא די רחבה, אז אני לא בטוח אם אפשר להספיק הכול בתואר ראשון. עם זאת היא מספקת לדעתי יעד מוצלח לשאוף אליו מהבחינות הבאת:
    * היא מבססת את היסודות גם בתחומים כמו תיאוריה, תכנות low level ואדמיניסטרציה שחסרים לדעתי בהצעה פה בבלוג.
    * היא מוכוונת עבודה מעשית, אבל מאפשרת להמשיך לתואר שני למי שרוצה בכך.

    השבמחק
  15. בהצלחה. מי ייתן ודבריך יגיעו אל אוזניים קשובות. המצב הנוכחי הוא פשוט שסטודנטים רבים בכל שנה נושרים ממקומות לימוד מכובדים רק כי אותם מקומות מתעקשים להמשיך להעביר חומרי לימוד ארכאיים במקום לחיות בעולם הדינמי שלנו כיום. עד כמה עולם המחשבים כיום דינמי? למעשה, אני חושב שהגישה הרווחת לפיה צריך ללמוד משהו חדש בכל פרק זמן של שנה-שנתיים על־מנת להישאר רלוונטיים היא כיום כבר שגויה, ואולי צריך לאמץ גישה אפילו יותר דינמית וללמוד טכנולוגיות חדשות בפרקי זמן קצרים אף יותר. כדי לחזות בדינמיות בפעולה מספיק לבקר בדף המגמות בפרויקטים חופשיים שמתארחים אצל github בכתובת http://github.com/trending בשביל לנסות לזהות את המגמות החמות כיום, ולהיכנס שוב לדף בעוד תקופה של חודש אחד, נניח, כדי לבחון אם המגמות מצביעות עדיין על שימוש באותן טכנולוגיות וגישות ארכיטקטוניות. אתה תופתע לגלות שרק פרויקטים בודדים מצליחים להישאר רלוונטיים לאורך זמן, וגם אלו לא בהכרח יישארו ברשימה זו לנצח.

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

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

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

    השבמחק
    תשובות
    1. היי תומר,

      תודה על התגובה.

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

      ליאור

      מחק
  16. שלום,
    שמי מיכאל, ואני אוהב את תחום המחשבים בכלל והתכנות והפיתוח בפרט.
    בעוד כ-10 חודשים אני מסיים את שירותי הצבאי, בן 22.
    עד היום יצא לי לעסוק יחסית מעט בקוד, קיבלתי הצצה או שניים לשכבות היותר עמוקות של התיכנות(אני מתכוון לנושאי הורשה, פולימורפיזים, מבנים וכו') וכמו כן, יצא לי לבנות מספר פרוייקטים קטנים ב-AS3 ו-C# רובם ככולם בתור תחביב ולא כעבודה מסודרת.

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

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

    השבמחק
    תשובות
    1. היי מיכאל,

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

      אתה יכול לראות את התשובה שעניתי לסטודנט אחר ("X") בפוסט שנמצא בלינק הבא: http://goo.gl/Dt50pP

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

      ליאור

      מחק
    2. הי מיכאל!

      אתה מוזמן להתייעץ איתי לקראת השחרור, ואם יש לך זמן פנוי אתה יכול גם לפני.
      לפני שנה הפעלתי תכנית המיועדת בדיוק לאנשים כמוך (כרגע אין תוכניות להתחיל קבוצה נוספת, אבל אתה יכול לראות מה עשינו כאן: http://www.10x.org.il ) ועזרתי להם למצוא עבודה.
      אם אתה לומד טוב לבד, תוכל למצוא עבודה די בקלות. אני עדיין ממליץ במקביל לעבודה ללמוד באוניברסיטה תואר שמעניין אותך.

      בהצלחה,
      אודי
      https://hackita.hasadna.org.il/

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

    http://limudim.psychometry.co.il/

    השבמחק