Mykhailo Pavlov
Back to Projects

FMFI Schedule Manager

Released
Released Dec 2024
C++17CMakeGoogleTestCLIData StructuresUnit Testing

About the Project

Why I Built This

Choosing courses at FMFI usually involves a messy spreadsheet and a lot of guessing. I wanted to build something that actually prevents you from signing up for two classes at the same time.

I chose C++17 for this project intentionally. Most of my work is in Python or TypeScript, so I wanted to force myself to deal with memory management, strict typing, and build systems without a safety net. It was a good reminder of what's happening under the hood.

How It Works

The core logic revolves around interval checking. When you try to add a course, the EventManager scans your existing timeline for overlaps. If there's a collision, it rejects the event.

I structured the code using Manager classes (EventManager, PersonManager) to keep the business logic separate from data storage. It's not a microservice architecture, but it taught me about separation of concerns without overengineering a local CLI tool.

The Hard Parts

  • Memory Safety: Managing pointers without leaking memory was tricky. I relied heavily on RAII principles to clean up resources automatically.
  • Build System: CMake is powerful but verbose. Configuring it to link GoogleTest correctly took more time than I expected.
  • Testing: I wrote unit tests with GoogleTest for the date validation and collision logic. Catching edge cases (like events spanning midnight) early saved me a lot of debugging later.

Current State

It's a console application. There's no GUI, because I'd rather spend time on the logic than fighting with UI libraries. It supports importing/exporting courses via text files and has basic role-based access (Admin vs. User).

It's not a product I'm selling, but it's a solid reference for how I handle data structures and system design when performance and control matter more than development speed.

What I'd Do Differently

If I revisited this today, I'd probably swap the file I/O for SQLite to handle concurrent writes better. I'd also add a CI pipeline to run the tests on every push—something I learned to appreciate after working with Python pipelines.