في المقال الأول من السلسلة وصلنا إلى أن الناتج النهائي للواجب لم يعد دليلاً على التعلم، وأن الحل في إعادة تصميم التقييم وليس في مطاردة الطلاب. وهنا يأتي السؤال العملي: ما هي الأدوات التي تساعد المعلم والجامعة على تنفيذ هذا التصميم؟ وما الذي تفعله كل أداة فعلاً، وما الذي لا تفعله مهما قال موقعها؟
المواضيع في السلسلة:
- الواجبات والاختبارات الجامعية في زمن الذكاء الاصطناعي.
- أدوات التعليم في زمن الذكاء الاصطناعي: من الكشف إلى التصحيح (الموضوع الحالي).
- مساعد تدريس بالذكاء الاصطناعي لمقرر البرمجة: تجربة عملية على سيرفرك.
وسوف نناقش في هذا المقال ما يلي:
- خريطة الأدوات في خمس عائلات، وما الذي تقدمه كل عائلة.
- أدوات الكشف وحدودها باختصار، لأن تفاصيلها في المقال الأول.
- قفل جهاز الاختبار مع Safe Exam Browser، وأين يفيد وأين لا يفيد.
- تتبع العملية بسجل Git وسجل النسخ.
- المصححات الآلية مفتوحة المصدر، مع تجربة حقيقية لـ CodeRunner على Moodle، وكيف يجتاز حل كتبه نموذج ذكاء اصطناعي كل الاختبارات.
- مساعدات المقررات مثل CS50.ai وKhanmigo، والخيار الذي تشغله على سيرفرك.
- جدول للرخص والأسعار، وجدول يساعدك على اختيار ما يناسب مقررك.
خريطة الأدوات
الأدوات التي تعرض على الجامعات في هذا الموضوع كثيرة، ولكنها تعود إلى خمس عائلات، ولكل عائلة سؤال واحد تجيب عنه. والصورة التالية تبين هذه العائلات:

