Avangarde Consulting Group · Software Engineer
Updated · 2026-10-02

Avangarde Consulting Group Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Avangarde Consulting Group is a consulting firm that delivers software projects for clients, and candidates report that engineers may also be placed on projects for partner companies. The Software Engineer role candidates describe is backend work in Java: designing, building and maintaining the services behind client applications, taking work from requirements and technical specification through implementation and testing, reviewing code, turning business requirements into technical tasks, reporting progress to project managers or clients, and fixing issues raised in testing or production. Much of the work happens inside codebases someone else wrote, so reading unfamiliar code fluently is part of the job.

This guide is for engineers interviewing for the Software Engineer role at Avangarde Consulting Group, usually with a Java backend background. It covers the reported stages, question-by-question guidance for the four Java and backend questions and five behavioral questions candidates report, the wider stack in the requirements candidates describe (SQL/databases and Git as must-haves; AWS or Azure, microservices and Agile/Scrum as nice-to-haves), and a one-week plan that ends in a full mock of the process.

Candidates report three stages over roughly two weeks: an introductory (conoscitivo) interview about background and goals, a technical assessment that usually centres on Java, and a final deep-dive with a senior developer covering past projects and live problem solving.

JavaBack-end developmentProblem solving (in colloqui di programmazione)

29 min read

Browse Software Engineer questions

See the practice prompts

14Practice promptsAcross five skill areas

The reported questions fall into two groups. Four are technical: OOP principles in Java, how you debug a complex backend application, memory management and performance in Java services, and refactoring legacy code. Five are behavioral and lean on consulting situations: a challenging project and your own part in it, technical disagreements with teammates or clients, learning a framework on a deadline, meeting a client's quality bar, and documentation on long-running projects. Candidates also mention a live coding exercise, with sample prompts such as processing a given data structure efficiently and speeding up an existing piece of code.

On the technical side, the areas candidates list are Java Collections, multithreading, exception handling, basic data structures and algorithms, and when to use Singleton, Factory or Strategy. That is a fundamentals-heavy scope: prepare to explain why a HashMap depends on a consistent equals and hashCode, when an ExecutorService beats managing raw threads, and where checked exceptions belong, and to write correct Java without an IDE filling in the APIs. Candidates describe the assessments as tests of core knowledge and reasoning rather than trick problems, so depth on fundamentals pays more than rare algorithms.

The final stage is reported as a conversation with a senior developer about projects you have built, plus problem solving in real time. Prepare two projects you can defend at the level of architecture, data model, the trade-offs you made and the code you personally wrote. Because the role involves explaining technical constraints and progress to project managers and clients, practise giving each technical answer in a version a non-engineer could follow as well.

The requirements candidates describe also list SQL/databases and Git as must-haves. Neither appears in the reported questions, but a Java backend assessment can reach a join, an index or a transaction, so cover joins, aggregation, indexing and isolation levels, and be able to explain merge versus rebase and how you resolve a conflict.

01

Preparation focus

editorial

Candidates report three stages. The process opens with an introductory (conoscitivo) interview about your background and professional goals. A technical assessment follows, usually centred on Java. The last stage is a deep-dive with a senior developer in which you discuss past projects and solve technical problems in real time, and candidates also mention a live coding exercise. Prepare in that order: a short career summary and clear reasons for wanting consulting work, then Java fundamentals and small coding problems written by hand in Java, then two project stories you can defend down to individual design decisions. Candidates say the way you reason through a coding problem counts alongside the final answer, so practise every coding problem out loud.

What to demonstrate

  • Your background and goals, reported as the subject of the introductory interview
  • Core Java knowledge, which candidates report the technical assessment centres on
  • Working Java code in the live coding exercise, with the reasoning stated as you write it
  • How well you explain and defend the design of your past projects in the senior-developer deep-dive

How to prepare

  • Rebuild the reported Java areas: Collections internals (HashMap, ArrayList, TreeMap, ConcurrentHashMap), exception handling, ExecutorService-based multithreading, and Singleton, Factory and Strategy with one code example each
  • Solve five or six small data-structure problems in plain Java without autocomplete while narrating, such as the overlapping job attempts and heaviest tenants practice problems, plus one task that speeds up an existing slow method
  • Write out two project stories covering architecture, data model, one trade-off, one production issue you fixed and the code you personally wrote
  • Prepare a career summary and questions about project allocation, partner-company placements and smart working for the introductory interview
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Reciting encapsulation, inheritance, polymorphism and abstraction as textbook definitions with no Java code behind them.

