13 בדצמבר 2019

כיצד ללמוד תכנות ללא תואר במדעי-המחשב ?

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

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

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


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

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

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

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

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

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

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

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

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

לפני שאתחיל - ארצה רק לתת אזהרה קלה מניסיון אישי. 

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

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

ההחלטה שלכם בתחילת הדרך תתווה את המסלול שלכם להמשך.

אז אם הגעתם עד לכאן ועדיין לא שכנעתי אתכם ללמוד לתואר ראשון, אז מאיפה מתחילים ?

שלב 1 - שלום כיתה א


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

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

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

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

בשלב הזה, תצטרכו להחליט עם איזו שפה אתם מתחילים. 

המלצה שלי - Python. אחרים ימליצו - Java או C++.

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

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

שלב 2 - עולים חטיבה


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

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


 שלב 3 - מסיימים תיכון


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

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

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

שלב 4 - מתחילים אוניברסיטה


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

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

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

כאן גם מתחברים מבני נתונים מתקדמים כמו AVL Tree, Hash Table ועוד.

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

שלב 5 - שלב ההתמחות


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

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

אופציה נוספת - האם תרצו לתכנת אפליקציות למערכות הפעלה השונות? אם כן, כדאי לכם להעמיק את הידע שלכם על מערכות הפעלה. זה אומר בעיקר - ניהול זיכרון, ניהול Threads, כתיבה של Process והכרת מבנה המעבד. זה אומר להבדיל בין מערכות שנועדו למעבדי x86 כמו Windows, Mac ו- Linux לבין מעבדי Arm כמו אנדרואיד ו iOS או מערכות Embedded.

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

אופציה נוספת - Data Science. אם לנבור בהררי מידע עושה לכם את זה (אבל לא רק) - ממליץ לכם לבחון את הנושא. זהו נושא ענק מאד שלא רק כולל התעסקות עם מידע אלא גם תהליכי Machine Learning ו- AI.
גם כאן, הרמה שתיבחרו להגיע אליה תציב לכם דרישות בהתאם. ניתן ללמוד את התחום הזה מבלי להתעסק יותר מדי עם מתימטיקה אבל מי שרוצה ללמוד את התחום ברצינות ולא רק להיות מוגבל לטכנולוגיה של אמזון או גוגל, למשל - יצטרך ללמוד (או לרענן) נושאים כמו אלגברה ליניארית וסטטיסטיקה. 
הידע הנדרש הוא אמנם ברמה אקדמית, אבל הוא לא כולל את כל החומר וההיקפים הנדרשים באוניברסיטה, אלא רק מה שצריך בשביל לתכנת. בכל מקרה, תוכלו להשלים את הידע המתימטי הנדרש דרך אתר כמו Kahn Academy.

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

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

שלב 6 - השתלמות


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

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

זה אומר ללמוד על כלי עבודה שמפתח עובד איתם בשוטף כמו IDE שונים ומערכות Version Control כמו Git למשל.
זה אומר ללמוד על מה זה Refactoring ואיך עושים את זה נכון, איך מתחזקים קוד, איך בונים קוד שיוכל לסבול שינויים בעתיד, איך לתכנן קוד לפני בכלל שנגענו במקלדת ולא רק כדי שיעבוד ביום הראשון אלא שיעבוד שנים ושיוכלו לעבוד איתו מספר מפתחים ולא רק מפתח יחיד.
זה אומר ללמוד מה זה Unit Testing, איך עושים את זה נכון ואיך משתמשים ב-Mocking כדי להצליח במשימה.
איך לכתוב Code שיהיה קל לתחזק אותו בהמשך, שיהיה קל לשדרג אותו או לתקן בו באגים ועוד.

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


בהצלחה !

אין תגובות:

הוסף רשומת תגובה