mirror of
https://github.com/tiennm99/cv.git
synced 2026-10-11 03:13:18 +00:00
274 lines
9.9 KiB
YAML
274 lines
9.9 KiB
YAML
# yaml-language-server: $schema=https://raw.githubusercontent.com/rendercv/rendercv/refs/tags/v2.8/schema.json
|
||
cv:
|
||
name: Tien Nguyen Minh
|
||
headline: Senior Java Software Engineer | Java 21, Real-Time Backends, CI/CD, AI-Assisted Delivery
|
||
location: HCMC, Vietnam
|
||
email: tiennm99@outlook.com
|
||
phone: (+84) 869 156 149
|
||
website: https://miti99.com/
|
||
social_networks:
|
||
- network: LinkedIn
|
||
username: miti99
|
||
- network: GitHub
|
||
username: tiennm99
|
||
- network: Telegram
|
||
username: tiennm5
|
||
sections:
|
||
experience:
|
||
- company: ZingPlay Game Studios, VNG Corp.
|
||
position: Senior Software Engineer
|
||
date:
|
||
start_date: 2020-07
|
||
end_date: present
|
||
location: HCMC, Vietnam
|
||
summary: Progressed from Game Programming Fresher to Senior Software Engineer over 5+ years building and operating production backends for real-time multiplayer games, collaborating daily with client, QA, release, and product stakeholders.
|
||
highlights:
|
||
- "[Chaos Age 2](https://play.google.com/store/apps/details?id=vn.zps.tl2): Built and operated gameplay systems, battle synchronization, matchmaking, payments/webpay, admin tooling, automated tests, and delivery pipelines as primary Java backend contributor"
|
||
- "Built and maintained Java 21 backend modules with Netty/Vert.x, Couchbase, Redis, Kafka, Gradle, JUnit 5, Mockito, Docker-based local dependencies, and GitLab CI pipelines; used automated tests around gameplay, payment, and release-critical flows"
|
||
- "Applied OOP and design patterns to reusable packet handlers, gameplay workflows, payment/config modules, and admin tooling for live products"
|
||
- "[Burkozel](https://play.google.com/store/apps/details?id=zps.games.burkozel), [Show](https://play.google.com/store/apps/details?id=zps.games.show), and [Sky Garden](https://play.google.com/store/apps/details?id=vn.kvtm.js): Diagnosed and fixed live concurrency issues; maintained backend gameplay events, payment/config updates, metrics, and release support"
|
||
- "Built an internal Claude Code plugin/skill marketplace and Java game-server scaffolding guidance, standardizing packet-handler generation, framework usage, and AI-assisted delivery workflows"
|
||
projects:
|
||
- name: "[Store Scraper Bot](https://github.com/tiennm99/store-scraper-bot) / [Java original](https://github.com/tiennm99/store-scraper-bot/tree/e794000df38c35d3e1a9aa0545d4573a2298a8a9)"
|
||
start_date: 2025-11
|
||
end_date: present
|
||
summary: Telegram bot for tracking Apple App Store and Google Play app updates; original Java 21 implementation later ported to Node.js/Vercel.
|
||
highlights:
|
||
- "Built Java bot with Gradle, MongoDB, command-pattern Telegram handlers, reusable repository abstractions, Docker Compose, and JUnit scraper tests; ported to serverless Node.js with Upstash Redis, Vercel Cron, and GitHub Actions checks"
|
||
- name: "[Gomoku](https://github.com/tiennm99dev/gomoku)"
|
||
date: 2026
|
||
summary: Multiplayer Gomoku game with authoritative Go WebSocket backend, protobuf binary messages, Docker Compose, GitHub Actions CI, and Phaser client.
|
||
highlights:
|
||
- "Designed server-authoritative gameplay (move validation, win detection, PVP/PVE/spectator modes, minimax AI with alpha-beta pruning) with Go tests over game, lobby, and codec flows; CI runs vet, tests, and builds"
|
||
- name: "[miti99bot](https://github.com/tiennm99/miti99bot)"
|
||
start_date: 2026-05
|
||
end_date: present
|
||
summary: Modular Go Telegram bot framework on AWS Lambda (SAM) with pluggable KV storage providers (Firestore/DynamoDB) and AI integration with rate limiting.
|
||
highlights:
|
||
- "Covered modules, storage providers, and AI rate limiting with 53 Go test files; GitHub Actions CI plus OIDC-authenticated AWS deploy pipeline"
|
||
skills:
|
||
- label: Languages
|
||
details: Java, Go, JavaScript/TypeScript, Shell
|
||
- label: Frameworks & Libraries
|
||
details: Netty, Vert.x, Spring Boot, JUnit 5, Mockito, Cocos2d-x, Godot, WebSocket
|
||
- label: Data & Messaging
|
||
details: Couchbase, Redis, MySQL, Kafka, ClickHouse
|
||
- label: Infrastructure & DevOps
|
||
details: Docker, GitLab CI, GitHub Actions, Linux, AWS Lambda/SAM, Cloudflare Workers, Vercel
|
||
- label: Architecture
|
||
details: OOP and design patterns, reusable components, real-time multiplayer game-server architecture, event-driven design
|
||
- label: Delivery Practices
|
||
details: Unit testing, code review, production debugging, continuous integration and delivery (CI/CD), DevOps collaboration, AI-assisted development workflows
|
||
education:
|
||
- institution: Ho Chi Minh City University of Technology
|
||
area: Computer Science and Engineering
|
||
degree: B.E.
|
||
date:
|
||
start_date: 2017-09
|
||
end_date: 2023-06
|
||
location: HCMC, Vietnam
|
||
highlights:
|
||
- "GPA: 8.0/10 — Academic Excellence Scholarship; Five Good Student Award"
|
||
- "Thesis: Survival2D — multiplayer Battle Royale game server in Java (Netty/WebSocket) with authoritative architecture, FlatBuffers serialization, behavior-tree AI bots, and server-side anti-cheat"
|
||
design:
|
||
theme: engineeringresumes
|
||
page:
|
||
top_margin: 0.45in
|
||
bottom_margin: 0.45in
|
||
left_margin: 0.55in
|
||
right_margin: 0.55in
|
||
header:
|
||
photo_width: 3cm
|
||
space_below_name: 0.3cm
|
||
space_below_headline: 0.3cm
|
||
space_below_connections: 0.3cm
|
||
section_titles:
|
||
space_above: 0.3cm
|
||
space_below: 0.2cm
|
||
sections:
|
||
space_between_regular_entries: 0.7em
|
||
space_between_text_based_entries: 0.2em
|
||
typography:
|
||
line_spacing: 0.5em
|
||
font_size:
|
||
body: 10pt
|
||
# page:
|
||
# size: us-letter
|
||
# top_margin: 0.7in
|
||
# bottom_margin: 0.7in
|
||
# left_margin: 0.7in
|
||
# right_margin: 0.7in
|
||
# show_footer: true
|
||
# show_top_note: true
|
||
# colors:
|
||
# body: rgb(0, 0, 0)
|
||
# name: rgb(0, 79, 144)
|
||
# headline: rgb(0, 79, 144)
|
||
# connections: rgb(0, 79, 144)
|
||
# section_titles: rgb(0, 79, 144)
|
||
# links: rgb(0, 79, 144)
|
||
# footer: rgb(128, 128, 128)
|
||
# top_note: rgb(128, 128, 128)
|
||
# typography:
|
||
# line_spacing: 0.6em
|
||
# alignment: justified
|
||
# date_and_location_column_alignment: right
|
||
# font_family:
|
||
# body: Source Sans 3
|
||
# name: Source Sans 3
|
||
# headline: Source Sans 3
|
||
# connections: Source Sans 3
|
||
# section_titles: Source Sans 3
|
||
# font_size:
|
||
# body: 10pt
|
||
# name: 30pt
|
||
# headline: 10pt
|
||
# connections: 10pt
|
||
# section_titles: 1.4em
|
||
# small_caps:
|
||
# name: false
|
||
# headline: false
|
||
# connections: false
|
||
# section_titles: false
|
||
# bold:
|
||
# name: true
|
||
# headline: false
|
||
# connections: false
|
||
# section_titles: true
|
||
# links:
|
||
# underline: false
|
||
# show_external_link_icon: false
|
||
# header:
|
||
# alignment: center
|
||
# photo_width: 3.5cm
|
||
# photo_position: left
|
||
# photo_space_left: 0.4cm
|
||
# photo_space_right: 0.4cm
|
||
# space_below_name: 0.7cm
|
||
# space_below_headline: 0.7cm
|
||
# space_below_connections: 0.7cm
|
||
# connections:
|
||
# phone_number_format: national
|
||
# hyperlink: true
|
||
# show_icons: true
|
||
# display_urls_instead_of_usernames: false
|
||
# separator: ''
|
||
# space_between_connections: 0.5cm
|
||
# section_titles:
|
||
# type: with_partial_line
|
||
# line_thickness: 0.5pt
|
||
# space_above: 0.5cm
|
||
# space_below: 0.3cm
|
||
# sections:
|
||
# allow_page_break: true
|
||
# space_between_regular_entries: 1.2em
|
||
# space_between_text_based_entries: 0.3em
|
||
# show_time_spans_in:
|
||
# - experience
|
||
# entries:
|
||
# date_and_location_width: 4.15cm
|
||
# side_space: 0.2cm
|
||
# space_between_columns: 0.1cm
|
||
# allow_page_break: false
|
||
# short_second_row: true
|
||
# summary:
|
||
# space_above: 0cm
|
||
# space_left: 0cm
|
||
# highlights:
|
||
# bullet: •
|
||
# nested_bullet: •
|
||
# space_left: 0.15cm
|
||
# space_above: 0cm
|
||
# space_between_items: 0cm
|
||
# space_between_bullet_and_text: 0.5em
|
||
# templates:
|
||
# footer: '*NAME -- PAGE_NUMBER/TOTAL_PAGES*'
|
||
# top_note: '*LAST_UPDATED CURRENT_DATE*'
|
||
# single_date: MONTH_ABBREVIATION YEAR
|
||
# date_range: START_DATE – END_DATE
|
||
# time_span: HOW_MANY_YEARS YEARS HOW_MANY_MONTHS MONTHS
|
||
# one_line_entry:
|
||
# main_column: '**LABEL:** DETAILS'
|
||
# education_entry:
|
||
# main_column: |-
|
||
# **INSTITUTION**, AREA
|
||
# SUMMARY
|
||
# HIGHLIGHTS
|
||
# degree_column: '**DEGREE**'
|
||
# date_and_location_column: |-
|
||
# LOCATION
|
||
# DATE
|
||
# normal_entry:
|
||
# main_column: |-
|
||
# **NAME**
|
||
# SUMMARY
|
||
# HIGHLIGHTS
|
||
# date_and_location_column: |-
|
||
# LOCATION
|
||
# DATE
|
||
# experience_entry:
|
||
# main_column: |-
|
||
# **COMPANY**, POSITION
|
||
# SUMMARY
|
||
# HIGHLIGHTS
|
||
# date_and_location_column: |-
|
||
# LOCATION
|
||
# DATE
|
||
# publication_entry:
|
||
# main_column: |-
|
||
# **TITLE**
|
||
# SUMMARY
|
||
# AUTHORS
|
||
# URL (JOURNAL)
|
||
# date_and_location_column: DATE
|
||
locale:
|
||
language: english
|
||
# last_updated: Last updated in
|
||
# month: month
|
||
# months: months
|
||
# year: year
|
||
# years: years
|
||
# present: present
|
||
# month_abbreviations:
|
||
# - Jan
|
||
# - Feb
|
||
# - Mar
|
||
# - Apr
|
||
# - May
|
||
# - June
|
||
# - July
|
||
# - Aug
|
||
# - Sept
|
||
# - Oct
|
||
# - Nov
|
||
# - Dec
|
||
# month_names:
|
||
# - January
|
||
# - February
|
||
# - March
|
||
# - April
|
||
# - May
|
||
# - June
|
||
# - July
|
||
# - August
|
||
# - September
|
||
# - October
|
||
# - November
|
||
# - December
|
||
settings:
|
||
current_date: "2026-06-11"
|
||
render_command:
|
||
design:
|
||
locale:
|
||
typst_path: miti99.typ
|
||
pdf_path: miti99.pdf
|
||
markdown_path: README.md
|
||
html_path: index.html
|
||
png_path: miti99.png
|
||
dont_generate_markdown: false
|
||
dont_generate_html: false
|
||
dont_generate_typst: false
|
||
dont_generate_pdf: false
|
||
dont_generate_png: true
|
||
bold_keywords: []
|