For each principle, have one snippet from your own work ready: an immutable value class, an interface with two implementations chosen at runtime, a place where you swapped inheritance for composition. Know the equals/hashCode contract and the interface versus abstract class rules well enough to state them without hesitation.

02

Answering the debugging question with 'I add print statements' and no order of attack.

Learn a fixed sequence: scope and reproduce, read logs by request id and the full stack trace, check metrics, then pick a tool by symptom (thread dumps for hangs, heap dumps for memory growth, a profiler for slowness), fix with a regression test. Tell it through one real incident you resolved.

03

Coding the live exercise in silence, or depending on an IDE for Java syntax and collection APIs.

Candidates report that explaining your logic during coding exercises carries weight. Practise in a plain editor while talking: restate the input, give the simple approach and its complexity, then improve it. Know Map.getOrDefault, computeIfAbsent, PriorityQueue, ArrayDeque and Comparator chaining from memory.

04

Going vague in the project deep-dive: unable to say why an architecture or library was chosen, or which part you wrote.

For two projects, write down the components and how they talk to each other, the data model, one trade-off with the rejected alternative, one production problem and how you fixed it, and the code that was yours. Rehearse answering 'why not X instead?' for each major choice.

05

Skipping SQL and Git because the reported questions are Java-heavy.

The requirements candidates describe list SQL/databases and Git as must-haves. Review joins, GROUP BY with HAVING, when an index is and is not used, transactions and isolation levels, and the N+1 problem in JPA or JDBC code; be able to explain merge versus rebase and how you resolve a conflict.

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

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?

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?

Find overlapping job attempts and peak concurrency from lease records

medium
sweep lineintervalsleases

A day of job_run history yields about 50,000,000 attempt records: (job_run_id, job_type, attempt, started_at, finished_at which is NULL when the worker died, lease_expires_at). Leases expire on a clock, so a job that outran its lease ran twice. Produce (a) every job_run_id whose attempts overlapped in wall-clock time and (b) the peak number of simultaneously running attempts per job_type with the minute it occurred. Target O(n log n). State how you treat a NULL finished_at and what clock skew does to your answer.

Approach
  1. Define the interval before sorting anything: an attempt occupies [started_at, COALESCE(finished_at, lease_expires_at)). finished_at is observed and lease_expires_at is only a promise, so every attempt without a finish contributes an estimate and the whole result is a lower bound on overlap rather than an exact count.
  2. For peak concurrency, sweep: emit 2n endpoints, sort by (timestamp, kind) with ends ordered before starts at equal timestamps, then walk the sequence maintaining a counter per job_type and record each type's maximum with its timestamp. O(n log n) dominated by the sort, O(n) space, or O(1) extra if the sort is external and the walk streams.
  3. For overlap detection, do not compare attempts pairwise. A single global sort by (job_run_id, started_at) gives both the grouping and the order; within a group, keep the maximum end seen so far and report an overlap exactly when the next start is less than that running maximum, which is one linear pass after the sort.
  4. Half-open intervals matter and are easy to get wrong: with closed intervals an attempt ending at the same millisecond another begins reads as concurrency two, and across 50,000,000 records that artefact swamps the real signal.
Follow-up
  • A handler is not idempotent and you have found 400 overlapping jobs. Which of them actually caused damage, and what would you query to find out?
  • Peak concurrency for one job_type is 4 against a configured cap of 4. Is the cap working, or is the data hiding attempts that never started?

Each day targets one part of the reported process: Java fundamentals and coding for the technical assessment, debugging, performance and SQL for the backend questions, project stories for the senior-developer deep-dive, and the consulting behavioral questions. Reported and practice questions are attached to the days that work them.

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
01Java OOP and design patterns
  • Answer the OOP principles question aloud, giving a Java code example for each of the four principles
  • Write a small fee calculator in Java with a Strategy interface, two implementations and a Factory that picks one at runtime
  • Write an immutable value class with correct equals and hashCode, and a test that stores and finds it in a HashSet

