تجربیات من در تیم تمرین درس برنامه‌سازی پیشرفته!

مدتی بود که چند دوست عزیز تصمیم به بهبود وضعیت ارائه‌ی درس برنامه‌سازی پیشرفته دانشکده کامپیوتر شریف گرفته بودند و تلاش های آن‌ها منجر به ارتقای چند پله‌ای کیفیت ارائه دادن این درس و به تبع آن پیشرفت زیاد دانشجویانی که این درس را می‌گذراندند (من جمله خودم!)، شده بود. به گونه‌ای که دانشجویی که این درس را به خوبی می‌گذراند، با کیفیت بالایی مفاهیم برنامه‌سازی پیشرفته را فرا گرفته بود و آمادگی خوبی برای برنامه‌نویسی پروژه‌های متوسط دانشگاه و همچنین پروژه‌های کوچک صنعتی به صورت گروهی داشت.

امّا این فرآیند باید در سال های آینده ادامه می‌یافت و صرفاً محدود به دو یا سه سال نمی‌شد. از این رو من و چند نفر از دوستانم تصمیم گرفتیم که امسال هم به کمک اساتید گرامی، تلاش کنیم که این درس در این ترم (ترم بهار 99) مثل ترم خودمان قوی، و بلکه قوی‌تر از آن ارائه شود.

در این ترم درس برنامه‌سازی پیشرفته در چهار گروه مختلف ارائه شد که برای اولین بار مسئولیت هر چهار گروه با یک تیم دستیاران آموزشی بود که هماهنگ کردن این 4 گروه، مشکلات و دشواری‌های خاص خود را داشت. در ‌این ترم مجموعاً 181 دانشجو درس را اخذ کرده بودند که ارائه درس در این سطح از تعداد دانشجو سابقه نداشت و نیازمند وقت‌گذاری مضاعف از سمت دستیاران آموزشی بود که به خوبی انجام شد. البته متاسفانه 17 نفر در مهلت حذف اضطراری درس را حذف کردند و در نهایت 164 دانشجو درس را تا پایانِ ترم داشتند.

اهداف کلی تمرین‌ها

دانشجویان برای رسیدن به اهداف درس لازم بود که ابتدا یک سری مفاهیم و مهارت‌های اولیه را در تمرین‌ها فرا بگیرند، سپس در پروژه اصلی درس با استفاده از این مفاهیم و مهارت‌ها و مهارت‌های فنی و غیر فنی دیگری مانند Git، توانایی کار کردن در تیم و تقسیم کار و...، پروژه اصلی درس را پیاده سازی کنند.

در این نوشتار می‌خواهم بیشتر درباره آن چه که من و تیمم در تمرین‌های این درس انجام دادیم، صحبت کنم. ما در طول این ترم سه تمرین را برای دانشجویان منتشر کردیم و تحویل گرفتیم.

انتشار بخش اول: 31 اردیبهشت 99. مهلت ارسال بخش اول: 16 خرداد 99.

انتشار بخش دوم: 12 خرداد 99. مهلت ارسال بخش دوم: 30 خرداد 99.

اهداف تمرین اول

  • آشنایی با مفاهیم اولیه جاوا (حلقه، شرط، متغیر های primitive و غیر primitive و ...)
  • آشنایی اولیه با Java Containers (مانند ArrayList ، HashMap ، LinkedList ، ...)
  • آشنایی اولیه با Regex و چگونگی کار کردن با آن در Java.
  • آشنایی با مفهوم Clean code و تمیز کد زدن.

بدین منظور در کلاس حل تمرین در این باره توضیحات لازم داده‌شد و ما هم محتوایی برای آشنایی اولیه دانشجویان با Clean code منتشر کردیم. در این تمرین صرفاً انتظار می‌رفت که نکات اولیه کد تمیز (تو رفتگی، نداشتن کامنت بی‌مورد، نامگذاری متغیرها و رعایت اندازه مناسب برای توابع) رعایت شود. بدین منظور 25 درصد نمره تمرین اول به این مورد اختصاص یافت.

