יום שבת, 8 בספטמבר 2012

שפות תכנות - מה כדאי ללמוד ולאיזו מטרה?

"שפות תכנות" הוא כנראה המושג הנפוץ ביותר והמבלבל ביותר שכל מי שמתחיל את דרכו בתחום ההיי-טק לומד להכיר. אפילו אנשים שלא למדו מחשבים בחייהם יודעים שמושגים כמו: Java, C++, Python - הם איכשהו קשורים לעולם המוזר הזה של אנשים שעושים כל מיני דברים מסובכים עם המחשב.

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

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


למה יש מגוון רחב כל כך של שפות תכנות?

קצת היסטוריה (ניתן לעבור לחלק הבא של הפוסט אם ההיסטוריה פחות מעניינת אותכם...), שפות התכנות הראשונות: FORTRAN, LISP, COBOL נוצרו כולן בערך באותה תקופה (תחילת שנות ה60) והרעיון שלהן היה פשוט ואמר משהו כזה: "אנשים לא רגילים לחשוב ולדבר באמצעות מחרוזות של 0 או 1 (ככה היה נהוג לכתוב למחשב עד אז), יהיה הרבה יותר קל לכתוב את התוכנה (כלומר את פקודות המכונה) בטקסט שיהיה מוסכם על כולם מראש".

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

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

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

אם אני רוצה לכתוב תוכנה לiPhone השפה שתתאים למשימה היא Objective-C (או Swift) והיא לא תהיה אופטימלית בכלל למי שצריך לכתוב תוכנה שעושה חישובים מתמטיים כבדים (לשם כך נשתמש ב R או ב Matlab). שפת התכנות היא למעשה הכלי איתו ניתן לפתור בעיה מסויימת.


מה ההבדל בין שפות התכנות השונות?

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

2) יש שוני בSyntax, כלומר, לכל שפה יש "מילים שמורות" שהן מילים שמרכיבות את השפה, למשל בJava המילים הבאות: if, class, for, public, private, try, this - הן מילים שמורות עם משמעות מיוחדת בשפה, הקומפיילר יודע לתרגם אותן לפקודות מכונה מסויימות. לכל שפה יש רשימת "מילים שמורות" ייחודית לה, אך חשוב לזכור שיש דמיון מסויים בין שפות תכנות שונות, למשל if, for הן מילים שמורות כמעט בכל שפת תכנות.

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



לאיזה תחום כל שפת תכנות שייכת?

1) Java -  אחת משפות התכנות הפופלריות ביותר בתעשיה העולמית והמקומית. Java שייכת לגישת ה Object Oriented. היא נפוצה בכמה תחומים שונים כמו: צד השרת של אתרי אינטרנט, פיתרונות ל Big Data וכמו כן פיתוח אפליקציות לAndroid. בישראל Java היא דומיננטית מאוד בתעשיה ומאוד רלבנטית לתחומים הנ"ל.

2) C# - כלומר C-Sharp, יחד עם Java היא נחשבת לאחת השפות הפופלאריות בתעשיה בישראל. זוהי שפה ממשפחת ה NET. גם היא שפת אובייקט אוריינטד, מיועדת בעיקר למטרות פיתוח תוכנות לסביבת Windows של Microsoft וגם לפיתוח צד שרת לאתרי אינטרנט או אפלקיציות מובייל למכשירי Windows Phone.

3)  Java Script - זוהי השפה השולטת והיחידה לפיתוח צד לקוח באתרי אינטרנט, וכיום היא תופסת תאוצה גם בצד השרת של אפליקציות Web באמצעות Node.js הפופלרי. JS כיום היא אחת משפות התכנות החשובות והפופולריות ביותר בעולם. מאוד רלבנטית לכל מי שמתעניין בכתיבת צד הלקוח באתרי אינטרנט (וגם צד שרת), web applications ולפעמים באפליקציות מובייל. כאמור בשנים האחרונות התחילו להשתמש בJS גם לפיתוח צד השרת על מנת ליצור אחידות בשפה בין צד הלקוח לשרת. כיום שימוש בJS בצד השרת נחשב לטכנולוגיה החדשנית ביותר בענף וצפויה לצבור תאוצה רבה בשנים הקרובות. לימוד JS הוא ההימור הכי בטוח שיכול להיות למי שעושה עכשיו את צעדיו הראשונים בתחום.

4) PHP - שפת תכנות לכתיבת Web Applications שהם למעשה אתרי אינטרנט דינאמיים כמו Wikipedia, Yahoo, Facebook. שפת PHP היא שפת scripts והקוד שלה למעשה נמצא גם בצד השרת וגם בצד הלקוח. כיום PHP נחשבת בחוגים מסויימים קצת מיושנת. יש שפות כמו Ruby on Rails שהם כרגע הדבר החם בעולם ה Web Applications אבל למרות זאת PHP היא רלבנטית חיה ובועטת גם היום וגם בעתיד הנראה לעין.

5) Ruby on Rails - שפת תכנות וסביבת פיתוח שרלבנטיות בעיקר לתחום ה Web Applications. בשנים האחרונות הפכה להיות שם החם ביותר לסטארט-אפים בתחום האינטרנט בסיליקון ואלי. לעומת זאת, כאן בישראל היא עדין לא אחת מהשפות הפופולריות ביותר אבל בהחלט צוברת תאוצה בקרב חברות סטארטאפ בתחום האינטרנט. אני מאוד אוהב את הסביבה הזאת משום שהיא פשוטה להבנה וניתן ממש בקלות ליצור איתה דברים מדהימים בזמן קצר. מעבר לזה חשוב לציין כי קל יחסית ללמוד לפתח ב RoR ביחס לשפות דומות אחרות.

