Compass Group North America · Software Engineer
Updated · 2026-10-02

Compass Group North America Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Compass Group North America is described in candidate-facing material as a food service and support services business that serves corporate offices, hospitals and schools. The Software Engineer role is described as touching logistics and supply chain systems as well as the software people use day to day at those sites. Candidates describe the engineering work as covering the full development lifecycle: gathering requirements with product managers, building and deploying, reviewing code, writing technical documentation and mentoring junior developers, all while integrating with infrastructure that already exists.

This guide is for candidates interviewing for the Software Engineer role at Compass Group North America. It covers the three reported rounds (Initial Screen, Technical Assessment, Panel Interview), the technical questions candidates report on hash maps, the Traveling Salesman problem, data structure selection and database architectures, and the behavioral questions on stakeholders, decisions, code review, changing requirements and getting stuck.

Candidates report three rounds spread over roughly 3-5 weeks: an Initial Screen, a Technical Assessment and a Panel Interview with several stakeholders. Reported questions fall into two groups, technical knowledge and behavioral.

Data StructuresAlgorithmic Problem SolvingHashing

31 min read

Browse Software Engineer questions

See the practice prompts

14Practice promptsAcross five skill areas

The requirements candidates describe for this role are one mainstream language (Java, C# and Python are named), solid data structures and algorithms, and database design with SQL. Cloud experience on AWS or Azure, CI/CD and automated testing, and earlier work in logistics or enterprise software are listed as nice-to-haves. For preparation, that means choosing the language you code fastest in, being able to explain hash tables from the inside, and being able to talk about relational schemas and queries without notes.

The reported technical questions are mostly conceptual and explanation-driven rather than puzzle-driven. They ask how you handle hash map collisions, how you approach the Traveling Salesman problem, how you choose between data structures for a new feature, and what the trade-offs are between database architectures under heavy traffic. Each one rewards the same habit: state the access pattern or constraint first, then the structure or algorithm, then its complexity and where it breaks. Candidates also describe example scenarios about handling high-frequency data updates and about a hard-to-debug bug, so keep one concrete debugging story ready alongside your fundamentals.

Half of the reported questions are behavioral, and the final stage is described as a panel of stakeholders from different departments. Candidates report that the panel includes people who are not engineers, so practise explaining a technical decision in terms of what it changed for the business: fewer failures, faster processing, lower operating effort. Use a consistent Situation, Task, Action, Result structure, and for every story be ready to say why you picked that approach over the alternatives you rejected.

Pace the work to the loop order candidates describe: refresh technical fundamentals before the technical stage and your stories before the panel. Candidates also warn that a panel can feel friendly and settled while decisions are made after all candidates are reviewed, so keep preparing and keep other options open until an offer is in writing.

01

Initial Screen

reported

Candidates describe the Initial Screen as a preliminary evaluation, with the process overall starting from a high-level discussion of your experience. Nothing more specific about its format is reported, so prepare for a conversation about your background and the stack you work in. Be ready to move from your CV into concrete detail on any project you list, because the later stages revisit your technical decisions.

What to demonstrate

  • A first read on your background and how clearly you describe your past work
  • Fit between your experience and the listed stack: Java, C# or Python, plus database design and SQL

How to prepare

  • Write a short walk through your CV that names the language, database and deployment setup of each recent project, and the reason you chose them.
  • Pick the one or two projects where you made architectural choices and rehearse the trade-offs and limitations of the tools you used.
  • Prepare a sentence on why logistics, food service or enterprise software interests you, using your own experience rather than company claims.
  • Have logistics details such as location and availability ready so the conversation stays on your work.
Compass Group North America Software Engineer candidate reports ↗
02

Technical Assessment

reported

Candidates report a Technical Assessment where you demonstrate technical skill. Candidate accounts describe a mix of algorithmic problems and practical discussion of past work, with hash maps, trees, graphs, complexity analysis and system design at scale named as areas. The practised questions for this kind of stage are the hash map and collision handling question, the Traveling Salesman question, choosing data structures for a feature, and database architecture trade-offs. Clarify requirements, discuss edge cases and outline your approach before you write code.

What to demonstrate

  • Working command of hash maps, trees and graphs, and the ability to reason about time and space complexity
  • Whether you outline an approach and edge cases before implementing
  • Database design and SQL knowledge, and how you reason about systems under heavy traffic

How to prepare

  • Implement a hash map from scratch in your strongest language, with both chaining and open addressing, and state resize behavior and worst-case cost.
  • Write out how you would approach the Traveling Salesman problem at three levels: brute force, dynamic programming, and a heuristic for larger inputs.
  • Prepare a decision table for choosing between array, hash map, heap, tree and graph by access pattern, then test it on a feature you have built.
  • Practise explaining read-heavy versus write-heavy database designs, replication and partitioning out loud, then work the SQL practice questions on index use and keyset paging.
Compass Group North America Software Engineer candidate reports ↗
03

Panel Interview

reported

The Panel Interview is described as a comprehensive session with multiple stakeholders from different departments. Candidates say the people met across the process include the Hiring Manager, peers and sometimes leadership, and that the atmosphere can feel very positive even though decisions follow a review of all candidates. Behavioral questions on difficult colleagues, choosing between options, code review feedback, changing requirements and being stuck are the practised material, together with explaining technical choices to people outside engineering.

What to demonstrate

  • Communication across technical and non-technical stakeholders
  • Collaboration and how you handle disagreement, feedback and ambiguity
  • Interest in the business effect of technical decisions

How to prepare

  • Build five STAR stories that cover a difficult colleague, a choice between two similar options, code review feedback, a changed requirement and getting stuck, then label which ones also show a technical optimization.
  • For each story, write the sentence that explains why you chose that path over the alternative, since the why is what candidates are advised to explain.
  • Practise describing one technical decision for a listener with no engineering background, in terms of outcome for operations.
  • Write two questions for the end, such as the team's current technical challenges or how they balance technical debt against new features.
Compass Group North America Software Engineer candidate reports ↗

PracHub editorial advice for the preparation topics above.

01

Describing hash map collisions only as a definition, without covering chaining versus open addressing, load factor, resizing or worst-case lookup

Be able to implement a small hash table in your strongest language and state the cost of each operation, the worst case with many collisions, and what a resize does to existing entries.

02

Treating the Traveling Salesman question as a request for a perfect fast algorithm, or giving only a brute-force answer

Say that exact solutions are exponential, give brute force at O(n!) and dynamic programming over subsets at O(n^2 2^n), then offer a heuristic such as nearest neighbor for larger inputs and explain when approximate is acceptable.

03

Answering database architecture trade-offs with brand preferences instead of workload facts

Start from the read and write pattern, consistency need and growth, then compare a single relational node, read replicas, partitioning and a non-relational store, and say what each makes harder.

04

Telling behavioral stories without a measured result or without explaining why you chose one path over another

For each story, state a number or concrete outcome and one sentence that begins with why you chose the option, including the alternative you rejected and what it would have cost.

05

Treating a friendly panel as a finished process and relaxing, or explaining technical choices in jargon to a mixed audience

Keep the same preparation until an offer is in writing, and practise explaining each technical decision in terms of what it did for operations, with no unexplained acronyms.

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

8 technical prompts0 include a worked solution

Explain how you handle hash maps and collision resolution in your code.

medium
Technical Knowledge and Data Structures

Explain how you handle hash maps and collision resolution in your code.

Approach
  1. Start with the mechanism: hash the key, map it to a bucket (modulo the capacity, or a bit mask when the capacity is a power of two), and accept that collisions are unavoidable because many keys share few buckets. Lookups and inserts are O(1) on average and O(n) in the worst case when every key lands in one bucket.
  2. Compare the two resolution families. Separate chaining keeps a list per bucket; Java's HashMap turns a bucket into a red-black tree once it holds 8 entries and the table has at least 64 slots, so worst-case lookup there drops to O(log n). Open addressing probes other slots (linear, quadratic, double hashing). Python's dict works this way, and deletes need tombstones so probe chains stay intact.
  3. Explain load factor and resizing. Java's HashMap resizes past 0.75 full by doubling and rehashing; Python's dict grows at about two-thirds full. A single resize costs O(n), but inserts stay amortized O(1). If I know the final size, I set the initial capacity up front to skip repeated rehashing.
  4. Cover what I do in my own code: keep equals and hashCode (or eq and hash) consistent, use immutable keys because a key mutated after insertion becomes unfindable, and avoid hashing on fields that change. In Python, a class that defines eq without hash becomes unhashable.
  5. Edge cases: adversarial keys that all collide (hash flooding), which is why Python randomizes string hashes; thread safety (Java's HashMap is not safe for concurrent writes, so I use ConcurrentHashMap); and iteration order (Python dicts keep insertion order since 3.7, while Java's HashMap guarantees no order and LinkedHashMap does).
Follow-up
  • Implement put, get and remove for a hash map with separate chaining, including the resize step.
  • Why is linear probing cache-friendly, and what is primary clustering?
  • What happens to lookups if a key object is mutated after it has been inserted?

Can you walk me through your approach to the Traveling Salesman problem?

medium
Technical Knowledge and Data Structures

Can you walk me through your approach to the Traveling Salesman problem?

Approach
  1. Clarify the variant before solving: how many cities, whether distances are symmetric (one-way streets make them asymmetric), whether they obey the triangle inequality, whether the tour returns to the start, and whether the optimal tour is required or a good one is enough. TSP is NP-hard, so the input size decides the method.
  2. Brute force: fix the start city and try every ordering of the rest, which gives (n-1)! tours ((n-1)!/2 when distances are symmetric) at O(n) each. That is only practical for about ten cities.
  3. Exact for small inputs: Held-Karp dynamic programming over subsets. dp[mask][j] is the cheapest path that starts at city 0, visits exactly the cities in mask and ends at j; extend it with dp[mask | 1<<k][k] = min(dp[mask][j] + d[j][k]). That is O(n^2 * 2^n) time and O(n * 2^n) memory, workable up to about 20 cities, and parent pointers recover the tour.
  4. Large inputs need heuristics: build a tour with nearest neighbour in O(n^2), then improve it with 2-opt, which reverses a segment whenever that shortens the tour, until no move helps. For metric instances, the MST-doubling tour is within 2x of optimal and Christofides is within 1.5x. At scale, I would use a solver such as OR-Tools rather than hand-rolling one.
  5. Edge cases: one or two cities, unreachable pairs (infinite distance), and duplicate points. Real routing work usually adds constraints such as vehicle capacity or time windows (the vehicle routing problem), which changes the model rather than just the algorithm.
Follow-up
  • Write Held-Karp and reconstruct the actual tour, not just its cost.
  • How would you check how far a heuristic tour is from optimal?
  • What changes if there are several vehicles, each with a capacity limit?

How do you choose between different data structures when designing a new feature?

medium
Technical Knowledge and Data Structures

How do you choose between different data structures when designing a new feature?

Approach
  1. Start from the operations, not the structure: list what the feature has to do (lookup by key, membership, ordered iteration, range queries, min or max, inserts in the middle), how often each runs, and how large the data gets. The most frequent operation drives the choice.
  2. Map each operation to a structure and its cost. A hash map gives O(1) average lookup but no order. A balanced BST (TreeMap, SortedDict) gives O(log n) lookups plus ordered and range queries. A heap gives O(1) peek and O(log n) push or pop for the minimum. A dynamic array gives O(1) indexing and amortized O(1) append, but O(n) middle inserts. A deque gives O(1) at both ends, and a trie handles prefix lookups.
  3. Combine structures when no single one covers every operation. An LRU cache pairs a hash map with a doubly linked list so get and put are both O(1). A scheduler that also needs cancel-by-id pairs a min-heap with a map from id to entry and deletes lazily.
  4. Weigh costs that Big O hides: memory overhead per entry, cache locality (arrays usually beat linked lists in practice), concurrent access, and whether the data must persist. Often the real decision is a table and index design: a B-tree index serves equality and range queries, while a hash index serves equality only.
  5. Close with a concrete example from my own work: the access pattern, the structure I picked, the alternative I rejected, and the measurement that confirmed or changed the choice.
Follow-up
  • Design an LRU cache and state the complexity of get and put.
  • When would a sorted array with binary search beat a hash map?
  • How does the choice change if the data has to be shared across several service instances?

The plan follows the reported order: fundamentals for the technical stage first, then database trade-offs, then behavioral stories for the panel, then a full run. Days that include a PracHub practice question use PracHub's own reviewed practice set, which is separate from the reported company 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
01Map the loop and pick your language
  • Write the three reported stages (Initial Screen, Technical Assessment, Panel Interview) on one page and mark which part of your preparation each needs.
  • Choose the one language from Java, C# or Python you will code in, and set up a plain editor environment where you can run small programs.
  • Write your CV walk-through with the stack, database and deployment details of each project.

Deliverable: A one-page loop map, a chosen interview language with a working environment, and a written CV walk-through.

02Hash maps and collision resolution
  • Implement a hash map with separate chaining in your chosen language, supporting put, get, delete and resize.
  • Add an open addressing variant with linear probing and write down how deletion works with tombstones.
  • Write a short answer on load factor, resize cost and worst-case lookup, then say it aloud for the collision resolution question.

Deliverable: Two working hash map implementations, tests for collisions and resize, and a spoken answer to the hash map question.

Practice prompt ↗
03Traveling Salesman and choosing data structures
  • Write brute force TSP over permutations, then the subset dynamic programming version, and record the complexity of each.
  • Implement nearest neighbor as a heuristic and compare its tour length to the exact answer on a small input.
  • Write a decision table for array, hash map, heap, tree and graph by access pattern, and apply it to a feature you built.

Deliverable: Three TSP solutions with a complexity note each, and a data structure decision table with one worked feature example.

Practice prompt ↗Practice prompt ↗
04Database architectures and SQL
  • Write a comparison of a single relational database, read replicas, partitioning and a non-relational store for a high-traffic read-heavy workload and a write-heavy one.
  • Work the PracHub practice questions on why an owner filter ignores an index and on replacing offset paging with keyset paging.
  • Practise the practice question on evolving an interface contract without breaking integrations you cannot upgrade.

Deliverable: A one-page trade-off comparison table, plus solved index and keyset paging practice questions.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Optimization, debugging and getting unstuck
  • Write your code optimization story in STAR form with a baseline figure, the evidence that found the bottleneck, the fix and the re-measured result.
  • Work the PracHub debugging practice question on latency spikes and record your diagnosis sequence.
  • Write your stuck-on-a-problem answer as a repeatable sequence plus one real example.

Deliverable: A written optimization story with numbers, a diagnosis note for the latency practice question, and a written getting-stuck answer.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
06Stakeholder, decision, review and pivot stories
  • Write STAR stories for the difficult stakeholder, the two similar options, the code review feedback and the changing requirements prompts.
  • For each story, add one sentence on why you chose that path over the alternative, and one measurable outcome.
  • Rehearse one of the stories aloud for a listener who is not an engineer, with no unexplained jargon.

Deliverable: Four STAR stories, each with a why sentence and an outcome, and one recorded non-technical retelling.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Full dry run and questions to ask
  • Run one mock that starts with a CV walk-through, then a spoken hash map, TSP and database trade-off answer, then two behavioral stories back to back.
  • Review where you stopped to think, and tighten those answers.
  • Write two questions for the end, on the team's technical challenges and on how they balance technical debt against new features.

Deliverable: A completed full mock with a list of weak answers to fix, and two written closing questions.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗

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

Candidates report that half of the questions are behavioral, on difficult colleagues, choosing between options, receiving code review feedback, changing requirements and getting stuck, and that the final stage is a panel with several stakeholders. Build stories you can tell in the STAR structure and always add why you chose that approach. Rehearse the code optimization story as both a technical and a behavioral answer.

Describe a time you had to optimize a piece of code that was performing poorly.

medium
Technical Knowledge and Data Structures

Describe a time you had to optimize a piece of code that was performing poorly.

Approach
  1. Choose a case where the slowness was measurable, and open with the number: a request time, a batch run length, a query cost or memory use. State the baseline before any change so the result is a comparison, not an impression.
  2. Show how you found the bottleneck: profiler, query plan or timing logs. Name the cause precisely, for example an N+1 query, a nested loop that a hash map lookup could replace, a missing index, repeated parsing or an oversized payload.
  3. Describe the fix and the alternative you rejected, with the trade-off, such as more memory for a cache against added complexity and invalidation risk. Mention complexity change where it applies, for instance O(n^2) to O(n).
  4. Close with the re-measured result, how you guarded against regressions (a benchmark, test or alert) and what you checked to be sure behavior stayed correct.
  5. The mistake that sinks this story is optimizing by guess. Never say you rewrote something because it looked slow; say what the evidence pointed at.
Follow-up
  • How did you know this was the bottleneck and not something upstream or downstream of it?
  • What did the optimization cost in readability, memory or maintenance, and was that worth it?
  • If profiling had shown no single hot spot, what would you have done next?

Tell me about a time you had to work with a difficult stakeholder or team member.

medium
Behavioral and Leadership

Tell me about a time you had to work with a difficult stakeholder or team member.

Approach
  1. Pick a real disagreement with a stakeholder or teammate where the relationship mattered afterwards, not a villain story. Describe the situation neutrally in two sentences: what each side wanted and why it was in conflict.
  2. Spend the story on what you did: asked questions to learn their constraint, restated their position to confirm it, moved the discussion from opinions to evidence such as data, a prototype or a written comparison, and agreed on who decided.
  3. Show the outcome in terms of the work: what shipped, what was changed, how the working relationship stood afterwards. If you did not get your way, say what you accepted and why.
  4. If the other person was non-technical, include how you translated the technical issue into effects on their operation. The mistake that sinks it is blame or describing the other person's character rather than your actions.
Follow-up
  • What would you do differently if you had to work with the same person again?
  • How did you handle it when you disagreed but the decision still went the other way?
  • How did you make sure the conflict did not slow the rest of the team?

Describe a project where you were given two similar options; how did you decide which path to take?

medium
Behavioral and Leadership

Describe a project where you were given two similar options; how did you decide which path to take?

Approach
  1. Choose a decision where both options were credible, such as two libraries, two storage designs or build versus buy. Name the options in one sentence each so the listener can follow the trade-off.
  2. State the criteria before the verdict: performance under expected load, team familiarity, operating effort, cost, reversibility and time to deliver. Show how you weighted them for that project.
  3. Describe how you reduced uncertainty: a small spike or benchmark, reading documentation and failure modes, asking someone who had run it in production. Evidence beats preference.
  4. Say what you decided, who agreed, and how you recorded the reasoning so it could be revisited. Close with what happened, including any cost of the option not chosen.
  5. The mistake that sinks it is describing a decision that was obvious or made by someone else. Pick one where you owned the call.
Follow-up
  • What would have changed your decision to the other option?
  • How reversible was the choice, and how did that affect how much analysis you did?
  • Looking back, was there a signal you missed or overweighted?

How do you handle feedback on your code during a pull request review?

medium
Behavioral and Leadership

How do you handle feedback on your code during a pull request review?

Approach
  1. Describe your habit in concrete steps: read all comments first, separate defects from style or preference, reply to each with a fix or a reason, and push the follow-up commit with a short summary. Treat the review as a conversation about the code, not about you.
  2. Give one real example where review changed your code, such as an edge case, a missing test, a naming problem or a simpler design. Say what you learned and whether it changed how you write the next change.
  3. Include one case where you disagreed: explain how you responded with evidence or a question, asked for a call when the thread was going in circles, and accepted the team convention when it was a matter of taste.
  4. Mention the other side: how you give feedback as a reviewer, with specific, kind comments tied to a reason. The mistake that sinks it is claiming you never receive meaningful comments or that you take them personally.
Follow-up
  • Tell me about a review comment you disagreed with and what you did.
  • How do you keep pull requests small enough to be reviewed well?
  • How do you review a colleague's code that you think has a design problem?

Tell me about a time you had to pivot your strategy due to changing project requirements.

medium
Behavioral and Leadership

Tell me about a time you had to pivot your strategy due to changing project requirements.

Approach
  1. Choose a project where requirements changed after work was underway, and state the change and its cause plainly, such as a stakeholder priority shift, a constraint discovered in testing or a new integration.
  2. Show the first thing you did: assess what existing work still held, what was wasted and what the new scope would cost. Present that to the product manager or stakeholder so the decision was shared rather than silent.
  3. Describe the new plan: what you cut, reused or deferred, how you adjusted tests and communication, and how you kept the team aligned. Name how you protected quality while the schedule moved.
  4. Finish with the result and one lesson, such as keeping the design modular or confirming requirements earlier. The mistake that sinks it is presenting the pivot as a complaint about the stakeholder or as pure rework.
Follow-up
  • How did you decide what existing work to keep and what to discard?
  • How did you communicate the impact on delivery to the people depending on it?
  • What did you change afterwards so a late change would hurt less?

What do you do when you are stuck on a technical problem and cannot find a solution?

medium
Behavioral and Leadership

What do you do when you are stuck on a technical problem and cannot find a solution?

Approach
  1. Answer with a repeatable sequence before the story. Reproduce the problem and shrink it to the smallest failing case, read the error and the relevant code or documentation, form one hypothesis at a time, and test each with a log, debugger or experiment.
  2. Name your limit: you set a time box and then bring in another person. Explain how you ask, with what you tried, what you observed and the minimal reproduction, so the other person can help quickly.
  3. Add a real example, such as a hard-to-debug production bug or a framework behavior you misread. Show what finally unlocked it and what you recorded afterwards, such as a test, a note or a runbook entry.
  4. Give a view on escalation: you do not sit silently on a blocker that affects others. The mistake that sinks it is saying you never get stuck or that you would only search the web.
Follow-up
  • How long do you work alone before asking, and how do you decide?
  • Tell me about the hardest bug you debugged and what finally revealed the cause.
  • How do you write up a problem so a colleague can help without a long meeting?
  • 01

    Describe a time you had to optimize a piece of code that was performing poorly.

  • 02

    Tell me about a time you had to work with a difficult stakeholder or team member.

  • 03

    Describe a project where you were given two similar options; how did you decide which path to take?

  • 04

    How do you handle feedback on your code during a pull request review?

  • 05

    Tell me about a time you had to pivot your strategy due to changing project requirements.

  • 06

    What do you do when you are stuck on a technical problem and cannot find a solution?

PracHub preparation framework ↗
How long does the interview process take?

Candidates report three rounds, an Initial Screen, a Technical Assessment and a Panel Interview, over roughly 3-5 weeks. The timing can vary with team requirements, so ask the recruiter for the schedule in writing after your first conversation.

Compass Group North America Software Engineer candidate reports ↗
Is the technical stage whiteboard coding or practical work?

Candidates describe a mix: algorithmic problems plus discussion of your past work in practical terms. Prepare both. Practise hash maps, trees, graphs and complexity analysis in code, and be ready to explain why you chose the tools and designs in your own projects, including their limitations.

Compass Group North America Software Engineer candidate reports ↗
How should I prepare for the panel?

Candidates describe a session with stakeholders from different departments, and report meeting the Hiring Manager, peers and sometimes leadership across the process. Rehearse STAR stories on conflict, decisions, review feedback, changing requirements and being stuck, and practise explaining a technical choice to a listener outside engineering.

Compass Group North America Software Engineer candidate reports ↗
If the panel feels positive, does that mean I have the offer?

Candidates warn that a panel can feel like a settled outcome even though the decision follows a review of all candidates. Keep your other processes moving and keep preparing until you hold a written offer.

Compass Group North America Software Engineer candidate reports ↗
Which languages and tools should I know?

The requirements candidates describe name Java, C# or Python as the programming language, strong data structures and algorithms, and database design with SQL. Cloud platforms (AWS or Azure), CI/CD pipelines, automated testing frameworks and logistics or enterprise software experience are listed as nice-to-haves. Choose the language you code fastest in, and review SQL joins, indexes and schema design.

PracHub Software Engineer practice ↗
What should I ask at the end of an interview?

Candidates suggest asking about the team's current technical challenges and about how the team balances technical debt against new feature work. Write your questions in advance and tailor them to what you learned in that conversation.

Compass Group North America Software Engineer candidate reports ↗
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.