Interview guides · TensorIoT
TensorIoT Software Engineer Interview Guide
TensorIoT Software Engineer interview guide: reported rounds, questions and how candidates describe the process.
The 60-second brief
A Software Engineer at TensorIoT plays a pivotal role in bridging the physical and digital worlds. TensorIoT is a highly specialized AWS Advanced Consulting Partner that builds cutting-edge solutions across IoT, Artificial Intelligence, Machine Learning, and Cloud/Serverless architectures. In this role, you are not just writing standard backend code; you are architecting the highly scalable pipelines and cloud infrastructure that allow enterprise clients to process massive streams of device data in real time. Your day-to-day contribution directly impacts how global enterprises leverage automation and data-driven insights. Whether you are optimizing a serverless API, configuring secure IoT device registries, or deploying machine learning models to the edge, your work ensures high availability, low latency, and robust security.
This guide is scoped to a Software Engineer candidate at TensorIoT.
Focus areas
- Python
- Object-Oriented Programming (OOP)
- AWS
The TensorIoT interview process
TensorIoT candidates report 4 rounds over 3-5 weeks. The stages below are what candidates describe, not a published process.
Initial Screening Call
A call with HR to align on your experience and expectations.
What to demonstrate
- A call with HR to align on your experience and expectations
- Depth in Python
How to prepare
- Be able to walk your CV end to end in two minutes, and say why this company specifically.
- Have your salary expectations, notice period and location constraints ready, and ask for the rest of the loop in writing.
Take-Home Assignment
A practical assignment to assess your coding skills and knowledge.
What to demonstrate
- A practical assignment to assess your coding skills and knowledge
- Depth in Python
How to prepare
- Answer aloud and timed: Explain the SOLID design principles and describe how you would apply them to refactor a tightly coupled codebase.
- Answer aloud and timed: What are design patterns, and when would you use a Singleton pattern versus a Factory pattern in a backend application?
Live Technical Interviews
Multiple rounds of interviews focusing on coding design, system architecture, and backend proficiency.
What to demonstrate
- Multiple rounds of interviews focusing on coding design, system architecture, and backend proficiency
- Depth in Python
How to prepare
- Answer aloud and timed: What is the difference between a list and a tuple in Python, and how do they differ in terms of memory allocation and performance?
- Answer aloud and timed: Explain how Python's garbage collection and memory management work, particularly regarding reference counting and cyclic references.
Final Discussion
A concluding discussion with senior management or the executive team.
What to demonstrate
- A concluding discussion with senior management or the executive team
- Depth in Python
How to prepare
- Answer aloud and timed: How do you handle concurrency in Python? Compare multi-threading, multi-processing, and asynchronous programming (
asyncio). - Answer aloud and timed: Describe how decorators work in Python and write a custom decorator to log the execution time of a function.
Where candidates lose points
Perfect Your Take-Home Assignment
Treat the take-home assignment as if you are writing production code for a client. Ensure your code is modular, includes clear comments, handles edge cases, and has a clean directory structure. Adding unit tests and a clear README file explaining your design decisions will set you apart from other candidates.
When designing your take-home project, explicitly state any assumptions you make in the README
This shows interviewers that you think critically about requirements and can work independently through ambiguity.
Over-Communicate During Live Coding
When solving coding problems in live interviews, do not jump straight into writing code. State your understanding of the problem, discuss your proposed approach, explain any trade-offs, and get the interviewer's alignment first. Talk through your thought process as you type.
Be Proactive with HR Follow-ups
Because the interview process involves multiple stakeholders and can span several weeks, keep a close track of your timeline. If you do not hear back within a few business days of completing a round, send a polite, professional follow-up email to keep your candidacy moving forward.
Questions & practice
What is the difference between a list and a tuple in Python, and how do they differ in terms of memory allocat
Medium · Python & Backend Development
What is the difference between a list and a tuple in Python, and how do they differ in terms of memory allocation and performance?
Approach
- Say what the runtime actually does before reasoning about the code.
- Name what is shared across threads and what owns each piece of state.
- Identify the window where an invariant is briefly untrue.
- Distinguish a value from a reference to it, and say which one you handed out.
Follow-up
- What happens if two callers reach this at the same time?
- Where could this allocate more than you expect?
Explain how Python's garbage collection and memory management work, particularly regarding reference counting
Medium · Python & Backend Development
Explain how Python's garbage collection and memory management work, particularly regarding reference counting and cyclic references.
Approach
- Say what the runtime actually does before reasoning about the code.
- Name what is shared across threads and what owns each piece of state.
- Identify the window where an invariant is briefly untrue.
- Distinguish a value from a reference to it, and say which one you handed out.
Follow-up
- What happens if two callers reach this at the same time?
- Where could this allocate more than you expect?
How do you handle concurrency in Python? Compare multi-threading, multi-processing, and asynchronous programmi
Medium · Python & Backend Development
How do you handle concurrency in Python? Compare multi-threading, multi-processing, and asynchronous programming (asyncio).
Approach
- Say what the runtime actually does before reasoning about the code.
- Name what is shared across threads and what owns each piece of state.
- Identify the window where an invariant is briefly untrue.
- Distinguish a value from a reference to it, and say which one you handed out.
Follow-up
- What happens if two callers reach this at the same time?
- Where could this allocate more than you expect?
Explain the difference between SQL and NoSQL databases. In what scenario would you choose Amazon DynamoDB over
Medium · System Design & Cloud Architecture
Explain the difference between SQL and NoSQL databases. In what scenario would you choose Amazon DynamoDB over a relational database?
Approach
- Name the grain you start from and join outward from it.
- Check whether any join is one-to-many before aggregating, or the sums inflate.
- Say which index the query would use, and what makes it unusable.
- Handle the rows that do not match: that is usually the actual question.
Follow-up
- How does the query change if that join becomes one-to-many?
- What happens to this when the table is ten times larger?
Stop tag and share joins from fanning out a page
Medium · join fan-out · semi-joins · many-to-many
resource_tag is (resource_id, tag_id) with PK (resource_id, tag_id); resource_share is (resource_id, shared_with_user_id, permission). The tagged-and-shared listing inner-joins resource to both, filters tenant_id, tag_id = ANY($2) and shared_with_user_id = $3, orders by updated_at DESC and takes 50. Pages come back with fewer than 50 distinct resources and the total in the header is far too high. Explain the row multiplication, rewrite both the page query and the count query so each is correct, and name the index each one needs. PostgreSQL 16.
Approach
- Do the arithmetic against the predicates that are actually there. An inner join emits one row per matching child row, and both joins are filtered: tag_id = ANY($2) admits only the requested tags, shared_with_user_id = $3 admits one user's share rows. So a resource holding three of the requested tags and shared with $3 once yields three rows, not one — the multiplier is its count of matching tags times its share rows for that single user, and that second factor is 1 unless the table admits duplicate (resource_id, shared_with_user_id) pairs. LIMIT 50 then limits rows rather than resources, and COUNT(*) counts pairs — the header is the product, not the population.
- Reject DISTINCT as the fix. It deduplicates after the product has been built, so the planner must materialise and sort the fanned-out set before the LIMIT can apply, and it leaves any SUM or AVG in the same select list wrong.
- Rewrite both filters as semi-joins, keeping resource as the only row source: AND EXISTS (SELECT 1 FROM resource_tag rt WHERE rt.resource_id = r.resource_id AND rt.tag_id = ANY($2)) and the same shape against resource_share. A semi-join stops at the first match per resource and preserves the driving index order, so ORDER BY updated_at DESC, resource_id DESC LIMIT 50 still stops after 50 rows.
- Count with the same predicates and no join at all: SELECT count(*) FROM resource r WHERE r.tenant_id = $1 AND r.status = 'active' AND EXISTS (...) AND EXISTS (...). Nothing multiplies a resource, so the number is the population.
Follow-up
- The filter changes from 'any of these tags' to 'all of these tags'. Rewrite it and state what it costs relative to the ANY form.
- A resource can be shared with the same user twice under different permissions. Does your count change, and should it?
Design a Parking Lot system using object-oriented principles. Explain your choice of classes, attributes, and
Medium · Object-Oriented Programming & Design
Design a Parking Lot system using object-oriented principles. Explain your choice of classes, attributes, and relationships.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
How do you implement inheritance, polymorphism, and encapsulation in Python? Provide concrete examples.
Medium · Object-Oriented Programming & Design
Approach
- Clarify what is being asked and what a complete answer contains.
- State your assumptions explicitly before working the problem.
- Say what you would check first and why it is the highest-information step.
- Work from the requirement backwards to the design.
Follow-up
- What assumption would you test first?
- How would you know your answer was wrong?
Explain the SOLID design principles and describe how you would apply them to refactor a tightly coupled codeba
Medium · Object-Oriented Programming & Design
Explain the SOLID design principles and describe how you would apply them to refactor a tightly coupled codebase.
Approach
- Clarify what is being asked and what a complete answer contains.
- State your assumptions explicitly before working the problem.
- Say what you would check first and why it is the highest-information step.
- Work from the requirement backwards to the design.
Follow-up
- What assumption would you test first?
- How would you know your answer was wrong?
What are design patterns, and when would you use a Singleton pattern versus a Factory pattern in a backend app
Medium · Object-Oriented Programming & Design
What are design patterns, and when would you use a Singleton pattern versus a Factory pattern in a backend application?
Approach
- Clarify what is being asked and what a complete answer contains.
- State your assumptions explicitly before working the problem.
- Say what you would check first and why it is the highest-information step.
- Work from the requirement backwards to the design.
Follow-up
- What assumption would you test first?
- How would you know your answer was wrong?
Describe how decorators work in Python and write a custom decorator to log the execution time of a function.
Medium · Python & Backend Development
Approach
- Clarify what is being asked and what a complete answer contains.
- State your assumptions explicitly before working the problem.
- Say what you would check first and why it is the highest-information step.
- Work from the requirement backwards to the design.
Follow-up
- What assumption would you test first?
- How would you know your answer was wrong?
How would you design a scalable API gateway that handles rate-limiting and authentication for millions of requ
Medium · System Design & Cloud Architecture
How would you design a scalable API gateway that handles rate-limiting and authentication for millions of requests?
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
How do you design a system to ingest and process real-time data streams from thousands of IoT devices?
Medium · System Design & Cloud Architecture
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
What is serverless architecture, and what are the primary architectural challenges when building an applicatio
Medium · System Design & Cloud Architecture
What is serverless architecture, and what are the primary architectural challenges when building an application entirely on AWS Lambda?
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
One log partition stops advancing while the others drain
Easy · poison message · head-of-line blocking · consumer lag
Search results for a subset of tenants are hours stale; the rest are current. The projection consumer reports lag of zero on 15 of 16 partitions and 400,000 on one. Its error rate is flat and its CPU is idle. outbox_event has no pending rows older than a second, so the relay has published everything it holds. Identify the mechanism, give the ordered checks, and state what you do in the first ten minutes versus what you change permanently.
Approach
- Read the lag distribution first. A slow consumer lags everywhere; zero on fifteen partitions and 400,000 on one is not throughput. Idle CPU on the stuck partition means the consumer is not advancing its offset at all, which points at one message it cannot get past rather than at a rate problem.
- Exonerate the producer before touching the consumer. No pending outbox rows older than a second means the relay published, so the event exists in the log. This separates never sent from sent and never applied, which are different code paths and usually different owners.
- Read the message at the stuck offset and the handler's log lines for its event_id. A flat error rate with no progress has two explanations and you must distinguish them: the handler is throwing and the retry loop is swallowing it, or the handler is blocking on something and never returning. Idle CPU with no error lines favours the second.
- Mitigate before diagnosing further. Move the offending event to a dead-letter store and commit the offset past it. Adding consumers does nothing here, because a partition is consumed by exactly one member of the group, and the blast radius is every aggregate hashed to that partition, not only the aggregate that produced the bad event.
Follow-up
- The dead-lettered event carried aggregate_version 7 and the projection had applied 6. What must the replay do differently if 8 and 9 landed in the meantime?
- How do you show staleness to the user while the partition is behind, given the API already returns the projection's watermark?
Suggested practice checklist
Built from the rounds and topics TensorIoT candidates report.
Day 1 — Map the TensorIoT loop
- Write out the reported sequence: Initial Screening Call, Take-Home Assignment, Live Technical Interviews, Final Discussion.
- For each round, write one sentence on what it is judging, from the description above, and mark the one you are least ready for.
Deliverable: A one-page map of the 4 reported rounds, with the weakest marked.
Day 2 — Work Python
- Spend the session on Python, which TensorIoT candidates report being tested on.
- Write one worked example in Python and time yourself on it.
Deliverable: One timed worked example in Python.
Day 3 — Work Object-Oriented Programming (OOP)
- Spend the session on Object-Oriented Programming (OOP), which TensorIoT candidates report being tested on.
- Write one worked example in Object-Oriented Programming (OOP) and time yourself on it.
Deliverable: One timed worked example in Object-Oriented Programming (OOP).
Day 4 — Work AWS
- Spend the session on AWS, which TensorIoT candidates report being tested on.
- Write one worked example in AWS and time yourself on it.
Deliverable: One timed worked example in AWS.
Day 5 — Answer out loud: Object-Oriented Programming & Design
- Answer aloud, timed: Design a Parking Lot system using object-oriented principles. Explain your choice of classes, attributes, and relationships.
- Answer aloud, timed: How do you implement inheritance, polymorphism, and encapsulation in Python? Provide concrete examples.
Deliverable: Spoken answers to 2 reported Object-Oriented Programming & Design question(s), under time.
Day 6 — Answer out loud: Python & Backend Development
- Answer aloud, timed: What is the difference between a list and a tuple in Python, and how do they differ in terms of memory allocation and performance?
- Answer aloud, timed: Explain how Python's garbage collection and memory management work, particularly regarding reference counting and cyclic references.
Deliverable: Spoken answers to 2 reported Python & Backend Development question(s), under time.
Day 7 — Answer out loud: System Design & Cloud Architecture
- Answer aloud, timed: How would you design a scalable API gateway that handles rate-limiting and authentication for millions of requests?
- Answer aloud, timed: Explain the difference between SQL and NoSQL databases. In what scenario would you choose Amazon DynamoDB over a relational database?
Deliverable: Spoken answers to 2 reported System Design & Cloud Architecture question(s), under time.
Behavioural preparation
Behavioural rounds judge the decision you made and what it cost.
Narrate an outage you owned from page to postmortem
Hard · incident response · blast radius · postmortems
Pick an incident you personally drove, ideally one where writes were affected rather than reads. In six to eight minutes: state the symptom as it first appeared on a dashboard, the blast radius you established before you knew the cause, the mitigation you applied and when, the mechanism you eventually proved, and the follow-up that would prevent a repeat. Bring numbers: error rate, tenants affected, minutes to mitigate, minutes to resolve. If you cannot name what you measured, choose a different incident.
Approach
- Open on the signal rather than the cause: which metric at which percentile moved, on which service, at what time, so the listener follows the same evidence you had rather than a conclusion you already reached.
- Separate mitigation from diagnosis out loud. State what you did to stop the bleeding (flag off, shed traffic, drain a lease, roll back a deploy) and say plainly that you did it before the mechanism was known, because those are two jobs with different deadlines.
- Establish blast radius in countable terms: how many tenants, how many writes, and crucially whether the effect was loss or only delay. An append-only revision table or a pending outbox row means the change survived and the projection was merely behind, which is a repair rather than a data-loss incident.
- Prove the mechanism instead of asserting it. Name the trace span that grew, the plan that flipped to a sequential scan, the lease that expired, plus one alternative you ruled out and the signal that stayed flat while you ruled it out.
Follow-up
- What would you do differently in the first five minutes, given the same dashboard and no more information?
- Which follow-up action did you deliberately not take, and why was dropping it the right call?
Argue against a design, lose, and commit anyway
Medium · disagreement · service boundaries · decision records
Describe a design you argued against and lost. State the failure you predicted as a named mechanism, not a feeling about complexity: two services that would need one transaction, a projection with no rebuild path, a write path with no idempotency key. Say what evidence you brought, what the decision maker weighed instead, and what you did after the decision was made: what you instrumented, what you wrote down, and whether the prediction came true. Five minutes.
Approach
- State the prediction in falsifiable form up front: the mechanism, the condition that triggers it, and the observable outcome. A prediction that cannot be checked also cannot be credited to you later.
- Show the evidence you had at the time and label each piece honestly as measured, analogous, or intuition. Keeping the intuition is fine; disguising it as data is the thing that erodes your standing in the next argument.
- Represent the opposing case at full strength, including the constraint you did not control: a fixed date, a team boundary, or the fact that the decision was cheap to reverse and yours was not.
- Make disagree-and-commit concrete. Name the artefact you left behind so the prediction could be settled without you: the alert and its threshold, the counter on the dashboard, the decision note that recorded the trade-off and the condition that would revisit it.
Follow-up
- What threshold on that alert would have proved you right, and did anyone ever look at it?
- If the same proposal arrived tomorrow with the same deadline, would you argue it the same way?
Turn a code review disagreement into a decision
Easy · code review · optimistic concurrency · communication
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
- 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.
- 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.
- 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.
- 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?