מה הסיפור הזה של Design Patterns, והאם הן רלוונטיות גם לתכנות Low-level מהסוג שמקובל בעולם המיקרו-בקרים? הנה סקירה קצרצרה של הספר Game Programming Patterns, ומחשבות שעלו בעקבותיו.
כשקוראים ומדברים מספיק על תכנות, במוקדם או במאוחר שומעים על הנושא של Design patterns: הספר המפורסם מאוד שיצא לאור בשנת 1994, ואינספור הפיתוחים, המאמרים והספרים שהופיעו בעקבותיו. אף על פי ששמעתי על הנושא כבר מזמן, לא התעמקתי בו וגם לא ממש הצלחתי להבין מה הרעיון: הטקסטים שהתחלתי לקרוא נראו לי תמיד מופשטים מדי או טריוויאליים מדי.
לאחרונה, בעקבות המלצות, קניתי וקראתי את הספר Game Programming Patterns מאת רוברט נייסטרום. לא שאני מתכנן לכתוב משחקי מחשב מודרניים, אך לפחות בעיקרון יש חפיפה מסוימת בין האילוצים בכתיבת משחק ובכתיבת קוד אמבדד. המחבר מכיר מבפנים את עולם תכנות המשחקים, וכל הדוגמאות וסיפורי "מורשת הקרב" בספר הם מהתחום הזה – אם כי הוא לא נכנס לפרטים טכניים או לקוד של שום משחק ספציפי. יש הרבה קטעי קוד בשפת C++, וצריך היכרות מינימלית עם השפה כדי להבין אותם, אך הם נכתבו כדוגמאות פשטניות מאוד להמחשה בלבד. משחק לא ייצא לכם מזה.
אז מה זה בעצם Design pattern? בסופו של דבר, אחרי שמקלפים את כל המילים הגבוהות, מה שנשאר זה "כלי קוד גנריים". לא מדובר כאן על איך לבנות את התוכנה השלמה (זה תחום של הנדסת תוכנה), ולא על דרכים ספציפיות לכתוב את הקוד (מה שיהיה קרוב יותר ל"אלגוריתמים"). אם נדמיין לרגע שבמקום לדבר על תוכנה אנחנו מדברים על כלי תחבורה, אז דוגמאות ל-patterns הן משהו כמו "גלגל", או "מנוע בעירה פנימית": מין קונספט כללי שימושי, אופציה שאפשר להיעזר בה כדי להשיג את מה שאנחנו רוצים, אבל היא רק חלק מהתוצאה הסופית, וגם אינה מפורטת מספיק כדי שנשתמש בה כמו שהיא – יש הרבה פרטים שנצטרך להשלים לבד. להמחשה נוספת, אם נחשוב על תקשורת מילולית בין בני אדם, אז יכולות להיות patterns כמו "נאום חוצב-להבות", "משפט פתיחה" או "שיחת חולין ('סמול-טוק')": שוב, כלים שכדאי להכיר ושיכולים לקדם אותנו למטרות שונות, אבל את התוכן הספציפי שמתאים לסיטואציה נצטרך ליצור בעצמנו.
אחרי שהגעתי לתובנה הזו, בעקבות תחילת הקריאה בספר, הבנתי גם למה לא הבנתי את זה עד עכשיו. הסיבה היא כפולה. ראשית, מפני שמאז ומתמיד השתמשתי בכלים גנריים כאלה בקוד, רק לא ידעתי שיש להם שם. למדתי אותם לאט-לאט לאורך שנים, כחלק מהתכנות ה"רגיל", ואילו כשקראתי על design patterns ציפיתי תמיד שיגלו לי משהו חדש ושונה. שנית, אנשים רבים קפצו על העגלה ואימצו את הקונספט הפופולרי הזה כדי לתאר, אולי אפילו להמציא, עוד ועוד patterns מכל סוג ומין, באופן שעירפל ודילל את המשמעות והתועלת של הרעיון כולו. מחלקה שיש לה רק instance אחד? זה pattern. באפר? pattern. תזמון משימות בשיטת round robin? לינוקס. אה… pattern. (לא חשוב, מי שהבין הבין).
לנוכח הג'ונגל הזה, הספר של נייסטרום עושה עבודה מצוינת. בכתיבה קולחת ולא מעיקה הוא מתמקד בתחום אחד, מציג מספר מצומצם של patterns רלוונטיות שהוא מכיר מניסיונו האישי, ומה שהכי חשוב – נותן רקע לכל אחת, הסבר, דוגמה, שרטוטים ברורים להמחשה וגם פירוט של יתרונות וחסרונות של השימוש בכל pattern במצבים שונים.
האם זה ספר שיועיל גם למפתחי אמבדד? פה זה מתחיל להיות מורכב. חלק מה-patterns בספר נועדו להתמודד עם מורכבויות בקני מידה נדירים בעולם שלנו, ואחרות קשורות באופן הדוק מדי לתכנות מונחה-עצמים, לשפות עם Garbage Collection ולהקצאות דינמיות, שגם הם לא תמיד רלוונטיים לנו. צריך להשקיע המון מחשבה ודמיון כדי לחבר חלק מהדברים שכתובים שם לתוכניות שרצות על ארדואינו, למשל. מהבחינה הזו, אם אתם מחפשים Design patterns ממוקדות לאמבדד, הספר של אליסיה ווייט עדיף.
אבל אם אתם עוסקים בפיתוח על פלטפורמות מורכבות יותר, כגון אמבדד לינוקס, וצריכים להתמודד עם אילוצים משמעותיים של זיכרון, מהירות וזמן-אמיתי, ייתכן שתמצאו בספר הזה מידע שימושי או לפחות ריענון מועיל של הידע. ואם אתם מפתחים משחקים, אז בכלל.
הייתי שם כאן פרטים לרכישה של הספר, אבל אם נוח לכם לקרוא ממסך, אתם יכולים פשוט לראות את הספר המלא אונליין. שם יש גם קישור לדרכים שונות להשיג עותק מודפס.