لازم بود که کد تمام دانشجویان یک بار توسط دستیاران خوانده شود و نمره دهی شود و هم‌چنین نکات Clean code که احیاناً رعایت نشده، به هر دانشجو تذکر داده شود که دانشجویان به سمت زدن کد تمیز حرکت کنند. این اتفاق در تحویل مجازی تمرین رخ داد و کدهای هر دانشجو به مدت 20 دقیقه مورد بررسی قرار گرفت. که البته 20 دقیقه مقداری کم بود و بهتر بود زمان تحویل تمرین اول برای هر دانشجو 30 دقیقه در نظر گرفته شود. جزییات بیشتر درباره هر سوال و نکات ضعف و قوتی که به نظر طراحان هر سوال به نظر رسید و هم‌چنین جزییات نکات تحویل مجازی تمرین اول را در داک پیوست (که در حال تکمیل است.) بخوانید.

اهداف تمرین دوم

  • آشنایی با مفهوم Class و کلاس بندی در جاوا
  • آشنایی با مفاهیمِ اولیه‌ی OOP
  • آشنایی با مفاهیم abstract و polymorphism
  • آشنایی اولیه با معماری MVC

این اهداف در تمرین دوم درس که شامل 3 سوال که پیاده سازی سه سیستم شی گرا بود، پیگیری شد. سوال اول پیاده سازی یک سیستم بانکی بسیار ساده، سوال دوم پیاده بازی ساده شده شطرنج و سوال سوم پیاده سازی ساده یک سیستم ذخیره سازی بود. در سوال اول دانشجویان مطابق UML ای که در اختیارشان بود، باید عمل می‌کردند. اما در دو سوال بعدی وظیفه طراحی معماری بر عهده خود دانشجویان بود. نکات ضعف و قوتی که به نظر طراحان هر سوال به نظر رسید را در داک پیوست بخوانید.

ساختار UML طراحی شده برای سوال اول تمرین دوم
ساختار UML طراحی شده برای سوال اول تمرین دوم

در این تمرین هم لازم بود که کد دانشجویان مورد بررسی قرار بگیرد که نکات شی گرایی و Clean code در آن رعایت شده باشند. این اتفاق در تحویل مجازی تمرین رخ داد و کدهای هر دانشجو به لحاظ رعایت معماری MVC، تمیزی کد و نکات شی گرایی به مدت 40 دقیقه مورد بررسی و نمره دهی قرار گرفت. در این تمرین در سوال اول بخشی از نمره به تمیزی کد و طراحی براساس UML داده شده، و در سوال دوم و سوم بخشی از نمره به تمیزی کد و طراحی صحیح شی‌گرا و رعایت نکات شی‌گرایی اختصاص یافت. جزییات نکات تحویل مجازی تمرین دوم را در داک پیوست (که در حال تکمیل است.) بخوانید.

یک اتفاق مثبتی که باعث کم شدن ابهامات تمرین اول و دوم شد، این بود که هر تمرین قبل از انتشار برای دانشجویان دو یا سه بار توسط دستیاران آموزشی اکسپت شد. (یعنی فرد کد سوال را بزند و در کوئرا پاسخ را Submit کند و همه تست‌های سوال را پاس کند.) یعنی علاوه بر این که خود طراح، سوال خودش را باید اکسپت می‌کرد، یک یا دو دستیار دیگر که در طرح آن سوال دخالتی نداشتند، باید آن را اکسپت می‌کردند تا ابهامات احتمالی موجود در صورت سوال پیدا و رفع شود.

داوری پروژه‌ای در سوالات شئ‌گرایی

پیشرفت مهم دیگری که در این تمرین برای اولین بار رخ داد، استفاده از داوری پروژه ای کوئرا برای این تمرین بود. با این کار دانشجویان بر خلاف سال های قبل لازم نبود تمام کد هر سوال را در یک فایل بنویسند و مجبور به ارسال و دیباگ کردن فایل های 1000 خطی شوند؛ بلکه می‌توانستند کلاس های مختلف را در فایل های مختلف بنویسند و برای ارسال پاسخ، فایل فشرده کلاس‌ها را ارسال کنند. از دیگر مزایای داوری پروژه‌ای می‌توان به پشتیبانی از package بندی‌های مختلف، امکان استفاده از کتاب خانه‌های غیربومی مختلف مانند YaGson و... اشاره کرد. لازم می‌دانم که از تیم کوئرا که دسترسی داوری پروژه‌ای و نحوه کار با آن را در اختیار تیم دستیاران آموزشی قرار داد، تشکر کنم.

