CS 128 Learning Management System
Interactive web-based platform for computer science course delivery
Overview
The CS 128 Learning Management System is a comprehensive web-based platform built with Ruby on Rails 6.0 and PostgreSQL, designed to deliver interactive computer science coursework to students. The system hosts daily lessons where students log in to complete embedded programming activities that are automatically graded through a containerized assessment infrastructure. The platform uses Rails Active Jobs with delayed job processing to launch Docker containers that execute student code submissions and provide immediate feedback through an automated grading pipeline.
Students access course content through a structured lesson delivery system where each page contains interactive coding exercises embedded directly within the learning materials. When students submit their code, the system queues grading jobs that spin up isolated Docker containers running custom grading images, execute the student submissions against test suites, and return detailed scoring results back to the platform. This approach enables real-time assessment of programming assignments while maintaining security through containerized execution environments.
The platform supports comprehensive course management capabilities including user authentication based on student enrollment status, role-based access control for students and staff, attendance tracking, extension management, and detailed analytics on student progress. The system uses WebSocket connections through Action Cable to provide live updates on submission status, ensuring students receive immediate feedback on their work. All course content is version-controlled and can be deployed across multiple semester configurations, supporting both current course delivery and archival access to historical course materials.
The Story
This project began in Fall 2020, when I set out to create a platform that would support the pedagogy I had envisioned for CS 128. The course was intentionally structured around daily practice – students would engage with coding activities embedded directly alongside content, ensuring they interacted with the material every weekday. Nathan Park and I worked together to build a system that could deliver this vision: one where students wouldn’t just read about concepts or watch lectures, but would immediately apply what they learned through hands-on coding exercises with auto-graded, immediate feedback. This wasn’t an afterthought or enhancement; it was the core of how I believed the course should be taught. Our first real test came when CS 128 launched as a pilot under CS 199 128 in Spring 2021.
As we prepared for the pilot, the scope of work became clear: I needed to create an entire semester’s worth of instructional content from scratch – over 70 daily lessons, multiple machine problems (weekly mini-projects), and supporting instructional materials for a course that had never existed before. This reality necessitated that Nathan assume leadership of the technical development, and what he accomplished within a single semester was remarkable. He designed and implemented the majority of the web application using Ruby on Rails, creating a sophisticated content management system that allowed us to compose lessons from multiple page blocks – each capable of rendering different media types. More impressively, Nathan built our online “playground” for in-browser compilation, execution, and grading of C++ code. He architected this as a service-oriented system: an intermediary API in Node.js that authenticated requests and interfaced with MySQL, forwarding jobs to Core API services that provisioned Docker containers for each student’s code execution. The administrative capabilities he built rivaled commercial auto-graders like Mimir and Vocareum. While Nathan delivered all of this technical infrastructure, I focused on developing each piece of content that would guide students through their daily practice.
During the pilot, Adarsh Suresh joined our development team and rewrote the Intermediary as a containerized Flask service, bringing production-quality performance that would prove essential as we scaled. His implementation carefully validated each request against our database, created bash scripts to run student code against test suites, and aggregated results before returning them to students – all while handling hundreds of simultaneous users. As we prepared for CS 128 to join the official curriculum with substantially increased enrollment, we knew every component needed to function reliably at scale. Within that single year, we successfully scaled from zero to over 1000 students using the platform simultaneously each day. This growth trajectory confirmed our architectural decisions could withstand real-world demands, yet it also illuminated inefficiencies in our three-component grading architecture – the Rails app, intermediary, and grading nodes – that we would later address by integrating autograding directly into the application using Rails Active Jobs.
The project’s evolution continued when Julian Schiavo assumed primary development responsibilities, bringing significant improvements to the platform’s usability. He revamped the Core grading service with real-time status updates, developed enhanced staff UI features for accessing student submissions, and redesigned the front page for better navigation. Rohit Valmeekam contributed his UI/UX expertise to build core components of our frontend, designing a better student-centered interface. At this point, I was performing mostly strategic oversight, ensuring that the platform’s development remained aligned with our educational objectives while meeting the production quality and reliability standards necessary for deployment to hundreds of students.
Today, the project finds itself at another transition point. As the academic climate evolves and our talented student developers graduate and move on to their careers, the collaborative model that served us so well is naturally coming to an end. I find myself re-immersing in the platform’s technical development, preparing to maintain and advance the system independently in the years ahead.
Technical Architecture
The system is built on a Ruby on Rails foundation with PostgreSQL for data persistence and uses delayed job processing for background task management. The grading infrastructure leverages the Docker API to create isolated execution environments for student code, with custom Ruby-based grading images that provide consistent assessment across all submissions. The platform integrates Bootstrap 5 for responsive design, jQuery for interactive elements, and uses gems like Ace Editor for in-browser code editing, marked-rails for markdown processing, and various authentication libraries for secure access management.
Educational Impact
The CS 128 instructional platform was built on a simple premise: like learning to play a sport or a musical instrument, programming proficiency comes from consistent, focused repetition. Students need many chances to try, correct, and try again. The more students practice, the better they become. Our platform supports this by letting them author, compile, run, and receive feedback on code entirely within their web browser.
Programming exercises are integrated directly into daily lesson content, providing structured opportunities to reinforce concepts as they are introduced. Students can apply what they’ve just learned through targeted, low-stakes activities that prepare them for larger, summative assignments. This steady repetition, paired with immediate formative feedback, allows them to identify and correct misunderstandings early, refine their techniques, and build confidence in their skills.