CanDeal Group · Software Engineer
Updated · 2026-10-02

CanDeal Group Software Engineer
Interview Guide

THE 60-SECOND BRIEF

CanDeal Group runs an electronic marketplace for Canadian fixed-income and derivatives trading. Candidates describe the Software Engineer role as work on trading platforms, data services and connectivity, with distributed systems, networking protocols and real-time data processing in the mix. The reported responsibilities cover the whole delivery cycle: gathering requirements with product managers and other engineering teams, writing well-tested code for trading applications, deploying, supporting the platform afterwards and paying down technical debt.

This guide is for candidates preparing for the CanDeal Group Software Engineer loop. It covers the reported technical questions on TCP and UDP, the OSI model, DNS, load balancing and multi-threaded concurrency, plus the production-debugging story candidates are asked for. The requirements candidates describe name a backend language such as Java, C++ or C#, TCP/IP and HTTP/S, and relational databases, with 3+ years in backend or systems work described as a good fit.

Candidates report an HR screening followed by one or more technical rounds. No round names, order or formats beyond that are reported, so confirm the stages with your recruiter.

Networking FundamentalsComputer Networks ConceptsProtocol Understanding (General)

29 min read

Browse Software Engineer questions

See the practice prompts

13Practice promptsAcross five skill areas

Reports for this role put networking fundamentals at the centre. The six reported questions are: TCP versus UDP, mapping the OSI model to network troubleshooting, a DNS lookup from start to finish, load balancing under heavy traffic, concurrency in multi-threaded code, and a production bug fixed under a tight deadline. Candidates also report two broader scenarios: what happens when you type a URL into a browser, and how you would handle a network partition in a distributed system. Five of these are explain-and-reason questions, so the preparation is to rehearse structured spoken answers rather than to grind coding problems.

Because the product is a marketplace for fixed-income and derivatives trading, it helps to connect each answer to a realistic trading-style case. For example, you can explain UDP through a price feed where a stale packet is worth less than the next one and gaps are detected with sequence numbers, and TCP through a session that must deliver every message in order. Do this as an illustration of your own reasoning, not as a claim about how CanDeal builds its systems. The same applies to latency versus throughput versus fault tolerance, which candidates report as the trade-offs to discuss in design answers.

Candidates also report deep questions about the architecture and challenges of projects on your resume. Pick the two or three projects you know best, and for each one be ready to draw the components, name the protocols and database interactions, and describe one failure and how it was diagnosed. That inventory doubles as raw material for the production-debugging story and the behavioral questions about stress, teamwork and learning from mistakes.

If your day job is not in Java, C++ or C#, choose one of them for concurrency examples, since the requirements name those as the backend languages. Nice-to-have items candidates mention are financial market data, cloud-native technologies and low-latency techniques; read up on them lightly after the fundamentals are solid.

01

Preparation focus

editorial

No named rounds are reported beyond an HR screening and one or more technical rounds, so this stage covers your preparation for all of them. Candidates report that the technical conversations lean on core computer science and networking, on solving problems live, and on detailed questions about the technologies and projects on your resume. Prepare spoken answers in a fixed order: definition, mechanism, a concrete case, then trade-offs. Practise the reported questions on TCP versus UDP, the OSI model and troubleshooting, DNS, load balancing, concurrency and the production-debugging story, and ask your recruiter whether any stage involves writing code.

What to demonstrate

  • Working knowledge of the network stack and protocols, from DNS and TCP through HTTP/S
  • Handling of concurrency in multi-threaded code
  • Reasoning about trade-offs between latency, throughput and fault tolerance
  • How well you can discuss the architecture and problems of projects on your resume

How to prepare

  • Write a one-page comparison of TCP and UDP with a use case for each, then say it aloud without notes
  • Walk a request from URL to rendered page, naming the DNS, TCP, TLS and HTTP steps in order
  • Build a layer-by-layer troubleshooting ladder (link, IP, transport, TLS, application) with one command per rung
  • Pick three resume projects and prepare a component sketch and one failure story for each
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Answering TCP versus UDP as a feature list (reliable, unreliable) with no use case or cost attached

State what TCP pays for its guarantees: the handshake, retransmission delay and head-of-line blocking. Then give one case for each protocol, such as an ordered request-response session versus a price feed where late data is useless and you detect gaps yourself.

02

