12 בספטמבר 2019

טיפים לבחינה בקורס מבוא למדעי המחשב ושפת Java של האוניברסיטה הפתוחה

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

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


כמה מילים מראש


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

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

שנית, אני רוצה להסיר אחריות.

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

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

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

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


מאיפה מתחילים ?


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

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

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

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

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


מאיפה משיגים בחינות?


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


כמה בחינות לפתור ?


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

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


באילו שאלות להתמקד בהכנה ?


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

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


איך מחלקים את הזמן בין השאלות בבחינה ? 


אין לזה תשובה נכונה או לא נכונה. אצל כל אחד זה שונה.

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

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

להלן ההצעה שלי:

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

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

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

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

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

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

החישוב שלי היה כזה: 

בבחינה חמש שאלות. 
מתוך 90 אחוז מהזמן של הבחינה (להשאיר זמן לפאדיחות) שזה 160 דקות, אני מחלק 60 אחוז מהזמן לחלק השני ו-40 אחוז לחלק הראשון. זה נותן 32 דקות לכל שאלה.

יש כאלה שעושים דווקא הפוך ומחלקים 60 אחוז לחלק הראשון ו-40 אחוז לחלק השני. 

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

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


עכשיו אתייחס לשאלות לפי נושאים:

שאלת רקורסיה


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

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

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

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

שאלה ביעילות


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

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

להלן הניחושים המושכלים שלי:

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

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

אם אין מנוס ומעבר ליניארי לא מספיק כנראה שצריך מיון ואז הפתרון יהיה n log n.

אם אין לכם מושג מה רוצים מכם, כיתבו פתרון Brute Force. גם אם זה n בשלישית. זה עדיין פתרון. אל תשכחו לכתוב יעילות מקום וזמן. זה כנראה ייתן לכם 10 נקודות שזה יותר טוב מ-0.


שאלה בירושה


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

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

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


שאלה ברשימות מקושרות


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

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

שאלה בעצים


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

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

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

לרוב מדובר בעצים בינאריים והשאלה מחזירה או ספירה / סכום של ערך התאים בעץ או גובה העץ וכדו'

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

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


עכשיו נדבר על סט הכלים שעזר לי להתכונן לבחינה:


קורס Backtracking and Recursion

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


קורס מבוא למדעי המחשב ושפת Java - שי תבור

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

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

החלק החשוב הוא החלק על רקורסיה ויעילות וכמובן הפרק על שאלות מהבחינה.

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

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

כרגע, יש אפשרות לצפות בהקלטות של הוובינרים האלה, להלן הלינקים:

שאלות חזרה ברקורסיה

שאלות חזרה ביעילות

שאלות חזרה בירושה, פולימורפיזם, עצים ורשימות


IntelliJ

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

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

בכל מקרה, את התשובות לשאלות של המבחן, אני תמיד כותב על נייר, מריץ בראש ובסוף מעתיק ל-IDE ואז בודק כמה הייתי קרוב.

הערה: אם אתם מגישים איתו ממ"נים - שימו לב שהוא מוסיף תמיד לכל קובץ את השורה package בהתחלה. זה לא נתמך ב-IDE של הקורס ויש להוריד אותה. בכל מקרה, לפני שליחה אני ממליץ להריץ את הקוד שוב על ה-IDE של הקורס ולוודא שהוא עובד.


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

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

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

אם מישהו מעונין לתרום קוד, תשאירו לי הערה, אני אפתח לו הרשאות.


זהו בינתיים,
מקווה שעזרתי לעשות קצת סדר.

שיהיה לכולכם בהצלחה !

2 תגובות: