Extended the OpenCEP complex event processing engine with adaptive load shedding, tested on a "hot paths" query over Citi Bike trips. When latency goes over a target, a utility score ranks partial matches on six factors and the weakest are dropped before the expensive step. At half the baseline latency it still found 65 % of the matches. I worked on the architecture, the pattern-tree integration and the engine internals.
Software engineer / Espoo, Finland
Phuong Nguyen
I build backend and data systems, mostly in TypeScript and Python. I'm doing my MSc in Computer Science at Aalto University.
About
I spent a year at Viomba, a small Finnish ad-tech startup, where I built their ad crawler from scratch: the controller, the workers, the database layer and the admin dashboard. I'm now on the Big Data and Large-Scale Computing track at Aalto, working on distributed systems, stream processing and cloud infrastructure. Before that I did bachelor's degrees in Data Science and in Economics.
I like systems that handle a lot of data and keep running. Outside work I run a small homelab, tinker with ESP32 boards, and follow trains and public transport closely, which is where a lot of my project ideas come from.
Experience
A 12-person ad-tech startup. I owned the ad-snapshot crawler end to end and reported to the CTO, working with a DevOps engineer and an ML developer.
- Built a distributed web crawler from scratch. A controller hands out jobs (target site, crawl depth, link filters, stop conditions) to Puppeteer workers on AWS EC2, scaling to a few hundred workers at peak.
- Workers move through pages with human-like randomness to avoid bot detection, find ads, record iframes, sizes and metadata, de-duplicate and rank links, and send heartbeats so the controller can spot failed workers.
- Designed the MySQL data layer, using Prisma for most access and raw SQL for the large queries.
- Built the internal admin dashboard and APIs for jobs, tasks, domains and ads, used across the company.
- The crawl data fed the company's ML work, which combined it with eye-tracking data to estimate how much attention ads get.
Helped run weekly competitive programming contests for over 300 students across Vietnam. Built the landing pages and the contest platform's front end in React.
EducationAalto University
| Degree | Year |
|---|---|
| M.Sc. (Tech.), Computer ScienceBig Data and Large-Scale Computing track | 2027 (expected) |
| B.Sc. (Tech.), Data Science, with honours | 2025 |
| B.Sc., Economics and Business AdministrationAdvanced minor in Computer Science | 2023 |
Selected coursework
Cloud Software and Systems, Scalable Systems and Data Management, Programming Parallel Computers, Principles of Algorithmic Techniques, Declarative Programming, Cybersecurity, Operating Systems, Information Security, Software Engineering, Databases for Data Science, Machine Learning, Federated Learning, Introduction to Large Language Models, Theory of Computation, Data Structures and Algorithms.
Projects
Answering natural-language questions over a Nobel laureate knowledge graph in Kuzu. I led the pipeline design and built the few-shot example selection, the self-refinement loop and a validate-and-repair step on top of EXPLAIN. On a 10-question benchmark it went from 6 to 9 answered, and cache hits cut query generation from about 20 ms to under 1 ms.
Does the weather predict when a long-distance train will be late? I worked with 509,110 arrivals from 2018 to 2024, used time-ordered validation and gradient boosting, and checked the results with bootstrap intervals. Adding weather raised ROC-AUC on the 2024 test year from 0.675 to 0.701.
A full-stack library app. The frontend has JWT login, browsing, borrowing, reservations, returns, favourites and an admin dashboard. The backend is a Spring Boot REST API for books, copies, categories, reservations and user history.
Aalto Data Science Project with Droppe Oy. I worked on the standards-extraction module, using natural language processing to pull product standards out of more than 36,000 product entries.
Forgejo, AFFiNE, Jellyfin, a Minecraft server and a Discord bot, mostly as Docker containers behind a Caddy reverse proxy on a Hetzner VPS. Cron jobs report the server's state and restart services when they fail. Now building a Kubernetes cluster across my own machines.
More course and personal work
| Project | What it is |
|---|---|
| CI/CD pipelinesCloud Software and Systems | GitLab CI pipelines that lint, test, build and publish a Python package to Google Artifact Registry on a git tag, and deploy a documentation site to Google Cloud Storage, with a staging build on Cloud Run. |
| Vaccine distribution databaseDatabases, group project | A 12-table PostgreSQL schema loaded from spreadsheet data, with SQL queries and analysis notebooks. |
| Used-car price predictionMachine Learning | Data cleaning, analysis and models from linear regression to random forest and XGBoost. |
| Data dashboard and interior design appsProgramming Studio, Scala | Two desktop applications with JSON data handling. |
| Dungeon crawlerC++ team project | An object-oriented game built as a team. |
| Home automationPersonal | A temperature sensor tied to heater and lighting presets, including a simulated sunrise, with a web interface on an ESP32. |
Skills
| Languages | TypeScript, JavaScript, Python, SQL. Also used: Java, Scala, C, C++, Rust |
| Backend | Node.js, NestJS, Express, Spring Boot, Prisma, REST APIs, JWT auth, Puppeteer |
| Frontend | React, Redux, Vue, Mantine, Tailwind |
| Databases | PostgreSQL, MySQL, Redis, Kuzu |
| Cloud and DevOps | AWS (EC2, S3, IAM), Google Cloud (Cloud Run, Cloud Build, Artifact Registry, Cloud Storage), Docker, Docker Compose, Linux, Caddy, nginx, GitLab CI/CD, Kubernetes, OpenTofu |
| Data and ML | pandas, scikit-learn, XGBoost, PyTorch, NLTK, DSPy, marimo, Jupyter |
| Concepts | Distributed systems, stream processing, parallel computing, scalable data processing, federated learning, LLM pipelines |
| Spoken languages | Vietnamese (native), English (fluent) |