COU
Summary
An open-source online judge providing problem solving, code judging, contests, and a community. We made it customizable and deployable in an operator’s own environment, and I grew the three-person development project into a ten-person startup.
- Role
- Founder, PM (product planning, team management, development participation, presentations)
- Stack
- Vue.js, Django, PostgreSQL, Redis, Docker Compose
- Outcome
- Open-source online judge release, outstanding work at the 2022 SW Talent Festival
Problem
An Online Judge Operators Could Adapt to Their Own Needs
Centrally hosted online judges limited users’ ability to change features or deploy the service in a separate environment. We wanted a platform that operators could configure for their own purposes, alongside grouping practice problems and running contests on their chosen schedule.
To solve this problem, I recruited two teammates and we began as a three-person project. The product covered both the user’s flow from solving and submitting code to checking results, and the operator’s flow for configuring the service and managing problems. I handled product planning and team management and also participated in development.
Design Direction
Adding Features with Separately Editable Screens and APIs
We used an open-source online judge’s core structure and judging functionality and added capabilities such as draft saving, practice progress, and a community. Operators can set the service name and registration policy and configure problems, categories, and contests.
The Vue.js frontend and Django APIs are separate so screens and server functionality can be developed and modified in their respective layers. Backend modules cover accounts, problems, submissions and judging, and contests. This structure supports changing the interface or extending server functionality in the relevant part of the system.
User Flow #1
Reading, Writing Code, and Checking Results in One Flow
Solving a problem involves repeatedly reading the statement and examples, writing code, and checking submission results. We placed the statement and editor side by side so that this flow could stay on one screen. Users can write and submit code in multiple languages and view judging results, with syntax highlighting and theme switching in the editor.
We also considered solutions that take more than one submission. Drafts are saved by user, problem, and selected language, then loaded when the user resumes work under those conditions. This lets users continue their previous code as they move between problems or languages.
User Flow #2
Practice and Contests Within the Same Service
Problems are grouped into categories with completion rates so users can choose practice material and review their progress. Tags, difficulty levels, search, filters, and random selection provide different ways to choose the next problem.
Operators can set contest start and end times, while participants solve problems and review submission status in the same service. Private submissions support coding tests by keeping participants from viewing one another’s code. Community posts, questions, and notifications allow discussions arising during practice to continue alongside problem solving.
Deployment and Execution
Starting the Web, Storage, and Judging Components Together
Running the service independently required the web application, storage, and judging environment together. We packaged the application, PostgreSQL, Redis, and judge server as separate containers with Docker Compose. Once the required images are prepared, one command starts the service components together.
Submitted code runs in a judging container separate from web request processing. We retained the underlying judging environment’s privilege restrictions to reduce the risks of executing submitted code. In the GCP deployment, we confirmed the flow from creating problems through submitting code to viewing judging results.
Team and Results
A Broader Perspective Through My First Startup
I wrote the initial proposal and recruited two teammates to begin development as a team of three. As development continued, I grew the team to ten people and registered the business once the platform was reasonably complete. As PM and founder, I set the product direction, coordinated team members’ roles and schedules, and gave external presentations.
In 2022, I presented COU as our school’s representative at the Gangwon-region SW-oriented University cooperation workshop. I introduced the design and implementation of a platform that operators could customize, deploy, and run in their own environment.
We documented the platform in "Design and Implementation of Coding Platform Using Open-Source Software," published at ACK 2022. The paper describes the separation of Vue.js and Django APIs, the roles of individual containers, and execution through Docker Compose. It also presents the GCP results for creating problems, submitting code, and viewing judging results.
We also showcased COU as our school’s representatives at the 2022 SW Talent Festival, where it was selected as an outstanding work. I ran a booth, demonstrated the service, and presented it on stage, showing the implemented flow from solving problems to submitting code and checking judging results.
My first attempt at founding a business involved product planning and team management, administrative work, and preparing applications for support programs. Alongside implementing features, I had to decide what to build, coordinate roles and schedules, and consider what the project needed to keep going. COU is particularly meaningful to me because it broadened my development experience into a wider perspective on products, teams, and business.
The design and implementation are described in Design and Implementation of Coding Platform Using Open-Source Software.