في الصورة أعلاه لاحظ أن الأسئلة مختلفة تماماً:
- أداة الكشف تسأل: هل يشبه هذا النص ما يولده النموذج؟
- قفل الجهاز يسأل: هل كان الطالب وحده مع الاختبار؟
- تتبع العملية يسأل: كيف وصل الطالب إلى هذا الناتج؟
- المصحح الآلي يسأل: هل الكود يعمل؟
- المساعد لا يقيس شيئاً، وإنما يحاول أن يساعد الطالب على التعلم بدلاً من أن يحل عنه.
أدوات الكشف وحدودها
شرحنا في المقال الأول نتائج دراستين على أدوات كشف النص المولد AI Detectors، ونلخصهما هنا لأنهما تحددان مكان هذه العائلة في الخريطة:
- دراسة Weber-Wulff وزملائها (2023) اختبرت 14 أداة منها Turnitin وGPTZero، ولم تتجاوز أي أداة دقة 80%، وأضعفت إعادة الصياغة والترجمة الآلية الأدوات بشكل كبير.
- دراسة Liang وزملائه (2023) وجدت أن سبع أدوات صنفت في المتوسط 61.22% من مقالات بشرية كتبها طلاب يكتبون الإنجليزية لغة ثانية على أنها مولدة.
والقاعدة العملية من ذلك أن نسبة الأداة سبب لمحادثة مع الطالب وليست دليلاً، ولذلك لا ننصح بشراء أداة كشف لمقررات البرمجة بالذات، والسبب أن الكود الصحيح لمسألة صغيرة يتشابه بطبيعته، وأن الطريقة الأرخص والأدق هي أن تسأل الطالب عن كوده.
قفل جهاز الاختبار مع Safe Exam Browser
إذا كان جزء من الدرجة في الاختبار داخل القاعة، كما اقترحنا في المقال الأول، فالسؤال هو كيف تضمن أن الجهاز الذي يحل عليه الطالب لا يفتح نافذة محادثة في الخلفية. وأشهر أداة مفتوحة المصدر لهذا هي Safe Exam Browser، واختصاراً SEB، وتصفها صفحتها الرسمية بأنها بيئة متصفح تحول أي كمبيوتر مؤقتاً إلى محطة عمل آمنة، وتتحكم في الوصول إلى وظائف النظام والمواقع والتطبيقات الأخرى أثناء الاختبار. وهذه أهم النقاط عنها:
- المكونات: تطبيق كشك Kiosk يقفل الجهاز، ومتصفح يتصل بنظام إدارة التعلم LMS، ويمكن السماح لتطبيق محدد بالعمل معه مثل بيئة برمجة إذا احتاجه الاختبار.
- الربط مع Moodle: قاعدة الوصول
quizaccess_sebجزء من Moodle نفسه، وقد تأكدنا من وجودها في نسخة Moodle 5.3 التي نصبناها في التجربة أدناه، فتطلب من إعدادات الاختبار Quiz أن يفتح الاختبار من SEB فقط. - الخصوصية: بحسب الصفحة الرسمية لا يتصل SEB بأي خدمة سحابية مركزية، ومكون SEB Server اختياري ويثبت على سيرفر الجامعة نفسها.
- الرخصة: رخصة MPL-2.0 بحسب مستودعي نسخة Windows وSEB Server على GitHub.
وهل هذا يحل المشكلة؟ لا، والتفصيل فيما يلي: SEB يقفل الجهاز الذي أمام الطالب، ولا يقفل الهاتف الذي في جيبه، ولذلك هو أداة للاختبار داخل القاعة مع مراقب، وليس بديلاً عن المراقبة. ولا ننصح بأدوات المراقبة عن بعد Remote Proctoring التي تسجل كاميرا الطالب في بيته، والسبب أنها تجمع بيانات شخصية حساسة من بيوت الطلاب، وهذا يحتاج أساساً نظامياً واضحاً بحسب نظام حماية البيانات الشخصية في المملكة.
وسوف نشرح تثبيت SEB وإعداده مع Moodle خطوة بخطوة في مقال مستقل ضمن مرحلة التعليم الإلكتروني بإذن الله، فهو مدرج في خريطة الموقع بعنوان «الاختبارات الآمنة مع Safe Exam Browser».
تتبع العملية بسجل Git
أبسط أداة لتتبع العملية في مقرر البرمجة هي Git نفسه، والطريقة أن يبدأ كل طالب الواجب من مستودع قالب Template Repository، ويرفع تغييراته على مراحل، ويسلم رابط المستودع وليس ملفاً. وما تحصل عليه من ذلك:
- تسلسل زمني للعمل، فالحل الذي ظهر كاملاً في Commit واحد قبل الموعد بدقائق يستحق سؤالاً في الدفاع الشفهي.
- رسائل الـ Commits نفسها، وهي تبين هل يفهم الطالب ما غيره.
- مادة جاهزة للأسئلة: لماذا غيرت هذه الدالة بين النسخة الثانية والثالثة؟
وقد شرحنا أساسيات Git في مقال إدارة النسخ وGit للمبتدئين. والجامعة التي تريد أن تبقى المستودعات على سيرفراتها يمكنها تشغيل Gitea أو GitLab داخلياً، وهو ما يذكره مقال المصادر المفتوحة للجامعات ضمن طبقة البحث.
المصححات الآلية مفتوحة المصدر
المصحح الآلي Autograder برنامج يشغل كود الطالب على اختبارات كتبها المعلم ويعطي الدرجة مباشرة، وهو الأداة التي جعلت مقررات البرمجة الكبيرة ممكنة أصلاً، لأن معلماً واحداً لا يستطيع أن يشغل كود 500 طالب كل أسبوع. والخيارات مفتوحة المصدر الأشهر:
- CodeRunner: نوع سؤال Question Type يضاف إلى Moodle، فيكتب الطالب الكود داخل اختبار Moodle العادي ويرى نتيجة الاختبارات فوراً، ويشغل الكود على سيرفر منفصل اسمه Jobe. وتذكر صفحته الرسمية أنه مستخدم في قرابة 4000 موقع Moodle مسجل.
- INGInious: من جامعة Louvain في بلجيكا، يشغل كود الطالب داخل Container عبر Docker، ويمكن ربطه بـ Moodle أو edX مصححاً خارجياً.
- Autolab: بدأ في جامعة Carnegie Mellon، ويشغل التصحيح عبر خدمة اسمها Tango، ويعرض لوحة نتائج Scoreboard للطلاب.
- nbgrader وOtter-Grader: لواجبات Jupyter Notebooks في مقررات البيانات والعلوم.
واخترنا CodeRunner للتجربة لأن الجامعة التي تستخدم Moodle تضيفه دون نظام جديد، وقد شرحنا تثبيت Moodle نفسه في دليل Moodle. أما INGInious فيحتاج أن يتحكم في Docker على السيرفر ليشغل Container لكل تصحيح، وهذا يعني إعطاءه صلاحية واسعة على السيرفر، فهو يناسب سيرفراً مخصصاً له وليس سيرفراً مشتركاً مثل سيرفر تجاربنا.
تجربة عملية: CodeRunner على Moodle
الهدف من التجربة سؤالان: كيف يصحح CodeRunner محاولة طالب حقيقية، وماذا يحدث عندما يلصق الطالب نص الواجب في نموذج ذكاء اصطناعي ويسلم ما يخرج منه. والصورة التالية تبين مكونات التجربة:

