תכנות מחשבים ואיפה להתחיל

2024-01-18 - תכנות

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

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

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

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

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

שפות תכנות

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

שפות תכנות שונות אחת מהשניה מסיבות טכניות אך גם מסיבות אסתטיות.

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

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

דברים מוזרים, כותבים #C על מחשב Amiga כאילו אנחנו ב-1986.

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

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

  • יש לה מדריך טוב שמלמד תכנות כמו שצריך
  • המדריך והשפה מעניינים אתכם, כלומר לא תרגישו משועממים או מתוסכלים (במידה בלתי נסבלת)
  • אפשר להשתמש בה לבנות את הדברים שאתם רוצים לבנות

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

איך להתחיל

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

  1. אם בניית אתרים הוא תחום שמעניין אתכם והייתם רוצים לעצב לעצמכם אתר אישי (כמו האתר הזה), ללמוד HTML, פורמט מסמכים המשמש לכתיבת התוכן של אתרים, ו-CSS, שמשמש להגדרת העיצוב של דפי HTML, יכול להיות צעד ראשוני מוצלח. הספר HTML for People מנסה להנגיש את הנושא לאנשים ללא רקע תכנותי ובעזרתו תוכלו ללמוד איך לבנות ולשתף את האתר שלכם ברשת האינטרנט.

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

  2. How to Design Programs (Second Editon) הוא ספר מצויין ללימוד תכנות בצורה סיסטמטית. הספר לא משתמש בשפת תכנות נפוצה, אלא בשפות שנכתבו במיוחד בשביל ללמד תכנות, מה שנותן ללומדים את האפשרות להתמקד בדברים החשובים בהתחלה (ואזכיר שוב ששפת התכנות הראשונה שלכם לא תהיה האחרונה). בנוסף קיים גם קורס מצולם המבוסס על הספר.

  3. ואם אתם ממש מתעניינים באיך מחשבים עובדים ואתם רוצים להכנס לעובי הקורה, אפילו יותר משאתם מתעניינים בתכנות מחשבים, יש ספר מאוד יפה (אבל לא חינמי) ששמו Code: The Hidden Language of Computer Hardware and Software שעושה עבודה מצויינת בלהציג מה זה קוד, ואיך מערכות מחשב בנויות מלמטה למעלה.

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

אוקיי. למדתי קצת תכנות. איך ממשיכים להשתפר?

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

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

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

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

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

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

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

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

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

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

מעבר לטיפים שלמעלה, כבר עברתם על הקורס The missing semester of your CS eduction? זהו קורס מצויין שמכסה הרבה דברים שיהיו שימושיים לכל מקצועני תוכנה שהרבה מקומות לא מלמדים.

The missing semester of your CS education ביוטיוב.

ואם אתם כבר דיי טובים בתכנות?

מעולה! האם ניסיתם להיכנס לתחום חדש לאחרונה? האם צללתם לתוך פרוייקט שאתם ממש אוהבים כדי לתקן איזה באג או לנסות להבין איך איזה משהו ספציפי עובד? ניסיתם לבנות שפת תכנות משלכם או לבנות קומפיילר לשפה קיימת? ניסיתם לבנות גרסה פשוטה של תוכנה שאתם משתמשים בה כל הזמן כמו VCS, מסד נתונים, או שרת ווב? ניסיתם ללמוד שפת תכנות מפרדיגמה שונה, כמו Haskell, Erlang, Forth או Datalog?

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

מדריכים מומלצים

מחולקים לפי רמות:

מתחילים

> HTML for People (ספר)
הוזכר למעלה. אם אתם רוצים להתחיל להכיר את עולם התכנות ואיך אתרים פשוטים בנויים, זו דרך קלה ונוחה להתחיל.
> How to Design Programs (ספר)
גם הוזכר למעלה. ספר קצת שונה בנוף שמציג את נושא התכנות בצורה מאוד סיסטמתית. משתדל מאוד לדייק בעובדות ולהתעסק בעיקר ולא בתפל.

רמת ביניים

> So you want to be a wizard? (zine)
מעין מגזין קצר שמדבר על סקילים חשובים ועל דרך חשיבה שיכולה לעזור לנו להשתפר.
> The missing semester of your CS education (קורס)
גם הוזכר למעלה כבר פעמיים. אבל אני מאוד אוהב את הקורס הזה כי הוא באמת מכסה הרבה נושאים מאוד שימושיים בעיניי שרוב תוכניות הלימוד בקושי מלמדות או מדלגות עליהם.

מתקדמים

> Out of the Tar Pit (pdf)
מאמר דיי ארוך על המורכבות שבבניית מערכות גדולות וכמה גישות להתמודדות עם הבעיות שנוצרות.
> Compiler Design: Virtual Machines (ספר)
ספר שמתאר 4 מכונות וירטואליות (לשפות תכנות) שמתאימות ל4 שפות תכנות עיליות בפרדיגמות שונות, ואיך ניתן לקמפל את שפות התכנות המדוברות ל-VM הרלוונטיות. אם אתם מתעניינים בשפות תכנות ותורת הקופילציה, זה ספר שווה קריאה.
> JonesForth (קוד)
מימוש ברור להפליא של מערכת המבוססת על שפת התכנות Forth הכתוב בשפת אסמבלי x86.
> Cpu Caches and Why You Care (יוטיוב)
הרצאה מאירת עיניים על מה גורם לתוכנה לרוץ מהר על מערכות מחשבים מודרניות.
> Zero to Production in Rust (ספר)
למדו איך לבנות מערכות אינטרנט מקצועיות באמצעות שפת תכנות חדשה (אולי?).
> CS 253 Web Security (קורס)
אבטחת מידע הוא עוד נושא חשוב שלא מקבל מספיק תשומת לב. הקורס הזה מכסה חלק מהדברים הבסיסיים שכדאי להיות מודעים אליהם כשבונים מערכות.

סיכום

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

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