"מה זה הש*ט הזה שלומדים במדעי המחשב?"
פעמים רבות אני נתקל בשאלות מהסוג הזה. יש גישה נפוצה של זלזול באקדמיה בטענה שבתואר במדעי המחשב לומדים מלא חומר לא רלוונטי.
בעיני, הרבה מהזלזול נובע מבורות. כי כשמשווים תואר לבוטקאמפ משווים תפוזים לתפוחים ומסתכלים בעיקר על הטווח הקצר. במילים אחרות – מה ישיג לי את העבודה ראשונה?
לתואר, לטעמי, יש ערך שהוא הרבה יותר ארוך-טווח. הרבה קורסים מהתואר שנראים לכאורה לא רלוונטיים דווקא יתגלו כמאוד חשובים בהמשך הקריירה. לכן במקום עוד מאמר על כן/לא תואר, חשבתי שיהיה נחמד לכתוב על קורסי החובה העיקריים שתלמדו בתואר במדעי המחשב, ולהסביר למה לדעתי הם רלוונטיים (או לא) ומתי תשתמשו בהם.
תוכן עניינים
שניה לפני שנצלול לעומק, כמה הבהרות:
1. כמו שאמרתי, תואר לא נועד להכשיר אתכם לעבודה בתעשיה אלא ללמוד את הבסיס של המדע שנקרא מדעי המחשב. אז להשוות תואר לקורס פרקטי (כגון קורס פולסטאק) זה להשוות תפוזים ותפוחים. בפוסט הזה אני לא רוצה לדבר על יתרונות וחסרונות התואר לעומת בוטקאמפ/קורס/למידה-עצמאית אלא לדבר דווקא על הרלוונטיות (או לא) של הקורסים הספציפיים לקריירה כמפתח.
2. כל מה שאני כותב במאמר מבוסס על הניסיון שלי, הן בתואר והן בתעשייה. אולי אנשים אחרים יראו את חלק ממה שאני אכתוב בצורה שונה ממני, וזה בסדר. זכרו שזו הדיעה שלי בלבד ולא עובדה מוגמרת.
מה לומדים במדעי המחשב?
הנה רשימה של קורסי חובה מרכזיים שתלמדו בתואר במדמ"ח:
אלגברה לינארית + חדוו״א/אינפי
כנראה שאלו הקורסים השנואים והמושמצים ביותר. הרי מה הקשר ביניהם לבין תכנות?
האמת? אין המון קשר ישיר ביניהם לבין תכנות. אז למה בכל זאת מלמדים אותם ומתי תפגשו אותם בחיים? בעיקר כשתרצו לפתור בעיות יותר ״מדעיות״ או אלגוריתמיות. למשל – עולמות עיבוד תמונה, רובוטיקה, ניתוח סאונד, אלגוריתמים מורכבים וכו׳.
נכון, אין בהם צורך בתכנות פולסטאק פשוט, אבל אם תרצו לפתח את השזאם הבא, או לפתח את האינסטגרם הבא (למשל, לפתח פילטרים של תמונה בעצמכם), או את הווייז הבא, תצטרכו בסיס מתמטי בשביל לבנות עליו את הידע לעשות את הדברים האלה. כמובן שגם לחלקים בעולמות ה-data-science תצטרכו בסיס תיאורטי שמקורו בקורסי מתמטיקה כמו אלו. מבין השניים יצא לי לפגוש הרבה יותר בצורך באלגברה לינארית (אבל יכול להיות שזה סתם אנקדוטלי אליי).
לא כל החומר בקורס באמת רלוונטי גם לנושאים מתקדמים יותר, ואני אפילו לא אגיד שזה סופר-מאסט ללמוד את זה. אבל זה פשוט יאפשר לכם לגשת לנושאים מתקדמים יותר בעתיד כשכבר יש לכם את הידע הזה בארגז הכלים שלכם.
סטטיסטיקה והסתברות
גם אלו נושאים שלא תפגשו כנראה בעבודה היומיומית בפיתוח fullstack (לדוגמה), אבל כן תפגשו כשתרצו להכנס לנושאים מורכבים יותר. הדוגמא הקלאסית היא עולם ה-data-science. data-science בלי סטטיסטיקה זה כמו פיתוח בלי שפת תכנות. אבל לא רק שם, תפגשו עם הנושאים האלה גם במקומות אחרים לדוגמא כשתרצו לפתור בעיות NP-קשות (או סתם בעיות קשות) בצורה היוריסטית. לדוגמא, לפתח solver למשחק שחמט, או כשתרצו להבין איך לעשות A/B-test* נכון על המוצר שלכם שבאמת נותן לכם הבנה של מה נכון יותר מבחינת המשתמשים שלכם
*פרקטיקה של A/B-test היא פרקטיקה בה משחררים מספר ואריאנטים של פיצ׳ר מסויים למשתמשים ודוגמים קבוצת ניסוי מול קבוצת בקרה על מנת להבין מה יותר נכון למשתמשים שלנו. קל מאוד לפשל בזה אם לא מבינים כלום בסטטיסטיקה ולהגיע לתוצאות שגויות בעליל.
פרטים על תואר במדעי המחשב? + מתנה
הרשמו לקבל מידע על תנאי קבלה, מועד פתיחה, ותנאי תשלום וקבלו מאיתנו שבועיים חינם לקורס תכנות אונליין של קודבוקס*
מתמטיקה בדידה (מתמטיקה דיסקרטית)
הקורס באונ׳ תל אביב (שם למדתי) מכיל כמה חלקים – לוגיקה, קומבינטוריקה ותורות הקבוצות. קורס סופר תיאורטי מצד אחד, מצד שני מאוד מפתח את המחשבה כמפתח. להבין נושאים כמו פונקציות, רקורסיה, שפות בוליאניות וכו׳.
קורס מתמתיקה בדידה לא יתרום לכם ישירות בשום דבר מעשי (לדעתי) אבל יפתח לכם מאוד את ההבנה של המחשבה מאחורי שפות תכנות, איך באופן תיאורטי מגדירים את עולם שפות הפיתוח, איך משתמשים בזה ועוד.
מצד אחד זה לא הכי פרקטי. מצד שני, זה מסוג הקורסים המעניינים שעוזרים להבין את הבסיס לעולם הפיתוח ומה זה שפת תכנות (במובן המתמטי-תיאורטי שלה). למרות שקיבלתי בו ציון גרוע מאוד (קורס מסנן באונ' ת״א), לא הייתי מוותר עליו.
בונוס נחמד - אחרי הקורס הזה תבינו את המושג ״רקורסיה״ על בוריו ותוכלו להתנשא בקבוצות ״בדיחות מתכנתים״ למיניהן על GIFs שמועלים שם ולכתוב ״זו לולאה! לא רקורסיה!״
מבוא מורחב למדעי המחשב
כשאני למדתי באוניברסיטה לימדו שפת Scheme שזו שפה פונקציונלית שבה כל דבר הוא פונקציה, אופרנד או אופרטור וכתיבת הקוד דומה למעין מחסנית ארוכה של פעולות מתמטיות שצריכות להשתערך בזו אחר זו. היום מלמדים שפת פייתון ואני לא יודע לדבר על איך הקורס נראה היום, ייתכן שהוא השתנה לחלוטין. בקורס אין מושגים כמו Object oriented ובפשטות הקורס בעצם מנסה ללמד לחשוב על שפת תכנות כסוג של מתמטיקה (אם בבדידה דיברנו על זה בתיאוריה, פה זה עובר לפרקטיקה).
למי שלא תכנת לפני זה, זה יהיה עבורו מבוא מגעיל מאוד לתכנות. מצד שני זה בונה את ההבנה של איך תכנות פונקציונלי עובד בפרט, ואיך קונספטים של שיערוך שפת תכנות עובדים בכלל.
תכנות מונחה עצמים (קורס ג׳אווה)
קורס מאוד פרקטי שמלמד איך לפתח בצורה Object-oriented בשימוש בשפת ג׳אווה (שהיא עדיין שפה מאוד נפוצה ופופולרית בתעשיה). דווקא בקורס הזה מאוד זלזלתי מכיוון שהגעתי אליו כבר עם 5 שנות ניסיון כמפתח C# (שזו שפה די דומה לג׳אווה).
קיבלתי ציון נמוך במבחן כי לא התכוננתי על כל מיני דברים כמו חוזים, Class invariant וכו'. דברים תיאורטיים לכאורה, אבל כשחושבים על זה מאוד עוזרים לחשוב על כתיבת קוד שמישהו אחר צריך לקרוא ולהשתמש בו (לעומת פרוייקט אישי).
אולי יעניין אותך:
7 מסלולי *בוטקאמפ* שיהפכו אתכם למתכנתים בהייטק
רוצים להפוך למפתחי Full Stack? ריכזנו עבורכם את תכניות הלימוד הפופולריות ביותר בארץ, שיכניסו אתכם לתעשייה!
מבני נתונים
זה אולי הקורס התיאורטי הכי פרקטי שיש. גם אם אתם כבר עובדים בפיתוח תוכנה ולא מתכננים תואר, הייתי מציע ללמוד את הקורס הזה ב-Coursera או משהו בסגנון. בקורס הזה מבינים איך מבני נתונים פועלים, החל ממערכים פשוטים ועד עצים ושאר מבנים מורכבים.
אחד הדברים החשובים שלומדים בקורס הוא הטרייד-אופים (שקלול תמורות) שכל מבנה נתונים מביא איתו. זה בעיקר מתייחס לעלויות זיכרון וזמן ולאילו בעיות הוא מתאים ולא מתאים.
מבני נתונים הם אבן בניין קריטית בבניית תוכנה יעילה. נכון שאפשר להשתמש פשוט ב-Hashmap או רשימה-מקושרת בלי להבין איך הם עובדים ולרוב זה יהיה מספיק. אבל ככל שפותרים בעיות מורכבות יותר תגלו שגם יש צורך בהבנה תיאורטית של איך הדברים עובדים מאחורי הקלעים, על מנת שתוכלו לבחור את הכלי הנכון עבורכם.
כמו שלא תעבדו עם נגר שיודע להשתמש רק במברג פיליפס, ככה גם איש תוכנה צריך (לדעתי) להכיר את הכלים השונים שפתוחים לרשותו, איך להשתמש בהם ומתי, ומעבר לזה – איך ליצור כלים חדשים שיתאימו למשימות שעוד לא פתרו עבורו.
פרטים על תואר במדעי המחשב? + מתנה
הרשמו לקבל מידע על תנאי קבלה, מועד פתיחה, ותנאי תשלום וקבלו מאיתנו שבועיים חינם לקורס תכנות אונליין של קודבוקס*
אלגוריתמים
מבחינתי כל מה שכתבתי על מבני נתונים נכון גם לאלגוריתמים למרות שיהיה אפשר לעבור חיים שלמים כמפתח בלי לעבוד עם 80% מהאלגוריתמים שלומדים בקורס. מבחינתי הערך העיקרי הוא הבנה של אלגוריתמיקה ואיך להסתכל, לפרק ולפתור בעיות מורכבות בצורה שתתאים למטרה שלכם. ולא פחות חשוב – להוכיח שהפיתרון שלכם אכן עובד (נשמע טריוויאלי, אבל קל מאוד לחשוב שפתרתם בעיה קשה כלשהי בתוכנה, רק כדי לגלות באגים קריטיים שמקריסים את הפיתרון שלכם אחרי שהשקעתם הרבה זמן בלממש אותו).
מודלים חישוביים
קורס שלאו דווקא יש בדיוק בקונסטלציה הזו בכל תואר ולעיתים הוא נקרא בשם אחר או נפרס על פני קורסים אחרים. בת״א – בעיקר מדבר על שפות (רגולריות, חסרות הקשר וכו׳…), על סוגי בעיות (NP Complete/Hard, etc…) ועל מכונות טורינג. קורס סופר תיאורטי. הקורס לשכעצמו כנראה לא יועיל ישירות בעבודה. אבל גם פה, ההבנה של מה זה אלגוריתם, מה זה מחשב (לא מבחינה פיזית, אלא מבחינה תיאורטית – מה מחשב יודע ולא יודע לעשות) ואילו בעיות אפשר לפתור ואי אפשר לפתור עם מחשב, לדעתי קורס סופר מעניין ובונה חשיבה של מפתח מקצועי.
ואם הזכרתי פיתוח של Solver למשחק שחמט כשדיברתי על סטטיסטיקה והסתברות, בקורס הזה תבינו למה מחשב (רגיל, לא קוואנטי, אל תתחכמו) בכלל לא יכול לפתור משחק שחמט בצורה אופטימלית ולמה תהיו חייבים להשתמש בהיוריסטיקה (שבה יכנסו הסטטיסטיקה וההסתברות למשחק) על מנת לפתח solver שבאמת יתן ערך למשתמשים בו ולא יקח 100 שנה להריץ.
מבנה מחשבים
הקורס שבו מבינים איך פולס חשמלי הופך לתוכנה מורכבת. האם זה חובה לדעת את זה? כנראה שלא. אבל מייקל שומאכר, נהג הפורמולה-1 האגדי אמר פעם שכדי להיות נהג המירוצים הכי טוב בעולם לא מספיק רק ללחוץ על הדוושה, צריך להבין איך כל החלקים של הרכב עובדים בהרמוניה יחד כדי לנצל את זה הכי טוב שאפשר. ככה גם בפיתוח – אפשר לעבור חיים שלמים בלי להבין איך מחשב עובד. פשוט כשתיתקלו בבעיות יותר קשות, יהיה לכם קשה יותר לרדת לפרטים שלהן (וכמובן אם תרצו לפתח low-level באיזורים שיותר קרובים לחומרה, זה ידע קריטי שיהיה לכם).
מערכות הפעלה
קצת המשך מבחינתי של מבנה מחשבים ואפילו יותר קריטי לפרקטיקה. התוכנה שלנו לא רצה בואקום, היא רצה על מערכת הפעלה שאחראית על הקצאת הזיכרון עבורה, על התקשורת עם כרטיס התקשורת שמחבר אותה לעולם החיצון, על ניהול ה-Threads וכו׳.. לא משנה אם זו מערכת הפעלה וירטואלית (כגון JVM) או מערכת הפעלה שהתוכנה מתקשרת איתה ישירות. כדי להבין בעיות זיכרון, בעיות ביצועים, באגים חמקמקים וכו׳, במוקדם או במאוחר תצטרכו הבנה כלשהי במערכות הפעלה (כן, גם בעולם של docker, גם ה-container הוא סביבה שצריך להבין וגם ה-container רץ מעל מערכת הפעלה כלשהי).
עוד שני קורסים שאני אישית לא עשיתי בתואר (אבל כן השלמתי אונליין לאחר מכן כי לדעתי הם חשובים) אבל הרבה עושים אותם (בין אם כחובה בחד-חוגי או כרשות בדו חוגי):
מבנה רשתות תקשורת
להבין איך עובדת בעצם רשת תקשורת שמעבירה נתונים בין שני מחשבים, מכרטיס הרשת ועד לתוכנה (נניח HTML). חשוב כדי להבין בעיות ביצועים שנובעות מבעיות רשת, כדי לתכנן אופטימיזציה של העברת נתונים כשצריך להעביר הרבה נתונים, כשצריך לתכנן פריסה של שרתים ושימוש בשירותים כגון CDN על מנת להביא למשתמשים מידע בצורה יעילה ומהירה וכו׳…
פרטים על תואר במדעי המחשב? + מתנה
הרשמו לקבל מידע על תנאי קבלה, מועד פתיחה, ותנאי תשלום וקבלו מאיתנו שבועיים חינם לקורס תכנות אונליין של קודבוקס*
בסיסי נתונים
הקורס בעיקר מדבר על איך עובדים עם Databases ובעיקר (אם זה לא השתנה) מעל SQL. קורס סופר פרקטי. אין מפתח שלא עובד עם בסיסי נתונים וגם בעידן ה-NoSql אי אפשר לוותר על הבנה מעל בסיסית של בסיסי נתונים רלציוניים (טבלאיים) ועבודה עם SQL.
מקווה שהצלחתי להבהיר למה התואר, למרות היותו מאוד תיאורטי, הוא חשוב ומאוד פרקטי לבניית קריירה ארוכת טווח ומאתגרת בתחום התוכנה. מי שמספיק לו להעביר ביטים הלוך חזור מה-DB לפרונטאנד, כנראה לא צריך את כל הידע הזה, אבל עוד לא פגשתי מפתח שרצה להתעסק רק בבעיות סופר-פשוטות כל החיים. גם אם בהתחלה זה מאתגר ומסעיר, זה ממצה את עצמו אחרי שנתיים-שלוש ואנשים רוצים להתקדם ולעשות דברים יותר מאתגרים, חדשניים, וקשים. שם דווקא הבסיס התיאורטי הופך להיות משמעותי יותר ככל שעולם ברמת הקושי.
לקריאה נוספת:
- באיזה אוניברסיטה ללמוד מדעי המחשב? | סקירה של 9 אוניברסיטאות
- באיזו מכללה כדאי ללמוד מדעי המחשב? | סקירה של 11 מכללות
מנהל פיתוח מנוסה, עד לאחרונה VP R&D ב-Planck ומנחה פודקאסט המפתחים הפופולרי ״מפתחים חסרי תרבות"