← C++ Course – From Basics to Advanced Topics

מפגש 1

טוען נגן…

תמלול

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

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

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

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

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

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

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

ואנחנו בעצם חותרים לזה שהקהילה שלנו תהיה קהילה טכנולוגית, קהילה שעושה באמת כמה שיותר כבוד לעולם ה-embedded, למייקרים, לכל הקוד, לכל השפות, ולכל האפליקציות שהשפות המקסימות האלו נותנות לנו, אם זה Python שהשתמשנו בשביל ה-AI, אם זה JavaScript, ואם זה C++, שזה לדעתי קורס הליבה של עולם ה-embedded.

רון ואני מנהלים חברה שקוראים לה Interface R&D. החברה שלנו נותנת שירותי ייעוץ בכל מה שקשור גם כן ל-embedded, אם זה PCB design, ואם זה embedded software כדי לצרוב את זה על הצ'יפים, ואם צריך פרוטוטיפים והכול, עושים מא' ועד ת'. סביב הדבר הזה אנחנו גם כן מאוד אוהבים להתעסק במיקרו-בקרים ובכל מה שקשור לקוד ותוכנה.

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

אז ככה, 60 שניות על מיכאל: מיכאל וייסמן, בן 41, יש לו 17 שנים של ניסיון בפיתוח. הוא התחיל מקורס של Microsoft Certified Professional Developer, שבו למד שפות תכנות כמו C שטכנולוגיות שונות. לאחר מכן הוא התחיל לעבוד בחברה צעירה שנותנת פתרונות תוכנה לציוד בדיקה שונה, הוא למד לתכנת על מיקרו-בקרים ב-C, ב-C++ וב-LabVIEW, והתחיל במקביל לימודים של תואר ראשון באוניברסיטה הפתוחה במדמ"ח.

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

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

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

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

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

יופי, שחף, המון תודה.

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

שפת C++ זה אחת השפות שבעיקר משתמשים לפיתוח מסוג כזה, אבל לא רק. כמובן C, בזמן האחרון Rust פתאום התחיל לעלות.

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

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

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

## C++ Overview

ככה: C++ היא שפה ותיקה, עם הרבה שנות ניסיון. פעם ראשונה בעצם היא יצאה ב-85', לפי לפחות מה שאומרים. עדיין היא מתקדמת, כל שנתיים, אם אני לא טועה, בעצם מוציאים release חדש של השפה.

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

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

## C++, Use It Anywhere

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

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

שפה מאוד גמישה. אפשר לכתוב בה בכל מיני פרדיגמות מסוימות, כמובן הפרדיגמה הכי מפורסמת זה Object-Oriented, אבל לא רק.

לדוגמה, בהרבה דוגמאות ב-Arduino, אם ראיתם את הדוגמאות של הקוד, אפשר לראות שמשתמשים בשפה כשפה רגילה, פונקציונלית, שבעצם יש לכם main, וב-main מפעילים כל מיני פונקציות, גם while-ים אינסופיים וכו'.

אבל מי שנכנס בעצם לתוך הספריות, הוא יכול לראות ש-C++ גם פתאום הופכת לשפה יותר מודרנית של Object-Oriented, שיש לכם בעצם סגירה של נתונים ששייכים ממש ל-class ולעבודה של ה-class, ובעצם יש interfaces, API-ים, מתודות, פונקציות הכוונה, לאלה שרוצים להשתמש בספריות האלה.

ב-C++ אפשר להשתמש, כמו שאמרתי, בכל מקום. מיקרו-בקרים על קומקומים, server side applications, game development. הכול הכול הכול, בניית אפליקציות כמובן, ממשק משתמש, הכול אפשר לעשות ב-C++.

## C++ Is All About Speed

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

מה שטוב ב-C++, אפשר באמת לעבוד מאוד קרוב ל-hardware, להשתמש ברגיסטרים של hardware, אפילו אם אני לא טועה, בזמנו אני זוכר לפני איזה 10 שנים, כתבתי תוכנה שבעצם שיחקה אפילו עם פינים על motherboard של מחשב רגיל מ-Windows.

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

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

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

ננסה להיכנס לתוך זה, נעשה הרבה Hands-on. אני ממש מאמין בזה שאתם תבינו יותר טוב את הנושאים רק כאשר באמת תנסו לבנות משהו. ויהיה מעניין. יהיה מעניין, אני מבטיח. נראה איך זה, אם זה באמת ככה.

## סילבוס הקורס

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

אפשר לעצור את ההקלטה ואנחנו נדבר על זה יותר.

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

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