البته یکی از مشکلاتی که داوری پروژه‌ای ایجاد کرد، این بود که به دلیل قدیمی بودن جاوا سرور داوری پروژه‌ای کوئرا (8)، دانشجویان از امکانات جدید جاوا در این تمرین و تمرین‌هایی که از داوری پروژه‌ای ‌استفاده می‌کردند، نمی‌توانستند استفاده کنند. (از کوئرا درخواست کردیم که جاوا سرور داوری پروژه‌ای را در صورت امکان بروزرسانی کنند.) جزییات پیاده سازی داوری پروژه ای تمرین دوم و شرح نقاط مثبت و منفی آن را در داک پیوست مطالعه کنید.

اهداف تمرین سوم

  • آشنایی اولیه با کلاس ها و متد ها عام (Generic)
  • آشنایی با گرافیک در جاوا
  • آشنایی اولیه با Unit Test
  • آشنایی با Socket و برنامه‌نویسی شبکه در جاوا
  • آشنایی اولیه و مقدماتی با مفاهیم Thread , Concurrency و توابع Blocking , Non-blocking در جاوا

دو هدف اول در بخش اول تمرین سه، پیگیری شد. یک سوال نسبتا ساده از کلاس‌ها و متدها Generic که داوری پروژه ای و نمره دهی خودکار، برای آن پیاده سازی شده بود؛ و دو سوال گرافیک که باید یکی از آن ها را به انتخاب دانشجویان می‌زدند. یکی از آن ها پیاده سازی گرافیکی همان شطرنجی بود که در تمرین دوم به صورت کنسولی پیاده‌سازی کرده‌بودند و سوال دیگر پیاده‌سازی گرافیکی بازی Space Invaders بود. اتفاق خوبی که امسال افتاد، این بود که دو سوال گرافیک در تمرین 3 (پارسال) به یک سوال کاهش یافت که این مورد باعث شد که وقت دانشجویان بی‌دلیل سر پیاده‌‌سازی‌های گرافیکی بدون یادگیری خاص، تلف نشود.

Space Invaders بازی
Space Invaders بازی

سه هدف بعدی تلاش شد در بخش دوم تمرین سوم محقق شود. این بخش شامل یک سوال پیاده سازی یک شبکه بانکی شامل سرور بانک، سرور DNS و عابر بانک بود که ProtoType کلاس‌ها و توابع لازم آن در اختیار دانشجویان قرار گرفته بود و دانشجویان باید صرفا توابع مربوطه را تکمیل می‌کردند تا 6 تست (سه تست blocking , سه تست non-blocking) را پاس کند.

برای آن که حل این تمرین برای دانشجویان بسیار دشوار نشود، تعدادی از تست ها در اختیار دانشجویان قرار گرفت که در دیباگ کردن کد کدشان از آن ها استفاده کنند.

داوری پروژه‌ای در سوال Generic و سوال شبکه

پیشرفت مهم دیگری برای اولین بار در درس برنامه‌سازی پیشرفته رخ داد، این بود که برای سوال‌ Generic و سوال پیاده‌سازی شبکه بانکی نیز، داوری پروژه‌ای پیاده‌سازی شد. به عبارتی تنها سوال گرافیک بود که در این ترم داوری خودکار نداشت. (البته برای استفاده از سیستم کشف تقلب کوئرا، یک داوری پروژه‌ای بدون تست هم برای دو سوال گرافیک، گذاشته شد.) در این دو سال با استفاده از سیستم داوری پروژه‌ای کوئرا تعدادی Unit Test بعد از هر Submit روی آن اجرا می‌شد و بلافاصله پاسخ آن اعلام می‌شد.

البته برای سوال شبکه باید چک می‌شد که قوانین سوال رعایت شده باشند که چک کردن این موارد با استفاده از یک اسکریپت پایتون انجام شد. (نظیر این که کلاس‌ها علاوه بر بستر شبکه از راه های دیگری با هم ارتباط نداشته باشند، عدم استفاده از Thread.sleep و یا عدم ایجاد delay مصنوعی به هر طریقی برای دور زدن تست کیس ها و ...) جزییات داوری پروژه‌ای این سوالات و نکات مثبت و منفی‌ای که به نظر طراحان هر سوال به نظر رسید را در داک پیوست (که در حال تکمیل است.) بخوانید!

این اتفاقات باعث شد که در دوران مجازی بودن ترم، دیباگ و تحویل تمرین سوم بسیار راحت‌تر انجام شود. یعنی فقط سوال گرافیک تحویل گرفته شد و نمره‌دهی دو سوال دیگر به صورت خودکار انجام شد.

سایر پیشرفت‌‌ها و نقاط قوت دیگر

