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

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

"שפות תכנות" הוא כנראה המושג הנפוץ ביותר והמבלבל ביותר שכל מי שמתחיל את דרכו בתחום ההיי-טק לומד להכיר. אפילו אנשים שלא למדו מחשבים בחייהם יודעים שמושגים כמו: 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, זוהי שפה ממשפחת ה NET. גם היא שפת אובייקט אוריינטד, מיועדת בעיקר למטרות פיתוח תוכנות לסביבת Windows של Microsoft וגם לפיתוח צד שרת לאתרי אינטרנט. בעבר היא הייתה אחת משפות התכנות הפופולריות בעולם, כיום היא נמצאת במגמת ירידה חדה. יש עדין חברות ותיקות שמפתחות בשפה הזו אבל חברות חדשות כמעט ולא. למי שרוצה להיכנס לעולם התכנות, הייתי ממליץ ללמוד שפה אחרת. 

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

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

5) Ruby on Rails - שפת תכנות וסביבת פיתוח שמיועדת בעיקר לתחום ה Web Applications. בערך בשנת 2011 היא הפכה להיות השם החם ביותר לסטארט-אפים בתחום האינטרנט, אך בדיעבד זה היה רגע השיא. מאז חלה ירידה בפופולריות שלה בעיקר בגלל בעיות של scale ו performance. כיום סטארטאפים חדשים מעדיפים לפתח אפליקציות Web בשפות תכנות אחרות, בעיקר:  java-script, python. 

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

7) Kotlin - בדומה לאפל שהוציאה את Swift לפני כמה שנים, החבר׳ה ב Google שאחראים למעשה על Android החליטו לעשות מהלך דומה והוציאו את Kotlin (בתור תחליף ל Java) שהיא ממש דומה ל Swift ומאפשרת למפתחים חדשים להיכנס לעולם של פיתוח לאנדרויד בצורה קלה ופשוטה יותר.

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

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

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

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

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




השוואת פופולריות בין שפות התכנות

מתוך stack overflow ניתן לראות את הפופלריות היחסית של כל שפה:


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

"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 בהם יש כמה שפות רלבנטיות כמו Python, Java, Java Script - הן נועדו לפתור את אותה הבעיה באותה צורה ולכן מעבר בין שפה אחת לאחרת הוא די פשוט. לעומת זאת יש תחומים כמו פיתוח לאייפון או לאנדרויד שבהם יש מספר מוגבל של שפות רלבנטיות ובדר"כ אין יתרון ממשי לידע קודם שנצבר בעבודה עם שפה אחרת בתחום אחר. 

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

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

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

1) Python - כדי להיות מסוגלים לבנות תוכנות לשימושים רבים במהירות ובקלות.
2) Java - כדי לקבל ידע בסיסי בתכנות 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

https://www.udemy.com/the-web-developer-bootcamp/

https://www.codecademy.com/learn/learn-python

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

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


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