Deliverable: A recorded OOP answer, a working Strategy plus Factory example, and an immutable value class with a passing HashSet test.

Practice prompt ↗
02Collections and data-structure coding
  • Review HashMap internals (hashing, buckets, resizing, tree bins since Java 8), ArrayList versus LinkedList, TreeMap, PriorityQueue and ConcurrentHashMap
  • Solve the overlapping job attempts problem in Java: sort by start time and sweep with a min-heap of end times to get peak concurrency, narrating as you go
  • Solve the heaviest tenants problem in Java: count with a HashMap and keep a size-k min-heap for O(n log k), then discuss what changes when memory is tight

Deliverable: A one-page Collections cheat sheet and two narrated Java solutions with their complexity written down.

Practice prompt ↗Practice prompt ↗
03Memory, performance and concurrency
  • Answer the memory management and performance question aloud with one real optimisation story and its before and after number
  • Write a program with an unbounded static cache, run it with a small -Xmx, capture a heap dump and identify the retaining map
  • Write a producer-consumer with ExecutorService and a BlockingQueue, and explain synchronized versus volatile versus AtomicInteger
  • Take a slow method (string concatenation in a loop, autoboxing, wrong collection) and rewrite it, measuring both versions

Deliverable: A recorded performance answer, an annotated heap-dump finding, a working producer-consumer, and a before and after timing for the rewritten method.

Practice prompt ↗
04Backend debugging and SQL
  • Write your debugging sequence as a one-page checklist and tell one real debugging story with it aloud
  • Create a deliberate deadlock between two threads, take jstack dumps and point to the lock cycle
  • Solve the per-tenant active cap SQL problem (transaction with a row lock or a guarded insert) and the tag-and-share fan-out problem (aggregate before joining)
  • Revise Git merge versus rebase and how you resolve a conflict

Deliverable: A debugging checklist plus recorded story, an annotated thread dump, two SQL solutions with the concurrency or fan-out reasoning, and Git notes.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Project deep-dive stories
  • For two projects, write the component sketch, data model, one trade-off, one production issue and the code you personally wrote
  • Build the legacy refactoring story around characterization tests, named refactorings and a measurable result
  • Build the challenging-project story with your own contribution and a concrete outcome, then explain each project once for an engineer and once for a non-technical client

Deliverable: Two project fact sheets and recorded STAR answers for the refactoring and challenging-project questions.

Practice prompt ↗Practice prompt ↗
06Consulting behavioral answers
  • Write STAR outlines for the disagreement, learning-under-deadline, client quality standard and documentation questions
  • Rehearse each aloud and cut anything that does not show your own decision or a result
  • Write questions for the interviewers about project allocation, partner-company placements, training and smart working

Deliverable: Four rehearsed STAR outlines and a list of questions to ask.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Full mock of the three stages
  • Mock the introductory interview: career summary, why consulting, what you want from your next project
  • Mock the technical stage: solve the projection-diff problem in Java (sorted merge or hash comparison in batches instead of per-row reads), then answer rapid Java questions on Collections, exceptions and threads
  • Mock the deep-dive: have someone question you on one project and one technical problem, then re-do the weakest answer

Deliverable: A completed three-part mock, a written list of weak spots, and one re-done answer.

Practice prompt ↗

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

The behavioral questions candidates report centre on consulting situations: owning your part of a hard project, resolving technical disagreements with teammates or clients, picking up new technology quickly, meeting a client's quality bar and keeping long-running projects documented. Prepare one first-person STAR story per prompt, each ending in a concrete result.

How do you handle memory management and performance optimization in Java-based services?

medium
Technical Proficiency and Java

How do you handle memory management and performance optimization in Java-based services?

