This is what your team receives
Every Coderbase interview produces a detailed, auditable report card with objective scoring, criteria checklists, interviewer notes, and candidate code. This is a sample with fictitious data.
Ada Lovelace
15 Mar 2026 · Senior Full-Stack Engineer (v1.2) · Acme Engineering
Interviewer: Jordan Ellery
The overall score, and where it sits among other candidates on the same format.
Each question is scored on its own, with how much help the candidate needed.
Overall rating 4.2 out of 5
How to read this report: /learn/how-to-read-a-report
The interviewer's write-up, in plain language. The interviewer makes every judgment and signs it.
Overall notes
Ada worked through the architecture and code review questions on her own, set up sound data models and found the major concurrency flaws. The coding question needed some steering on the commit graph and on time, but the design she reached was technically sound. Across all three questions, Ada justified her trade-offs with specific production constraints.
Every criterion is one observable behavior, ticked as it happens. The score comes from the ticks.
Review this pull request and provide feedback
Interviewer's notes
Ada opened by identifying the missing transaction boundary in the payment handler, noting that concurrent requests could charge a customer twice.
- Proposed wrapping the database writes in a serializable transaction with a unique idempotency key.
- Flagged the N+1 query in the notification loop and recommended batch fetching.
- Did not identify the time zone bug in the date comparison.
- Left review comments that named the exact lines and included code suggestions.
Criteria
- Met: Identifies the primary bug or anti-pattern in the code
- Met: Explains the impact on production (data loss, race condition, etc.)
- Met: Proposes a correct fix with appropriate trade-offs
- Not met: Identifies secondary issues (performance, style, naming)
- Met: Comments are constructive and actionable
- Met: Considers edge cases and error handling
Bonuses
- Met: Suggests improvements beyond the immediate scope (testing, monitoring)
Implement a version control system in 2 weeks
Interviewer's notes
Ada structured the first implementation around files and, after a prompt about concurrent changes, designed a three-way merge from the common ancestor out loud. The data model used a directed acyclic graph for commit history and content-addressable storage with SHA-256 hashes, storing diffs rather than full snapshots. A good part of the session went on the command-line interface, which left less time to finish the merge logic. The commit graph needed moderate guidance from the interviewer.
Criteria
- Met: Designs a reasonable data model for commits and branches
- Not met: Implements basic branching and checkout
- Met: Implements commit history traversal (log)
- Met: Handles content-addressable storage correctly
- Not met: Implements merge with conflict detection
Bonuses
- Not met: Implements diff computation between commits
What the candidate wrote, as they left it.
class Repository {
private commits: Map<string, Commit> = new Map();
private branches: Map<string, string> = new Map();
private HEAD: string = "main";
init(): void {
const rootCommit = this.createCommit("Initial commit", {}, null);
this.branches.set("main", rootCommit.hash);
}
commit(message: string, changes: Record<string, string>): Commit {
const parentHash = this.branches.get(this.HEAD)!;
const parent = this.commits.get(parentHash)!;
const newTree = { ...parent.tree, ...changes };
const commit = this.createCommit(message, newTree, parentHash);
this.branches.set(this.HEAD, commit.hash);
return commit;
}
branch(name: string): void {
const currentHash = this.branches.get(this.HEAD)!;
this.branches.set(name, currentHash);
}
checkout(name: string): void {
if (!this.branches.has(name)) throw new Error(`Branch ${name} not found`);
this.HEAD = name;
}
log(limit = 10): Commit[] {
const result: Commit[] = [];
let hash: string | null = this.branches.get(this.HEAD) ?? null;
while (hash && result.length < limit) {
const commit = this.commits.get(hash)!;
result.push(commit);
hash = commit.parentHash;
}
return result;
}
private createCommit(
message: string,
tree: Record<string, string>,
parentHash: string | null,
): Commit {
const hash = this.computeHash(message, tree, parentHash);
const commit: Commit = { hash, message, tree, parentHash, timestamp: new Date() };
this.commits.set(hash, commit);
return commit;
}
private computeHash(
message: string,
tree: Record<string, string>,
parentHash: string | null,
): string {
const content = JSON.stringify({ message, tree, parentHash });
// Simplified hash – production would use SHA-256
let h = 0;
for (let i = 0; i < content.length; i++) {
h = ((h << 5) - h + content.charCodeAt(i)) | 0;
}
return Math.abs(h).toString(16).padStart(8, "0");
}
}Design a notification system for a social platform
Interviewer's notes
Ada began by validating scale constraints (10M DAU), latency targets (under 500 ms for push, under 2 s for email) and the supported notification types (mentions, follows, likes, system). Her architecture routed events through Kafka to a fan-out service, buffering them in per-user Redis sorted sets before delivery workers picked them up. She added dead-letter queues, exponential backoff for retries and circuit breakers for the email provider without prompting. She walked through fan-out for a celebrity account with sequence diagrams, and designed a time-windowed aggregation layer with Redis TTL keys to batch notifications.
Criteria
- Met: Clarifies requirements and constraints before designing
- Met: Proposes a scalable event-driven architecture
- Met: Addresses fan-out for high-follower-count users
- Met: Considers failure modes and retry strategies
- Met: Discusses trade-offs between push and pull models
Bonuses
- Met: Addresses notification batching or aggregation
- Met: Discusses monitoring, SLOs or observability
Every Coderbase interview produces a report like this. Ready to see what your candidates can really do?