ملف Docker Compose
نبدأ من الإعداد نفسه الذي استخدمناه في دليل Moodle، ونضيف إليه خدمة Jobe من Docker Image الرسمية trampgeek/jobeinabox، والملف كاملاً كما يلي:
name: lab-edu
services:
db:
image: postgres:17.11
container_name: lab-edu-db
environment:
POSTGRES_DB: moodle
POSTGRES_USER: moodle
POSTGRES_PASSWORD: change-me-db
volumes:
- db:/var/lib/postgresql/data
web:
image: moodlehq/moodle-php-apache:8.3-bookworm@sha256:501f19fa75ad3cdc8962f2a742f39d179b8aa8ffdc2ff233d8d27a32f14e0e05
container_name: lab-edu-web
depends_on: [db, jobe]
environment:
PHP_INI-max_input_vars: "5000"
PHP_INI-display_errors: "Off"
ports:
- "127.0.0.1:18481:80"
volumes:
- code:/var/www/html
- data:/var/www/moodledata
- ./moodle-router.conf:/etc/apache2/conf-enabled/moodle-router.conf:ro
- ./:/lab:ro
# Jobe runs the students' code in a sandbox; Moodle talks to it over the internal network only
jobe:
image: trampgeek/jobeinabox@sha256:b442c8e63f016ff33aa2b6f28c36abc8ebd30cbb39e8e025cadeec2107c5ce85
container_name: lab-edu-jobe
volumes:
db:
name: lab-edu-db
code:
name: lab-edu-code
data:
name: lab-edu-data
networks:
default:
name: lab-edu-moodleفي الإعداد أعلاه لاحظ التالي:
- خدمة Jobe لا تنشر أي منفذ على السيرفر، فلا يصل إليها إلا Moodle عبر الشبكة الداخلية، والسبب أن Jobe يشغل أي كود يرسل إليه.
- Docker Images مثبتة ببصمة Digest، فالتجربة تعطي النتيجة نفسها إذا أعدتها.
- المجلد الحالي مربوط داخل Container على المسار
/labللقراءة فقط، لنستورد منه السؤال.
بعد ذلك نفك Moodle 5.3.0 في ال Volume، ونضع إضافتي CodeRunner في مجلد public لأن Moodle منذ الإصدار 5.1 ينقل الإضافات تحته:
curl -sL -o moodle.tgz https://github.com/moodle/moodle/archive/refs/tags/v5.3.0.tar.gz
curl -sL -o coderunner.tgz https://github.com/trampgeek/moodle-qtype_coderunner/archive/refs/tags/v5.10.6.tar.gz
curl -sL -o behaviour.tgz https://github.com/trampgeek/moodle-qbehaviour_adaptive_adapted_for_coderunner/archive/refs/tags/v1.4.8.tar.gz
docker volume create lab-edu-code
docker run --rm --name lab-edu-unpack -v "$PWD":/src:ro -v lab-edu-code:/var/www/html \
--entrypoint sh moodlehq/moodle-php-apache:8.3-bookworm -c '
tar xzf /src/moodle.tgz -C /var/www/html --strip-components=1 &&
mkdir -p /var/www/html/public/question/type/coderunner /var/www/html/public/question/behaviour/adaptive_adapted_for_coderunner &&
tar xzf /src/coderunner.tgz -C /var/www/html/public/question/type/coderunner --strip-components=1 &&
tar xzf /src/behaviour.tgz -C /var/www/html/public/question/behaviour/adaptive_adapted_for_coderunner --strip-components=1 &&
chown -R www-data:www-data /var/www/html'
docker compose up -dثم ننصب Moodle من سطر الأوامر بالأمر نفسه الذي شرحناه في دليل Moodle، ومن مخرج التنصيب الأسطر التي تخص الإضافتين:
برنامج تنصيب مودل 5.3 (Build: 20261005) عبر سطر الأوامر النصية
...
-->qtype_coderunner
++ install.php: نجاح (2.03 ثوان) ++
...
-->qbehaviour_adaptive_adapted_for_coderunner
++ نجاح (0.17 ثوان) ++
...
تم التنصيب بنجاح.ثلاثة أشياء يجب ضبطها قبل أول سؤال
التنصيب نجح، ولكن السؤال لن يعمل بعد، وقد واجهنا ثلاث مشاكل بالترتيب.
الأولى: نماذج الأسئلة لا تنصب إلا عبر Cron. عند فتح معاينة السؤال ظهر الخطأ التالي:
تم الكشف عن خطأ بالنص البرمجي ، يجب إصلاحه من قبل المبرمج : prototype_contexts: no system-level question bank foundوالسبب أن CodeRunner في Moodle 5 ينشئ نماذج أنواع الأسئلة Prototypes بمهمة مؤجلة Adhoc Task تنتظر Cron، فإذا لم يكن Cron يعمل فلن تنشأ. والحل تشغيل Cron كما في دليل Moodle، أو تشغيل المهام المؤجلة مرة واحدة:
docker exec -u www-data lab-edu-web php /var/www/html/admin/cli/adhoc_task.php --executeوالمخرج سوف يكون كما يلي (الأسطر التي تخص CodeRunner):
Execute adhoc task: qtype_coderunner\task\qtype_coderunner_setup_question_prototypes
Setting up CodeRunner question prototypes...
CodeRunner prototypes set up using qbank.
CodeRunner: creating new system question bank.
CodeRunner: replacing existing prototypes with new ones.
CodeRunner question prototypes successfully installed.
Adhoc task complete: qtype_coderunner\task\qtype_coderunner_setup_question_prototypesالثانية: CodeRunner يرسل الكود إلى جامعة Canterbury افتراضياً. هذا أهم ما في التجربة من ناحية الخصوصية، فالإعداد الافتراضي لسيرفر Jobe ليس سيرفرك:
docker exec -u www-data lab-edu-web php /var/www/html/admin/cli/cfg.php --component=qtype_coderunner --name=jobe_hostjobe2.cosc.canterbury.ac.nzوهذه القيمة موجودة في كود الإضافة نفسه في ملف constants.php، وهو سيرفر تجريبي لجامعة Canterbury في نيوزيلندا، وهذا يعني أن أي جامعة تنصب CodeRunner ولا تغير الإعداد ترسل كود طلابها إلى سيرفر خارجي. والحل أن نوجهه إلى خدمة Jobe في ملف Compose:
docker exec -u www-data lab-edu-web php /var/www/html/admin/cli/cfg.php --component=qtype_coderunner --name=jobe_host --set=jobe
docker exec lab-edu-web curl -s http://jobe/jobe/index.php/restapi/languagesوالأمر الثاني يسأل Jobe عن اللغات التي يشغلها، والمخرج سوف يكون كما يلي:
[["c","15.2.0"],["cpp","15.2.0"],["java","25.0.4.1"],["nodejs","22.22.1"],["octave","Unknown"],["pascal","3.2.2"],["php","8.5.4"],["python3","3.14.4"]]الثالثة: حماية Moodle تمنع الوصول إلى الشبكة الداخلية. عند أول محاولة ظهرت هذه الرسالة في نتيجة السؤال:
فشل تشغيل الاختباراتفشل طلب مخدم Jobe.HTTP response from Jobe was -1: "" (curl error 0: تم حظر عنوان URL.)والسبب أن Moodle يمنع افتراضياً اتصالات cURL بالعناوين الخاصة، وقائمة المنع الافتراضية تحتوي على النطاقات 10.0.0.0/8 و172.16.0.0/12 و192.168.0.0/16، وشبكة Docker عندنا كانت 192.168.112.0/20. وفي الإنتاج اترك القائمة كما هي واحذف منها فقط النطاق الذي فيه سيرفر Jobe، وهذا ما فعلناه في التجربة:
docker exec -u www-data lab-edu-web php /var/www/html/admin/cli/cfg.php --name=curlsecurityblockedhosts \
--set="$(printf '127.0.0.0/8\n10.0.0.0/8\n172.16.0.0/12\n0.0.0.0\nlocalhost\n169.254.169.254\n0000::1')"السؤال ومحاولة الطالب
السؤال هو الواجب الثاني من مقررنا التجريبي: الدالة top_words(text, n) التي تعيد أكثر الكلمات تكراراً مع ترتيب أبجدي عند التساوي، وفيه سبعة اختبارات، أربعة ظاهرة للطالب وثلاثة مخفية. واستوردناه بسكربت PHP صغير موجود في ملفات التجربة يستخدم واجهة الاستيراد في Moodle، والمخرج كان كما يلي:
++ تحليل الأسئلة من ملف الاستيراد. ++
++ يجري استيراد 1 أسئلة/سؤال من الملف ++
course=2 qbank_cmid=2 question=1 (HW2 top_words)ثم كتبنا محاولة تشبه ما يكتبه طالب في أسبوعه الرابع، فهي تعمل على الحالة البسيطة وتنسى علامات الترقيم والترتيب عند التساوي:
from collections import Counter
def top_words(text, n):
words = text.lower().split()
return Counter(words).most_common(n)وسلمناها من معاينة السؤال، والصورة التالية تبين النتيجة:

