MINT S.p.A (ARM / AdTech) — prep map
Preparation map for the MINT interview, built from 00_interview_debrief.md. Same format as links.md and links_2.md: tick the box once reviewed, bold is the primary note.
Domain: Advertising Resource Management — a marketing platform where advertisers top up a balance, run campaigns, and track spend and results. Expect examples to be framed in that language: campaigns, budgets, spend, attribution.
Weighting from the debrief. The AI half carries the most weight — one note-taker says they asked almost only about AI. But DDD and dependency-injector came up independently twice, so those are the non-AI items to drill hardest. Everything else is table stakes you should be able to discuss but probably won’t be grilled on.
Tier 1 — near-certain, drill these
AI: RAG, token optimization, caching, MCP, tool-call optimization
Explicitly listed as what they mostly asked about.
- RAG end to end — ingestion, chunking, retrieval, generation
- Hybrid search + reranking — the “make RAG production-grade” answer
- Token / cost optimization — the thing they named directly
- Caching (prompt / exact / semantic) — three distinct layers, don’t conflate
- MCP — including the 2026-07-28 stateless-core revision
- Tool-call optimization at scale — hundreds of tools, context budget
The answer they’re probing for on hundreds of tools: you don’t put them all in context. Tool selection accuracy degrades past roughly 20-40 tools. Options: retrieve a relevant tool subset per request (RAG over tool descriptions), group tools behind fewer coarse tools with a mode parameter, split across MCP servers the client loads per task, or route to a specialised agent with its own narrow tool set. Then note that tool descriptions are prompt tokens on every call, so their length is a cost line.
DDD: Repository and Unit of Work
Called “a must”, raised twice.
- Repository + Unit of Work — the two patterns named explicitly
- DDD building blocks — entity, value object, aggregate, bounded context
Have ready: SQLAlchemy’s
Sessionis a Unit of Work with an identity map — so “we use SQLAlchemy” already means you have one, and an explicitUnitOfWorkclass is about controlling the transaction boundary and making it testable, not about adding a missing capability. In ARM terms: debiting a campaign budget and writing a spend record must commit or roll back together.
dependency-injector
“The whole project uses it — what it is, what it’s for, what it does.”
- DI containers and the
dependency-injectorlibrary
Know concretely:
SingletonvsFactoryvsResource(the one with teardown, for pools),Configuration,Selectorfor config-driven implementation choice,container.wire(modules=[...])and why forgetting a module silently breaks injection, and.override()for tests. The strongest argument for a container over FastAPIDepends():Depends()can’t wire a Celery task or a Kafka consumer, and this project has both.
AI agents, LangChain, testing agents
- What an agent is — and when a workflow is better
- LangChain / LangGraph 1.0 — middleware, durable execution
- How to test agents — asked explicitly
Testing agents, condensed: mock the tools so runs are deterministic; assert on the trajectory (which tools were called, in what order) not the exact text; keep a curated regression set scored on outcome; add adversarial cases; and put cost and step-count budgets in CI so a regression that doubles spend fails the build.
Multi-agent, knowledge graph, orchestration
- Multi-agent patterns — and why one agent is often better
- Knowledge graphs / GraphRAG
Tier 2 — explicitly named, expect a question each
Microservices, Saga, retries
- Saga pattern — named directly, with “how to test”
- Retries when a microservice dies — named directly
- Microservices testing — contract tests are the answer they want
Saga + retries together: at-least-once delivery means every step must be idempotent, and a saga step that fails after side effects needs a compensating transaction. In ARM terms: reserving budget, charging, and recording spend across services — if the charge fails, the reservation must be released.
Celery, Kafka
- Celery — named directly
- Kafka topics and partitioning — named directly
Partitioning is the likely question. The partition key determines ordering and parallelism: same key means same partition means ordered. For ARM, keying by
campaign_idkeeps a campaign’s spend events ordered while allowing parallelism across campaigns. Note that ZooKeeper was removed in Kafka 4.0 — KRaft is the only mode — and that consumer count above partition count leaves consumers idle.
Async, threading, multiprocessing
- async / asyncio — event loop, coroutines
- threads vs multiprocessing vs async — GIL, and free-threading in 3.14
AI in your own work
- How you use AI — “you need to give a solid answer”
- Interest in Python and architecture reading — they check for this
Books to be able to name and say one real thing about: Evans or Vernon on DDD, Cosmic Python (Percival & Gregory) — which is the Python Repository/UoW/DDD book and directly relevant here, Fowler’s Patterns of Enterprise Application Architecture for Repository and UoW, Kleppmann’s Designing Data-Intensive Applications. Naming Cosmic Python specifically will land well given the stack.
Tier 3 — on the list, be conversational
- FastAPI — pyq/backend/06_web_frameworks/fastapi/00_fastapi_overview.md, dependencies, async
- Django — pyq/backend/06_web_frameworks/django/README.md
- REST API design — pyq/backend/07_rest_apis/05_rest_principles.md, idempotency, versioning
- Event-driven architecture — pyq/backend/13_architecture_design/19_event_driven_architecture.md
- Structured outputs / tool calling — pyq/ai_ml/10_agents_orchestration/08_function_calling_and_structured_output.md, validation
- Guardrails — pyq/ai_ml/14_guardrails_safety/02_guardrails_and_output_validation.md, prompt injection
- Prompt versioning / CI gates — pyq/ai_ml/15_mlops_llmops/01_experiment_tracking_and_registry.md, online eval
- AI observability — pyq/ai_ml/15_mlops_llmops/03_llm_observability.md, OpenTelemetry
- Rate limiting — pyq/backend/13_architecture_design/17_rate_limiting_algorithms.md
- Observability generally — pyq/backend/15_observability/08_three_pillars.md, structured logging
- AWS — pyq/backend/19_cloud_aws/_interview_essentials.md
- Docker — pyq/backend/16_docker/01_docker.md
- Kubernetes — pyq/backend/17_kubernetes/01_kubernetes_basics.md
- Terraform — pyq/backend/18_iac/terraform/01_terraform_state.md
- SQL — pyq/backend/08_databases/sql/01_sql_fundamentals.md, indexes
- ETL / data pipelines — pyq/backend/29_data_engineering/01_spark_databricks/01_spark_architecture.md, pandas
- TypeScript — pyq/frontend/04_typescript/README.md
Not covered in these notes
Be honest if asked rather than bluffing:
| Item | Note |
|---|---|
| Go | listed in the stack; no notes here. Likely secondary for a Python role — say you’d pick it up, and that you understand goroutines/channels conceptually if you do. |
| Scala | same; almost certainly legacy or data-platform adjacent. |
| AdTech domain specifics | auctions, RTB, attribution windows, viewability. Worth 30 minutes of reading — knowing the vocabulary (impression, CPM, attribution, pacing) helps you frame answers in their language. |
Suggested order
If time is short, spend it in this order — it follows the debrief’s weighting:
- RAG + hybrid search + reranking, then tool-call optimization at scale and caching/token cost. This is where they concentrated.
- MCP, including the stateless-core change.
- dependency-injector — provider types, wiring, override for tests.
- Repository + Unit of Work, framed with SQLAlchemy’s session.
- Testing agents — trajectory assertions, mocked tools, regression sets.
- Saga + retries + idempotency as one connected answer.
- Kafka partitioning, Celery retries, async vs threads vs processes.
- How you use AI — rehearse it; they will ask, and a vague answer costs you.