פשוט לכו לאוניברסיטה

23/01/2017

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

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

1. מבוא לתכנות

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

קודם כל כי השפה עצמה שונה מאוד משפות אחרות שתגיעו לכתוב בהן קוד: מודל האוביקטים המבוסס על Prototypes במקום על מחלקות. מנגנון מודולים ומרחבי שמות שעדיין לא נתמך בשום דפדפן ולכן דורש תרגום קוד JavaScript לקוד JavaScript אחר לפני הרצה (עם webpack). מושגים שאינם תואמים (אוביקט ב JavaScript הוא Dictionary או Hash בשפות אחרות). המרת טיפוסים כברירת מחדל. כל אלו יעבדו נגדכם כשתרצו ללמוד את השפה השניה שלכם.

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

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

מה כן? גישה מקובלת אומרת שכדאי להתחיל ללמוד תכנות משפה מונחית עצמים, כי כאלה יהיו רוב השפות שתפתחו בהן בעולם האמיתי. מצדדי הגישה יתחילו מלימוד Python, Java או C# בהיותן שפות מונחות עצמים קלות ללמידה אבל שגם הושקעה הרבה מחשבה בפיתוחן ולכן הן מעודדות הרגלים טובים.

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

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

2. קיצורי דרך

נתבונן בקוד הבא מתוך שעור אמיתי בקורס מבוא לתכנות מדומיין:

 <button id="btn" onclick="myFunction()">Click me</button>

 <script>
 function myFunction() {
    btn.innerHTML = 'Ouch!';
 }
 </script>

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

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

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

3. אבל החמור מכל: להתרגל לא להבין

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

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

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

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