Sou Ben McMorran, um calouro em ascensão que estuda ciência da computação no Worcester Polytechnic Institute. Passei as últimas doze semanas como estagiário de engenharia de software na equipe de Ensino e Aprendizagem (TNL). Este é o meu segundo verão como estagiário aqui na edX. Embora existam muitas tarefas em que trabalhei durante meu tempo aqui, há dois projetos principais que gostaria de destacar.
Desenvolvimento de API e front-end para equipes
O primeiro projeto em que trabalhei foi o recurso Teams para o LMS, que ainda está em desenvolvimento. Esse recurso tornará mais fácil para os alunos se conectarem e conversarem uns com os outros em pequenos grupos e aumentará a viralidade dos cursos edX. O desenvolvimento para este recurso incluiu trabalho de front-end usando Espinha dorsal e implementação de API com o Estrutura de descanso do Django (DRF). Embora eu estivesse familiarizado com o Backbone por melhorar o fluxo de trabalho de publicação de cursos no verão passado, o trabalho da API era novo para mim.
Houve um forte foco durante todo o desenvolvimento na criação de componentes desacoplados e reutilizáveis. Um exemplo disso é a maneira como projetamos controles de paginação para listagens de equipes e tópicos. Desenvolvemos vários controles de paginação genéricos e reutilizáveis compatível com as informações da página que o DRF retorna:

Esses controles, conforme ilustrado acima, serão fáceis de integrar com outros endpoints da API edX em desenvolvimento futuro.
O campos expansíveis que criei para dar suporte a API Team são outro exemplo de código reutilizável. Os clientes podem especificar sobre quais campos eles gostariam de obter mais informações como parte da solicitação inicial. Por exemplo, uma solicitação de informações da equipe pode especificar que o campo de usuários deve ser expandido. Em vez de fornecer apenas nomes de usuário, a resposta incluiria detalhes sobre cada usuário da equipe. Isso reduz o número de solicitações que o cliente deve fazer ou reduz o tamanho da resposta quando os campos são desnecessários. Os campos expansíveis são fáceis de integrar com qualquer API DRF, especificando o campo como um Campo Expansível e fornecendo um serializador para o estado recolhido e expandido. À medida que a plataforma edX cresce, esse foco em componentes reutilizáveis só se tornará mais importante.
Melhorias no desempenho dos fóruns de discussão
Também passei várias semanas melhorando o desempenho de nossos fóruns de discussão. Usamos o New Relic para monitorar os servidores que executam o edx.org. No início deste verão, o monitoramento capturou um rastreamento que mostrou que estava levando mais de 40 segundos para postar um comentário em um curso específico, levando a uma investigação mais aprofundada.

Carreguei o curso problemático no meu ambiente de desenvolvimento local e tentei postar um comentário. A criação de perfil revelou que o servidor passava a maior parte do tempo emitindo um evento de análise, que inclui o tópico da discussão, se aplicável. O tópico de um componente de discussão fornece uma maneira de filtrar e agrupar tópicos de discussão. Por exemplo, todos os tópicos em um componente de discussão embutido têm o mesmo tópico.
No aplicativo de discussão, os comentários são criados com base em um ID de discussão usado pelo serviço de comentários. No entanto, o tópico de discussão para um comentário específico é armazenado no módulo de discussão como parte do curso. Os módulos de discussão conhecem seu id de discussão associado, mas não havia uma maneira eficiente de obter o tópico da discussão se você soubesse apenas o id de discussão. O curso problemático teve quase 1000 módulos de discussão. Criando o evento de análise carregado cada um para descobrir o tópico de discussão!
Meu primeiro pensamento foi adicionar um índice no id da discussão. Isso provou ser problemático porque existem vários mecanismos de persistência para cursos na plataforma edX (cursos old mongo, split mongo e XML). Usar um novo índice exigiria mudanças drásticas. Em vez disso, criei um mapeamento de IDs de discussão para módulos associados. Esse mapeamento é armazenado em cache no banco de dados MySQL quando um curso é publicado. Como os dados do curso raramente mudam, mas são acessados com frequência, o custo relativamente alto de construir o mapeamento percorrendo todo o curso é aceitável, pois isso acontecerá com pouca frequência.
Com minha correção implementada, eu precisava verificá-la por meio de testes de carga. Esse processo era novo para mim. Embora não fosse um desafio em si, demorei um pouco para me acostumar. Eu corri os fóruns existentes Gafanhoto testes contra o curso problemático antes e depois que minha correção foi aplicada.

Antes da correção, levava cerca de 20 segundos para criar um comentário durante a meia hora de teste de carga. Observe o grande número de consultas do MongoDB, 1320, na tabela de detalhamento conforme cada módulo de discussão do curso é carregado.

Após a correção, levou cerca de quatro segundos para criar um comentário durante a meia hora de teste de carga. Observe como o número de consultas do MongoDB agora é de apenas 6.75.
Os tempos de resposta foram cerca de cinco vezes mais rápidos e o número de consultas do MongoDB foi bastante reduzido com a correção. Ele agora está no branch master da plataforma edx e deve ser implantado no edx.org em breve.
Em suma…
Minha experiência como estagiário da edX foi fantástica. Integrado à equipe da TNL, parecia que eu era um funcionário em tempo integral. Consegui aceitar ingressos reais e ver o impacto do meu trabalho na plataforma. Desenvolver um projeto de código aberto é incrível. Gostaria de agradecer a Andy Armstrong, Christina Roberts, toda a equipe da TNL e edX por fazer deste um ótimo verão!
![]()