Soy Ben McMorran, un joven en ascenso que estudia informática en el Instituto Politécnico de Worcester. Pasé las últimas doce semanas como pasante de ingeniería de software en el equipo de enseñanza y aprendizaje (TNL). Este es mi segundo verano como pasante aquí en edX. Si bien trabajé en muchas tareas durante el tiempo que estuve aquí, hay dos proyectos principales que me gustaría destacar.
Desarrollo API y Front End para Teams
El primer proyecto en el que trabajé fue la función Teams para LMS, que aún está en desarrollo. Esta función facilitará que los estudiantes se conecten y conversen entre sí en pequeños grupos y aumentará la viralidad de los cursos de edX. El desarrollo de esta característica incluyó el trabajo de front-end usando Columna vertebral e implementación de API con el Marco de descanso de Django (DRF). Si bien estaba familiarizado con Backbone por haber mejorado el flujo de trabajo de publicación de cursos el verano pasado, el trabajo de la API era nuevo para mí.
Hubo un fuerte enfoque durante todo el desarrollo en la creación de componentes desacoplados y reutilizables. Un ejemplo de esto es la forma en que diseñamos los controles de paginación para las listas de equipos y temas. Desarrollamos varios controles de paginación genéricos y reutilizables compatible con la información de la página que devuelve DRF:

Estos controles, como se muestra arriba, serán fáciles de integrar con otros puntos finales de la API de edX en el desarrollo futuro.
El campos expandibles que creé para admitir Team API son otro ejemplo de código reutilizable. Los clientes pueden especificar sobre qué campos les gustaría obtener más información como parte de la solicitud inicial. Por ejemplo, una solicitud de información del equipo podría especificar que el campo de usuarios debe expandirse. En lugar de solo proporcionar nombres de usuario, la respuesta incluiría detalles sobre cada usuario del equipo. Esto reduce la cantidad de solicitudes que debe realizar el cliente, o reduce el tamaño de la respuesta cuando los campos son innecesarios. Los campos expandibles son fáciles de integrar con cualquier API DRF especificando el campo como un campo expandible y proporcionar un serializador para el estado colapsado y expandido. A medida que crece la plataforma edX, este enfoque en los componentes reutilizables solo se volverá más importante.
Mejoras en el rendimiento de los foros de discusión
También pasé varias semanas mejorando el rendimiento de nuestros foros de discusión. Usamos New Relic para monitorear los servidores que ejecutan edx.org. A principios de este verano, el monitoreo capturó un rastro que mostraba que se tardaba más de 40 segundos en publicar un comentario en un curso específico, lo que provocó una mayor investigación.

Cargué el curso problemático en mi entorno de desarrollo local e intenté publicar un comentario. La creación de perfiles reveló que el servidor pasaba la mayor parte del tiempo emitiendo un evento de análisis, que incluye el tema de la discusión, si corresponde. El tema de un componente de discusión proporciona una forma de filtrar y agrupar hilos de discusión. Por ejemplo, todos los hilos en un componente de discusión en línea tienen el mismo tema.
En la aplicación de discusión, los comentarios se crean en función de una identificación de discusión utilizada por el servicio de comentarios. Sin embargo, el tema de discusión de un comentario en particular se almacena en el módulo de discusión como parte del curso. Los módulos de discusión conocen su identificación de discusión asociada, pero no había una forma eficiente de obtener el tema de la discusión si solo conocía la identificación de la discusión. El curso problemático tuvo casi 1000 módulos de discusión. Creando el evento analítico cargado cada uno para descubrir el tema de discusión!
Mi primer pensamiento fue agregar un índice en la identificación de la discusión. Esto resultó ser problemático porque hay varios mecanismos de persistencia para los cursos en la plataforma edX (mongo antiguo, mongo dividido y cursos XML). El uso de un nuevo índice requeriría cambios drásticos. En su lugar, creé un mapeo de ID de discusión a módulos asociados. Esta asignación se almacena en caché en la base de datos MySQL cuando se publica un curso. Dado que los datos del curso rara vez cambian pero se accede a ellos con frecuencia, el costo relativamente alto de construir el mapeo recorriendo todo el curso es aceptable, ya que ocurrirá con poca frecuencia.
Con mi solución implementada, necesitaba verificarla a través de pruebas de carga. Este proceso era nuevo para mí. Si bien no fue un desafío en sí mismo, me tomó un tiempo ponerme al día. Corrí los foros existentes Langosta pruebas contra el curso problemático antes y después de aplicar mi solución.

Antes de la solución, se tardaba unos 20 segundos en crear un comentario durante la media hora de prueba de carga. Observe la gran cantidad de consultas de MongoDB, 1320, en la tabla de desglose a medida que se cargan todos los módulos de discusión del curso.

Después de la corrección, tomó alrededor de cuatro segundos crear un comentario durante la media hora de prueba de carga. Observe cómo el número de consultas MongoDB ahora es solo 6.75.
Los tiempos de respuesta fueron unas cinco veces más rápidos y la cantidad de consultas de MongoDB se redujo considerablemente con la corrección. Ahora está en la rama principal de la plataforma edx y debería implementarse en edx.org pronto.
En resumen…
Mi experiencia como pasante de edX fue fantástica. Integrado en el equipo de TNL, me sentí como si fuera un empleado de tiempo completo. Pude adquirir boletos reales y ver el impacto de mi trabajo en la plataforma. Desarrollar un proyecto de código abierto es increíble. ¡Me gustaría agradecer a Andy Armstrong, Christina Roberts, todo el equipo de TNL y edX por hacer de este un gran verano!
![]()