والجدول نفسه كما قرأناه من الصفحة بسكربت التجربة، لأن واجهة Moodle العربية تعرض قوائم Python بترتيب معكوس كما سيأتي:
| الفحص | المتوقع | Got |
| print(top_words('the cat and the hat', 1)) | [('the', 2)] | [('the', 2)] |
| print(top_words('b a c a b', 2)) | [('a', 2), ('b', 2)] | [('b', 2), ('a', 2)] |
| print(top_words('Hello, hello! HELLO?', 1)) | [('hello', 3)] | [('hello,', 1)] |
| print(top_words('', 3)) | [] | [] |
| print(top_words('one two', 0)) | [] | [] |
| print(top_words('سلام عليكم سلام', 1)) | [('سلام', 2)] | [('سلام', 2)] |
| print(top_words('zeta alpha zeta alpha beta', 3)) | [('alpha', 2), ('zeta', 2), ('beta', 1)] | [('zeta', 2), ('alpha', 2), ('beta', 1)] |وفي النتيجة أعلاه لاحظ التالي:
- المصحح أدى عمله جيداً: الطالب يعرف من الصف الثالث أن
splitتترك الفاصلة في الكلمة، ومن الصف الثاني أنmost_commonلا ترتب المتساوي أبجدياً، وهي معلومة موجودة في ملاحظات المقرر. - في الصورة تظهر القوائم مثل
[('b', 2), ('a', 2)]مقلوبة الأقواس والترتيب، والسبب أن خلايا الجدول ترث اتجاه الصفحة من اليمين إلى اليسار RTL، وهذه مشكلة عرض في الواجهة العربية فقط، والقيم نفسها صحيحة كما في النص أعلاه، فانتبه لها إذا كان طلابك يستخدمون Moodle بالعربية.
الحل الذي كتبه الذكاء الاصطناعي
الآن نفعل ما يفعله طالب لا يريد أن يتعب: نلصق نص الواجب في نموذج ذكاء اصطناعي ونطلب الكود فقط. واستخدمنا نموذجاً صغيراً على سيرفرنا وليس خدمة تجارية، وهو qwen2.5:3b عبر Ollama، بحرارة صفر Temperature 0 وبذرة ثابتة Seed، والطلب كان كما يلي:
Solve this Python assignment. Give only the code.
Write the function top_words(text, n) that splits the text into words (letters and digits, Arabic included),
ignores case and punctuation, and returns a list of (word, count) tuples for the n most frequent words.
When two words have the same count, sort them alphabetically. If n is zero or less, return an empty list.واستغرق النموذج قرابة 400 ثانية على المعالج فقط في سيرفر تجاربنا المزدحم، وكتب 240 توكن، وهذا هو الكود كما خرج منه دون أي تعديل:
from collections import Counter
import re
def top_words(text, n):
if n <= 0:
return []
# Normalize text: convert to lower case and remove punctuation
text = re.sub(r'[^\w\s]', '', text.lower())
# Split text into words
words = text.split()
# Count the frequency of each word
word_counts = Counter(words)
# Get the n most common words
most_common = word_counts.most_common(n)
# Sort by count, then alphabetically
most_common.sort(key=lambda x: (-x[1], x[0]))
return most_commonثم سلمناه في السؤال نفسه، والصورة التالية تبين النتيجة:

