أضواء المتدرب: أوتكارش جادهاف

9 سبتمبر 2015 | بقلم

اسمي أوتكارش جادهاف ، وأنا طالبة ماجستير في علوم الكمبيوتر بجامعة نورث إيسترن ، هنا في بوسطن. لقد أمضيت الثلاثة عشر أسبوعًا الماضية في edX أعمل مع فريق Platform. فريق المنصة مسؤول عن بناء البنية التحتية لمنتجات Open edX ، لا سيما العمل على جعل الكود يعمل بشكل أسرع. في هذا المنشور ، أود أن أبرز أحد مشاريعي الرئيسية ، Call Stack Manager. إنها أداة تتعقب مجموعات الاستدعاءات الفريدة للوظائف والأساليب وفئات نموذج Django.

وحدة الطالب في البرامج التعليمية (CSM) وتاريخ وحدة الطالب في البرامج التعليمية (CSMH) في كود منصة edx مسؤولة عن الحفاظ على حالة المستخدم للطلاب الذين يحاولون حل المشكلات والدرجات الخاصة بهم. وصل موقع edx.org مؤخرًا إلى 5 ملايين متعلم ؛ يتسبب الحجم المتزايد لـ CSM و CSMH في مخاوف جدية بشأن تعطل المساحة وقاعدة البيانات. يعد تفكيك مناطق الشفرة المتجانسة مثل LMS و CMS في النظام الأساسي edx حاجة حيوية مع زيادة قاعدة الكود وحجم قاعدة البيانات.

عميل حالة مستخدم edX (eUSC)

في الأصل ، كان هيكل عميل حالة المستخدم على النحو التالي -

يظهر الهيكل السابق لعميل حالة المستخدم الاتصال بين منصة edx وقاعدة بيانات MySQL عبر CSM / CSMH

يظهر الهيكل السابق لعميل حالة المستخدم الاتصال بين منصة edx وقاعدة بيانات MySQL عبر CSM / CSMH

الهيكل كله كان تحت منصة edx / edx. كان عميل حالة المستخدم يتواصل مباشرة مع جداول MySQL المسماة Courseware_studentmodule و Courseware_studentmodulehistoryعبر DjangoORM.

عندما بدأت فترة التدريب ، كان الفريق على علم بالفعل بالجوانب السلبية لهذه الهندسة المعمارية. لإصلاح ذلك ، ساعدت في تنفيذ البنية المقترحة الموضحة في الشكل التالي:

الهيكل المقترح لعميل حالة المستخدم يظهر طبقة edx-user-state-client بين النظام الأساسي وخلفية قاعدة البيانات

الهيكل المقترح لعميل حالة المستخدم يظهر طبقة edx-user-state-client بين النظام الأساسي وخلفية قاعدة البيانات

في هذه العمارة الجديدة ، edx- المستخدم- الدولة- العميل بمثابة طبقة بين منصة edx وخلفية قاعدة البيانات. هناك العديد من المزايا لاستخدام مثل هذا الهيكل:

  1. سيعمل eUSC كواجهة واحدة على مستوى ملخص يتم من خلاله إجراء جميع استدعاءات قاعدة البيانات. سيساعد هذا النمط في النهاية في التواصل الفعال مع قاعدة البيانات.
  2. سيسمح eUSC أيضًا بالتبديل السهل بين الخلفيات المختلفة. ستسمح واجهة برمجة التطبيقات هذه باختيار الخلفيات ، حتى للمهام الموزعة.

كخطوة أولى نحو إنشاء هذا الهيكل ، قمت بإنشاء مستودع باسم edx / edx-user-state-client. يحتوي هذا المستودع على الواجهة XBlockUserStateClient، الذي يعتني بجميع المكالمات التي أجراها نموذج Django مع قاعدة البيانات.

استدعاء مدير المكدس

استخدم XBlockUserStateClient مسؤول عن إجراء جميع المكالمات إلى قاعدة البيانات. ومع ذلك ، بالنظر إلى الحجم الهائل لقاعدة كود edX ، واستخدام امتدادات الطرف الثالث (مثل XBlocks) ، والعديد من المكالمات التي يتم إجراؤها لقاعدة البيانات في أماكن مختلفة ، فمن المفيد بالفعل إجراء مكالمات إلى قاعدة البيانات التي لم يتم إجراؤها عبر الواجهة XBlockUserStateClient.

