چرا تایمر آزمون باید سمت سرور باشد
هر تایمری که در مرورگر نگه داشته شود، قابل دستکاری است. ولی راهحل «هر ثانیه از سرور بپرس» هم نیست.
اگر زمان باقیماندهی آزمون را جاوااسکریپت در مرورگر نگه دارد، هر کسی که کنسول مرورگر را باز کند میتواند عوضش کند.
معماری درست
- وقتی داوطلب آزمون را شروع میکند، سرور زمان شروع را ثبت میکند.
- مهلت از روی همان زمان شروع و مدت آزمون حساب میشود.
- مرورگر فقط نمایش میدهد؛ عدد نمایشی هیچ اعتباری ندارد.
- موقع ثبت پاسخ، سرور دوباره بررسی میکند که مهلت نگذشته باشد.
مرحلهی ۴ مهمترین است. اگر سرور موقع ثبت چک نکند، همهی مراحل قبلی تزئینیاند.
چرا هر ثانیه از سرور نپرسیم
وسوسهانگیز است که مرورگر هر ثانیه زمان را از سرور بگیرد. ولی این یعنی برای ۱۰۰ داوطلب همزمان، ۱۰۰ درخواست در ثانیه فقط برای تایمر — بار بیدلیل.
راه درست: یک بار همگامسازی در شروع، بعد شمارش محلی، و همگامسازی دوباره در هر تعامل واقعی (رفتن به سؤال بعد، ذخیرهی پاسخ). اینطور اختلاف هیچوقت زیاد نمیشود.
ساعت سیستم کاربر را باور نکنید
شمارش محلی نباید با Date.now() باشد، چون ساعت سیستم را میشود عقب کشید. باید از ساعت یکنواخت مرورگر (performance.now()) استفاده کرد که از لحظهی بازشدن صفحه میشمارد و به ساعت سیستم کاری ندارد.
وقتی اینترنت قطع میشود
این سناریو در ایران رایج است و باید از قبل تصمیمش را گرفته باشید:
- پاسخها باید در لحظه ذخیره شوند نه فقط در پایان — وگرنه قطعی یعنی از دست رفتن همهچیز.
- اگر داوطلب برگشت و مهلت نگذشته، باید بتواند ادامه بدهد. سرور میداند کجا بود.
- اگر مهلت در زمان قطعی تمام شد، آزمون با پاسخهای ذخیرهشده بسته میشود.
سیاست «قطعی اینترنت عذر موجه نیست» باید قبل از آزمون اعلام شود، وگرنه بعدش اعتراض حق داوطلب است.
مهلت اضافه برای موارد خاص
بعضی داوطلبها (مثلاً با کمبینایی) قانوناً مستحق وقت اضافهاند. این باید در سطح تلاشِ فرد قابل تنظیم باشد نه کل آزمون — و ثبت شود که چه کسی و چرا وقت اضافه گرفته.