والسطر الأخير من النتيجة كما قرأه سكربت التجربة:
state: صحيح / الدرجات لهذا التسليم: 10.00/10.00.وهنا نقطة مهمة جداً، فالحل الذي أخذ الدرجة الكاملة ليس صحيحاً. لاحظ أنه يأخذ أكثر n كلمات بالدالة most_common أولاً، ثم يرتب، فإذا كان التساوي على حدود القائمة فقد يختار الكلمة الخطأ قبل أن يرتب. وشغلنا الحل نفسه على حالتين ليستا في اختبارات السؤال:
# two extra cases that the CodeRunner tests do not contain
print(top_words('b a b a c', 1))
print(top_words('my_var my var', 3))والمخرج سوف يكون كما يلي:
[('b', 2)]
[('my', 1), ('my_var', 1), ('var', 1)]وفي المخرج أعلاه لاحظ التالي:
- الإجابة الصحيحة للحالة الأولى
[('a', 2)]، لأن a وb متساويتان والترتيب الأبجدي يقدم a، ولكن الحل اختار b لأنها ظهرت أولاً في النص. - في الحالة الثانية اعتبر الشرطة السفلية Underscore جزءاً من الكلمة، والسبب أن
\wفي Python يطابقها كما تذكر ملاحظات المقرر، والمطلوب أن تكون الكلمات حروفاً وأرقاماً فقط. - الخطآن لم يظهرا في المصحح لأن المعلم لم يكتب اختباراً لهما، وهذه طبيعة أي مصحح آلي: يقول إن الكود اجتاز الاختبارات الموجودة، وليس إنه صحيح.
والنتيجة التي تهمنا من التجربة كلها: طالب في أسبوعه الرابع حاول بنفسه فأخذ 5.71، وطالب لصق نص الواجب في نموذج صغير مجاني فأخذ 10 من 10 بحل فيه خطآن لا يعرف عنهما شيئاً. والمصحح الآلي لم يخطئ في شيء، فهو أجاب عن السؤال الذي صمم له، وهذا بالضبط سبب ما قلناه في المقال الأول: درجة المصحح الآلي يجب أن ترافقها أسئلة عن الكود في الدفاع الشفهي، مثل «ماذا يحدث إذا تساوت كلمتان على حدود القائمة؟»، وهو سؤال يجيب عنه من كتب الكود في ثوان، ولا يجيب عنه من نسخه.
مساعدات المقررات
العائلة الأخيرة لا تقيس شيئاً، وإنما تحاول أن تعطي الطالب مساعدة تشبه المعلم: تلميح وسؤال يوجهه بدلاً من الحل. وأشهر مثالين موثقين:
- CS50.ai من جامعة Harvard: بحسب ورقة الفريق في SIGCSE 2024، بنوا على GPT-4 مجموعة أدوات منها «بطة» للمحادثة على شكل Rubber Duck، مع ضوابط تربوية Pedagogical Guardrails توجه الطالب ولا تعطيه الحل، واسترجاع من نصوص المحاضرات بطريقة RAG، وفحص لمحاولات حقن التعليمات Prompt Injection، وحد لعدد الأسئلة على شكل قلوب: عشرة قلوب يعود منها قلب كل ثلاث دقائق. وراجع أحد أعضاء فريق المقرر 25 إجابة منهجية في الفصل الصيفي فوجد 22 منها صحيحة (88%).
- Khanmigo من Khan Academy: تصفه صفحته الرسمية بأنه يتحدى المتعلم أن يفكر ويحل المسائل دون أن يعطيه الإجابات مباشرة، ونسخة المعلم مجانية بحسب الصفحة نفسها، وهو موجه للتعليم العام أكثر من الجامعات.
وفي الحالتين المساعد خدمة لا تتحكم في بياناتها ولا في نموذجها، وهذا مناسب لكثير من المقررات، ولكن الجامعة التي تريد أن تبقى أسئلة طلابها داخلها، أو تريد مساعداً يعرف ملاحظات مقررها هي، تستطيع أن تبني مساعداً مشابهاً على سيرفرها بنموذج مفتوح، وهذا بالضبط ما سوف نبنيه ونقيس ضوابطه في المقال الثالث من السلسلة.
الرخص والأسعار
الجدول التالي من المستودعات والصفحات الرسمية كما قرأناها في 13 أكتوبر 2026، والأسعار تتغير فارجع إلى الصفحة قبل القرار:
| الأداة | العائلة | الرخصة أو نموذج التسعير | ملاحظة |
|---|---|---|---|
| Safe Exam Browser | قفل الجهاز | مفتوحة المصدر برخصة MPL-2.0 | يدعمه Moodle مباشرة |
| CodeRunner | مصحح آلي | مفتوحة المصدر برخصة GPL | إضافة لـ Moodle تحتاج سيرفر Jobe |
| Jobe | بيئة تشغيل معزولة | مفتوحة المصدر برخصة MIT | تشغله على سيرفرك |
| INGInious | مصحح آلي | مفتوحة المصدر برخصة AGPL-3.0 | من جامعة Louvain، يشغل كل تصحيح في Container |
| Autolab | مصحح آلي | مفتوحة المصدر برخصة Apache-2.0 | من جامعة Carnegie Mellon، مع خدمة Tango للتشغيل |
| nbgrader وOtter-Grader | مصحح آلي | مفتوحة المصدر برخصة BSD-3-Clause | لواجبات Jupyter Notebooks |
| CodeGrade | مصحح آلي | تجاري، وفيه خطة مجانية حتى 50 طالباً في المقرر | ربط LMS في الخطط المدفوعة |
| GitHub Classroom | توزيع الواجبات | خدمة من GitHub | توقف في 28 أغسطس 2026 |
| CS50.ai | مساعد | خدمة مجانية لطلاب CS50 | خاص بمقررات CS50 |
| Khanmigo | مساعد | خدمة، ونسخة المعلم مجانية | للتعليم العام أكثر |
كيف تختار؟
الجدول التالي يربط ما تريد إثباته في مقررك بالأداة المناسبة، وهو مبني على ما شرحناه في المقالين:
| ماذا تريد؟ | الأداة المناسبة | ما يجب أن ترافقه |
|---|---|---|
| أن تعرف هل الكود يعمل، لمئات الطلاب | مصحح آلي مثل CodeRunner | دفاع شفهي لعينة، لأن المصحح لا يعرف من كتب الكود |
| أن تتأكد أن الطالب يملك المهارة بنفسه | اختبار داخل القاعة مع SEB | مراقب في القاعة وأسئلة تقيس قراءة الكود |
| أن ترى كيف وصل الطالب إلى الحل | Git مع مستودع لكل طالب | أسئلة عن التغييرات في الدفاع الشفهي |
| أن تعطي الطالب مساعدة في أي وقت | مساعد بضوابط يعطي تلميحات | قياس دوري لما يتسرب منه، كما في المقال الثالث |
| أن تثبت أن نصاً مولد | لا توجد أداة تثبت ذلك | محادثة مع الطالب عن عمله |
أخطاء شائعة
- اعتبار درجة المصحح الآلي دليلاً على الفهم: التجربة أعلاه بينت أن الحل المولد يأخذ الدرجة الكاملة.
- ترك CodeRunner على سيرفر Jobe الافتراضي: الإعداد الافتراضي يرسل كود طلابك إلى سيرفر جامعة Canterbury، فغيره إلى سيرفرك قبل أول اختبار.
- إخفاء كل الاختبارات عن الطالب: الاختبارات الظاهرة تعلمه ما المطلوب، والمخفية تمنع البرمجة على المخرج المتوقع، فاجمع بينهما.
- SEB بلا مراقب: الأداة تقفل الجهاز ولا تقفل الهاتف.
- بناء مقرر جديد على GitHub Classroom: الخدمة توقفت.
- شراء أداة كشف لمقرر البرمجة: الكود الصحيح يتشابه، والأبحاث لا تدعم استخدام النسبة دليلاً.
الخلاصة
وصلنا لنهاية الموضوع، وأهم ما فيه:
- أدوات التعليم في زمن الذكاء الاصطناعي خمس عائلات، وكل عائلة تجيب عن سؤال مختلف، ولا توجد أداة تقول لك «هل تعلم الطالب؟».
- أدوات الكشف لا تصلح دليلاً، وSafe Exam Browser يفيد داخل القاعة مع مراقب، وسجل Git يعطيك مادة للأسئلة.
- المصحح الآلي يتحقق أن الكود يعمل، وفي تجربتنا حصل حل كتبه نموذج صغير على سيرفرنا على الدرجة الكاملة، ولذلك يجب أن يرافقه تقييم للعملية والفهم.
- CodeRunner مع Jobe على سيرفرك خيار مفتوح المصدر يناسب الجامعات التي تستخدم Moodle، وGitHub Classroom توقف.
- المساعد الذي يعطي تلميحات بدل الحلول هو العائلة الوحيدة التي تحاول أن تساعد على التعلم، وفي المقال القادم بإذن الله نبنيه على سيرفرنا ونقيس كم مرة تصمد ضوابطه.
دليلالواجبات والاختبارات الجامعية في زمن الذكاء الاصطناعيكيف تقيم طلابك عندما يكتب الذكاء الاصطناعي الواجب، ولماذا لا تنفع أدوات الكشف، وما الذي يجب أن تدرسه الآن.
دليلمساعد تدريس بالذكاء الاصطناعي لمقرر البرمجةكيف تبني مساعداً محلياً يجيب طلاب البرمجة من ملاحظات المقرر ويعطي تلميحات بدلاً من حل الواجبات.
دليلMoodle: منصة تعلم بالعربية على سيرفرككيف تثبت Moodle على سيرفرك وتجهزه بالعربية، ثم تنشئ مقرراً واختباراً وتسجل الطلاب وتأخذ له نسخة احتياطية كاملة.
دليلأنظمة إدارة التعلم LMS: ماذا تحتاج منها مؤسستك التعليمية؟ما الذي يفعله نظام إدارة التعلم LMS، وما الذي تحتاجه منه مدرستك أو جامعتك فعلاً قبل أن تختار بين الأنظمة المفتوحة.
دليلإدارة النسخ وGit للمبتدئين: لماذا نحتاجها وكيف تعمللماذا تضيع الملفات بأسماء final_v2 ويمسح الزملاء عمل بعضهم، وكيف يحل Git ذلك على مشروع حقيقي من أول commit.
دليلالمصادر المفتوحة للجامعات: خطة وأدوات بالترتيبدليل لقيادة الجامعة يشرح ما تكسبه فعلاً من المصادر المفتوحة وما تكلفه، وبأي ترتيب تنقل خدماتها إليها.سجل التحديثات
- أكتوبر 2026: كتابة المقال، وقراءة الرخص والأسعار من المستودعات والصفحات الرسمية في 13 أكتوبر 2026، وتنفيذ التجربة على Docker Engine 29.8.0 مع Moodle 5.3.0 (Build 20261005) على PHP 8.3.35 (moodlehq/moodle-php-apache:8.3-bookworm) وPostgreSQL 17.11، وCodeRunner 5.10.6 مع qbehaviour_adaptive_adapted_for_coderunner 1.4.8، وJobe من Docker Image trampgeek/jobeinabox (البصمة b442c8e63f01، Python 3.14.4 داخلها)، وOllama 0.40.3 مع النموذج qwen2.5:3b (البصمة 357c53fb659c، تكميم Q4_K_M) على المعالج فقط.