لتلبية هذه الحاجة ، قمت بتطوير مكتبة تسمى استدعاء مدير المكدس. هذه مكتبة تسمح لنا بتتبع المكالمات التي لا يتم إجراؤها عبر الواجهة ، وتتواصل مباشرة مع قاعدة البيانات. يسجل Call Stack Manager مثل هذه المكالمات في سجل LMS.

تقوم المكتبة بتنفيذ اثنين من الديكورات الرئيسية:

  1. تضمين التغريدة - الذي يتتبع الكيان المزين
  2. @لا تتبع - الذي يوقف تتبع الكيانات المزينة بـ تضمين التغريدة.

كانت الحاجة الأساسية لتطوير هذه المكتبة هي تتبع مكالمات فئات النموذج في CSM و CSMH ، بشكل أساسي StudentModule و StudentModuleHistory. يتم الاتصال بقواعد البيانات في Django عن طريق الفئات المعرفة من قبل المستخدم والتي تصنف ضمن فئة فئة جانغو "موديل". تستخدم فئات النموذج ملحق واجهة برمجة تطبيقات QuerySet لإنشاء واسترجاع وتحديث قواعد البيانات. يمكن تجاوز المكالمات التي تم إجراؤها بواسطة QuerySet API باستخدام مدير مخصص مسمى CallStackManager - المعرفة في مكتبة Call Stack Manager. بهذه الطريقة ، تم التعامل مع الحالة الخاصة لتتبع فئات Django Model التي تصل مباشرة إلى قاعدة البيانات.

أثناء تشغيل Call Stack Manager في نسخته الأولية ، واجهت المشكلات التالية:

  1. تم إجراء سجلات المكالمات بشكل متكرر ، مما أدى إلى ازدحام سجل LMS.
  2. تم تسجيل العديد من المكالمات التي نعرفها بالفعل دون داع.
  3. تحتوي سجلات المكالمات على إطارات غير ضرورية ، مما يجعلها طويلة وصعبة القراءة.

لمعالجة هذه القضايا ، قدمت مصمم ديكور جديد ، اسمه @لا تتبع، مما يوقف تتبع نطاق الوظيفة المزينة بهذا المصمم. بشكل عام ، يمكن فصل استدعاءات الطريقة المتعقبة إلى فئتين: تلك التي يتم إجراؤها بواسطة تطبيق الواجهة الجديدة وتلك التي لا يتم إجراؤها. يمكن تجاهل المكالمات التي نعرفها ونتوقعها بالفعل - أي تلك المكالمات من التطبيق الجديد - لأننا مهتمون فقط بالتقاط المكالمات التي لا نعرف عنها. وهكذا نستخدم هذا @لا تتبع مصمم لإخفاء أي مكالمات متعقبة يتم إجراؤها بواسطة هذا التطبيق. في هذه المرحلة ، فإن المكالمات الوحيدة التي يتم تتبعها ستكون تلك التي يتم إجراؤها من خارج التطبيق الجديد.

بهذه الطريقة ، يتم إجراء المكالمات المتوقعة والمعروفة لقاعدة البيانات (على سبيل المثال عبر الواجهة XBlockUserStateClient) لم يتم تسجيلها ، مما يعطينا صورة واضحة عما كانت تفعله المكالمات المجهولة. أيضًا ، تمت تصفية الإطارات المكررة في مكدس الاستدعاءات باستخدام مرشحات التعبير العادي. بهذه الطريقة ، كان عدد المكالمات المسجلة أقل ، وأكثر دقة ، وأسهل في القراءة.

مثال على مكدس المكالمات المذكور أعلاه كما يلي -

