JD Swipe

A sample report

“Tomasz W.” is fictional – the verdict comes from the real engine, the layout is exactly what you get. Recordings are not included in this example.

Build your own
Senior BFF Backend Engineer

Tomasz W.

finished 12/10/2026 · 8 min 31 s
Against the JDClose to the JD

Senior level confirmed in Kotlin, Java and Spring. Architecture not shown at the senior level the JD asks for. Basics in Observability, CI/CD and Cloud. The check compares the answers with the level this JD asks for – it does not place the candidate's level. Worth an interview – questions on Architecture below.

This compares the answers with the level your Job Description asks for – a hiring aid, not a decision about the person. Only core areas decide the summary; supporting areas are information.

Skill areas

required level from the job description
AreaRequiredResult
Kotlin · coreSeniorMeets the JD ✓4 of 4 at senior
Java · coreSeniorMeets the JD · one slip3 of 4 at senior – one wrong
Spring · coreSeniorMeets the JD ✓4 of 4 at senior
Architecture · coreSeniorBelow the JD level1 of 4 at senior · mid confirmed
Observability · supportingMidMeets the JD ✓4 of 4 at mid
CI/CD · supportingMidMeets the JD ✓3 of 4 at mid
Cloud · nice to haveMidBelow the JD level1 of 4 at mid · junior confirmed

How the check went

right wrong skipped · bar height = seconds on the card (max 60)

Kotlin
Java
Spring
Architecture
Observability
CI/CD
Cloud
Total 8 min 31 sAverage 13 s per cardFastest 6 s (Kotlin, right)Slowest 60 s (Architecture, timed out)

Observations

Observations, not verdicts. Decisions below were made by the recruiter.

  • Steady pace – 13 s per card on average, no card under 3 s.
  • Pace steady – no speeding up at the end.
  • Stayed on the page the whole time.
  • Voice: Explains answers clearly in their own words (3 of 3 solid). This supports the scores above.
okResponse times grow with difficulty and nothing looks unusual. No concerns.

For the interview

Architecture – where the check stopped at mid. Ask these, listen for trade-offs, not definitions.

  1. You have a BFF in front of six services and p99 latency doubled last week. Where do you look first, and what would you change in the BFF itself?
    Architecture · The check stopped at mid – this shows whether they reason about fan-out and caching at senior level.
  2. When would you let the BFF own data (a cache or a read model) and when is that a mistake? Give one example of each.
    Architecture · The missed card was about read-model ownership.
  3. A product team wants a GraphQL BFF per client; platform wants one REST gateway. What do you actually recommend, and what do you give up?
    Architecture · Trade-offs, not definitions.

Voice explanations

Recordings never change the verdict. They show whether the candidate can explain an answer in their own words.

