← Atlassian Interview Insights

Atlassian·Software Engineer·Onsite - System Design / Architecture·Senior

Senior
Jul 2026

Summary

System design round at Atlassian focused entirely on building a tagging system with a heavy emphasis on REST API design. The problem felt deceptively scoped but the edge cases and concurrency bits made it genuinely tricky.

Questions Asked (4)

Q1

Design a tagging system (like tagging pages or issues) with a focus on REST API design. Cover CRUD for tags, attaching and detaching tags from entities, listing tags per entity, and searching entities by tag with AND/OR semantics.

System DesignAPI & IntegrationsData Modeling
Author's notes

This is the kind of question where you think you've got it in the first five minutes and then you don't.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and constraints, then design a RESTful API with clear resource modeling and standard HTTP methods. Focus on the core operations: tag CRUD, attaching/detaching tags to entities, listing tags per entity, and searching entities by tags with AND/OR semantics. Discuss data modeling, scalability, and edge cases like tag normalization and permissions.

Pro tip: Demonstrate awareness of real-world concerns like tag name normalization (case-insensitivity, trimming) and idempotency of attach/detach operations. Also, mention how to handle large result sets with pagination and filtering to show production readiness.

1. Clarify Requirements and Scope

Ask questions to understand the entities (e.g., pages, issues), expected scale, permission model, and whether tags are global or scoped. Confirm the need for AND/OR search and any constraints like tag name uniqueness.

2. Design Resource Model and Endpoints

Define resources: /tags for tag CRUD, /entities/{entityId}/tags for attaching/detaching/listing tags on an entity, and /entities?tags=tag1,tag2&match=all/any for searching. Use standard HTTP methods (GET, POST, PUT, DELETE) and status codes.

3. Detail Operations and Payloads

Specify request/response bodies for each endpoint, including how to attach (POST with tag ID or name) and detach (DELETE with tag ID). For search, define query parameters for AND/OR semantics and pagination.

4. Address Data Modeling and Storage

Discuss how to store tags and associations (e.g., many-to-many relationship). Consider indexing for efficient search, normalization of tag names, and handling of tag deletion (cascade or orphan cleanup).

5. Discuss Scalability, Security, and Edge Cases

Cover pagination, rate limiting, permissions (who can tag what), idempotency, and error handling. Mention potential performance optimizations like caching or denormalization for search.

Key Points to Mention

  • Use of standard HTTP methods and status codes (e.g., 200 OK, 201 Created, 204 No Content, 404 Not Found).
  • Resource naming conventions: plural nouns, hierarchical relationships (e.g., /entities/{id}/tags).
  • Idempotency of attach/detach operations to avoid duplicate tags.
  • Tag normalization: case-insensitivity, trimming whitespace, and uniqueness constraints.
  • Pagination and filtering for search results to handle large datasets.
  • AND/OR semantics implementation: query parameters like ?tags=tag1,tag2&match=all or ?tags=tag1|tag2 for OR.
  • Permissions and access control: ensuring users can only tag entities they have access to.
  • Data modeling: many-to-many relationship with a join table, indexing for efficient lookups.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

How would you handle concurrency and idempotency for tag attach and detach operations?

System DesignTechnical Trade-offsAPI & Integrations
Author's notes

Blanked for a second here.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements and constraints, such as expected concurrency levels and consistency needs. Then propose a design that ensures idempotency (e.g., using idempotency keys or conditional writes) and handles concurrency (e.g., optimistic locking or serializable transactions). Finally, discuss trade-offs and how you would test and monitor the solution.

Pro tip: Emphasize that idempotency is not just about duplicate requests but also about ensuring that the same operation can be safely retried after partial failures, and that concurrency control should be applied at the right granularity to avoid bottlenecks.

1. Clarify Requirements

Ask about expected concurrency, consistency requirements, and whether the operations are part of a larger transaction. This shows you don't jump to solutions without understanding the problem.

2. Design for Idempotency

Propose using idempotency keys for each request, storing them with a unique constraint to detect duplicates. Alternatively, use conditional writes (e.g., 'add tag if not present') to make operations naturally idempotent.

3. Handle Concurrency

Discuss concurrency control mechanisms such as optimistic locking (version numbers) or pessimistic locking (SELECT FOR UPDATE). Consider the trade-offs between them in terms of performance and complexity.

4. Address Failure Scenarios

Explain how to handle partial failures, retries, and timeouts. For example, if a detach operation fails after removing the tag but before acknowledging, the retry should not fail because the tag is already gone.

5. Discuss Trade-offs and Testing

