I'm an intern at a small startup and have spent the last three months learning Java and Spring Boot by building small CRUD applications. I'd now like to tackle a more advanced backend project: a media pipeline where users upload videos, the system processes them with FFmpeg, and viewers receive multiple quality levels through HLS.
The project could eventually involve video transcoding, object storage, CDN delivery, webhooks or events, distributed processing, queues, background workers, retries, idempotency, and scaling for more uploads and viewers. My difficulty is figuring out where to start without trying to design the entire distributed system at once.
Would it be better to design the full architecture first, or build a small end-to-end version and add complexity gradually? How would you divide this project into stages, and what concepts should I learn before beginning each stage?
2 Answers
Treat the project like isolating one problem at a time. Begin with a single endpoint that accepts a video and saves it to disk. Once that works, add transcoding, then HLS playback, and only afterward introduce storage services, queues, workers, and scaling concerns.
For each stage, define a small success condition and test it before moving on. For example, first verify that an uploaded file can be retrieved, then verify that FFmpeg produces playable output, then verify that a player can switch between quality levels. This keeps infrastructure decisions from hiding basic application bugs.
Start with the smallest complete version you can build: accept one video upload, run FFmpeg inside the Spring Boot application, write the HLS playlist and segments to local disk, and play the result in a browser. Don’t add queues, webhooks, a CDN, or distributed workers until that basic path works.
Then introduce one boundary at a time. Move the files to object storage, make transcoding asynchronous with a queue, add job status tracking, and then implement retries and idempotency. Add a CDN near the end, since it mainly addresses delivery and caching at scale rather than the fundamentals of the pipeline.
A sensible progression is:
1. Upload and store a source video locally.
2. Transcode it into one HLS quality level.
3. Generate several resolutions and a master playlist.
4. Move source files and segments to object storage.
5. Run transcoding as a background job.
6. Add persistent job states, retry limits, and failure handling.
7. Add authentication, cleanup, monitoring, and access control.
8. Introduce CDN delivery and tune performance.
This leaves you with a working project after every stage and makes it much easier to identify which change caused a failure. Use test or licensed media while building, since accepting arbitrary public uploads can create copyright and moderation responsibilities.
That incremental approach also helps reveal the architecture instead of forcing you to guess it upfront. Plan enough to keep the first version simple, but expect to replace parts once real constraints become clear.
Thanks, this gives me a much clearer order to follow.

A simple architecture diagram showing upload, processing, storage, and playback is useful, but it should describe the current version rather than become a detailed design for every future feature.