צורת הגישה לתרגיל

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

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

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

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

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

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

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

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

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

זהו בגדול, עכשיו תורכם אם תרצו

6 לייקים

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

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

8 לייקים

כל מה שאמרה אורפז.
כמה דברים שאני תמיד משתדל לשים לב אליהם כשאני כותב:

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

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

  3. שאלות מבני נתונים - משתדל לחשוב איזה תכונות של מבני הנתונים ‘הבסיסיים’ שלמדנו מתאימות למבנה המורכב יותר שנדרש לבנות בשאלה, כדי להבין מה מייצג אותו טוב יותר. תהליך החשיבה שלי למשל בשאלת האוטומטים משבוע 4: מהו מצב התחלתי? יש מצב התחלתי לכל אוטומט - ז"א יש תווית שלו שנקראת “מצב התחלתי”, אוקי, ומה הערך של המצב ההתחלתי הזה? משתנה מאוטומט לאוטומט, לפעמים הוא מספר, לפעמים הוא אות, לפעמים הוא שילוב של השניים, אז נשמע שכדאי שאשתמש במחרוזת כדי לייצג מה זה מצב התחלתי באוטומט ספציפי, ולחבר אותו כערך לתווית שנקראת “מצב התחלתי”, סבבה זה אומר שאני צריך להשתמש במילון! הלאה, מה אני יכול לומר לגבי שאר המרכיבים של אוטומט כללי? יש לו גם מצבים סופיים, גם כאן אני יכול להדביק תווית של “מצבים סופיים” והערך שיתאים לה צריך להיות טיפוס נתונים שיכול להכיל כמה ערכים, איזה טיפוס נתונים יכול לעזור לי בזה? … האם יש קשר של סדר בין “מצב התחלתי” ל-“מצבים סופיים”? כמובן מצב התחלתי צריך לקרות לפני סופי, אבל האם זה משפיע איכשהו על הצורה שאני שומר אותם במבנה או שזה בעצם יותר רלבנטי לאופן שבו צריך להריץ קלט על האוטומט שלי?..
    שאלות מנחות כאלה עוזרות לי לגשר על התהום הזו של בעיה שעלולה להיות ערטילאית בהתחלה לבין כלים קונקרטיים שיעזרו לי לגרום לה לקרום עור וגידים.

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

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

5 לייקים

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

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

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

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

4 לייקים

מצטרפת. אני מגדירה את עצמי ללא ניסיון - בתואר ראשון עשיתי קורס פורטרן כחובה לתואר, ובשבוע 2 בערך מיצינו את כל הרקע שהיה לי. עם זאת, יש לי רקע בהנדסה ואני מגדירה את עצמי כניסיונאית, ואני חושבת שהניסיון שצברתי בתחומים האלו עוזר גם כאן, לפחות בדרך מחשבה על הדברים. כל הדרכים שצוינו לעיל מעולות בעיני, וגם אני עושה דברים דומים. דרור - אני לגמרי איתך בקומפריהנשיין (בכלל, כשראיתי את זה השבוע בפעם הראשונה לא הבנתי למה קוראים לזה כך, נון-קומפרנדה הרבה יותר מתאר את איך שאני מרגישה כלפיהן), וגם אני עשיתי לולאות השבוע שאח’כ המרתי, מקווה שיעזור לי בהמשך להשתמש בקומפריהנשיין. חוץ מזה, אני בכלל לא חושבת שאני זריזה בפתרונות. יש לי עבודה וילדים (שעדיין בבית) ואני חייבת לתחום ולתכנן את הזמן שאני משקיעה בקורס, ואני לקחתי את העצה של מחברת ביום מאוד ברצינות (תגובות בפורום אני יכולה גם מהטלפון כשאני עם הילדים וזה המקור לפעילות שלי בפורום)
אני מאוד אוהבת לצייר ולכתוב על נייר, ומשתמשת בזה גם לפתרון תרגילים כאן.
כמו שאמרתי, אני ניסיונאית: אני גם פשוט מנסה הרבה - גם במחברת, במהלך ההסברים (עוד לפני התרגילים) אני מוצאת את עצמי חושבת: "הממ… מה היה קורה אם הייתי כותבת &₪-#±$_#& במקום ? " ואז אני פשוט כותבת את זה ורואה מה קורה. גם בתרגילים אני עושה את אותו הדבר, וגם מול הבודק האוטומטי. בגלל זה אני גם מריצה הרבה שורות של print (לפני ואחרי, כמו שאמרו לפני) ובהחלט בודקת כל חלק של הקוד שעובד, וכל פעם עושה שינוי אחד ובודקת מה קורה. בנוסף אני גם מנסה להכניס לעצמי בדיקות אוטומטיות מדי פעם בקוד (או כשאפשר או רלוונטי), כמו:

If function(var) == (desired result):
print(woohoo!)
else:
print(try again!)

וכאלו. אני די משקיעה בהדפסות במהלך כתיבת הקוד, ומוצאת שלעיתים קרובות אני צריכה להוסיף בהדפסה יותר פירוט על מאיפה היא מגיעה כדי לא להתבלבל (שורה של this is …), לפני ההגשה אני מוחקת את כל השורות האלו.

3 לייקים

שלום דרור,
לי מאוד עוזר לוודא שאני מבין את השאלה ומה רוצים ממני בעצם. אם לא מבינים את זה אז מאוד קשה לפתור את התרגיל ולהגיע לתשובה הרצויה.
לאחר מכן אני קורא שוב את השאלה מהתחלה אבל הפעם עוצר בכל פעם שיש משימה/הוראה שלמה ומתחיל לכתוב קוד לפי ההוראה…
לדוגמא: כתבו פונקציה ש…
אז אני כותב def ושם של הפונקציה
אולי תתפלא לשמוע אבל התרגילים כתובים פה בסדר מופתי גם מבחינת דרגת קושי שמתחיל מהקל לקשה גם מבחינת אורך קוד אבל הכי חשוב מבחינת סדר הדברים שיש לבצע בכל שאלה.
לדוגמא אחרי שרשום כתוב פונקציה כתוב אילו משתנים היא מקבלת בסדר המתאים ולא צריך להתחיל לשבור את הראש באיזה סדר לסדר את המשתנים ואחרי זה תמיד רשום מה היא צריכה להחזיר
אז כבר יש את המבנה של def fun(משתנים):

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

גילוי נאות
אני מאוד אוהב לקצר כתיבה (מה שגורם לקוד מסובך/קשה להבנה אבל עובד) כך שבסוף יוצא לי לא פעם שורה אחת של הגדרת הפונקציה ושורה נוספת של return… וזהו! הגעתי לסוף התרגיל…

האם זה טוב?! כנראה שלא… אבל זה הסגנון שלי

לייק 1

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

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