Я Бен Макморран, молодший студент, який вивчає комп’ютерні науки у Вустерському політехнічному інституті. Останні дванадцять тижнів я провів стажера з програмної інженерії в команді викладання та навчання (TNL). Це моє друге літо як стажера тут, в edX. Хоча є багато завдань, над якими я працював протягом свого перебування тут, є два основних проекти, які я хотів би виділити.
Розробка API та інтерфейсу для команд
Першим проектом, над яким я працював, була функція Teams для LMS, яка все ще розробляється. Ця функція полегшить учням зв’язок і розмову один з одним у невеликих групах, а також підвищує віральність курсів edX. Розробка цієї функції включала використання передньої частини Хребет і впровадження API за допомогою Django Rest Framework (DRF). Хоча я був знайомий із Backbone після вдосконалення процесу публікації курсів минулого літа, робота з API була для мене новою.
Під час розробки особлива увага приділялася створенню відокремлених багаторазових компонентів. Одним із прикладів цього є те, як ми розробили елементи керування розбивкою на сторінки для списків команд і тем. Ми розробили декілька загальні багаторазові елементи керування сторінками сумісний з інформацією про сторінку, яку повертає DRF:

Ці елементи керування, як зображено вище, можна буде легко інтегрувати з іншими кінцевими точками API edX у майбутній розробці.
Команда розширювані поля Ще один приклад багаторазового коду, який я створив для підтримки Team API. Клієнти можуть вказати, про які поля вони бажають отримати додаткову інформацію, у початковому запиті. Наприклад, запит на інформацію про команду може вказати, що поле користувачів має бути розширене. Замість того, щоб надавати лише імена користувачів, відповідь міститиме деталі про кожного користувача в команді. Це зменшує кількість запитів, які повинен зробити клієнт, або зменшує розмір відповіді, якщо поля непотрібні. Поля, що розгортаються, легко інтегрувати з будь-яким API DRF, вказавши поле як an ExpandableField і надання серіалізатора для згорнутого та розгорнутого стану. У міру розвитку платформи edX цей акцент на багаторазових компонентах ставатиме ще важливішим.
Форуми для обговорень Покращення продуктивності
Я також витратив кілька тижнів на покращення продуктивності наших дискусійних форумів. Ми використовуємо New Relic для моніторингу серверів, на яких працює edx.org. Раніше цього літа моніторинг зафіксував слід, який показав, що публікація коментаря в одному конкретному курсі займає більше 40 секунд, що спонукало до подальшого розслідування.

Я завантажив проблемний курс у своє локальне середовище розробки та спробував опублікувати коментар. Профілювання виявило, що сервер витрачав переважну більшість часу на випуск аналітичної події, яка включає тему обговорення, якщо це можливо. Тема компонента обговорення надає спосіб фільтрації та групування тем обговорення. Наприклад, усі ланцюжки у вбудованому компоненті обговорення мають однакову тему.
У додатку для обговорення коментарі створюються на основі ідентифікатора обговорення, який використовується службою коментарів. Однак тема обговорення для конкретного коментаря зберігається в модулі обговорення як частина курсу. Модулі обговорення знають свій пов’язаний ідентифікатор обговорення, але не було ефективного способу отримати тему обговорення, якщо ви знали лише ідентифікатор обговорення. Проблемний курс налічував майже 1000 дискусійних модулів. Створення завантаженої події аналітики кожного окремого щоб дізнатися тему обговорення!
Моєю першою думкою було додати індекс до ідентифікатора обговорення. Це виявилося проблематичним, оскільки існує кілька механізмів збереження курсів на платформі edX (старі курси mongo, розділені курси mongo та XML). Використання нового індексу вимагало б кардинальних змін. Натомість я створив a зіставлення ідентифікаторів обговорень із пов’язаними модулями. Це відображення кешується в базі даних MySQL, коли курс публікується. Оскільки дані курсу рідко змінюються, але до них часто звертаються, відносно висока вартість побудови відображення шляхом проходження всього курсу є прийнятною, оскільки це відбуватиметься нечасто.
Коли моє виправлення реалізовано, мені потрібно було перевірити його за допомогою навантажувального тестування. Цей процес був для мене абсолютно новим. Хоча це не було складним само по собі, мені знадобився деякий час, щоб навчитися. Я вів існуючі форуми сарана тести щодо проблемного курсу до та після застосування мого виправлення.

До виправлення на створення коментаря протягом півгодини навантажувального тестування потрібно було близько 20 секунд. Зверніть увагу на величезну кількість запитів MongoDB, 1320, у таблиці розподілу під час завантаження кожного модуля обговорення в курсі.

Після виправлення на створення коментаря протягом півгодини навантажувального тестування знадобилося близько чотирьох секунд. Зверніть увагу, що кількість запитів MongoDB тепер становить лише 6.75.
Час відповіді був приблизно в п’ять разів швидшим, а кількість запитів MongoDB значно зменшилася завдяки виправленню. Зараз він знаходиться в головній гілці платформи edx і незабаром має бути розгорнутий на edx.org.
У резюме…
Мій досвід стажера edX був фантастичним. Увійшовши в команду TNL, я відчував себе штатним працівником. Я міг взяти реальні квитки та побачити вплив моєї роботи на платформу. Розробка проекту з відкритим кодом — це чудово. Я хотів би подякувати Енді Армстронгу, Крістіні Робертс, усій команді TNL та edX за те, що зробили це чудове літо!
![]()