از دیگر نقاط قوت تمرین‌ها به طور کلی در این ترم می‌توان به موارد زیر اشاره کرد:

  • لاتک بودن داک تمام تمرین و داشتن یک قالب مشخص برای همه آن‌ها. از این قالب می‌توان برای سال‌های آینده هم استفاده کرد. هم چنین توضیحات فراوان و کامل در داک ها، باعث حداقل شدن ابهامات موجود در سوالات شده بود.
  • پیشگیری از آسیب‌های احتمالی مجازی شدن ترم. با مجازی‌‌شدن ترم تحویل حضوری تمرین‌ها ممکن نبود. اما با تحویل و بررسی مجازی کدها به کمک سامانه Skyroom و اپلکیشن Discord این خلاء تا حد امکان رفع شد.
  • پاسخگویی دستیاران آموزشی در کوئرا. طراحان هر تمرین موظف بودند که ابهامات مطرح شده درباره هر تمرین را در کوتاه‌ترین زمان ممکن در کوئرا پاسخ بدهند.
  • شفافیت کامل در داک نمرات نمرات. داک نمرات که در زمان تحویل حضوری توسط دستیاران آموزشی پر می‌شود، بعد از ثبت نمرات هر تمرین در اختیار دانشجویان برای مشاهده قرار می‌گرفت که اگر احیاناً موردی اشتباه شده بود، به دستیاران اطلاع دهند. داک نمرات چهار گروه از طریق لینک های زیر قابل دسترس است:

? نمرات گروه 1 (استاد مصطفی زاده)

? نمرات گروه 2 (استاد ملک زاده)

? نمرات گروه 3 (استاد عیسی زاده)

? نمرات گروه 4 (استاد چکاه)

هم‌چنین در ابتدای ترم مقرر شد که برای کل تمرین‌ها، 3 روز تاخیر بدون جریمه در نظر گرفته شود. که اگر اتفاقی برای دانشجویی رخ داد، بتواند از این سه روز تاخیرش در یک یا چند تمرین به دلخواه استفاده کند. در ضمن برای آن‌که اگر احیانا مشکلی پیش آمد، این سوپاپ اطمینان، موجود باشد. ولی برای تاخیرهای بعدی روزی 30 درصد کسر نمره در نظر گرفته شد و هم‌چنین مقرر شد که در هر تمرین بیش از سه روز اجازه استفاده از تاخیرها نباشد.

هم‌چنین برای این که دانشجویانی که صرفاً یک تمرین نمره پایینی گرفته بودند، آسیب کمتری به نمره نهایی تمرین آن‌ها وارد شود، نمره‌های تمرین به سه طریق مختلف محاسبه و بیشترین آن‌ها درنظر گرفته شد.

مجموعاً میانگین نمره تمرین 164 دانشجویی که درس را داشتند، 87.37 از 100 شد که تلاش تیم دستیاران آموزشی و همچنین تلاش جدی خود دانشجویان در جهت یادگیری از دلایل اصلی این میانگین بالاست.

در پایان از اساتید گرامی هر چهار گروه (جناب آقای مصطفی‌زاده، ملک‌زاده، عیسی‌زاده، چکاه) بابت اعتماد فراوان به تیم دستیاران آموزشی تشکر می‌کنم. همچنین از مسئول دستیاران آموزشی، آقای محمد حقیقت بابت اعتماد و پیشتیبانی فراوان از تیم تمرین، تشکر می‌کنم و سپاسگزارم.

از تمام اعضای تیم تمرین بسیار سپاسگزارم که کمک کردند تمرین‌ها این درس هر چه قد بهتر ارائه شود و بدون ایشان این مورد ممکن نبود. و از تمام اعضای تیم های دیگر دستیاران آموزشی بسیار سپاسگزارم که ارائه با این کیفیت درس مدیون زحمات تک تک آن هاست و باید یک تشکر مهم از دانشجویان بکنم که علی رغم مشکلات ترم مجازی و... به خوبی با درس همراهی کردند. ان‌شاء‌الله که این روند در ترم‌های آینده ادامه پیدا کند.

در نهایت به شخصه امیدوارم توانسته باشم قدمی هر چند بسیار کوچک، در پیشرفت هر چه بیشتر دانشجویان و دانشگاه و در نهایت در جهت پیشرفت کشورم انجام داده باشم. و ممنونم ازتون که با متن همراهی کردید. :)

موفق باشید

محمدحسین قیصریه - تیر ۹۹