האם שפת סי עדיין רלוונטית?

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

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

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

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

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

vinney

Well-known member
את שואלת על C או על CPP? אלה שפות שונות.

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

CPP לעומת זאת חיה ובועטת, זאת השפה. CPP מאפשרת כתיבה בכל רובד, החל מהembedded בלי OS, וכלה בכתיבת UIים מורכבים. אין משהו ש״אי אפשר״ לעשות טוב עם CPP, אם כי להרבה דברים יש שפות יותר ייעודיות שמאפשרות לעשות דברים ביתר קלות.

גילוי נאות: אני כותב בC וCPP באופן כמעט בלעדי לאורך כל הקריירה שלי (חוץ מקצת VB ממש בהתחלה).
 
אם ככה, מהפרספקטיבה שלך היה מעניין אותי לשמוע:
1. מה אתה חושב לגבי אמירות לגבי זה שבטווח היותר רחוק cpp תידחק ממקומות מסויימים ע"י rust
2. מה דעתך על הכיוון שהשפה מתפתחת אליו בשנים האחרונות (נניח מאז cpp17 או 14)? בתור מישהו שכמעט לא נגע בה ב3-4 שנים האחרונות זה נראה לי כאילו מוסיפים עוד ועוד אופציות במקום לטפל בנושאים כמו בילד יותר פשוט או ניהול חבילות.
 
אם ככה, מהפרספקטיבה שלך היה מעניין אותי לשמוע:
1. מה אתה חושב לגבי אמירות לגבי זה שבטווח היותר רחוק cpp תידחק ממקומות מסויימים ע"י rust
2. מה דעתך על הכיוון שהשפה מתפתחת אליו בשנים האחרונות (נניח מאז cpp17 או 14)? בתור מישהו שכמעט לא נגע בה ב3-4 שנים האחרונות זה נראה לי כאילו מוסיפים עוד ועוד אופציות במקום לטפל בנושאים כמו בילד יותר פשוט או ניהול חבילות.
1. קשה לי להאמין שזה יקרה. יש ל-Rust לא מעט חסרונות שיבלטו יותר ויותר ככל שיכתבו בה פרויקטים גדולים ומשמעותיים. אני בצד שמאמין שספ"פ תמשיך להישאר רלוונטית, בפרט אם אכן יחולו מספר שינויים גם מבחינת הבטיחות.
2. צריך להפריד בין העבודה של ועדת הסטנדרט של השפה לבין יצרני הקומפיילרים. לוועדת הסטנדרט אין ממש מנדט לקבוע דברים לגבי ניהול חבילות. היא מגדירה שפת תכנות בשפה כמעט משפטית. יצרני קומפיילרים משפרים מאוד את ההתנהגות במקביל, והתחרות בתחום עוזרת לכולם (למשל, הכניסה של clang בשחקן חדש לפני קצת יותר מ-10 שנים הקפיצה מאוד את תחום הודעות השגיאה ועוד). לגבי בילד - CMake, Meson ו-Bazel הם הכלים המודרניים (כן, CMake מודרנית, לא גרסה 2.8) שצוברים פופולריות רבה. בתחום ניהול החבילות, בלינוקס הניהול גם ככה מובנה. במקומות אחרים - Conan ו-vcpkg צוברים תאוצה. חלק מהבעיה היא שבמקרים רבים אנשים לא מודעים בכלל לשינויים ולשיפורים בתחום ועובדים "כמו שעשינו ב-48, אין יותר טוב מזה", ואז מתלוננים שב-C#/JS וכו' הכול קל יותר.
 
לגבי מה שכתבת בסוף, אני זוכר הרצאה של Herb Sutter מלפני עשור בערך שבה הוא מדבר על זה שאחד החסרונות של Cpp ביחס לשפות אחרות ומה שהכי חסר למפתחים זה אקוסיסטם של כלים וספריות ולא עוד פיצ'רים בשפה. אמנם אני כבר כמה שנים בקושי נוגע בשפה אבל נראה שמאז, קצת ספריות נכנסו כסטנדרט פנימה, אבל בעיקר התווספו כל מני פיצ'רים לשפה (והרב עצמו משחק עם דברים כמו ccp2 וcppfront כשאחת המטרות המוצהרות זה להגדיל את הtooling אקוסיסטם)
 

Nuke1985

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

שמעתי טענות דיי גרנדיוזיות על השפה (משהו כמו זמן פיתוח יורד בחצי), ניסיתה את השפה? , היא כבר כמה שנים רצוף נבחרת בתור השפה הכי אהובה בסקר של stack overflow.
לגבי בילד - CMake, Meson ו-Bazel הם הכלים המודרניים (כן, CMake מודרנית, לא גרסה 2.8)

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

בלינוקס הניהול גם ככה מובנה. במקומות אחרים - Conan ו-vcpkg צוברים תאוצה. חלק מהבעיה היא שבמקרים רבים אנשים לא מודעים בכלל לשינויים ולשיפורים בתחום ועובדים "כמו שעשינו ב-48, אין יותר טוב מזה", ואז מתלוננים שב-C#/JS וכו' הכול קל יותר.