אחרי זה, כל הנושאים של File includes ו-Preprocessor directives ודברים קצת יותר מתקדמים, לוגיקה בינארית וכל הסוגי typing. אנחנו נצלול אליהם קצת יותר לעומק ונבין בדיוק מה כל אחד אומר ומה המשמעות שלהם, ולא סתם כשלש אותיות, ארבע אותיות על המסך.

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

אופרשנים לוגיים, וכל כותרת שכתוב פה, זה מעבר לרק להבין, אוקיי, זה עושה AND, זה גם להבין באמת Hands-on איך עושים את זה, איך מיישמים את זה חכם, ומה השיקולים בליישם ולא ליישם את זה.

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

++C זו שפה נמוכה, שפה שגם מערכת ההפעלה שלנו כתובה ממנה, גם Windows, גם iOS כתוב ב-Objective-C, שיש לו גם כן הרבה מאפיינים דומים של הפרדיגמה של ה-Classes ו-Object-Oriented Programming. ואנחנו נשתמש ממש במשאבים של ה-Windows עצמו כדי לפתח אפליקציית מוזיקה, ונייצר מחשבון. וזו תהיה אפליקציה שתמיד כיף בקוד, כמו שמיכאל הציג בהתחלה, שאתה רואה את התגובה, אתה רואה את המחשב מגיב לך, אתה רואה את הדברים קורים איתך, ואז גם אתה יודע שהצלחת ויש לך מדדים להבין גם כמה זה יעיל או לא יעיל, או מה נתקע או לא נתקע.

ונמשיך: מערכים ו-Strings, מחרוזות. עבודה עם קבצים. אני זוכר שאני למדתי C בהתחלה, אז עשינו מעין וידאומט כזה שרץ על המחשב, ואנחנו צריכים כל פעם לעשות קובץ שנותן את ה-Logins של מי לקח איזה סרט. ותמיד התרגשתי מהאופציה של אני יכול לייצר קבצים, לקרוא קבצים ולמחוק קבצים. ופה מיכאל גם לקח את זה Level Up, והוא אומר שאם אנחנו עובדים ב-Multithreading או ב-Multiprocessing, אז מה קורה אם Process אחד לוקח משאבים מ-Process אחר ואיך מונעים את זה.

וכל העולם של ההקצאות הדינמיות. זה עולם ומלואו. מי שיעשה על זה Double Click, היעילות של הדבר הזה ואיך ניגשים באמת לבעיה שאתה לא יודע מראש כמה משאבים להקצות לה. כי כשאנחנו מגדירים מראש ומציגים, עושים Declaration לכל ה-typing, אז המחשב יודע מראש כמה משאבים ואיזה כתובות לשמור לו. ואם אנחנו לא יודעים, אנחנו צריכים לעשות הקצאות דינמיות, שזה מאוד קריטי ליעילות ולזמן ריצה גם ב-Real-time וגם באפליקציות שאנחנו נריץ אותן.

ונראה לי שגולת הכותרת ש-++C נגיד שונה בזה בתכלית מ-C, זו האופציה לתכנת ב-Object-Oriented. זו פרדיגמה מאוד מודרנית ומאוד יעילה לפיתוח. Apple מאוד אוהבים להשתמש בה, בגלל זה יש להם את ה-Objective-C שלהם. וזה עולם ומלואו של איך לתכנת נכון ב-Object-Oriented. זה מאוד יעיל, זה מאוד נוח. לדעתי זה גם קצת Straightforward לפילוסופיה של למה בכלל הגיעו לללעבוד עם זה. אבל צריך להיכנס וללמוד את זה וליישם את זה. זה לא כמו שאנחנו עושים באמת ב-Arduino שזה תכנות כפונקציונליות, כ-If, Else ולולאות וזהו, אלא משהו קצת יותר מתקדם ועמוק.

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

וככל שנתקדם, נוסיף פה 9 ו-10 ו-11, ונלמד עוד ועוד דברים.

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

ב-26 אנחנו מתחילים את ההרצאה הראשונה, 28, אחרי זה ב-2, 4, 9, 11, 16 ו-18. נפגש לשעתיים ב-Zoom.

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

מיכאל, אתה רוצה להסביר קצת על צורת הפיתוח, איך הקורס הולך להתנהל מבחינת ה-Hands-on ותוכנות ודברים כאלה?

## סביבת עבודה ופיתוח

בהחלט, בהחלט.

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

היא נקראת Code::Blocks. נתקין אותה, נבדוק אותה.

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

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

ונגיע ממש רחוק. אני די מאמין בזה.

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

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

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