Approach
  1. Lay out the JVM memory model: objects live on the heap, which the garbage collector manages in young and old generations; each thread has its own stack for frames and local variables; class metadata lives in Metaspace. Know that G1 has been the default collector since Java 9 and that -Xms and -Xmx bound the heap.
  2. Explain that a Java leak is memory still referenced, not memory never freed: unbounded static maps or caches, listeners never removed, ThreadLocal values left on pooled threads, unclosed streams and connections. Remedies are try-with-resources, bounded caches with eviction, removing ThreadLocal values in finally blocks, and weak references where they fit.
  3. Describe a measure-first workflow: reproduce the load, profile with Java Flight Recorder or VisualVM, read GC logs for pause length and frequency, and take a heap dump and inspect the dominator tree when old-generation usage keeps climbing after full collections.
  4. Name the fixes that usually matter in backend services before any JVM flag: N+1 database queries, missing indexes, connection-pool sizing, string concatenation in loops (use StringBuilder), autoboxing in hot paths, and the wrong collection (LinkedList for indexed access, a HashMap resized repeatedly instead of created with a capacity).
  5. Anchor it with one real case: the symptom, the measurement that pinpointed it, the change, and the before and after number such as p95 latency, heap after GC or pause time.
Follow-up
  • OutOfMemoryError: Java heap space versus Metaspace: what does each point to?
  • How would you find a leak in a running service without restarting it?
  • Why can a hand-written microbenchmark mislead you, and how does JMH help?

Tell me about a challenging project you worked on and your specific contribution to its success.

medium
Behavioral and Professional Experience

Tell me about a challenging project you worked on and your specific contribution to its success.

Approach
  1. Choose a project where the difficulty was real and you owned a clear piece, ideally backend work in Java; a project you only watched will not hold up under detailed questions about its design.
  2. Situation and task in a few sentences: the system, the constraint (deadline, legacy integration, performance target, shifting requirements) and what you were responsible for.
  3. Actions in the first person: the decision you made, the alternative you rejected and why, and how you kept the team, project manager or client informed. Separate your work from the team's explicitly.
  4. Result with a number or concrete outcome (shipped on a date, latency from A to B, defects down) plus one thing you would do differently. The mistake that sinks this answer is narrating the team's achievement without ever stating your own contribution.
Follow-up
  • What would have gone wrong if you had not done your part?
  • Walk me through the architecture of that system.
  • What would you change if you started the project again?

How do you handle disagreements regarding technical implementation with team members or clients?

medium
Behavioral and Professional Experience

How do you handle disagreements regarding technical implementation with team members or clients?

Approach
  1. Pick a real disagreement over an implementation choice (framework, data model, synchronous versus asynchronous integration, scope of a fix) where the stakes were concrete.
  2. Show the method: understand the other side's reasons first, agree the decision criteria (requirements, risk, delivery date, maintenance cost), then settle it with evidence such as a small prototype, a benchmark or a written comparison of options.
  3. For a client disagreement, translate the technical constraint into cost, risk and timeline, present options with their consequences, let the client decide where the call is theirs, and record the decision in writing.
  4. Include the outcome and your conduct afterwards: if the decision went against you, show that you committed to it. Avoid stories where the other person was simply wrong or where nothing was resolved.
Follow-up
  • Tell me about a time you turned out to be the one who was wrong.
  • What if the client insists on an approach you believe is risky?
  • When do you escalate instead of resolving it yourself?

Describe a time when you had to learn a new technology or framework under a tight deadline.

medium
Behavioral and Professional Experience

Describe a time when you had to learn a new technology or framework under a tight deadline.

