به قلم علی بهجتی – عید سال ۹۷
در متن پیش رو سیری در جزییات تیم فنی نبرد هوش مصنوعی امسال(۹۷-۹۶) خواهیم داشت.
به صورت کلی، تیم فنی از شش تیم سایت، زیرساخت، طراحی بازی، گرافیک، سرور و کلاینت تشکیل شدهاست. تیمهای سایت و زیرساخت و طراحی بازی بلافاصله کارشان را (حدود ۱۰ آذر) شروع کردند. تیم گرافیک دنبال انتخاب پلتفرم مناسبت برای گرافیک بازی رفت و تیمهای سرور و کلاینت به انتظار نشستند تا تیم طراحی بازی، بازی را مشخص کند تا آغاز کارشان رقم بخورد. زمان تخمینی مشخص شدن بازی و شروع کار این دو تیم ۱۵ دی بود.
برای منظم شدن برنامهریزیها و زمانبندی و دقیقهآخری نشدن کار تیمها، خودمان را مقید به انتشار نسخههای آلفا و بتا کردیم. در نسخهی آلفا تیمها باید نسخهی اولیه محصولشان را منتشر کنند تا پس از آن به تست و دیباگ بپردازند و تصمیم گرفتیم که نسخه بتا، نسخهای نسبتا پایدار باشد و انتشارش عمومی باشد تا شرکتکنندگان به عنوان end-user آن را تست کنند و پس از آن انتشار نهایی را داشته باشیم. تاریخهای مشخص شده برای انتشار نسخه آلفا، بتا و نهایی به ترتیب ۲، ۱۴ و ۱۸ بهمن بود. ما با سختی و کمی تاخیر به این انتشارات رسیدیم؛ اما چون تاخیر داشتیم، نسخه بتا را به طور عمومی منتشر نکردیم. برای اینکه فرایند گزارش مشکلات توسط شرکتکنندهها و پیگیری آنها سریعتر و راحتتر شود، امسال این فرایند را به بخش مشکلات گیتهاب هر تیم بردیم. این کار خیلی تاثیر گذار بود؛ حتی در چند بخش، بعضی از شرکتکنندگان برای باگها پچ ارائه دادند تا با کد مرج کنیم. البته روند گزارش مشکل تا روزهای آخر غیرحضوری ادامه داشت و دلیلش این بود که اکثر شرکتکنندهها روزهای آخر مرحله غیر حضوری به صورت جدی مشغول کد زدن شده بودند.
از بزرگترین چالشهای تیم فنی، دانشجو بودن اعضاش هست. به دلیل مستمر و طولانی بودن فعالیتها، پروژه و امتحان و درس بچهها تاثیر کاملا مستقیمی روی وقت گذاشتن بچهها توی تیمهاشون داره و به هیچ شکل هم نمیشه بهشون گفت که درس نخونین!
در زیر توضیحی در مورد هر تیم و فعالیتهای امسال آنها و چالشهای پیش رویشان و پیش روی آیندگان را به شکل خلاصه مشاهده میکنید.
تیم طراحی بازی
این تیم باید با زدن ایدههای مختلف، بازیای که قلب و روح و جان مسابقه است را مشخص کند! امسال تصمیم گرفتیم که این تیم برای بازیهای پیشنهادیاش پروتوتایپ بزند و به صورت انسانگونه و ماشینگونه (هوش مصنوعی) جوانب مختلف بازی را بررسی کند و بهبود دهد و سپس پس از پخته شدن و چکش خوردن بازیها، بازی مسابقه را انتخاب کند. سپس همین روند پخته کردن و چکش زدن به بازی را ادامه دهند تا ویژگیها و پارامترهایشان دقیق مشخص شوند. این تیم علاوه بر مشخص کردن بازی، داستان و روح بازی را نیز باید انتخاب کند و طراحی نقشههای بازی، که باید بتواند جوانب مختلف استراتژیهای بازیکن را بسنجد، هم از وظایف اوست!
این تیم کارش را با برگزاری جلسهای گزینشی برای انتخاب بهتر اعضا آغاز کرد. سپس ۲ ایده بازی مطرح شد و بچهها شروع به زدن پروتوتایپ کردند و در جلسات جوانب مختلف ایدهها را بررسی کردند. یکی از پروتوتایپها با unity و دیگری با java زده شد و بعد از یک ماه حدود ۱۵ دی، بازی نهایی مشخص شد. در طی زمان با تستهای بیشتر جزییات بازی را دقیقتر کردند و داستان و داک مسابقه را آماده کردند و نقشهها را طراحی کردند. پس از مرحله غیر حضوری این تیم با بررسی بازیهای شرکتکنندهها پارامترها را تغییر و بهبود داد. این تیم از اینجهت که برای اولین بار برای انتخاب بازی و انتخاب ویژگیها و مشخص شدن پارامترها از پروتوتایپ استفاده کرد باعث شد که بازی خیلی کیفیت بالایی داشته باشد و پختگی محسوسی در آن مشاهده شود.
چالش اصلی این تیم به صورت کلی انتخاب قابلیتهای بازیکنان در بازی و متعادل کردن پارامترهای آنها هست تا تمامی جوانب در نظر گرفته شود و در بازی باگ منطقی یا ضعف استراتژی وجود نداشته باشد که شرکتکنندهای بتواند با استفاده از آن برتری خاصی پیدا کند. از چالشهای برای آینده، چگونه طراحی کردن نقشههایی است که همه جنبههای استراتژیهای مختلف را در بر بگیرند. همچنین چالش جذاب و سخت دیگر، طراحی بازی با این نگاه که قابلیت یادگیری ماشین در آنها راحتتر وجود داشته باشد است.
تیم کلاینت و سرور
وظیفه اصلی تیم سرور، پیاده سازی منطق بازی و سروری است که کلاینتها (مثل بازیکن عادی) با تعامل با آن بتوانند بازی کنند و از اتفاقات منطق بازی مطلع شوند. تیم کلاینت نیز باید رابطی برای ارتباط با سرور و ذخیره جزییات بازی در ساختاری مشخص پیادهسازی کند که شرکتکنندهها با استفاده از آن بتوانند کدهای هوش مصنوعی خود را به سادگی و بدون دغدغه از منطق بازی یا درگیر شدن با شبکه و تفسیر پیامهای سرور بزنند. این دو تیم علی رغم اینکه کارهای نسبتا سبکی دارند، از این جهت که شرکتکنندهها تعامل مستقیم با آنها دارند از اهمیت خیلی بالایی برخوردار هستند و کدشان باید تا جای ممکن عاری از هر باگی باشد!
شروع کار این دو تیم حدودا ۲۰ دی پس از مشخص و نهایی شدن بازی و جزییاتش بود. و این دو تیم زمان اندکی آنهم در ایام پرفشار امتحانها و پروژهها داشتند. این دو تیم علاوه بر انجام وظایفش، بهبودهایی در شبکهی بین کلاینت و سرور انجام دادند که سرعت بازی را بسیار بیشتر کرد. شرکتکنندگان در هر مرحله بازی، زمانی مشخص برای تصمیمگیریهای خود دارند و یکی از چالشهای این دو تیم، تمهیداتی است که باید برای بیرون زدن شرکتکننده از این زمان بیاندیشند تا پایداری کدهای سرور و کلاینت حفظ شود و عملکرد معقولی داشته باشد. یکی از مهمترین چالشهای این دو تیم، تست کردن کدهایشان است. این دو تیم برای تست کاملا به همدیگر وابسته هستند و این باعث میشود روشهای تست مرسوم به راحتی جوابگو نباشند. امسال تلاش کردیم تستهایی ابتدایی طراحی کنیم تا ساختارهای پایهای ارتباط و تفسیر پیامها تست شوند. احتمالا بدون تست به عنوان end-user، یوزری که قرار است از محصول استفاده کامل بکند که در این مسابقه یعنی شرکت کننده، نمیتوان به سادگی باگها را شناسایی کرد. اما چه کسی حاضر است کار شرکتکننده را خارج از فضا و جوّ مسابقهای انجام دهد و جایزهای هم نداشته باشد؟ :)
برای سالهای بعد برای پیادهسازی رابط مشترک سرور و کلاینت و تفسیر آسانتر پیامها، به تکنولوژیهایی مانند protobuf که یک رابط را به زبانهای مختلف پیادهسازی میکنند و انتقال پیام و تفسیرش در شبکه را مدیریت میکنند فکر خواهیم کرد.
تیم گرافیک
تیم گرافیک وظیفه دارد که نمایشگر بازی را پیادهسازی بکند تا شرکتکنندگان با دیدن بازیهایشان به شکل گرافیکی روی آن بتوانند عملکرد خود را با جزییات ببیند و بر اساس آن کد خود را بهبود دهند.
در سال گذشته، دو گرافیک برای بازی وجود داشت، یک گرافیک برای سرور جاوا که شرکتکنندگان بلافاصله هنگام بازی گرافیک را مشاهده کنند و یک گرافیک هم برای سایت که در بازیهای دوستانه بتوانند بازیهای خود را مشاهده کنند. تیم گرافیک امسال تصمیم گرفت که این دو را یکی کند و تمرکزش را روی پیادهسازی تنها یک گرافیک با کیفیت بیشتر بکند. این تیم پس از جستجو و بررسی موتورهای مختلف بازیسازی بستر وب، پلتفرم playcanvas را برای توسعه بازی انتخاب کردند و گرافیک بازی را به شکل سه بعدی روی این پلتفرم توسعه دادند که این نمایشگر بازی از نقاط قوت و نمایشی تیم فنی امسال شد!
این تیم اشیاء گرافیکی با مِشهای low-poly (که ساختار اشیاء از چندضلعیهای کمی تشکیل شدند و باعث میشود بازده بالاتر برود) خرید و از آنها استفاده کرد. از چالشهای این تیم، پیادهسازی حرکت پیوسته اشیا و سبک کردن بازی تا جای ممکن (به علت گرافیک سه بعدی) بود.
خوشبختانه چون تجربه استفاده از انجین وب امسال بدست آمد و خوب بود، امیدواریم که سال دیگه هم بشود خیلی بالغتر و کاملتراین راه را ادامه داد. از کارهای آینده برای این تیم، نمایش دادن گرافیک بازی به صورت stream است که شرکتکنندگان همزمان با اجرای بازی در کامپیوتر خود، بازی را هم مشاهده کنند.
تیم سایت
تیم سایت، بخصوص که امسال بنا شده بود از اول زده شود، بزرگترین و پرکارترین تیم ما بود. سایت مسابقه که همه با آن آشنا هستیم، عملا یک محصول کامل شامل بخشهای مختلفی مثل ثبتنام و تیمبندی، وبلاگ، مستندات، سابمیت و بازی دوستانه، ارتباط با زیرساخت بازی و ارتباط با گرافیک بازی، ساخت و مدیریت لیگ و جام حذفی و نمایش ردهبندی آنها و نهایتا پرداخت است.
این تیم وقت خیلی زیادی برای طراحی و توسعه سایت گذاشت و در انتها سایت خیلی مناسبی طراحی شد.
این تیم برای بکاند سایت از فریمورک جنگو برای فرانتاند از semantic ui استفاده کردند و در توسعه تلاش کردند که برای هر بخش unit test بنویسند. همچنین همه کدها توسط مسئول تیم (علی عسگری) بازبینی و بررسی میشد و سپس به کد اصلی اضافه میشد. این تیم امسال از travis برای Continuous Integration (که باعث میشود در گیت به صورت خودکار بتوان تستها را اجرا کرد و محصول را دیپلوی کرد) استفاده کرد و بستر سایت را روی docker (چیزی شبیه ماشین مجازی با این تفاوت که بسیار سریعتر و سبکتر است) بالا آورد که فرایند دیپلوی مستقل از سرور و راحتتر و پایدارتر شود.
بزرگترین درس این تیم برای آیندگان، قابل اعتماد نبودن سرورهای دانشگاه هست! روزهای زیادی (بخصوص روزهای مرحله حضوری) اینترنت دانشگاه ناپایدار بود و باعث نارضایتی شرکتکنندگان شدهبود. روز مسابقه کار به جایی رسید که سایت نمیتوانست کدهای شرکتکنندگان را از سایت (در مرکز محاسبات) به سرور زیرساخت (که سروری خارجی بود) بفرستد و مجبور شدیم ارتباط سرور سایت و سرور زیرساخت را به واسطه لپتاب علی عسگری و گوشی حقیر برای ارسال کدها میسر کنیم :)
از چالشهای فنی این تیم برای آیندگان احتمالا توجه بیشتر و دقیقتر به UI و UX است. همچنین از چالشهای مدیریتی این تیم، این است که معمولا انتظارات برای پروژه بزرگ سایت(که واقعا حداقلی هم هستند) با توان بچههایی که کمتر تجربه دارند نمیخواند و آدمهایی که میتوانستند جایگاه مشاوره داشته باشند تا بقیه یاد بگیرند مجبور میشوند خودشان وارد عمل شوند. البته این مسئله بیشتر به محدودیت زمان بر میگردد. اگه زمان کافی وجود داشته باشد این اتفاق نمیافتد.
تیم زیرساخت
تیم زیرساخت، مسئولیت اجرای خودکار در محیط بسته (بدون دسترسی خارجی) بازیها را روی تعداد قابل توجهی سرور دارد. این تیم باید بتواند منابع بازیها را به درستی اختصاص دهد و رابطی (api) برای ارتباط با سایت پیادهسازی کند و علاوه بر اینها کاملا scalable (دارای قابلیت زیاد و کم کردن تعداد سرورها بدون مشکل) باشد چون در مواقعی لازم است تعداد سرورها را زیاد شوند که بازیها سریعتر اجرا شوند. مثلا برای مرحله غیر حضوری حدود ۱۵۰۰ بازی انجام شد که هر کدام زمان تخمینی حدود ۳ دقیقه داشتند و بنابراین نیاز به تعداد قابل توجهی سرور بود.
این تیم امسال با اجرای بازیها روی docker و مدیریت توزیع بازیها روی سرورها با docker swarm (سامانهای برای مدیریت سرویسها روی تعداد زیادی سرور) کار پارسال را ادامه داد و کد پارسال را بهینهتر و باگها را برطرف کرد و علاوه بر این فایلهای fab (اسکریپتهایی خاص که میتوان آنرا به سرعت روی یک سرور از راه دور اعمال کرد) برای دیپلوی سریع سرور جدید درست کرد که باعث شد بتوان به سرعت تعداد سرورها را زیاد کرد. علاوه بر اینها، این تیم رابط (api) بین خودش و سایت را تغییر داد و برای ارسال نتایج بازیها به جای اینکه سایت هر دقیقه از زیرساخت بپرسد چه خبر، webhook ای در سایت پیادهسازی شد و نتایج را به آن ارسال کرد. برای خرید سریع سرورها از سرویسهای ابری (cloud) استفاده کردیم که سرور را با تحویل زیر یک دقیقه و با محاسبه قیمت ساعتی ارائه میدادند.
مشکلات زیرساختی، مشکلات عجیبی هستند و یافتن ریشه آنها کار سختی است. همچنین تکنولوژیهایی که در آنها استفاده میشود لزوما تکنولوژیهای بدون باگی نیستند و چون خودشان در حال توسعه هستند باگهای زیادی دارند. این مشکلات هم معمولا مادامی که لودهای سنگین روی سیستم نباشند مشخص نمیشوند. مثلا در مرحله انتخابی دیدیم که به طرز عجیبی سیستم میگوید که این بازی را ران کن، دستور اجرا میشود اما بازی ران نمیشود! و چنین مشکلی در بازیهای دوستانه که قبل از آن وجود داشت دیده نشده بود! برای این مشکل و چند مشکل کوچک دیگر، مجبور شدیم مجددا از اول مرحله انتخابی را برگزار کنیم.
از چالشهای این تیم برای آیندگان، fail-safe کردن سیستم و همچنین robust کردن آن است (به صورت کلی یعنی بخشهای مختلف چه درون سیستم و چه خارج سیستم سرویسهای دیگر اگر کار نکردند، سیستم پایداری خودش را حفظ کند و رفتار درستی از خود نشان بدهد). همچنین چالش بزرگ مدیریتی این تیم این است که جنس تسکها و کارهای این تیم خیلی خوشتعریف نیست و مشکلات هم به سادگی قابل مشاهده نیستند، بنابراین اینکه دقیقا چه باید کرد مشخص نیست.
در مورد هر تیم، خلاصهای از کارها و چالشهایش را گفتم. همهی بچههای خیلی وقت گذاشتند و چه شبها که توی اتاق ۰۰۴ و ۰۰۷ ماندند و کار (و اندکی تفریح!) کردند تا بالاخره توانستیم این کارها را به خوبی به نتیجه برسانیم؛ قطعا کار بدون عیب نبود ولی مطمئنم که نتیجه خوبی داشت و رضایتبخش بود. حس میکنم که بچهها هم تجربهی خوبی از تیم فنی داشتند و برایشان مفید بوده است.
نهایتا، تجربهی کار فنی به شکل دانشجویی، یکی از بکرترین و خاصترین و بهترین تجربههاست که فقط و فقط اینجا توی نبرد هوشمصنوعی پیدا میشود! به امید اینکه سال دیگه، با استقبال بیشتر شما؛ تیم فنی بهتری درست کنیم و کارهای بزرگتر و بهتری انجام بدیم :)