تسجيل مكدس الاستدعاءات الجديد رقم 4 لـ:
   ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor/views/api.py" ، السطر 240 ، ملفوف
    عودة func (* args ، ** kwargs)
  ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor/views/api.py" ، السطر 176 ، ملفوف
    عودة func (* args ، ** kwargs)
  ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor/views/api.py" ، السطر 127 ، ملفوف
    عودة func (request، * args، ** kwargs)
  ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor/views/api.py" ، السطر 1896 ، في rescore_problem
    Instructor_task.api.submit_rescore_problem_for_student (طلب ، module_state_key ، طالب)
  ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor_task/api.py" ، السطر 110 ، في submit_rescore_problem_for_student
    إرجاع Submit_task (الطلب ، نوع المهمة ، فئة المهام ، مفتاح الاستخدام. مفتاح الدورة ، Task_input ، مفتاح_المهمة)
  ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor_task/api_helper.py" ، السطر 346 ، في submit_task
    task_class.apply_async (task_args، task_id = task_id)
  ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor_task/tasks.py" ، السطر 80 ، في rescore_problem
    إرجاع run_main_task (entry_id، visit_fcn، action_name)
  ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor_task/tasks_helper.py" ، السطر 279 ، في run_main_task
    Task_progress = task_fcn (معرّف_إدخال ، معرف_دورة ، إدخال_المهمة ، اسم_إجراء)
  ملف "/edx/app/edxapp/edx-platform/lms/djangoapps/instructor_task/tasks_helper.py" ، السطر 345 ، في Perform_module_state_update
    modules_to_update = StudentModule.objects.filter (course_id = course_id، module_state_key__in = Usage_keys)

أثناء تطوير مكتبة Call Stack Manager ، كان علي حل العديد من مشكلات مستوى Python الأساسية مثل المعالجة الفعالة لفئات Django Model ، وإنشاء فئات Django Model في وقت التشغيل لغرض الاختبار ، ووظائف التغليف حتى لا تفقد هويتها ، والتعامل مع الاشتباكات مع الديكورات الأخرى مثل @اتفافية في PyContracts وغيرها الكثير.

استدعاء مدير المكدس كمكتبة عامة

كان الغرض الرئيسي من Call Stack Manager هو تتبع مكالمات StudentModule و StudentModuleHistory. بالإضافة إلى ذلك ، يمكننا تتبع أي دالة Python في أي مستوى معين من التعليمات البرمجية. يمكن إيقاف التتبع عند الحاجة. باستخدام هذه المكتبة ، يمكننا إهمال الوظائف غير المرغوب فيها بشكل فعال من خلال تتبع المكالمات غير المعروفة. سيكون من المثير للاهتمام متابعة تطوير هذه الأداة كأداة عامة تنطبق على أي مشروع Django.

خاتمة

أعتقد بشدة أن الحل العام لـ Call Stack Manager يمكن استخدامه كمكوِّن إضافي أو مكتبة قياسية لمشروع Django / Python مع المزيد من الإضافات والتعديلات.

بالنظر إلى تجربتي في فترة التدريب ، استمتعت بالعمل على قاعدة كود edX. إن العمل في مثل هذا المشروع المفتوح المصدر واسع النطاق والذي له تأثير عالمي هائل أمر مثير للغاية. لدى EdX فريق من المبرمجين الرائعين ، ويعامل المتدربين كموظفين بدوام كامل مع أقصى قدر من التعرض على كل المستويات. وجدت نفسي أعمل على أحدث التقنيات وشاركت في جميع أنواع المناقشات التقنية مع فريق المنصة. كان العمل على مستوى Python الأساسي وحل المشكلات غير العادية وغير المتوقعة مفيدًا بشكل خاص. أود أن أشكر جون إيسكو ، وكالين بنينجتون ، وعلي محمد ، وبريان بيجز ، وميكي جويال ، وآدم بالاي ، ونيد باتشيلدر على مساعدتهم ودعمهم المستمر. كان العمل في edX فرصة رائعة وصعبة سأعتز بها لسنوات قادمة.

تحميل

حان الوقت للمزيد؟ تحقق من المقالات أدناه.

التعلم المؤسسي يجعل انتقاله إلى Ed Tech
دعوة للحصول على أوراق تنتج محصولًا وفيرًا
دعوة مفتوحة لتقديم الأوراق من edX: تنتهي في 7 كانون الأول (ديسمبر)
تحسينات تدريجية لفتح edX
انضم إلى مؤتمر edX المفتوح 2026!

سيقدم مؤتمر Open edX لعام 2026 حالات استخدام مبتكرة لأحد أفضل أنظمة إدارة التعلم عبر الإنترنت مفتوحة المصدر في العالم، وهي منصة Open edX، واكتشاف أحدث التطورات في التصميم التعليمي ومجموعة الدورات التدريبية وطرق تشغيل وتوسيع منصة Open edX. ، بما في ذلك التقنيات المتقدمة، مثل الذكاء الاصطناعي التوليدي.