6) Objective-C \ Swift - אלו הן שפות התכנות של Apple עבור מכשירי האייפון וה iPad. אמרנו קודם שרק בJava ניתן לפתח אפליקציות אנדרויד, אז באותו אופן, רק ב Objective-C או ב Swift ניתן לפתח אפליקציות למכשירי Apple כאשר Swift היא השפה החדשה שאפל הוציאה לפני מעט שנים כדי להפוך את הפיתוח למוצרי אפל לקל יותר. Obj-C היא השפה הותיקה שכנראה בעוד כמה שנים תרד דרמטית בפופורליות שלה. שתי השפות האלו צברו פופלריות חסרת תקדים בשנים האחרונות בעקבות ההצלחה המסחררת של Apple. אם אתם מעוניינים להתחיל ללמוד תכנות לאייפון כיום אז לכו על Swift.

7) C - מיועדת בעיקר לתחום Real Time Embedded, חברות שמפתחות חומרה כמו צ'יפים למצלמה דיגיטלית, תקשורת נתונים או למכשיר סלולרי - משתמשות בפיתוח בשפת C כדי להיות מסוגלים להפעיל לוגיקה מסויימת על רכיב החומרה. זוהי שפה שנחשבת יחסית קשה ללימוד בגלל שהמתכנת צריך לנהל את הזיכרון של התוכנה בעצמו (דבר שכמעט בכל שפת תכנות אחרת קורה אוטומטית ״מאחורי הקלעים״). לכל מי שיש עניין בחומרה, מעגלים חשמליים והקשר שנוצר בינם לבין התוכנה. שפת C היא הדומיננטית ביותר בתחום הזה.

8) ++C - זוהי שפת C משופרת אשר נותנת יכולות של תכנות Object Oriented, בדומה לJava אבל עדין עם הקושי של ניהול זיכרון ידני בדומה ל C. בשפה הזו משתמשות חברות בהן הביצועים הם קריטיים (חישובים מתמטיים סבוכים), אבל גם הרבה חברות "וותיקות" משתמשות בה עבור אפליקציות desktop. מתאימה לפיתוח צד שרת ונעשה בה גם שימוש לעיתים בתחום ה Real-Time Embedded  כאשר יש צורך בשימוש בעקרונות ה Object Oriented.

9) Perl \ Bash אלו שפות scripts שונות אבל אני כותב אותן יחד משום שדי בהבנת אחת מהן על מנת להרגיש בנוח לכתוב בשפה השניה. לדעתי חובה על כל מי שרוצה להיות מתכנת להכיר לפחות אחת משתי השפות ברמה בסיסית. כל מתכנת ימצא את עצמו משתמש באחת משפות ה scripts האלו.

10) Python - שפת תכנות פופלרית ביותר שנוצרה במטרה לעשות את הכל פשוט יותר לשימוש. היא נחשבת לשפה די פופולרית בישראל, למשל ב Google מפתחים בפייטון חלק מהמוצרים. הקוד של השפה אמור להיות קריא וברור אך יש כאלו שיגידו שהוא "מגעיל". פייטון היא ללא ספק אחת משפות התכנות הפופלריות ביותר. ניתן להשוות אותה ל Java, Ruby, PHP ועוד שפות נוספות כי כאמור Python נוצרה כדי לעשות את הכל טוב יותר.

עד כמה קשה לעבור משפה אחת לאחרת?

"As to methods, there may be a million or more, but principles are few. The man who grasps principles can successfully select his own methods. The man who tries methods, ignoring principles, is sure to have trouble" - Ralph Waldo Emerson

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

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

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

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

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

לכל תחום יש שפות תכנות רלבנטיות, לפעמים רק אחת ולפעמים יותר

יש תחומים כמו Web Server בהם יש כמה שפות רלבנטיות כמו ++Java, C#, C - הן נועדו לפתור את אותה הבעיה באותה צורה ולכן מעבר בין שפה אחת לאחרת הוא די פשוט. לעומת זאת יש תחומים כמו פיתוח לאייפון או לאנדרויד שבהם יש רק שפה אחת רלבנטית ובדר"כ אין יתרון ממשי לידע קודם שנצבר בעבודה עם שפה אחרת בתחום אחר. 

איך אתם יכולים להכין את עצמכם לשוק העבודה?

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

השפות תכנות שאתם חייבים להכיר הן (כמובן שלפחות 2 מהן תלמדו גם ככה במהלך התואר):

1) Python - כדי להיות מסוגלים לבנות תוכנות לשימושים רבים במהירות ובקלות.
2) #Java \ C - כדי לקבל ידע בסיסי בתכנות Object Oriented.
3) Java-Script - כי זו השפה החשובה והחזקה ביותר בעולם התכנות היום.
4) Bash-Script - כי כל מתכנת ימצא את עצמו משתמש בסקריפטים במוקדם או במאוחר.

החלק השני של התשובה שלי נוגע לדבר הראשון שצריך לדעת לפני שמתחילים לחפש עבודה והוא לדעת באיזה תחום אתם רוצים לעבוד. אם החלטתם לדוגמה שהתחום שמעניין אתכם הוא Web Applications אז דבר שיכול דרמטית להגדיל את הסיכויים שלכם למצוא עבודה בתחום הוא ללמוד לבד Node.js או Python או PHP ולעשות פרוייקט קטן בעצמכם שיוכיח מה למדתם. אם תציגו את זה בראיונות עבודה אתם תקבלו נק' בונוס רבות על כך.

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


מאיפה מתחילים?

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

https://www.udemy.com/java-tutorial

https://www.udacity.com/course/intro-to-java-programming--cs046

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

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

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