Small timebox
The design had to be understandable and complete within the scope of a short technical assessment.
Case Study · International Engineering Assessment
A deliberately small full-stack assessment where the real engineering work was deciding what not to build, separating responsibilities, validating behavior and using AI without outsourcing judgment.
01 / Context
The project was built for a Junior Software Engineer technical assessment. The visible requirement was simple: a calculator with a React interface and a Go API. The engineering goal was broader: produce a solution that was correct, readable, testable and easy to explain inside a deliberately small timebox.
02 / The real challenge
A calculator is easy to overengineer because almost any architectural pattern can be justified in theory. The harder decision was to keep only the structure that improved correctness and testability while resisting frameworks, abstractions and features that did not solve a requirement.
03 / Constraints that shaped the solution
The design had to be understandable and complete within the scope of a short technical assessment.
Frontend and backend needed a clean contract without adding infrastructure that the exercise did not require.
The result needed tests, type checking, builds and integration verification rather than relying on manual demonstration.
AI was allowed, but generated suggestions still had to be reviewed, adapted and validated before inclusion.
04 / Small architecture, explicit boundaries
Each layer has one obvious responsibility. The design stays intentionally boring in the best sense: there is little hidden behavior and every boundary can be tested independently.
Local component state owns inputs, operation selection, loading state and user feedback.
A small TypeScript module isolates the POST request and maps API or network failures into user-facing errors.
The handler owns routing, strict JSON decoding, validation, status codes and response serialization.
Pure calculation rules live outside HTTP and expose explicit domain errors for invalid operations and results.
The frontend calls a relative /api path while Vite proxies requests to the Go server during development.
GitHub Actions verifies backend, frontend and the complete development path before changes are considered healthy.
05 / Deliberate trade-offs
The strongest decisions in the project are the missing dependencies and abstractions.
POST /api/calculate handles every required operation through one explicit request contract.
net/http and encoding/json are enough for a single endpoint, so a backend framework would add weight without value.
One form does not need a global state-management library.
Go and Node already provide a direct local setup; containers would solve a problem the assessment did not have.
Optional calculator features were intentionally excluded so effort stayed on correctness and engineering quality.
Coverage commands exist, but the design favors meaningful behavioral confidence over chasing an arbitrary percentage.
06 / TESTING
The backend tests the calculation domain independently from HTTP, including all four operations, division by zero, unsupported operations and non-finite values. HTTP tests then verify successful requests, malformed or incomplete payloads, unknown fields and method handling. On the frontend, Testing Library and Vitest exercise user behavior, validation before network calls, successful results, backend errors and network failures.
07 / CI
The pipeline mirrors the architecture instead of collapsing everything into one generic build job.
Checks Go formatting, runs tests with coverage output and builds the server.
Installs dependencies, runs strict TypeScript checking, behavioral tests, coverage and the production build.
Starts both development servers, verifies the Go endpoint directly, then repeats the request through Vite's /api proxy and expects 6 × 7 = 42.
08 / AI-ASSISTED DEVELOPMENT
AI was used across planning, architecture, implementation, testing, documentation and review. Meaningful prompts are preserved in the public repository. The important rule was ownership: suggestions were not accepted because they came from an AI tool; they were reviewed against the requirements, adapted where necessary and then validated by tests and builds.
09 / What the repository proves
The result is intentionally more valuable as engineering evidence than as a calculator.
Architecture, source code, tests, technical design, CI and AI prompt history can all be reviewed directly.
TypeScript strict checking, strict JSON decoding and typed domain errors reduce ambiguous behavior across the stack.
Domain logic, HTTP concerns, API communication and UI behavior can be reasoned about independently.
The repository does not depend on a one-time demo: GitHub Actions rebuilds and revalidates the solution on changes.
10 / LESSONS