Approach
  1. Pick a case with a real deadline and a technology new to you (a framework, a database, a cloud service, a client's internal platform), and say what was at stake if you missed it.
  2. Describe how you learned efficiently: mapped the new tool onto concepts you already knew, read the official documentation, built a small throwaway spike on the hardest part first, and asked someone experienced to review your first pull request.
  3. Show you protected quality: what you tested, which shortcuts you took on purpose and how you paid them back afterwards.
  4. Close with the result and the habit you kept. Candidates report that consultants move between client projects, so link the story to how you would ramp up on an unfamiliar client codebase.
Follow-up
  • How did you decide you knew enough to ship?
  • What did you get wrong because the technology was new to you?
  • How would you become productive in an unfamiliar client codebase in your first week?

How do you ensure that your code meets the quality standards expected by the client?

medium
Behavioral and Professional Experience

How do you ensure that your code meets the quality standards expected by the client?

Approach
  1. Start by establishing the client's standard: coding conventions, Definition of Done, required coverage, static-analysis or security gates, review rules. Quality is judged against that bar, not only your own.
  2. List the practices you apply every time: JUnit unit tests with mocked dependencies, integration tests at database and API boundaries, deliberate exception handling and logging, small pull requests, and review on every change.
  3. Mention automation: a CI pipeline that runs tests and static analysis (for example Checkstyle or SonarQube) on every push, so the standard is enforced by the build rather than by memory.
  4. Back it with one example, such as a defect you caught in review or with a test before it reached the client, and address deadline pressure: what you would never skip and what you would negotiate.
Follow-up
  • What do you look for first when reviewing someone else's pull request?
  • The deadline is tomorrow and the tests are not written. What do you do?
  • How do you handle a client standard you disagree with?

What is your approach to documentation when working on long-term projects?

medium
Behavioral and Professional Experience

What is your approach to documentation when working on long-term projects?

Approach
  1. Say what you document and where: a README that gets a new developer running locally, architecture decision records explaining why a choice was made, API contracts (OpenAPI, or Javadoc on public interfaces), and runbooks for deployment and common incidents.
  2. Keep it beside the code and current: documentation lives in the Git repository, changes in the same pull request as the code it describes, and is checked in review; code comments explain why, not what.
  3. Tie it to consulting work: candidates report that consultants move between client projects, so handover notes and decision records are what let the next engineer continue without you.
  4. Give one example where documentation saved time, or where its absence cost time, and what you changed afterwards.
Follow-up
  • How do you stop documentation going stale?
  • What would you write before handing a project to another consultant?
  • What belongs in a code comment and what belongs in external documentation?
  • 01

    Tell me about a challenging project you worked on and your specific contribution to its success.

  • 02

    How do you handle disagreements regarding technical implementation with team members or clients?

  • 03

    Describe a time when you had to learn a new technology or framework under a tight deadline.

  • 04

    How do you ensure that your code meets the quality standards expected by the client?

  • 05

    What is your approach to documentation when working on long-term projects?

  • 06

    Describe a situation where you had to refactor legacy code to improve maintainability.

PracHub preparation framework ↗
How difficult are the technical assessments?

Candidates describe them as checks on core Java knowledge and logical reasoning rather than trick questions. If you can write correct Java using Collections, explain exception handling and basic multithreading, and solve simple data-structure problems while explaining your approach, you have covered the reported scope.

Avangarde Consulting Group Software Engineer candidate reports ↗
What is the typical timeline for the interview process?

Candidates report about two weeks from first contact to a decision. Finish Java fundamentals before the technical assessment and have your project stories ready before the deep-dive with the senior developer.

Avangarde Consulting Group Software Engineer candidate reports ↗
Does the company offer remote work?

Candidates report that smart working is often possible but depends on the client or project you are assigned to. Ask about it in the introductory interview, together with how projects are allocated.

Avangarde Consulting Group Software Engineer candidate reports ↗
How can I stand out during the interview?

Candidates point to two things: explaining the reasoning behind the technical decisions in your own projects, and communicating clearly during the live coding exercise. Prepare the reason behind every major choice in two projects, and practise stating your approach before and while you write code.

Avangarde Consulting Group Software Engineer candidate reports ↗
What topics come up in the Avangarde Consulting Group Software Engineer interview?

Candidates report Java, backend development, problem solving in coding interviews, a coding exercise and a technical test. Within Java the listed areas are Collections, multithreading, exception handling, basic data structures and algorithms, and the Singleton, Factory and Strategy patterns; example prompts include processing a data structure efficiently and making a piece of code run faster.

Avangarde Consulting Group Software Engineer candidate reports ↗
Do I need anything beyond Java?

The requirements candidates describe list SQL/databases and Git as must-haves, and AWS or Azure, microservices and Agile/Scrum as nice-to-haves. Cover joins, aggregation, indexing and transactions, and Git branching and conflict resolution; for the nice-to-haves, be able to describe any real experience you have rather than studying them from scratch.

PracHub Software Engineer practice ↗
Could I end up working on another company's project?

Candidates report that working on projects for partner companies is possible, which is a common arrangement in consulting. If that matters to you, ask in the introductory interview how placements are decided and how assignments are handed over.

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.