הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
איך אומרים "אמא" בבינארית?
שאלת שפת התכנות הראשונה היא אחת השאלות הטעונות ביותר. יש המון ויכוחים בנושא של אנשים שבאים מרקע שונה או בעלי ראיה שונה. כולם קצת צודקים וכולם קצת טועים. יש כאלה שימליצו על שפות דינאמיות כמו Python/Perl, יש כאלה שימליצו ללמוד C או אפילו Assembly, אוניברסיטאות רבות מתחילות מ־scheme וממשיכות ל־Java, יש כאלה שממליצים על Pascal שנבנתה במיוחד עבור המשימה. אני רוצה כאן להביע את דעתי מראיה של כ־15 שנים שעברו מאז נגעתי במחשב לראשונה וכתבתי תכנות פשוטות ב־Basic של ZX Spectrum.
אני התחלתי מ־Basic, אבל לא Basic של היום, כמו VB המונחה עצמים, אלא מאחד הישן והלא־טוב, שכלל רק פקודות GOTO ו־GOSUB, שבו אפילו לא היה מושג של משתנה לוקלי (חייב להגיד שהשפה הזו הייתה פשע נגד אנושות, אבל זה סיפור אחר). לאחר מכן, למדתי... Assembler של Z80 ותכנתי קצת ב"קודים" שהמרתי בעזרת טבלאות ארוכות. כן, המרת LD HL,10
ל־#21, #0A, #00 ואני זוכר את זה עד היום.
לאחר מכן, כשהייתה לי גישה למחשבי 80286, כתבתי תקופה מאוד ארוכה ב־Turbo Pascal עד שלמדתי C, שהייתה הרבה יותר חזקה מ־Pascal דאז. בתקופות שונות ומשונות היו לי נגיעות גם ב־C++ שהכרתי אותה בצורה שטחית.
בתקופה מאוחרת יותר יצא לי לכתוב גם ב־C++, גם לא מעט סקריפטים קטנים (ללא התעמקות) ב־Perl, התנסיתי ב־PHP ואפילו ב־Python לאחרונה (שהפך לשפת סקריפטים החביבה עלי). כתבתי לא מעט ב־Matlab, יצא לי לכתוב קוד גם ב־Java (או ליתר דיוק לתקן באגים) ומה שהרבה יותר חשוב, למדתי להבין את כוחה האמיתי של C++.
כיום אני יכול לכתוב קוד בחצי תרסיר של שפות: דינמיות, סטטיות, מקומפלות, משוערכות או gitים למיניהם. אני יכול לחשוב על כתיבה פרצדורליות/מודולרית וגם לחשוב במושגי OOP.
עכשיו, בראיה לאחור, אני מנסה לחשוב: "מהו הניסיון החשוב ביותר שרכשתי כשלמדתי את כל השפות המשונה והפחות משונות האלה? מהו הרכיב המרכזי שהשפיע על הבנת התכנה?" היום בעידן כתיבה OOP ובחשיבה של מחלקות, ממשקים, Design Patters מהו ההד שעדיין ממשיך להגיע אלי ולהשפיע עלי לטובה?" תאמינו או לא, זה Assembly של מעבד 8 ביטים Z80 שכל אוסף הקודים האפשריים לא כלל יותר מ־700 אפשרויות שונות.
כן, הידע שרכשתי בתחום כל־כך יסודי, עוזר לי וממשיך לעזור לי עד היום. ממשיך לספק לי את ההבנה של מה קורה בפועל כשאני מעביר מצביע למחלקה שירשתי ממנה או כיצד אני קורא לפונקציה וירטואלית.
הבנת יסודות מהם מורכב המחשב, זה מה שיכול להפוך את "מבצע משימות עבודה" למישהו ש"מבין באמת מה הוא עושה"...
אז, אם תשאלו אותי איזו שפה כדאי להתחיל ללמוד? אני אגיד:
השפה הראשונה חייבת להיות מאוד קלה ופשוטה מבחינת המושגים, כדי שאפילו ילד קטן יוכל להיכנס לעניינים במהירות. מצד שני, אסור לפשטוּת השפה לפגוע באבני יסוד של תכנות. לכן:
- Perl נופל על תבחיר זוועתי ומורכבות
- Java נופלת על מורכבות מיותרת למתחילים.
- Basic הישן על הרס דור תוכניתנים -- "להרוג אותו".
- C מורכבת מידי בתור שפה ראשונה.
- Scheme יותר מידי אקזוטית ולא שימושית בעליל.
הבחירות שלי הן:
- Python שפה פשוטה, חזקה ואלגנטית שכל ילד יכול לקחת ולהבין אותה בקלות.
- Pascal היא מאוד פשוטה, מצד שני נותנת אבני בנין טובים למי שמתחיל משפה מקומפלת.
אחרי שאדם התנסה מעט בתכנות, מבין מה זה משתנה, פונקציה, לולאה, אלגוריתם, מגיע הזמן להתחיל ללמוד יסודות: כיצד המחשב עובד באמת. פה הייתי מחלק את הלימודים לשני חלקים:
- לימודי מבנה מחשבים ושפות אסמבלי, אפילו אם הוא לעולם לא יכתוב באסמבלי יותר, זה חשוב להבין מה קורה מאחורי הקלעים, אדם חייב להיות מסוגל לקבל פלט אסמפלי של תכנה ולהבין מה קורה.
- לימוד של שפה שנותנת שליטה מלאה במה שקורה. כן, שפות JIT ושפות דינמיות נופלות באופן עיקרוני. אולי הן טובות לעבודה ומימושים שונים, הם לא מתאימים ללימודים כי מסתירים יותר מידי דברים הכרחיים לבניית מתכנת טוב. כאן אני הייתי ממליץ על שתי שפות:
- C היא שפה מעולה ומאפשרת לרדת לפרטי הפרטים ומאפשרת להישאר גם ברמה "גבוהה" במידת הצורך.
- Pascal דומה ל־C מבחינה הזו, רק יותר פשוטה.
מה אסור לעשות:
- ללמוד שפות OOP וגם חשיבת OOP. מצטער, יש מספיק מה ללמוד לפני. חשוב להכיר גישות שונות. כמו במתמטיקה: יש חשבון, אינפי ויש תורות מורכבות יותר. צריך ללכת מהיסודות. לכן, Java ו־C++ נופלות בגדול.
- ללמד שפה מבוססת על GC. זה יגרום בסופו של דבר לבעיות הבנה בסיסיות שאני לפעמים נתקל אצל מתכנתים שלא מבינים את ההבדל בין מחסנית וערימה. לכן, שוב, Java ושפות דינמיות נופלות בגדול.
- אחרי שהמתכנת נולד, מבין מה הוא עושה הוא יכול להמקצע בתחומים שונים: ללמוד OOP, ללמוד שפות שונות כמו Java, C#, C++, Perl, PHP או Python שתשפרנה את היעילות שלו בצורה משמעותית, אבל זה, אחרי שיהיו לו יסודות ברורים שאותם הוא לא ישכח.
בניין בונים מהיסוד, מתמטיקה לומדים מחשבון, כך גם המתכנת נבנה מהבנה מה זה: אלגוריתם, ביט, בית, כתובת.
תגובות
שפת תכנות ראשונה? הממ... שאלה קשה.
אני חסיד גדול של פייתון, אני חושב שהיא שפה שמתאימה למגוון רחב מאוד של תפקידים ושהיא שפה שכיף לכתוב בה. אבל האם היא מתאימה כשפה ראשונה? פייתון מפספסת משהו בקלות שבה הדברים נכתבים, היא מעלימה מהמתכנת מורכבויות שונות. רוצה לגשת לאינטרנט? אין בעיה, import urllib2. רוצה לרחף באוויר? אין בעיה, import antigravity
אני חושב שהייתי ממליץ לילד או מישהו שאין לו touch לתכנות ללמוד פייתון כשפה ראשונה, כי כך הסיכויים שהוא לא יברח בבעתה גדולים יותר וגם אם הוא לא ימשיך הלאה בלימודים שלו, לפחות יהיה לו כלי אחד נוסף בעולם הדיגיטלי.
את התלמיד המבוגר יותר, שמגיע עם אותו ה touch (הסטודנט למדעי המחשב לדוגמא) הייתי מלמד שפה קצת יותר בסיסית בהתחלה - c או ++c לדוגמא, כך שהוא יצטרך להתמודד עם נושאים שיותר קרובים לברזלים כמו זיכרון.
אגב, השפה הראשונה שלימדו אותי באוניברסיטה הייתה Java.
קראתי את המאמר שלך ואני חייב להגיד שנהנתי מכול מילה, וכן לקחתי לצומת ליבי חלק גדול מהדברים שאמרת פה. באופן אישי השפה הראישונה שנגעתי בתחביר שלה (לא יודע אם זה נקרא לתכנת במונחים שלך) היית JavaScript, אני חייב להגיד שזה לא היה מחזה מלבב.
שפת התכנות הראשונה שלי היתה FORTRAN IV (!). אבל העולם אז היה שונה מהעולם של ימינו - מחשבים קיבלו אולמות משלהם וגם צוותות משרתים ("מפעילי מחשבים"), שפות תכנות פרימיטיביות (יחסית להיום), ספריות מעטות וחלשות, ועלות החומרה גברה על עלות פיתוח התוכנה.
בעולם של ימינו, לדעתי צריך ללמוד תכנות בסיסי - כלומר הפעלת פונקציות בסיסיות (כמו למשל "גרום לדפדפן להציג עמוד זה וזה"), משפטים מותנים (if ו-switch), לולאות. מבני נתונים בסיסיים (מערך ומערך אסוציאטיבי). לשם כך צריך לבחור בשפת scripting. פייתון זו בחירה טובה. אבל גם Scheme זו בחירה סבירה, בתנאי שסביבת העבודה תהיה עתירת ספריות.
ובמקביל - צריך לקבל מושג איך החומרה עובדת. כלומר ללמוד תכן לוגי, שפת מכונה, שפת Assembly, ומשם להגיע לשפת C ולמימוש של שפת scripting פשוטה. זה כמו שסטודנטים להנדסה צריכים ללמוד חדו"א ואלגברה לינארית כדי שיהיה להם בסיס למתמטיקה שהם ישתמשו בה אחר כך.
זה אחד הדברים שאני ממש מתנגד אליו בתוקף, לפי דעתי, ללמד Java בתור שפה ראשונה (או ליתר דיוק שניה אחרי scheme כפי שעושים בת"א) זה להרוס דור שלם של מתכנתים.
ארתיום, אל תתרגל לזה, אבל אני מסכים עם כל מילה שלך D:
בקשר לבייסיק הישן (השפה השנייה שלי ד"א, פסקל היתה השלישית), אני לא מאמין שאני הולך להגיד את זה, אבל בזכותה אני מצליח לכתוב Dialplan לאסטריסק. בגלל שהשפה של Dialplan מאוד מאוד בסיסית, ו"פשוטה" מידי מאשר כל השפות המסובכות, השפה שאני מכיר שהכי קרובה זה בייסיק הישן (ומהגעיל). ככה שגם לטעויות יש מקום בחיים ;)
אני לא מתכנת מי יודע מה גדול, אבל בכ"ז יש לי השגות על דבריך. אולי לילד (עד גיל 10-12) אפשר ללמד בשלב ראשון שפת סקריפטים - כדי שהוא יתרגל לחשוב במונחים של אלגוריתם (פירוק הבעיה לשלבים, תוך חשיבה מה קודם למה וכו'). אולם למבוגר, הייתי ממליץ לקפוץ ישר למים וללמוד c++. אמנם "צריך ללמוד גישות שונות" כדבריך, אך נראה לי שזה כדאי משום שזה כולל גם את ה"גישות השונות", וגם את היסודות שנלמדים ב C. במקביל, ואני מדגיש שבמקביל, צריך ללמוד על מבנה המחשב, וקצת על אסמבלי. כמו שאין קשר בין לימוד נהיגה ללימוד על חלקי הרכב ועקרונות הפעולה שלו, עכ"פ צריך לדעת קצת גם מהנושא השני (גם אם אתה לא מכונאי רכב). באותה מידה הדבר נכון גם במחשבים. ע"מ להתמקצע עליך ללמוד גם את עקרונות המחשב. אסבמלי נמצאת בכלל זה משום שבסופו של דבר כמעט ואין בה שימוש ישיר. לימוד מקביל נוסף, הנחוץ לפי דעתי להתמקצעות אמיתית, הוא לימוד יסודות האלקטרוניקה והמוליכים למחצה. זה נותן פתח להבנה רחבה של החומרה, וכיצד תכל'ס הביטים זורמים ומעובדים ב CPU.
אני מסכים לגבי הגישה שרואה נזקים בלימוד שפות מסוימות (לפחות בהתחלה). אולם הדבר נכון במידה רבה גם לגבי לימוד שפות סקריפטים בד"כ.
שאלה: מה הניסיון שלך ב־C++?
השפה הזו מאוד, אבל מאוד מורכבת. כדי לכתוב קוד טוב בשפה הזו צריך ללמוד הרבה, בנוסף, צריך להבין את הרקע בהרבה תחומים. C++ זו הבחירה הגרועה ביותר עבור שפה ראשונה (אולי אפילו גרוע מ־Java).
אני חושב שאמנם C++ היא שפה לא פשוטה למתחילים, אבל אחרי שמבינים אותה קל מאוד לעבור לשפות אחרות. נכון, בשיטה הזו קשה יותר להתחיל, אבל אחרי שעוברים את החלק הראשוני והקשה הכל נראה קל יותר. אני התחלתי עם C++ את הקורס הראשון במחשבים "מבוא למדעי המחשב" ואני חייב להודות שהרבה סטודנטים התקשו מאוד, אבל בחלק השני של הסמסטר הרוב הצליחו להשתלב והבינו את השפה בצורה טובה מאוד. בקורסים הבאים הכל נראה יותר קל לכולם והמאמץ הראשוני השתלם.
אולי. אבל תמיד אפשר לפרק את הלימוד לגורמים.
היתרון הוא שמצד אחד אתה יכול להיות מודע בדיוק למה שקורה מתחת ל"מכסה המנוע", ומצד שני אתה מקבל את כל העוצמה הטמונה בשפה הזאת.
לימוד שפות סקריפטים גורם לך לאבד את הקשר לברזלים. פסקל גם היא איננה בחירה טובה למטרה זו. C היא טובה מספיק מבחינה זו (לזה התכוונתי כשכתבתי שאפשר לפרק את הלימוד לגורמים - עם כל ההבדלים בין C ל C++), אך אם כבר הגענו לכאן למה לא ללמוד ישר C++ (בצורה שהצעתי)?
יצא לי לראות מתכנתי C/++ מגיעים לעולם הפסקל מונחה עצמים, ובאים בדרישות לעשות הרבה מאוד פעולות שלא באמת צריך לעשות אותן. ומרימים הבה מאוד וויכוחים למה פסקל לא מספיק טובה, עד שמגיע אדם כמוני או אחרים, ומראים לו איך עם גישה שונה אתה מקבל אותו הדבר, בלי להיות צריך בתוסף הלא הגיוני הזה.
או גישה של קוד שהיא ממש לא נכונה לכל שפה שהיא לא C או ++C.
העניין בללמוד שפות הוא לדעת להבדיל בחשיבה השונה שהן דורשות. אני יודע משהו כמו 20 שפות תכנות (חלקן מאוד ייעודיות כדוגמת ה Dialplan שהזכרתי למעלה). ולוקח לי זמן להיכנס לכל שפה ושפה (בגלל החשיבה). פסקל מספקת לך את כל הכלים ש C מספקת לך (לרדת לרמת אסמבלי, להחליט על ביטים, לעשות union ועוד), אבל היא מלמדת אותך להבין את החשיבות של הדברים. ב C אין לימוד של החשיבות למה צריך מצביע, אלא זה הכרח של השפה. למשל הבעיה הכי חמורה של C שנפתרה ב ++C (והידע שלי ב ++C מאוד מאוד בסיסי במקרה הטוב). ב C אתה לא יכול להחזיר ערך חדש לפרמטר שעבר לפונקציה. השימוש במצביע בשביל זה הוא hack וזהו. העניין הוא שהרבה שפות כן תומכות בזה (כולל ++C), אבל אם אתה לא תבין את הצורך בזה, אתה לא תכתוב את זה כמו שצריך בשפות אחרות. בגלל זה חשוב מאוד להשתמש בשפות שנועדו להסביר חשיבות וצורך מסויים בשימוש בכלים שהשפה מספקת.
בקשר ל"שפת סקריפטים" היא טובה להבנת המושגים של אלגוריתם, לולאות פונקציות. הבסיס של הבסיס בלי להתקל בבעיות בסיסיות כמו "כיצד להעתיק מחרוזת" או איך להקצות ולמחוק רכיבים.
מבחינה הזו Pascal היא גם בחירה טובה.
אחרי שיש הבנה בסיסית חובה ללכת על שפות רציניות כמו C או Pascal.
גבי C++. אני יכול להביא כמה קטעים קטנים שאולי יבהירו את הבעיות הבסיסיות שמתכנת מתחיל ייתקל בהם:
פוסט מעולה גרם לי לבחון כמה נושאים מחדש. אני עצמי די מתחיל ואני יכול להגיד שפיתון עזרה לי להבין הרבה מושגים חשובים. אבל אני אוסיף לפוסט שלא מספיק לבחור שפה טובה אלא צריך מקור טוב ללמוד ממנו ומקום טוב לקבלת תמיכה שלפחות במקרה שלי נמצא כלא פחות חשוב מהספרים והמדריכים (whatsup.co.il).
אם אתה כבר תלך על לימוד C אני הייתי ממליץ לך הספר הזה; ובנוסף להיזהר עם שימוש בפורום בצורה מוגזמת, כלומר אפשר לשאול אם אתה ממש לא מצליח להבין לבד. כי אפשר לאבד עוזרים בקלות אם שואלים שאלות שהתשובות עליהן נמצאות בכל מקום/ספר
כן זה ברור לי דיברתי על בצורה עקיפה בזכות מספר דיונים שנפתחו כמו הדיון זה http://whatsup.co.il/forum/44604
את הספר שהמלצת עליו קראתי ברובו (לא ממש התכוונתי להתעמק ב-C ולכן ויתרתי על ה-appendix של הספריה הסטנדרטית). ואני חושב שהוא באמת מעולה ואני אקרא אותו שוב כאשר אני אתחיל ללמוד C ברצינות אבל תודה בכל אופן.
לפני כמה שנים בבית הספר התחלתי לעבוד עם פסקל אני חושב שהיא שפה מאד טובה להתחלה. אני מתחיל ללמוד בקרוב מדעי המחשב וחשבתי לעצמי איפה הם יתחילו אני מאד אתאכזב אם זה יהיה java כי למרות שאני כמעט לא מכיר את השפה היות ולמדתי בעבר C אני הבנתי שjava היא שפה שאסור להתחיל איתה. המסלול שלי היה Pascal ואז C במקביל לאסמבלי. אני לא מכיר שפות תכנות רבות אך מה שלמדתי בעבר מאד עוזר לי אפילו היום השפות סקריפטינג למינהם. אני אומר שפסקל היא השפה שצריך להתחיל איתה - חזקה או לא - היא מאד טובה ללימוד - מה שC וjava לא מתאימים בהתחלה.
מישהו יכול להביא לי קישור ללמידת שפת סף(assembly)ובבקשה לשלוח לי את זה לאימייל?תודה.
ארתיום, אתה לא חושב שפסקל מיושנת מידי? או שבכדי להתחיל היא מספקת בסיס קל להבנה ומוצק? מה אם אני יתחיל ללמוד יש PHP או ASP?
אם כבר? ASP כבר מתה, או ליתר דיוק נהרגה ע"י MS. ו־PHP מיועדת לפיתוח אתרים ולא לדברים כלליים.
שפה כמו Pascal היא שפה כללית ולא קשורה לסוג פיתוח ספציפי, כך שבהחלט לא ASP ולא PHP מתאימות "להגיד אמא בבינארית"
הוסף תגובה:
חובה לאפשר JavaScript כדי להגיב.