Compare different approaches (e.g., database constraints vs. application-level checks) and mention how you would test concurrency and idempotency, such as with stress tests and chaos engineering.

Key Points to Mention

  • Idempotency keys or request IDs to deduplicate requests
  • Optimistic locking with version numbers to handle concurrent updates
  • Database transactions with appropriate isolation levels (e.g., serializable)
  • Conditional writes (e.g., INSERT ... ON CONFLICT DO NOTHING) for idempotent tag attach
  • Retry logic with exponential backoff and jitter
  • Monitoring and alerting for duplicate requests or contention

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

Walk through the edge cases: what happens when you delete a tag that's still attached to entities, how do you handle rename collisions within a workspace, and how do you approach bulk attach/detach?

System DesignAPI & IntegrationsTechnical Trade-offs
Author's notes

The rename collision one I actually liked.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by framing the problem: tags are shared references, so deletion, rename, and bulk operations must handle referential integrity and concurrency. Then walk through each edge case systematically, covering data model implications, API design, and user experience. Emphasize trade-offs like soft delete vs. hard delete, optimistic locking, and asynchronous processing for bulk operations.

Pro tip: Atlassian values scalability and user trust, so highlight how you'd prevent data loss and ensure consistency across workspaces, perhaps by referencing their existing patterns like soft deletes in Jira or Confluence.

1. Clarify requirements and constraints

Ask about expected scale, consistency requirements, and whether tags are global or workspace-scoped. This shows you think before coding.

2. Design the data model for tags and associations

Propose a schema with a tags table and a join table for entity-tag relationships, including metadata like created_at and deleted_at for soft deletes.

3. Handle deletion of attached tags

Discuss soft delete vs. hard delete, cascading vs. orphaned associations, and how to maintain referential integrity. Consider asynchronous cleanup for large datasets.

4. Manage rename collisions

Enforce uniqueness per workspace, use optimistic locking or transactions to handle concurrent renames, and define clear error responses or auto-suffixing strategies.

5. Implement bulk attach/detach

Design idempotent batch APIs with partial success handling, rate limiting, and asynchronous job processing for large volumes. Ensure atomicity where needed.

Key Points to Mention

  • Soft delete with a 'deleted_at' timestamp to allow recovery and maintain audit trails.
  • Referential integrity: use foreign keys with ON DELETE CASCADE or SET NULL, or handle in application logic.
  • Optimistic concurrency control (e.g., version numbers) to prevent lost updates during renames.
  • Unique constraint on (workspace_id, tag_name) to enforce no collisions, with proper error handling.
  • Bulk operations should be idempotent and support partial success, returning per-item status.
  • Asynchronous processing with job queues for bulk operations to avoid blocking and improve scalability.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

How would you design pagination for the tag list and entity search endpoints?

API & IntegrationsSystem Design
Author's notes

Cursor-based pagination over offset.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements and constraints of each endpoint, then propose a pagination strategy that balances performance, scalability, and ease of use. Discuss trade-offs between offset-based and cursor-based pagination, and recommend a hybrid or context-specific approach with clear API design.

Pro tip: Atlassian values API consistency and developer experience; emphasize how your pagination design aligns with existing Atlassian API patterns (e.g., Jira's cursor-based pagination) and how it handles edge cases like concurrent modifications.

1. Clarify Requirements and Constraints

Ask about expected data volume, update frequency, and client needs (e.g., random access vs. sequential). Identify if the tag list is static or dynamic, and if entity search supports complex queries.

2. Choose Pagination Strategy

For tag list, consider offset-based pagination if tags are relatively stable; for entity search, prefer cursor-based pagination to handle large, changing datasets and avoid duplicates/skips.

3. Design API Parameters and Responses

Define parameters like limit, offset, cursor, and sort order. Include metadata in responses (e.g., total count, next cursor, links) and standardize error handling for invalid cursors.

4. Address Performance and Scalability

Discuss indexing, caching, and database query optimization. For cursor-based, ensure cursors are opaque and encode necessary state (e.g., last ID, sort key).

5. Handle Edge Cases and Consistency

Cover scenarios like concurrent updates, deleted items, and cursor expiration. Explain how to maintain stable ordering and avoid duplicates or missing results.

Key Points to Mention

  • Offset-based vs. cursor-based pagination trade-offs (performance, consistency, complexity)
  • Use of opaque cursors to prevent tampering and simplify client logic
  • Inclusion of pagination metadata (total count, next/prev links) for discoverability
  • Database indexing and query optimization for efficient pagination
  • Handling of concurrent modifications and ensuring stable sort order
  • Alignment with Atlassian API design guidelines and existing patterns

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.