A Software Engineer at Tech Tammina plays a crucial role in delivering robust, scalable IT solutions and consulting services to a diverse portfolio of global clients. Because Tech Tammina operates as both a direct technology solutions provider and a strategic staffing partner, software engineers here work on a wide variety of projects, ranging from enterprise-level web applications to specialized client-led systems integrations. In this role, your impact is felt immediately through the clean code you write, the databases you optimize, and the integrations you build. You will often be positioned at the intersection of client requirements and technical execution, making adaptability and strong fundamental engineering skills highly prized. Whether you are assigned to an internal product team or deployed to collaborate directly with one of the company's high-profile client partners, you will be expected to deliver reliable, high-performing software that directly drives business value. For candidates, this environment offers a unique opportunity to gain exposure to different tech stacks, industry domains, and development methodologies. Success as a at requires a balance of strong core programming capabilities, a solid understanding of database management, and the professional agility to adapt to different client environments and project requirements.
Written Technical Assessment
reportedCandidates take an in-person or remote written test to assess baseline coding and analytical skills.
What to demonstrate
- Candidates take an in-person or remote written test to assess baseline coding and analytical skills
- Depth in Python
How to prepare
- Answer aloud and timed: Explain the core differences between the JVM, JRE, and JDK.
- Answer aloud and timed: What are the main pillars of Object-Oriented Programming (OOP), and how do you implement them in your code?
Technical Interview Rounds
reportedOne or two rounds focusing on programming languages, object-oriented concepts, and database queries.
What to demonstrate
- One or two rounds focusing on programming languages, object-oriented concepts, and database queries
- Depth in Python
How to prepare
- Answer aloud and timed: How does exception handling work in Java, and what is the difference between checked and unchecked exceptions?
- Answer aloud and timed: What is the Java Collections Framework? Explain the difference between a List and a Set.
HR Interview
reportedDiscussion on behavioral alignment, academic background, and compensation details.
What to demonstrate
- Discussion on behavioral alignment, academic background, and compensation details
- Depth in Python
How to prepare
- Answer aloud and timed: What are interfaces and packages in Java, and how do they help in organizing code?
- Answer aloud and timed: What are the core architectural concepts of AngularJS, and how do you handle data binding?
PracHub editorial advice for the preparation topics above.
Master the Basics
Do not spend all your time memorizing complex algorithmic structures. Instead, ensure you can confidently write simple programs, explain object-oriented design patterns, and write clean SQL queries on demand.
Be Punctual and Professional
Interviewers at Tech Tammina actively evaluate behavior, punctuality, and attitude. Arrive early for in-person interviews or log on a few minutes before remote calls.
Prepare Your Self-Introduction
Almost every interview round starts with a request to introduce yourself. Prepare a concise, 2-minute summary of your academic background, key technical skills, and any projects you have worked on.
Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.
How do you manage memory and garbage collection in Python?
How do you manage memory and garbage collection in Python?
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?
Collapse a redelivered event batch into per-aggregate high-water marks
You drain a batch of up to 5,000,000 events, each (aggregate_id BIGINT, aggregate_version INT, event_type, payload). The log guarantees order within one aggregate only; the batch merges 64 partitions, and a relay failover has redelivered a range, so an older version for an aggregate can appear after a newer one. Given a map of last_applied_version per aggregate, produce the events worth applying, at most one per (aggregate_id, version), plus the count discarded. Target O(n) time. State the memory for 2,000,000 distinct aggregates and what you do when it does not fit.
Approach
- One pass, one hash map from aggregate_id to the highest version kept, and a discard counter. An event whose version is at or below last_applied_version for its aggregate is dropped without further work, which is the whole reason the event carries its version rather than a delta. O(n) expected time, O(d) space in distinct aggregates.
- Keep the maximum, never the last occurrence. The redelivered range means the final appearance of an aggregate in the batch can be an older version than one seen earlier in the same batch, so last-wins applies stale state over newer state and the projection regresses with no error anywhere.
- Cost the memory instead of calling it large: an 8-byte key plus a 4-byte version is 12 bytes of payload, and an open-addressed table held at a 0.7 load factor costs roughly 17 bytes per entry before per-slot metadata, so 2,000,000 aggregates is tens of megabytes in a native layout and several times that in a runtime that boxes both key and value.
- If the distinct set exceeds memory, partition on hash(aggregate_id) mod P and reduce each partition independently. Every event for one aggregate hashes to the same partition, so the per-partition result is exact and the merge is concatenation rather than a second reduction.
Follow-up
- The payload is a patch rather than a snapshot, so applying only the highest version loses the intermediate changes. What changes in your reduction?
- How do you detect that version 7 arrived while version 6 was never delivered, and what should the consumer do about the gap?
Find overlapping job attempts and peak concurrency from lease records
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
- 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.
- 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.
- 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.
- 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?
Write an SQL query using the `UPDATE` command to modify specific records in a table based on a condition.
Write an SQL query using the UPDATE command to modify specific records in a table based on a condition.
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?
What is the difference between an `INNER JOIN` and a `LEFT JOIN`?
What is the difference between an INNER JOIN and a LEFT JOIN?
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?
Explain the concept of database normalization and why it is important.
Explain the concept of database normalization and why it is important.
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?
Explain the core differences between the JVM, JRE, and JDK.
Explain the core differences between the JVM, JRE, and JDK.
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 the main pillars of Object-Oriented Programming (OOP), and how do you implement them in your code?
What are the main pillars of Object-Oriented Programming (OOP), and how do you implement them in your code?
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 does exception handling work in Java, and what is the difference between checked and unchecked exceptions?
How does exception handling work in Java, and what is the difference between checked and unchecked exceptions?
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 is the Java Collections Framework? Explain the difference between a List and a Set.
What is the Java Collections Framework? Explain the difference between a List and a Set.
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 interfaces and packages in Java, and how do they help in organizing code?
What are interfaces and packages in Java, and how do they help in organizing code?
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 difference between var, let, and const in JavaScript.
Explain the difference between var, let, and const in JavaScript.
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 how components communicate with each other in a modern frontend framework.
Explain how components communicate with each other in a modern frontend framework.
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?
Write a basic Python program to reverse a string or find duplicate elements in a list.
Write a basic Python program to reverse a string or find duplicate elements in a list.
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 the primary differences between lists and tuples in Python?
What are the primary differences between lists and tuples in Python?
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?
p99 jumped on one listing filter while p50 stayed flat
After a release that added an owner_user_id filter to the resource listing, p99 rose from 90 ms to 1.9 s while p50 stayed at 40 ms. Traffic and row counts are unchanged. resource carries the index (tenant_id, status, updated_at DESC, resource_id DESC). The new query filters tenant_id and owner_user_id, orders by updated_at DESC, resource_id DESC, and takes 20 rows. On PostgreSQL, explain the shape of the regression, prove it from a query plan, and give the index you would add.
Approach
- Start from the shape. A flat p50 with a moved p99 means a subset of requests changed cost, not all of them, so the first job is naming the subset. Bucket the endpoint's latency by the tenant's row count; the natural hypothesis is that large tenants are a small share of requests and all of the tail.
- Get the plan for the new query on a large tenant with EXPLAIN (ANALYZE, BUFFERS). Expect an index scan over the tenant's range, a filter discarding most of it, then a Sort feeding the Limit, possibly reporting Sort Method: external merge Disk. Read actual rows on the scan node, not estimated.
- Explain why the existing index cannot serve it. A composite B-tree is seekable only as a left prefix, and with no equality predicate on status the scan cannot treat updated_at as an ordering, because rows in the tenant's range are ordered by status first. Everything matching must be read and sorted before LIMIT 20 can apply, so a tenant with 400,000 rows pays 400,000 rows to return 20.
- Add (tenant_id, owner_user_id, updated_at DESC, resource_id DESC). Equality on the first two columns leaves the index ordered by updated_at within that pair, so the plan becomes an index scan that stops after 20 rows with no Sort node. PostgreSQL can scan a B-tree backwards, so the DESC markers matter only if the two sort columns ever disagree in direction; keeping them explicit documents the order the keyset cursor depends on.
Follow-up
- The endpoint paginates with OFFSET. What does page 500 cost with your index, and what does the keyset version cost?
- How would you have caught this before release, given that a 10,000-row seed database produces the same plan shape at an unnoticeable cost?
Built from the rounds and topics Tech Tammina candidates report.
Prepare, practise & reflect
One practical outcome each day. Spend longer where you need it.
0 / 7 done01Map the Tech Tammina loop
- Write out the reported sequence: Written Technical Assessment, Technical Interview Rounds, HR Interview.
- 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 3 reported rounds, with the weakest marked.
02Work Python
- Spend the session on Python, which Tech Tammina candidates report being tested on.
- Write one worked example in Python and time yourself on it.
Deliverable: One timed worked example in Python.
03Work Java Fundamentals Coverage (interfaces, packages, collections, exceptions)
- Spend the session on Java Fundamentals Coverage (interfaces, packages, collections, exceptions), which Tech Tammina candidates report being tested on.
- Write one worked example in Java Fundamentals Coverage (interfaces, packages, collections, exceptions) and time yourself on it.
Deliverable: One timed worked example in Java Fundamentals Coverage (interfaces, packages, collections, exceptions).
04Work SQL Fundamentals
- Spend the session on SQL Fundamentals, which Tech Tammina candidates report being tested on.
- Write one worked example in SQL Fundamentals and time yourself on it.
Deliverable: One timed worked example in SQL Fundamentals.
05Answer out loud: Core Java & Object-Oriented Programming
- Answer aloud, timed: Explain the core differences between the JVM, JRE, and JDK.
- Answer aloud, timed: What are the main pillars of Object-Oriented Programming (OOP), and how do you implement them in your code?
Deliverable: Spoken answers to 2 reported Core Java & Object-Oriented Programming question(s), under time.
06Answer out loud: Web & Frontend Technologies
- Answer aloud, timed: What are the core architectural concepts of AngularJS, and how do you handle data binding?
- Answer aloud, timed: Explain the difference between var, let, and const in JavaScript.
Deliverable: Spoken answers to 2 reported Web & Frontend Technologies question(s), under time.
07Answer out loud: Python & Scripting Fundamentals
- Answer aloud, timed: Write a basic Python program to reverse a string or find duplicate elements in a list.
- Answer aloud, timed: What are the primary differences between lists and tuples in Python?
Deliverable: Spoken answers to 2 reported Python & Scripting Fundamentals question(s), under time.
Expand any day for tasks and deliverables. Your progress is saved on this device.
Behavioural rounds judge the decision you made and what it cost.
What are the core architectural concepts of AngularJS, and how do you handle data binding?
What are the core architectural concepts of AngularJS, and how do you handle data binding?
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
How do you handle asynchronous operations in JavaScript?
How do you handle asynchronous operations in JavaScript?
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Ship under a deadline and bound the debt you chose
You have four days to ship a tenant-facing listing endpoint. The version you would defend uses keyset pagination over (tenant_id, status, updated_at DESC, resource_id DESC); the version you can finish uses LIMIT/OFFSET with no matching index. Describe a deadline call you actually made of this shape: what you shipped, what you knowingly deferred, how you bounded the damage with a mechanism rather than an intention, and the specific numeric condition that would force the follow-up. Name who you told and where you wrote it down.
Approach
- Name the deferred failure precisely instead of calling it slow. OFFSET n makes the database produce and discard n rows, so cost grows with page depth; without an index matching the sort, every matching row is read and sorted before the limit applies; and rows inserted between two page fetches shift across the boundary so items are skipped or repeated with nothing in the response to signal it.
- Bound the blast radius with something mechanical rather than a promise: cap maximum page depth, cap page size, restrict the endpoint to one internal caller, or keep it behind a flag. State which failure each cap removes and which it leaves standing.
- Attach a number to the trigger and wire it to an alarm: the first tenant crossing N resources, or the endpoint's p99 crossing its share of the 400 ms budget, so the debt announces itself instead of waiting to be remembered.
- Write it where the next engineer looks, which is the code and the ticket, not a chat message: what was deferred, why, the cap, and the trigger.
Follow-up
- At what page depth does the offset version breach your latency budget, given your page size and row counts?
- What breaks first when you switch to keyset pagination later, and what does a client holding an old page token see?
- 01
What are the core architectural concepts of AngularJS, and how do you handle data binding?
- 02
How do you handle asynchronous operations in JavaScript?
- 03
You have four days to ship a tenant-facing listing endpoint. The version you would defend uses keyset pagination over (tenant_id, status, updated_at DESC, resource_id DESC); the version you can finish uses LIMIT/OFFSET with no matching index. Describe a deadline call you actually made of this shape: what you shipped, what you knowingly deferred, how you bounded the damage with a mechanism rather than an intention, and the specific numeric condition that would force the follow-up. Name who you told and where you wrote it down.
How difficult are the technical interviews at Tech Tammina?
On average, candidates describe the interviews as easy to moderate. The focus is heavily on programming fundamentals, core language concepts, and basic SQL rather than highly complex algorithmic puzzles.
Tech Tammina Software Engineer candidate reports ↗Does Tech Tammina offer remote work opportunities for Software Engineers?
While some roles may support remote work depending on the client, many positions—such as those based in Guaynabo, PR, or specific offshore development centers—require onsite attendance. It is highly recommended to clarify location and remote expectations during your initial HR screen.
Tech Tammina Software Engineer candidate reports ↗What is the typical timeline for the hiring process?
The process is generally very fast. For most candidates, the entire loop—from the initial technical screen or written test to the final HR interview—takes between 3 to 5 days.
Tech Tammina Software Engineer candidate reports ↗What are Contract-to-Hire (C2H) roles at Tech Tammina, and how do they affect the interview?
Tech Tammina frequently recruits for C2H positions. In these cases, after an initial screening by Tech Tammina, your primary technical interviews may be conducted directly by the end client's engineering team to ensure you align with their specific technical environment.
Tech Tammina Software Engineer candidate reports ↗What topics does Tech Tammina test in interviews?
Tech Tammina interviews most often cover Python, Java Fundamentals Coverage (interfaces, packages, collections, exceptions), SQL Fundamentals, Coding round / Algorithmic coding questions, and JVM (Java Virtual Machine). The exact emphasis depends on the specific role you apply for.
Tech Tammina 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.
- 01Tech Tammina Software Engineer candidate reports ↗
Company-reported rounds, questions and FAQ.
Candidate reports · Accessed 2026-09-22 - 02PracHub Software Engineer practice ↗
PracHub practice material, not company-reported.
PracHub page · Accessed 2026-09-22 - 03PracHub preparation framework ↗
PracHub preparation guidance.
PracHub page · Accessed 2026-09-22