שלום לך. עד עכשיו, התייחסנו לקורות החיים כאלו הפרוייקטים, ובמיוחד הטכנולוגיות שאת מציגה נגזרו משמיים, ועכשיו נשאר רק לכתוב את קורות החיים כך שהן יציגו את הפרוייקטים והטכנולוגיות באופן אופטימלי. כמובן שזה לא בדיוק המצב – הפרוייקטים והטכנולוגיות בהן רוב הסטודנטיות משתמשות נקבעים לרוב ע"י סגל ההוראה. מכיוון שכך, הם הרבה פעמים נקבעים באופן לאו-דווקא אופטימלי להשתלבות בתעשיה: עם כל הרצון הטוב, באקדמיה קשה לעדכן חומרי לימוד כל כמה סמסטרים, לפי הקצב של התעשיה. (גילוי נאות: אני מרצה בקורס תכנות שמבוסס על פרוייקטים. אני משקיע הרבה זמן בלעדכן את הסילבוס, ומשתדל באופן כללי, אבל ברור לי שגם הקורס שלי לא חף מהבעיות הללו).
אז הפעם בבלוג, נלך אחורה ב-stack, ונדבר על משהו שאפשר לעשות עוד לפני תחילת חיפוש העבודה וכתיבת קורות החיים: לימוד עצמאי של טכנולוגיות קטנות. אני לא מתכוון לכתיבת פרוייקטי ענק שלא במסגרת התואר – אם יש לך זמן לזה, כנראה שעדיף לך להתחיל לחפש עבודה. אני מתכוון להשקעה של כמה שעות ספורות בכל פעם, על מנת ללמוד טכנולוגיה ולהשתמש בה.
הפוסט מכיל בעיקר רשימה של טכנולוגיות שנמצאות היום בשימוש בתעשיה, ומנסיוני לאו דווקא נלמדות בכל התארים. ההמלצה שלי היא ללמוד טכנולוגיות תומכות שמתאימות לשפת התכנות בה כתבת את הפרוייקטים העיקריים בתואר, כמתואר מטה, ולהשתמש בהן במסגרת הפרוייקטים. אין שום הכרח להשתמש בהן לפני הדדליין להגשת הפרוייקט – אפשר גם להשלים ידע בקיץ, כשיש את כל הזמן שבעולם, ואז לשפץ את הפרוייקט אחרי שהוא הוגש, בלי לתת דין וחשבון לאף איש סגל טרחן *שיעול* 🙂
אדגיש שוב: ממש לא כדאי לדחות את חיפוש העבודה לצורך הזה, או מקסימום – לדחות בכמה ימים, וללמוד רק מה שאת מספיקה. גם אם יש ברשימה הרבה טכנולוגיות שלא מוכרות לך, זה טבעי ואין סיבה להילחץ; לשמחתנו הביקוש למתכנתות מספיק גבוה.
אגב, מתכנתות ותיקות, אם יש לכן השגות, אשמח לשמוע בתגובות. ועוד יותר אשמח אם יש לכן לינקים למקורות לימוד יותר טובים 🙂
אז יאללה, נצלול לרשימת הטכנולוגיות, בחלוקה לפי שפה:
טכנולוגיות שרלבנטיות תמיד, ללא תלות בשפת התכנות
לינוקס: לינוקס היא מערכת הפעלה ש"מתחרה" בווינדוס, רק שמבחינת עולם התכנות, לינוקס מזמן כבר ניצחה. רוב שרתי האינטרנט מריצים לינוקס, ומערכת ההפעלה אנדרואיד מבוססת על לינוקס.
אם לא למדת לינוקס באוניברסיטה (מוזר, אבל זה אכן קורה בחלק מהמקומות), בהחלט שווה להשקיע את הזמן בקורס הזה, הזה, או הזה (כבוד ועוצמה למאמר הזה דרכו הגעתי לשני הקורסים הראשונים – תודה!)
כלי source control: אם את מתנהלת בדומה אליי בתקופתי כסטודנט, את בוודאי רגילה לאחסן את הקוד שלך בשיטה העתיקה והמוכחת "שלחתי במייל לשותפה, ויש גם עותק בדרופבוקס" 🙂 אבל ברוב החברות, הקוד מאוחסן בכלי יעודי, שמאפשר לעקוב אחרי שינויים, ולהבין עבור כל שינוי: מי שינה את הקוד, מתי, מה היה השינוי בקוד, ומה הסיבה לשינוי.
בפוסט זה נסקור שני כלים כאלה: subversion, או בשמו המקוצר SVN, ו-git.
Git הוא הכלי החזק מבין השניים, אבל יותר קשה ללמוד אותו. להגיע לשליטה טובה ב-git, במיוחד במצב שכמה מתכנתות עובדות על קוד משותף, עשוי לקחת גם כמה שבועות למתכנת ותיק (מנסיון כואב). לכן, אם את מחפשת כלי שמאפשר לעבוד בנוחות על פרוייקט עם שותפה, למשל במהלך הסמסטר, אני ממליץ קודם כל ללמוד ולעבוד עם SVN, למרות שבימינו זה כבר כלי די מיושן. לחלופין, אם את מתכוונת להשתמש בכלי לבדך, כן הייתי הולך על git.
לצערי, לא מצאתי קורס חינמי לחלוטין עבור SVN – אם מישהי מכירה, אשמח לשמוע. בהיעדר אופציות אחרות, הייתי הולך על הקורס הזה, שמצריך הרשמה (כולל כרטיס אשראי), אבל להבנתי יש עשרה ימים ראשונים בחינם וניתן לבטל לפני שהחיוב מתחיל.
על מנת ללמוד git, הייתי מנסה את הקורס הזה. יש גם ספרים (מהם דווקא לא הייתי ממליץ ללמוד, אבל מה אכפת לי לתת לינק) על SVN ו-git. עדכון, 22.3.18, תודה לקורא ברוך: האתר הזה נותן טוטוריאל אינטראקטיבי נפלא ללימוד git (רק שימו לב שיש שני "טאבים" בתוך האתר, main ו-remote; החלק תחת remote הוא האתגר האמיתי שמסבך אנשים ב-git). התוכנה git extensions עשויה בהחלט לעזור למתחילים, ובנוסף אליה, כדאי לשלוט לפחות חלקית ב-git מה-command line.
באופן כללי, מומלץ להעלות את הפרוייקטים הכי מרשימים שלך לאתר בסגנון github (למרות שמו, האתר תומך לא רק ב-git אלא גם ב-SVN). כל קוד שאת מעלה, צריך כמובן להיות מדוגם ומצוחצח כמה שיותר – נדבר על כך בפוסט עתידי. בינתיים, אני ממליץ לפחות להשתמש בכלים הנלווים לכל שפה, המפורטים מטה, על מנת לשפר את איכות הקוד כמה שניתן.
כלים פר-שפה
כאמור, ההצעה שלי היא להשתמש בכלים שרלבנטיים לשפת התכנות בה כתבת את הפרוייקטים העיקריים שלך.
בנוסף לכך, אם לא למדת בתואר ג'אווה ופייתון, יש הגיון להשקיע פה ושם כמה שעות, וללמוד אותן ברמה בסיסית. את C לעומת זאת, להערכתי אין אפשרות ריאלית ללמוד בכמה שעות, ובטח שלא את ++C. אגב, זה אולי המקום להעיר ששפת #C דומה מאוד לג'אווה, ולכן אם את שולטת היטב בג'אווה, זה בהחלט עשוי לעניין מעסיקים שמגייסים למשרות #C, ולהיפך.
עדכון, 22.3.18: נשאלתי בתגובות לגבי המושג "קונבנציית קוד": בארגונים מודרניים, מקובל שכולם כותבים את הקוד בסגנון אחיד. למשל, האם כותבים שם פונקציה באותיות קטנות, function_name, או באותיות מתחלפות, functionName? האם הסוגריים המסולסלים אחרי if נפתחים באותה שורה, או בשורה שמתחתיו? מה לגבי הסוגריים המסולסלים שפותחים פונקציה? בארגונים מודרניים, יש תשובות ברורות לכל השאלות הללו, כך שכל הקוד שנכתב בארגון נראה אחיד, בניגוד למצב "קוד שמשה כתב נראה ככה, וקוד שחזי כתב נראה אחרת". גם בחלק משפות התכנות מקובל שכל הקוד שנכתב בשפה, לא משנה באיזה ארגון הוא נכתב, הוא אחיד לגבי השאלות הללו. היכרות עם קונבנציית קוד סבירה תעיד עליך לטובה, וחשוב מכך: כשמעלים קוד לאתר בסגנון github כדאי לוודא שהוא אחיד, ואם יש קונבנציה מקובלת לשפה בה הוא נכתב, שהוא תואם לקונבנציה הזו.
כלים רלבנטיים לשפות C ו-++C
- קונבנציית הקוד של גוגל ל-CPP.
- עבור שפת C, הייתי מנסה לחקות את הקונבנציה של s2n, ספריית ההצפנה של אמזון שכתובה ב-C. לצערי אין להם בדיוק מסמך קונבנציית קוד, אלא יותר משהו בסגנון קווים מנחים.
- מומלץ לפרמט את הקוד באופן אוטומטי בעזרת clang-format. הכלי תומך במספר סגנונות פירמוט ידועים; בהיעדר העדפה אחרת, הייתי הולך על הסגנון של גוגל. כדאי לבדוק גם את הכלי הדומה clang-tidy; גם עבורו, הסגנון של גוגל הוא בחירה סבירה.
- Valgrind הוא כלי שמאפשר לזהות גישות שגויות לזיכרון במהלך ריצה של תוכנית, גם אם הן לא גורמות לקריסה של התוכנית.
- Makefile הוא כלי לארגון והאצת קומפילציה בלינוקס (פה יש מדריך נוסף).
כלים רלבנטיים ל-Java
גילוי נאות: אני שונא ג'אווה. אבל בשביל לעזור לצעירים בתחילת דרכם, אפילו עם ג'אווה אני מוכן לטנף את הידיים 😉 ההמלצות כאן גובשו בעזרתו הנדיבה של רון ביגמן, ראש צוות בחברת EMC.
- הקונבנציה של גוגל לקוד ג'אווה. ניתן להשתמש ב-Checkstyle כדי לאכוף את הקונבנציה הנ"ל.
- בג'אווה יש תרבות טסטים נרחבת, וכדאי להכיר את ספריית הטסטים JUnit. מי שמחפשת הזדמנות להתעמקות נוספת בטסטים, יכולה להשתמש בתרגיל הזה.
- כדאי להכיר את הכלי Maven, שהוא מעין מקבילה ל-Makefile.
יש גם כלים פופולריים נוספים שכדאי להכיר, למרות שאני לא בטוח שתמיד ניתן לתרגל שימוש בהם בפרוייקט קיים:
- Tomcat הוא שרת web פופולרי.
- Spring היא framework פופולרית שכדאי להכיר, למרות שלהערכתי הלימוד שלה לוקח זמן, והייתי מגיע לזה אחרון, אם בכלל. נראה לי שעדיף להתחיל בעזרת Spring Boot, שמתיימרת 'לבחור בשבילך' בחירות סבירות, על מנת שתוכלי להתחיל במינימום זמן. מי שרוצה להתעמק ב-Spring עצמו, יכולה להיעזר למשל בשלושת המדריכים האלה.
- Scala היא שפה שמנסה לשלב את היתרונות של תכנות פונקציונלי עם היתרונות (הלא קיימים) של ג'אווה. היכרות ראשונית איתה יכולה להיות סעיף תומך נחמד בקורות החיים שלך. אפשר להתחיל ללמוד אותה פה, או פה (למתכנתות עם נסיון בג'אווה).
כלים רלבנטיים לשפת Python
הרשימה גובשה בעזרתו הנדיבה של יוני צפיר, מפתח בחברת JoyTunes. אגב, את פייתון אני דווקא אוהב 🙂
- קונבנציית הקוד של פייתון ידועה בשם PEP 8, ונוסחה בעזרתו של יוצר השפה, חידו ואן רוסום. יש גם קונבנציה של גוגל, שלא ברור לי כמה היא תורמת מעבר ל-PEP 8, אבל נשים לינק שיהיה.
- כדאי להשתמש בכלי pylint על מנת לזהות בעיות בקוד באופן אוטומטי.
- pip הוא כלי פופולרי לניהול אוטומטי של חבילות מותקנות.
- פה יש רשימה מומלצת של חבילות, וכדאי לשחק עם כמה מהן פה ושם ברגעי שעמום (ממש לא לעבור אחת-אחת – זה לא שווה את הזמן שלך; לבחור שתיים-שלוש ולשחק איתן).
- המקבילה הפייתונית ל-JUnit נקראת PyUnit, וכדאי להשתמש בה.
טכנולוגיות שרלבנטיות לפעמים, כתלות בפרוייקט
- אם אחד מהפרוייקטים שלך מאחסן נתונים באופן פרסיסטנטי, כדאי להשתמש ב-SQL.
- Docker הוא כלי פופולרי לאריזה של אפליקציות יחד עם התלויות שלהן – בגדול, הוא בא לפתור את הבעיה המוכרת "זה עובד לי על המחשב שלי, אז מוזר שזה לא עובד על המחשב שלך". פה יש מדריך כתוב, ופה יש קורס עם וידאו (יש גם חלק יותר מתקדם על טכנולוגיה בשם Kubernetes, שהוא 'אופציונלי' אפילו בהנתן שכל מה שכתוב בפוסט הזה הוא אופציונלי; אפשר ללמוד גם אותו, ולא הייתי מתקדם מעבר אליו).
יאללה, נראה לי שמספיק חפרתי. ביי בינתיים 🙂
הפוסט פורסם לראשונה באתר של הבלוג ב-The Marker