הרעיון של מנהל חבילות לשפה ספציפית לא נשמע לי טוב במיוחד , כלים כמו nix וguix נשמעים כמו אלטרנטיבה טובה (אני בינתיים רק צרכן של חבילות, לא ייצא לי לייצר חבילה), המאמר הזה מציג כמה מהיתרונות של nix.
 
שמעתי טענות דיי גרנדיוזיות על השפה (משהו כמו זמן פיתוח יורד בחצי), ניסיתה את השפה? , היא כבר כמה שנים רצוף נבחרת בתור השפה הכי אהובה בסקר של stack overflow.
הכול נכון, ועדיים כשזמני הקומפילציה ממריאים לשמים, וזה משהו אינהרנטי לדיזיין של השפה (לא משהו ששיפור של המימוש יכול למנוע), הניחוש שלי הוא שזה יהיה מחסום מהותי. אבל כמובן שזו רק ספקולציה שלי. לא לקחת את זה יותר מידי ברצינות :)

ממה שאני זוכר בתקופה שעבדתי בשפה , אם אתה משנה header אז זה דורש קימפול מחדש של כל הקבצים שמשתמשים בheader, אם זה משהו שבהרבה שימוש (לדוגמה מימוש של big int) זה יכול מאוד לסרבל את הפיתוח כי צריך לחכות מלא שהקומפילציה תסתיים, שמעתי שיש סטנדרט של modules אבל אני כבר לא משתמש בשפה ולא יודע אם זה איכשהו פותר את זה.
זה נכון, ומודולים משפרים רק במעט (הם מונעים קצת חלק מהמקרים שדורשים קימפול מחדש ובעיקר הם portable precompiled headers מה שמשפר זמני קומפילציה), אבל כאמור בראסט זה לא פחות גרוע (אולי יותר; נראה לי שגם שינוי לא בממשק דורש קומפילציה מחדש של כל המודול, בדומה ל-סי#, אבל פה זמני קומפילציה ארוכים, חלקם בגלל ה-borrow checker), אז מה עשינו?

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

Nuke1985

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

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

vinney

Well-known member
אם ככה, מהפרספקטיבה שלך היה מעניין אותי לשמוע:
1. מה אתה חושב לגבי אמירות לגבי זה שבטווח היותר רחוק cpp תידחק ממקומות מסויימים ע"י rust
הנבואה ניתנה לשוטים. Rust זה עוד נסיון לפתור את הבעיות של מתכנתים לא הכי טובים בCPP, אבל זה בא על חשבון משהו. יכול להיות שrust תתפוס נישה, כמו שjava תפסה, ויכול להיות שנשכח ממנה כמו ששכחו מada.
2. מה דעתך על הכיוון שהשפה מתפתחת אליו בשנים האחרונות (נניח מאז cpp17 או 14)? בתור מישהו שכמעט לא נגע בה ב3-4 שנים האחרונות זה נראה לי כאילו מוסיפים עוד ועוד אופציות במקום לטפל בנושאים כמו בילד יותר פשוט או ניהול חבילות.
האופציות שה14 וה17 הוסיפו היו קיימות בהרבה צורות לא מתוקננות כבר שנים. התקנים האלה פשוט תיקננו בצורה אחידה את הגלגלים שהרבה אנשים המציאו מחדש בנפרד. בינתיים אני אישית לא רואה בעיות מיוחדות לא עם בילד ולא עם ניהול חבילות, למה בילד צריך להיות חלק מתקן השפה?
 

AnarchistPhilosopher

Well-known member
הנבואה ניתנה לשוטים. Rust זה עוד נסיון לפתור את הבעיות של מתכנתים לא הכי טובים בCPP, אבל זה בא על חשבון משהו. יכול להיות שrust תתפוס נישה, כמו שjava תפסה, ויכול להיות שנשכח ממנה כמו ששכחו מada.

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

vinney

Well-known member
לא, זה סימן שלמדתי באוניברסיטה הפתוחה :ROFLMAO: לא נתקלתי באף איזכור של עדה בתעשיה בכל שנות הקריירה שלי, רק בספרי היסטוריה.
 

AnarchistPhilosopher

Well-known member
לא, זה סימן שלמדתי באוניברסיטה הפתוחה :ROFLMAO: לא נתקלתי באף איזכור של עדה בתעשיה בכל שנות הקריירה שלי, רק בספרי היסטוריה.
ואני שמעתי על brainfuck מ-stackoverflow אז?!
מעניין לבנות קורס על brainfuck... אם פעם באת"א לימדו על scheme אין סיבה שלא.
 
את שואלת על C או על CPP? אלה שפות שונות.

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

CPP לעומת זאת חיה ובועטת, זאת השפה. CPP מאפשרת כתיבה בכל רובד, החל מהembedded בלי OS, וכלה בכתיבת UIים מורכבים. אין משהו ש״אי אפשר״ לעשות טוב עם CPP, אם כי להרבה דברים יש שפות יותר ייעודיות שמאפשרות לעשות דברים ביתר קלות.

גילוי נאות: אני כותב בC וCPP באופן כמעט בלעדי לאורך כל הקריירה שלי (חוץ מקצת VB ממש בהתחלה).
השאלה שלי היתה ספציפית לגבי שפת סי - משהו שקיםי בשוק אבל נדיר, ומאוד חששתי לעבוד בחברה שהקוד בייס שלה הוא עדיין בגדול שפת סי, כי הפער בינה לבין שפות מודרניות יותר הוא גדול משמעותית מזה של cpp
 

פולגאר

Well-known member
את שואלת על C או על CPP? אלה שפות שונות.

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

CPP לעומת זאת חיה ובועטת, זאת השפה. CPP מאפשרת כתיבה בכל רובד, החל מהembedded בלי OS, וכלה בכתיבת UIים מורכבים. אין משהו ש״אי אפשר״ לעשות טוב עם CPP, אם כי להרבה דברים יש שפות יותר ייעודיות שמאפשרות לעשות דברים ביתר קלות.

גילוי נאות: אני כותב בC וCPP באופן כמעט בלעדי לאורך כל הקריירה שלי (חוץ מקצת VB ממש בהתחלה).
ב-RT עדיין יש מקומות שמעדיפים C על פני CPP כי זאת שפה יותר מהירה כי אין בה את כל העצמים.
 

vinney

Well-known member
ב-RT עדיין יש מקומות שמעדיפים C על פני CPP כי זאת שפה יותר מהירה כי אין בה את כל העצמים.
אין בה את כל... מה? כמו שאמרתי לבראבו, אין משהו שאפשר לעשות בC ואי אפשר לעשות בCPP באותה צורה. כך שלא, C לא ״יותר מהירה״ (מה זה בכלל אמור להביע?).

יש הרבה מקומות שעדיין כותבים בC מתוך הרגל, או כי יש להם מלא קוד legacy שאף אחד לא הולך לשכתב, אבל זה לא כי יש איזשהי מגבלה עם CPP שאפשר לפתור רק עם C.
 

vinney

Well-known member
עד כמה עבודה בנישות כמו שפת סי יכולה להיות מועילה או פוגעת מבחינה מקצועית? האם השפה עצמה חשובה (במיוחד אם יש ניסיון מקביל בשפות אחרות ומודרניות יותר), או שהניסיון עצמו גם חשוב? או אולי גם וגם?
לגבי החלק השני - הנסיון עצמו הרבה יותר חשוב מהשפה. ללמוד שפה זה לא קשה. במיוחד כשעוברים משפה ישירה כמו CPP לשפה מנוהלת כמו Java או פייתון (בכיוון ההפוך זה יותר קשה). הנסיון בCPP מאפשר לך להיות הרבה יותר וורסטילית, בעיניי, כי זה מאפשר לך הכרות הרבה יותר מעמיקה עם איך שהמחשב עובד ואיך שהקומפיילרים עובדים.
 
איך ניסיון בשפה שהיא הלינגואה פרנקה של התחום יכול לפגוע?
יש תחומים שלמים בהם סי וספ"פ שולטות, גם אם הם לא בהכרח מאגניבים כמו אזורי פיתוח האפליקציות וה-web למיניהם

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

(גילוי נאות: fanboy של ספ"פ. הדעה שלי לגמרי משוחדת, אל תקשיבי לי.)
השאלה שלי היתה פחות על C++ אלא על סי עצמה.ספ״פ נהדרת בעיני בעיקר אחרי שחידשו אותה החל מ2011
 
השאלה שלי היתה פחות על C++ אלא על סי עצמה.ספ״פ נהדרת בעיני בעיקר אחרי שחידשו אותה החל מ2011
למרות הלייק שלי ל-vinney, ולמרות שאני מסכים איתו שזו טעות לעבוד בסי במקום בספ"פ, אני לא מסכים עם האמירה שסי שפה מתה. יש לא מעט פרויקטים שעדיין נכתבים בה כשצריך פורטביליות מלאה כולל למעבדי אמבדד נישתיים למיניהם שאין עבורם קומפיילר ספ"פ, יש לא מעט קוד קיים, וכמובן הקרנל של לינוקס הוא דוגמה חיה ובועטת. וכמו ש-vinney אמר, אם את יודעת היטב סי, תסתדרי מצוין בכל שפה אחרי לימוד קצר של היכולות ושיטות העבודה, ותביני טוב יותר מהקולגות שלך מה קורה שם.
בעיניי, ההחלטה לגבי המשרה הספציפית תלויה באמת במקצועיות שם, ברמת העניין, והאם זה יתרום לך ניסיון משמעותי.
 
למעלה