1 vs 100 הוא חידון חי לאולם הרצאות: אדם אחד על הבמה מול הקהל בטלפונים, כולם עונים על אותה שאלה מול אותו שעון.
בפעם הראשונה שהוא רץ באירוע אמיתי של הפקולטה, סגן הדיקן היה The One. בערך 45 סטודנטים נכנסו למשחק. שאר האולם החזיק טלפונים שהציגו כל שאלה ולא הציעו אף כפתור ללחוץ עליו.
השרת היה בסדר. שום דבר לא נגמר לו הזיכרון, שום דבר לא חרג מהזמן. המשחק עשה בדיוק את מה שאמרתי לו לעשות.
איך חדר עובד
כל משחק הוא Durable Object אחד של Cloudflare, שהכתובת שלו היא הקוד בן שש הספרות שעל המקרן. כל טלפון באולם פותח WebSocket אל האובייקט הזה, והאובייקט הזה הוא המקום היחיד שבו המשחק קיים.
Durable Object מטפל באירוע אחד בכל פעם. אולם שלם שעונה באותה שנייה לא יכול לשבש את הניקוד, כי אין אף פעם חוט שני להתחרות בו. אין מנעולים בקוד, כי אין שם שום דבר שהם צריכים להגן עליו.
אין גם מסד נתונים משותף. החדר שומר את המצב שלו באחסון המובנה של האובייקט: השחקנים, הניקוד שלהם, השאלה שרצה עכשיו. זה מה שמאפשר לחדר לשרוד פינוי מהזיכרון ולהמשיך מאיפה שעצר. כשהמשחק נגמר, התראה מתוזמנת מוחקת את הנתונים של החדר. כל משחק הוא מסד נתונים קטן משלו, והוא חי בדיוק כמו המשחק.
תשובות מגיעות בפרצים, ולכן השידורים נאספים יחד, לכל היותר ארבעה בשנייה, במקום שידור לכל תשובה. חיבורים רדומים נכנסים לתרדמה ולא עולים כלום. הכול רץ על התוכנית החינמית של Cloudflare.
הכלל שהיה נכון על הנייר
במשחק יש סבבי הדחה. טועים בשאלה ויוצאים. אז כתבתי כלל שנראה מובן מאליו: מי שמצטרף אחרי שהמשחק התחיל, צופה. אי אפשר להיכנס לסבב הדחה באמצע ולטעון ששרדת שאלות שלא ראית.
בבדיקה, הכלל הזה אף פעם לא מופעל. כולם כבר בלובי כשלוחצים על התחל, כי אתה זה שמחליט מתי ללחוץ.
אולם הרצאות אמיתי לא עובד ככה. אנשים עוד נכנסים, עוד מחפשים את קוד ה־QR, עוד מקלידים שם, כשהמנחה מחליט שהאולם נראה מלא מספיק. המנחה לחץ על התחל עם בערך 45 אנשים בפנים. כל טלפון שסיים להצטרף שנייה אחר כך היה צופה, לכל אורך המשחק.
לתקן בזמן שהמשחק רץ
המשכנו באירוע. מי שנתקע הועבר ידנית לסבב הבא, כדי שאף אחד לא יאבד את המקום שלו בגלל משהו שלא היה באשמתו.
בינתיים שיניתי את הכלל, והעליתי אותו לאוויר במהלך האירוע. בסבב שבו אי אפשר להיות מודח, מי שמאחר מצטרף מיד כשחקן מלא. בסבב הדחה הוא צופה בשאלה הנוכחית ונכנס חי מהשאלה הבאה, כך שאף אחד לא מודח בגלל שאלה שלא ראה. הדבר היחיד שמשאיר מישהו בחוץ לתמיד הוא הדחה אמיתית.
החלק שאני הכי שמח עליו: מי שכבר נתקע כצופה לא היה צריך לעשות כלום. כשהשאלה הבאה התחילה, השרת החזיר אותו פנימה. עד הסבב שאחריו, רוב האולם שיחק.
שני השחקנים שהודחו
שני שחקנים הודחו בלי שהיו צריכים להיות מודחים, ועד סוף האירוע לא ידעתי למה.
התברר שזה בכלל לא היה השרת. שניהם עברו לכרטיסייה אחרת באמצע המשחק. כשחזרו, הטלפון טען את הדף מחדש, ובסבב הדחה זה עלה להם במקום.
זה החצי השני של אותו שיעור. טלפון הוא לא דפדפן של בדיקות. הוא משהה כרטיסיות שהוא לא מציג, טוען אותן מחדש כשהוא רוצה את הזיכרון בחזרה, ואף אחד באולם הרצאות לא משאיר כרטיסייה אחת פתוחה במשך שעה.
מה לקחתי מזה
הארכיטקטורה החזיקה. אובייקט אחד לכל חדר, בלי מצב משותף, חוט אחד: שום דבר מזה לא היה הבעיה, ושום דבר מזה לא היה צריך להשתנות.
מה שנכשל הוא הנחה לגבי אנשים. תרגול הוא לא הדבר האמיתי, וההבדל אף פעם לא נמצא בחלקים שבדקת. הוא נמצא בתור בכניסה, ובכרטיסייה שמישהו עבר ממנה.