matches the answer14 s· Kotlin · answered correctly in 9.0 s
A coroutine started in GlobalScope is cancelled automatically when the function that launched it returns.
“GlobalScope is not tied to any lifecycle, so the coroutine keeps running after the function returns – you have to cancel it yourself or use a structured scope.”
AI assessment: Explains structured concurrency in own words; matches the answer.
matches the answer11 s· Spring · answered correctly in 16.0 s
Spring Boot auto-configuration backs off when you define your own bean of the same type.
“Boot checks whether a bean of that type already exists and skips its own if it does – conditional on missing bean.”
AI assessment: Correct mechanism (@ConditionalOnMissingBean).
matches the answer16 s· Architecture · answered correctly in 19.0 s
A BFF that owns a read model for one client must be kept in sync by the services it aggregates.
“If the BFF keeps its own read model, something has to update it – usually events from the services, otherwise it goes stale.”
AI assessment: Right direction, hesitant on who owns the sync.
Details – cards, answers, sources, timings Every card the candidate saw, with the answer, time, our verified answer and the source. Here for completeness and for complaints – you will rarely need it.
1.Kotlin · Senior✓ correct9.0 s
A coroutine started in GlobalScope is cancelled automatically when the function that launched it returns.
Candidate answered True · the statement is True. GlobalScope coroutines live for the whole application; nothing cancels them when the launching function returns.
2.Kotlin · Senior✓ correct12.0 s
A coroutine started in GlobalScope is cancelled automatically when the function that launched it returns.
Candidate answered False · the statement is False. GlobalScope coroutines live for the whole application; nothing cancels them when the launching function returns.
3.Kotlin · Mid✓ correct6.0 s
A coroutine started in GlobalScope is cancelled automatically when the function that launched it returns.
Candidate answered True · the statement is True. GlobalScope coroutines live for the whole application; nothing cancels them when the launching function returns.
4.Kotlin · Senior✓ correct15.0 s
A coroutine started in GlobalScope is cancelled automatically when the function that launched it returns.
Candidate answered True · the statement is True. GlobalScope coroutines live for the whole application; nothing cancels them when the launching function returns.
5.Kotlin · Senior✓ correct8.0 s
A coroutine started in GlobalScope is cancelled automatically when the function that launched it returns.
Candidate answered False · the statement is False. GlobalScope coroutines live for the whole application; nothing cancels them when the launching function returns.
6.Java · Senior✓ correct11.0 s
A virtual thread that blocks on a synchronized block pins its carrier thread.
Candidate answered True · the statement is True. Blocking inside synchronized pins the carrier (JEP 444); ReentrantLock does not.
7.Java · Senior✓ correct14.0 s
A virtual thread that blocks on a synchronized block pins its carrier thread.
Candidate answered False · the statement is False. Blocking inside synchronized pins the carrier (JEP 444); ReentrantLock does not.
8.Java · Senior✗ wrong22.0 s
A virtual thread that blocks on a synchronized block pins its carrier thread.
Candidate answered True · the statement is False. Blocking inside synchronized pins the carrier (JEP 444); ReentrantLock does not.
9.Java · Mid✓ correct13.0 s
A virtual thread that blocks on a synchronized block pins its carrier thread.
Candidate answered True · the statement is True. Blocking inside synchronized pins the carrier (JEP 444); ReentrantLock does not.
10.Java · Senior✓ correct10.0 s
A virtual thread that blocks on a synchronized block pins its carrier thread.
Candidate answered False · the statement is False. Blocking inside synchronized pins the carrier (JEP 444); ReentrantLock does not.
11.Spring · Senior✓ correct12.0 s
Spring Boot auto-configuration backs off when you define your own bean of the same type.
Candidate answered False · the statement is False. Most auto-configurations are @ConditionalOnMissingBean, so a user-defined bean wins.
12.Spring · Mid✓ correct9.0 s
Spring Boot auto-configuration backs off when you define your own bean of the same type.
Candidate answered True · the statement is True. Most auto-configurations are @ConditionalOnMissingBean, so a user-defined bean wins.
13.Spring · Senior✓ correct16.0 s
Spring Boot auto-configuration backs off when you define your own bean of the same type.
Candidate answered True · the statement is True. Most auto-configurations are @ConditionalOnMissingBean, so a user-defined bean wins.
14.Spring · Senior✓ correct11.0 s
Spring Boot auto-configuration backs off when you define your own bean of the same type.
Candidate answered False · the statement is False. Most auto-configurations are @ConditionalOnMissingBean, so a user-defined bean wins.
15.Spring · Senior✓ correct7.0 s
Spring Boot auto-configuration backs off when you define your own bean of the same type.
Candidate answered True · the statement is True. Most auto-configurations are @ConditionalOnMissingBean, so a user-defined bean wins.
16.Architecture · Senior✗ wrong21.0 s
A BFF that owns a read model for one client must be kept in sync by the services it aggregates.
Candidate answered False · the statement is True. Keeping a client-specific read model fresh is the BFF's job (events or refresh), not the upstream services'.
17.Architecture · Seniortimed out60.0 s
A BFF that owns a read model for one client must be kept in sync by the services it aggregates.
Candidate answered – (no answer) · the statement is False. Keeping a client-specific read model fresh is the BFF's job (events or refresh), not the upstream services'.
18.Architecture · Seniorskipped18.0 s
A BFF that owns a read model for one client must be kept in sync by the services it aggregates.
Candidate answered – (skipped) · the statement is False. Keeping a client-specific read model fresh is the BFF's job (events or refresh), not the upstream services'.
19.Architecture · Senior✓ correct19.0 s
A BFF that owns a read model for one client must be kept in sync by the services it aggregates.
Candidate answered True · the statement is True. Keeping a client-specific read model fresh is the BFF's job (events or refresh), not the upstream services'.
20.Architecture · Mid✓ correct14.0 s
A BFF that owns a read model for one client must be kept in sync by the services it aggregates.
Candidate answered True · the statement is True. Keeping a client-specific read model fresh is the BFF's job (events or refresh), not the upstream services'.
21.Observability · Mid✓ correct10.0 s
A trace span's parent id is enough to reconstruct the full call tree without timestamps.
Candidate answered True · the statement is True. The parent id gives the tree shape; timestamps are still needed for ordering siblings and durations.
22.Observability · Mid✓ correct13.0 s
A trace span's parent id is enough to reconstruct the full call tree without timestamps.
Candidate answered False · the statement is False. The parent id gives the tree shape; timestamps are still needed for ordering siblings and durations.
23.Observability · Mid✓ correct11.0 s
A trace span's parent id is enough to reconstruct the full call tree without timestamps.
Candidate answered True · the statement is True. The parent id gives the tree shape; timestamps are still needed for ordering siblings and durations.
24.Observability · Mid✓ correct12.0 s
A trace span's parent id is enough to reconstruct the full call tree without timestamps.
Candidate answered True · the statement is True. The parent id gives the tree shape; timestamps are still needed for ordering siblings and durations.
25.Observability · Junior✓ correct8.0 s
A trace span's parent id is enough to reconstruct the full call tree without timestamps.
Candidate answered True · the statement is True. The parent id gives the tree shape; timestamps are still needed for ordering siblings and durations.
26.CI/CD · Mid✓ correct9.0 s
A pipeline cache keyed only on the branch name is safe to share between pull requests.
Candidate answered True · the statement is True. Two PRs on different branches never share such a key, and one branch's cache can leak stale artefacts.
27.CI/CD · Mid✓ correct12.0 s
A pipeline cache keyed only on the branch name is safe to share between pull requests.
Candidate answered False · the statement is False. Two PRs on different branches never share such a key, and one branch's cache can leak stale artefacts.
28.CI/CD · Mid✓ correct15.0 s
A pipeline cache keyed only on the branch name is safe to share between pull requests.
Candidate answered True · the statement is True. Two PRs on different branches never share such a key, and one branch's cache can leak stale artefacts.
29.CI/CD · Junior✓ correct7.0 s
A pipeline cache keyed only on the branch name is safe to share between pull requests.
Candidate answered True · the statement is True. Two PRs on different branches never share such a key, and one branch's cache can leak stale artefacts.
30.CI/CD · Midskipped11.0 s
A pipeline cache keyed only on the branch name is safe to share between pull requests.
Candidate answered – (skipped) · the statement is False. Two PRs on different branches never share such a key, and one branch's cache can leak stale artefacts.
31.Cloud · Mid✗ wrong20.0 s
An S3 bucket policy can grant access to a principal in another AWS account.
Candidate answered False · the statement is True. Cross-account access via bucket policy is standard; the principal still needs IAM permission on its side.
32.Cloud · Mid✓ correct14.0 s
An S3 bucket policy can grant access to a principal in another AWS account.
Candidate answered True · the statement is True. Cross-account access via bucket policy is standard; the principal still needs IAM permission on its side.
33.Cloud · Mid✗ wrong23.0 s
An S3 bucket policy can grant access to a principal in another AWS account.
Candidate answered True · the statement is False. Cross-account access via bucket policy is standard; the principal still needs IAM permission on its side.
34.Cloud · Junior✓ correct9.0 s
An S3 bucket policy can grant access to a principal in another AWS account.
Candidate answered True · the statement is True. Cross-account access via bucket policy is standard; the principal still needs IAM permission on its side.
35.Cloud · Midskipped10.0 s
An S3 bucket policy can grant access to a principal in another AWS account.
Candidate answered – (skipped) · the statement is False. Cross-account access via bucket policy is standard; the principal still needs IAM permission on its side.