Reciting the seven OSI layer names when asked how the model maps to troubleshooting

Turn the layers into a ladder of checks: link state, IP address and route, port reachability, TLS handshake, then the application response. Name a tool or symptom for each rung, and say how a failure at one layer rules out the layers above it.

03

Saying "I would add locks" for the concurrency question without saying what state is shared

Name the shared mutable state first, then pick a tool for it: immutability, confinement to one thread, an atomic, a lock or a concurrent collection. Cover lock ordering for deadlock and say what each choice costs under contention.

04

Telling the production-debugging story as heroics with no sequence, no root cause and no follow-up

Structure it as symptom, first check, how you narrowed it, root cause, fix under the deadline, and the change that stopped it recurring. Quote the pressure briefly and spend the time on your reasoning.

05

Listing technologies on your resume that you cannot discuss below the surface

Since candidates report detailed resume questions, cut or flag anything you have only touched. For each remaining item prepare how it was deployed, how it failed and what you would change.

Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.

10 technical prompts0 include a worked solution

How do you handle concurrency issues in a multi-threaded application?

medium
Technical and Networking Fundamentals

How do you handle concurrency issues in a multi-threaded application?

Approach
  1. Start by naming the shared mutable state and the invariant it has to keep. Most bugs are check-then-act or read-modify-write races: count++ is a load, an add and a store, so two threads can lose an update.
  2. Choose the tool to fit the state. A mutex or synchronized block with a short critical section protects multi-field invariants. Atomics and CAS (AtomicLong, std::atomic, Interlocked) cover single variables. Immutability and thread confinement avoid sharing altogether. Concurrent collections help, but compound operations still need their atomic methods (computeIfAbsent, merge), not a get followed by a put.
  3. Address visibility as well as atomicity. Without a happens-before edge, another thread may never see a write. Java volatile gives visibility and ordering but does not make count++ atomic. Double-checked locking is only correct with a volatile field.
  4. Prevent deadlock by breaking one of the four Coffman conditions: acquire locks in a fixed global order (for example by account id in a transfer), use tryLock with a timeout, and never call unknown code while holding a lock. Also mention livelock and starvation, and fairness as their trade-off.
  5. Prefer structures that shrink the problem: a producer-consumer pipeline on a bounded blocking queue, a single writer that owns the state, and thread pools instead of ad hoc threads. Verify with stress tests, ThreadSanitizer for C++, and thread dumps (jstack) to find a deadlock in a running process.
Follow-up
  • Two threads transfer money between the same two accounts in opposite directions and hang. Why, and how do you fix it?
  • When would you pick a lock-free CAS loop over a mutex, and what is the ABA problem?
  • How would you reproduce a race that shows up only under production load?

Identify the heaviest tenants in a five-minute window under memory pressure

medium
top-kheavy hittersstreaming

The edge service handles about 3,000 requests per second across roughly 50,000 tenants, peaking near 9,000. Expose the 50 heaviest tenants by request count over the trailing five minutes so limits can be tightened before one tenant's backfill starves the fleet. You may not retain five minutes of raw records. Give the exact solution and its memory, then the bounded-memory approximation with its error stated as a formula, and say which you would ship and at what tenant cardinality that choice changes.

Approach
  1. Do the exact version first, because it is affordable at this cardinality: a ring of 300 one-second counters per tenant, advanced lazily, is 1,200 bytes of counters per tenant and roughly 60 to 90 MB for 50,000 tenants with overhead. Carry a running total and subtract the bucket you overwrite so a window read is O(1) rather than 300 adds.
  2. Extract the top 50 with a size-k min-heap over the tenant sums: O(d log k) for d tenants, against O(d log d) to sort them all. Maintaining the heap continuously instead of on query requires a tenant-to-heap-index map, because incrementing a count already inside the heap means sifting from a known position, and without that map you rebuild the heap on every request.
  3. State the approximation precisely rather than gesturing at sketches. Misra-Gries with m counters retains every item whose true count exceeds N/(m+1), and each retained count underestimates the truth by at most N/(m+1). With m = 1,000 and N = 900,000 requests in the window the error is roughly 900 requests, which is fine for spotting a tenant sending 50,000 and useless for ranking two tenants 200 apart.
  4. Say what breaks when the window slides: Misra-Gries and Space-Saving are insert-only and cannot be decremented as records age out. The workable construction is one summary per sub-window, say ten seconds, with 30 summaries merged at query time, and the merged error is the sum of the per-summary errors, so the bound degrades linearly in the number of sub-windows.
