Engineering brief Helsinki, Finland
01

Summary

Hung Thai

Team Lead, Software Engineer. Backend, Python and Django.

13 years in software, 9.5 of them at Inspectorio, a B2B SaaS platform for supply-chain quality and compliance, which I joined in its very early startup phase.

Based in
Helsinki, Finland
Status
Full right to work in Finland, 45-day notice period
Open to
Senior IC, lead and product-engineering roles
02

Outcomes

FigureMeasureScope
~290k / ~166kPurchase orders and inspections a month through the core backend I have built as a core member since 2017#1 committer on it (Oct 2026). Volumes as of 2026
1–2 min → ~2 sLab Test page loadPerformance programme I led, Apr–Jun 2025
6 weeksDisposition, from start of development to production3,000+ decisions recorded by Oct 2026
79kLab tests created, 56% through the integration API I rebuiltH1 2026
2 + 2Engineers promoted (one to staff, one to senior), plus backend engineers hiredAs squad lead, 2023–2026
03

Selected work

Case ADisposition: from email threads to a product in six weeks

Problem
When a lab test failed, the brand, supplier and factory negotiated what to do over email. There was no shared record, no rules on who decides, and no audit trail.
Role
Worked with the product manager on scope; designed the domain and built its core with the squad.
Action
  • Modelled it as a state machine with per-transition rules (who may act, and when). Notifications, audit and follow-up actions plug in as observers.
  • Wrote the technical design: data model, API, frontend/backend contract.

Lifecycle: Open → Response requested → Responded → Completed, with re-open. I wrote 21 of the module’s first 25 commits.

Result
In production after 6 weeks of development (Jan 2026). Enterprise rollout Apr 2026. 3,000+ decisions recorded.

Case BLab Test performance: 1–2 minutes to ~2 seconds

Problem
A major customer escalated Lab Test pages that took one to two minutes to load.
Role
Led the programme and wrote both analysis documents.
Action
  • Found the root causes: N+1 queries from missing prefetches, and one count query taking up to 90% of each request.
  • Fixed the list page, proposed reordering the frontend’s API calls, and split the detail-page work into sized tickets for the squad.
Result
List and detail responses from 1–2 min to ~2 s. Pre-production load test on data sized a year ahead: list p95 1.82 s, detail p95 ~1.4 s.

Case CIntegration API: rebuilt without breaking a single caller

Problem
The create-lab-test path that customers’ own systems call had to be refactored to support generic entities. 56% of lab tests arrive through it, so any behaviour change would break integrations.
Role
Owned the rebuild.
Action
  • Rebuilt the create path for generic entities behind the same contract, with end-to-end contract tests first.
  • Removed the old code path and, along the way, cut the queries per request (including N+1 on create).
  • Applied new validation only to callers who opt in.
Result
Shipped Sep 2025 with no contract change for existing callers. 79k lab tests in H1 2026, 56% through this API.
04

System map

Where the three cases sit in the platform I work on. Select A, B or C to jump to the case.

Customer systems call the integration API, which creates lab tests in the core Python/Django backend. The backend holds inspections and purchase orders, Lab Test, and the Disposition state machine, and uses PostgreSQL, Celery with Redis, and Kafka, on GCP with Kubernetes. Below, the decommissioned assignment service on AWS, whose logic moved into the core backend. GCP · Kubernetes, deployed via ArgoCD Customer systems their own integrations calls Integration API same contract C create 56% Core backend · Python / Django ~290k POs, ~166k inspections a month Inspections & purchase orders Lab Test 1–2 min → ~2 s B Disposition state machine · 6 weeks A writes PostgreSQL live migrations tasks Celery / Redis background work events Kafka to other services Assignment service · Flask, DynamoDB on AWS 2017–2019 · #1 committer · decommissioned logic moved in
Simplified. Shows only the parts the cases touch; internal module names are left out.
05

Career

Timeline: Web & Mobile Developer at Infory 2013 to 2015; Web Developer & RTB Solutions Engineer at MagicGroup 2015 to 2016; Inspectorio from 2017 as Software Engineer, Senior Software Engineer from 2022, technical lead of the squad from 2023, Team Lead from September 2025. Infory MagicGroup Inspectorio Web & mobile Web & RTB Software Engineer Senior Software Engineer Team Lead Technical lead of the squad, 2023 → 2013 14 15 16 2017 18 19 20 21 2022 23 24 25 2026 now
PeriodRoleWhere
Sep 2025 – nowTeam Lead, Software EngineerTechnical lead of the squad since 2023Inspectorio
2022 – 2025Senior Software EngineerInspectorio
2017 – 2021Software Engineer#1 committer on the assignment service (AWS era)Inspectorio
2015 – 2016Web Developer & RTB Solutions EngineerMagicGroup
2013 – 2015Web & Mobile DeveloperInfory
EducationBSc Computer & Information SciencesAuckland University of Technology

#1 committer on the main backend (Oct 2026).

06

Practice

  • PerformanceProfile first, count the queries, fix the query shape, then pin the fix with a test.Worst Inspection request paths: thousands of queries → ~20.
  • Safe change on live productionSchema migrations on live tables with no maintenance window. Data-fix commands with dry-run, handed to support with runbooks.Python 3.9 → 3.12 across 37 apps, Feb 2025.
  • AI-assisted, verification firstClaude Code and Cursor daily. Generated code stays a draft until review and tests pass.
07

Stack

  • Python
  • Django / DRF
  • PostgreSQL
  • Celery
  • Redis
  • Kafka
  • GCP
  • Docker
  • Kubernetes (via ArgoCD)
  • GitLab CI
  • Datadog
  • Sentry

Earlier: AWS (DynamoDB), Flask. I pick up frontend tasks (Angular/TypeScript) when the team needs it.