Follow-up
  • The heaviest tenant is heavy because of one export job rather than user traffic. Should the limiter treat those as the same tenant?
  • Two tenants sit tied at the boundary of the top 50. Does your answer flap, and does the flapping matter?

Diff a projection against the primary without per-row point reads

hard
reconciliationrange hashingthrottling

The listing projection has drifted and some rows show a stale version. The primary holds 40,000,000 resource rows across 12,000 tenants while serving 1,200 writes and 14,000 reads per second. The obvious repair, reading each resource row and comparing its version against the projection, is correct and would eventually finish. Explain precisely why it is unacceptable here, then give a diff that finds the differing rows, state its complexity, and make it safe to run against a live primary. Replication lag is usually under 100 ms and is not bounded.

Approach
  1. Quantify the naive cost rather than calling it slow: 40,000,000 point reads at even 0.5 ms each is over five hours serialised, and the only lever is concurrency, which is exactly what you cannot spend. The primary's pool is sized for the write path, and 40,000,000 random reads evict the buffer cache that sustains the 85 percent cache hit rate, so the audit degrades the system it is auditing.
  2. Replace random access with one ordered pass per side. Both sides can be read in (tenant_id, resource_id) order, which is a sequential scan on each and a merge join in O(n) time and O(1) memory. For a dense diff that is the whole answer, and it reads the primary once instead of 40,000,000 times.
  3. For the expected sparse case, compare range hashes instead of rows: partition the key space, compute per range an order-independent aggregate over hash(resource_id, version), compare aggregates, and descend only into ranges that differ. With d differing rows and branching factor B, at most d ranges mismatch per level, so the drill-down examines O(d log_B(n/d)) ranges and reads full rows only in mismatching leaves.
  4. Aggregate with a sum modulo 2^64 or a multiset hash, never XOR. XOR is order-independent but self-cancelling, so two rows wrong in the same way, or a row duplicated on one side, leave the range aggregate matching and the range is declared clean.
Follow-up
  • The diff reports 900 stale rows. How do you decide between patching those rows and rebuilding the projection from resource_revision?
  • Same job, but the projection lives in a search index that cannot be scanned in key order. What changes?

Seven days, ordered from the transport layer up through DNS, troubleshooting, load balancing and concurrency, ending with the debugging story and a full mock. Each day produces something you can check against the reported questions.

Small steps. Visible outcomes.0 / 7 completed
ONE WEEK · YOUR PACE

Prepare, practise & reflect

One practical outcome each day. Spend longer where you need it.

0 / 7 done
01Confirm the format and inventory your resume
  • Ask your recruiter which stages follow the HR screening and whether any involves writing code
  • List every technology and project on your resume, with one sentence on its architecture and one on a failure you handled
  • Mark the three projects you could discuss in most depth and choose a language (Java, C++ or C#) for concurrency examples

Deliverable: A list of questions for your recruiter and a resume inventory with the three strongest projects marked.

02Transport layer: TCP versus UDP
  • Write a comparison covering the three-way handshake, byte-stream versus datagram, retransmission, ordering, flow control and congestion control
  • Capture a TCP connection with tcpdump or Wireshark and label the SYN, SYN-ACK and ACK packets and the teardown
  • Prepare one use case per protocol and the cost you accept by choosing it

Deliverable: A one-page comparison, an annotated packet capture and a spoken answer to the TCP versus UDP question.

Practice prompt ↗
03DNS and the type-a-URL walkthrough
  • Run dig +trace on a domain and note the root, top-level and authoritative steps
  • Write the full path from stub resolver and caches through the recursive resolver, record types, TTLs and the UDP-to-TCP fallback
  • Extend it into a complete URL-to-page walkthrough (DNS, TCP, TLS, HTTP request, response) and say it aloud

Deliverable: An annotated dig trace and a spoken DNS answer that continues into the full browser walkthrough.

Practice prompt ↗
04OSI model as a troubleshooting ladder
  • For each rung (link, IP, transport, TLS, application) pick one command and one failure it reveals, such as ping, traceroute, nc, ss, openssl s_client and curl -v
  • Invent three outages (DNS misconfiguration, closed port, expired certificate) and walk the ladder for each
  • Practise the answer so it starts from a symptom and ends with the layer that explains it

Deliverable: A one-page troubleshooting runbook and three worked outage walkthroughs.

Practice prompt ↗
05Load balancing and network partitions
  • Compare layer 4 and layer 7 balancing, and the algorithms round robin, least connections and consistent hashing
  • Cover health checks, connection draining, session affinity and the balancer itself as a single point of failure
  • Sketch how a service behaves during a network partition, what you refuse or serve stale, and how it recovers

Deliverable: A diagram of a balanced service with its failure modes, and spoken answers to the load balancing and partition scenarios.

Practice prompt ↗
06Concurrency in multi-threaded code
  • In your chosen language, write a lost-update counter race, then fix it three ways: a lock, an atomic and confinement to one thread
  • Reproduce a lock-ordering deadlock and fix it with a consistent order
  • Work through the practice question on detecting a concurrent edit in an update statement, which carries the same idea into a relational database

Deliverable: Running code for the race and its fixes, plus a spoken answer that names shared state before naming locks.

Practice prompt ↗Practice prompt ↗
07Production-debugging story and full mock
  • Write the debugging story as symptom, first check, narrowing, root cause, fix and prevention, and rehearse it aloud
  • Run a mock that mixes all six reported questions and one resume deep dive, with someone interrupting for detail
  • Do the practice exercise on turning a review disagreement into a decision for a second collaboration example

Deliverable: A rehearsed debugging story, a completed mock and a list of the answers that still need work.

Practice prompt ↗Practice prompt ↗

Expand any day for tasks and deliverables. Your progress is saved on this device.

Candidates report that behavioral questions cover handling stress, working with teams and learning from mistakes, and they are asked for a production issue fixed under a tight deadline. The reported guidance is to structure answers with Situation, Task, Action, Result and to stay composed and analytical when requirements change unexpectedly. Prepare stories where you can show your own sequence of reasoning.

Turn a code review disagreement into a decision

easy
code reviewoptimistic concurrencycommunication

A colleague's change updates a row with UPDATE resource SET version = version + 1 WHERE resource_id = $1 AND version = $2 and treats an affected-row count of zero as a successful no-op. You read that as a silently lost update; they think returning 200 is friendlier to clients than returning a conflict. Describe how you have handled a review disagreement of this shape: what goes in the comment, when you leave the thread, and who decides. Then write the comment you would leave here, in under 80 words.

Approach
  1. Sort the disagreement before writing anything. A silently discarded write is a correctness claim about data; the choice between 409 and 412 is taste. Only the first justifies blocking a merge, and saying which one you are doing is most of the value of the comment.
  2. Make the claim reproducible in the comment itself with an interleaving rather than a principle: A reads version 7, B reads version 7, B commits version 8, A's predicate matches zero rows, A is told it succeeded and A's edit is gone.
  3. Offer the alternative with its cost attached: return 409 carrying the current version and the revision that won, so the client can re-read and re-apply. Note that automatic retry is not the fix, because a retry re-reads the winner's state and reapplies an intent formed against data that no longer exists.
  4. Apply an escalation rule you can state: two round trips on the thread, then a call, and the service's owner decides rather than the reviewer. A reviewer who cannot be overruled is a bottleneck with extra steps.
Follow-up
  • Where would you put the test that fails if someone reintroduces the swallowed zero rowcount?
  • The author says clients cannot handle a 409. How do you check whether that is true?

Reverse your own decision and price the reversal

medium
reversibilitymeasurementmigrations

Describe a technical decision you made and later reversed. Pick one that cost something: a service you split and merged back, a cache you added and removed, an index you created that pushed the planner onto a worse plan, a projection you rebuilt from scratch. State what you believed when you decided, the measurement that changed your mind, how long the wrong version ran in production, and what the reversal cost in migrations, dual writes, and a deprecation window for callers you did not own.

Approach
  1. State the original rationale without irony, in the version you would still defend given what was known then. If it is not defensible, the story is about carelessness rather than judgement, and a different example serves you better.
  2. Give the measurement that moved with a before and after: the p99 that did not improve, the cache hit rate that sat at 40%, the plan that flipped to a sequential scan once the table passed a size you can name.
  3. Cost the reversal in steps, not adjectives: expand-and-contract deploys, the dual-write window, the callers who had to be notified, the rows already written in the wrong shape that had to be backfilled or abandoned.
  4. Distinguish reversal from rewrite by naming what you kept. Most good reversals preserve the schema or the interface and undo one decision inside it, which is also why they were affordable.
Follow-up
  • What in that decision was irreversible, and did you know it was irreversible when you made it?
  • How did you tell the people who had already built on top of the original decision?

Unblock an engineer without taking the keyboard

easy
mentoringleasesat-least-once

A teammate has spent two days on a job handler that occasionally writes duplicate rows. They are certain the queue is delivering twice by mistake. You suspect a lease expiring under a slow handler, so the job is running concurrently with itself. Describe how you have unblocked someone in this position: what you asked before offering a hypothesis, what you showed them rather than told them, and what you left them owning. Then say what you would do if their theory turned out to be the right one.

Approach
  1. Ask before diagnosing, and ask for things answerable from data they already have: the attempt count on the job rows that produced duplicates, the handler's observed duration against its lease expiry, and whether the duplicate rows share a natural key that a unique constraint could have caught.
  2. Teach the shape rather than the answer. A lease cannot distinguish a dead worker from a slow one, so a handler that outruns its lease is running twice by design, and deploys deliver the other half by killing handlers mid-run on every rollout. Both of their candidate theories produce identical duplicate rows, which is why the evidence has to come from timings rather than from argument.
  3. Hand over a checklist they execute: a natural key on every write the handler performs so the second copy collides rather than appends, the record of intent written before any external effect, a lease heartbeat while running, and the metric that shows it working.
  4. Keep ownership with them deliberately. Pair on the first write, then step back; if you finish it yourself you have closed one ticket and left the same person stuck on the next redelivery.
Follow-up
  • How would you distinguish a genuine double-delivery from a lease expiry using only the data already stored?
  • Their handler calls an external endpoint before recording that it did. What do you tell them to change first?
  • 01

    Describe a time you had to debug a production issue under a tight deadline.

  • 02

    Tell me about a time project requirements changed unexpectedly. How did you keep the work on track?

  • 03

    Describe a mistake you made in a system you owned and what you changed afterwards.

  • 04

    Tell me about working with a product manager or another engineering team to get a feature to match a business need.

  • 05

    Describe technical debt you found and fixed before it turned into an outage.

PracHub preparation framework ↗
What does the CanDeal Group Software Engineer interview process look like?

Candidates report an initial HR screening followed by one or more technical rounds. No names, order or schedule for those rounds are reported, so ask your recruiter for the stages and whether any of them involves writing code.

PracHub Software Engineer practice ↗
What technical topics should I prepare?

The reported questions are TCP versus UDP, the OSI model and network troubleshooting, a DNS lookup, load balancing in high-traffic systems and concurrency in multi-threaded code. Candidates also report what happens when you type a URL into a browser and how to handle a network partition. Add data structures, algorithms and relational database basics, since the requirements candidates describe name them.

PracHub Software Engineer practice ↗
Which languages and skills does the role list?

A major backend language such as Java, C++ or C#, TCP/IP and HTTP/S knowledge, and experience with relational databases. Familiarity with financial market data, cloud-native technologies and low-latency programming is described as a plus. Prepare concurrency examples in whichever of the three languages you know best.

PracHub Software Engineer practice ↗
How much should I prepare on my own resume?

Candidates report detailed questions on the architecture and challenges of previous projects. For each project prepare the components, protocols and data stores involved, one failure and how it was resolved, and what you would change now. Remove or downplay anything you cannot discuss in that depth.

PracHub Software Engineer practice ↗
Should I prepare for behavioral questions?

Yes. Candidates report questions on handling stress, collaborating and learning from mistakes, including the production issue under a deadline. Prepare three or four stories in Situation, Task, Action, Result form, and make sure the debugging story names a root cause and a prevention step.

PracHub Software Engineer practice ↗
How long does the process take?

No timeline is reported beyond a few distinct stages. Ask your recruiter for the expected schedule, and use the seven-day plan as a compact pass over the reported topics that you can repeat if you get more time.

PracHub Software Engineer practice ↗
Sources & methodology 3 sources ↗

No official company page is cited. Rounds and questions come from candidate reports and PracHub editorial material; each source shows the date it was read.