Interview guides · Automationtechies
Automationtechies Software Engineer Interview Guide
Automationtechies Software Engineer interview guide: five reported rounds, PLC and SCADA design topics, troubleshooting, and a 7-day prep plan.
The 60-second brief
Automationtechies works in industrial automation and control systems. Candidates describe the Software Engineer role as the software side of automated environments, with manufacturing plants and municipal water and wastewater facilities named as examples. The work covers SCADA architectures, programmable logic controller configuration and custom application software, written alongside mechanical, electrical and field engineers who supply the operating requirements. Initiatives listed for the role include modernising legacy control systems, automated testing of control software, troubleshooting live control loops, tuning data pipelines, taking part in on-site commissioning and keeping deployed software within industry safety standards.
This guide is for engineers applying to Automationtechies as a Software Engineer. The requirements candidates describe span mid-level to senior experience: PLC and SCADA familiarity, industrial communication protocols and hardware-software troubleshooting as core skills, and cloud IoT platforms, telemetry databases, industrial cybersecurity and water, wastewater or manufacturing exposure as extras. It covers the five reported rounds, the technical and design areas, behavioral preparation and a seven-day plan. Reports of specific questions are thin, so treat the examples as representative topics rather than a fixed list.
Candidates report five rounds over roughly 4-6 weeks: a Recruiter Screen, a Technical Screen, a System Design Deep-Dive, a Behavioral Discussion and Final Stakeholder Interviews. Stage details can shift with location, team and seniority.
Focus areas
- Software Engineering
- Controls Engineering
- SCADA Systems
Overview
The work described for this role sits where software meets machinery. Day to day it covers writing control code, building SCADA interfaces, connecting application software to physical equipment, troubleshooting live control loops, tuning data pipelines and joining on-site commissioning. Initiatives mentioned include modernising legacy control systems and putting automated tests around control software. Because the output drives real equipment, a strong answer names the physical consequence: what a pump, valve or conveyor does when your code, your network or your server fails, and which state it falls back to.
Three families of example question circulate for the role. Technical controls and architecture covers fault-tolerant SCADA for a distributed water treatment facility, PLC languages and ladder-logic structure, protocols between field devices and enterprise software, validating control code before live hardware, and intermittent communication faults. System design and integration covers legacy-to-cloud monitoring, centralized versus distributed control topologies, a slow database logging sensor data, redundancy for safety instrumented systems, and version control plus CI/CD around physical hardware. Problem-solving and field operations covers commissioning failures, deployment pressure, stakeholder communication, competing requirements and safety compliance. Candidate logs are limited, so prepare the underlying skills rather than memorised wording. Less common areas listed include edge computing, hardware-in-the-loop simulation, predictive maintenance with machine learning, formal verification and chaos-style testing of industrial networks.
Preparation therefore splits three ways. First, a controls-aware technical base: be able to draw a SCADA topology, explain real-time constraints such as scan cycles and buffering, and describe how you timestamp and store high-frequency sensor data. Second, designs argued through trade-offs and failure behavior, since the design stage is described as a discussion of your architectural decisions. Third, a bank of project stories with concrete outcomes, because the behavioral and stakeholder rounds are described as conversations about your experience and teamwork. The reported extras (cloud IoT platforms, telemetry databases, industrial cybersecurity) each deserve at least one prepared example if you have touched them.
The Automationtechies interview process
These are the five stages candidates describe, in the order they report them. Descriptions are brief, so each entry pairs what is reported with how to prepare.
Recruiter Screen
Candidates describe an initial screening call with a recruiter to assess fit for the role. Little else is reported, so use it to show how your background maps to the job: software development plus PLC, SCADA and communication-protocol experience, and any water, wastewater or manufacturing exposure.
What to demonstrate
- Fit between your background and the role
- Clarity in summarising your engineering experience
How to prepare
- Write a short career summary naming the controllers, SCADA platforms, protocols and languages you have used, and the kind of site each ran on.
- Be ready to say plainly where your experience is software-heavy and where it is controls-heavy.
- Have location and travel constraints ready, since reported roles range from local application engineering to field-based positions.
- Ask the recruiter for the order of the remaining rounds.
Technical Screen
Candidates describe a focused technical interview. The topic areas listed for the role give it shape: PLC and SCADA architecture, real-time data handling (latency, buffering and thread safety on high-frequency sensor input), industrial communication protocols, and how control code is tested before it reaches live hardware. Answer from projects you have run: name the platform, the constraint, the choice you made and what it cost.
What to demonstrate
- Working knowledge of PLC programming and SCADA architecture
- Handling of real-time data and field-to-enterprise communication
- Testing and validation of control code before live deployment
How to prepare
- Rehearse a fault-tolerant SCADA layout for a distributed water treatment site: field devices, controllers, supervisory servers, and which functions keep running locally when the link to the centre drops.
- Outline how you structure PLC logic for maintainability: modular routines, consistent tag naming, interlocks kept separate, comments a technician can follow.
- Prepare a layered validation answer: logic unit tests, simulated I/O or hardware-in-the-loop, a bench controller, then a supervised on-site release with a rollback path.
- Pick one intermittent communication failure you have chased and write the order in which you checked things.
System Design Deep-Dive
Described as an in-depth discussion of system design principles and your architectural decisions. Design topics listed for the role include a data-logging pipeline for high-speed telemetry from multiple remote terminal units without dropping packets, connecting legacy control systems to cloud monitoring, centralized versus distributed control topologies and high availability for safety instrumented systems. Treat each as a design with a physical side: say what the outputs do when a link, a controller or a server fails.
What to demonstrate
- Architecture choices and the reasoning behind them
- Fault tolerance, redundancy and failover design
- Respect for hardware limits and failure modes
How to prepare
- For the telemetry pipeline, outline source timestamps and sequence numbers, a buffer at the edge, store-and-forward on reconnect, bounded queues with a stated overflow policy, idempotent inserts at the receiver and gap detection.
- For legacy-to-cloud monitoring, describe a read-only gateway that translates protocols and never lets the cloud write to controllers directly, and say how you would secure it.
- Write a short trade-off list for centralized versus distributed control: single point of failure, network dependence, commissioning effort, maintenance and scaling.
- Explain redundancy concretely: paired controllers, how failover is detected, what is voted on in a safety function, and how you test failover without risking the process.
Behavioral Discussion
Candidates describe conversations with engineering leaders about your experiences and teamwork. The example prompts for the role centre on a control system failing during commissioning, balancing sound software practice against urgent on-site schedules, explaining a technical control issue to a non-technical stakeholder, gathering requirements from teams with competing priorities and meeting safety and regulatory standards. Build STAR stories from your own projects that cover each.
What to demonstrate
- Your own role and decisions in past projects
- Teamwork across software, electrical, mechanical and field disciplines
- Communication of technical issues to non-specialists
How to prepare
- Write one commissioning-failure story with the safe-state step, the diagnosis order, the fix and what you changed afterwards.
- Write a schedule-versus-practice story that names the practice you refused to skip and the item you deferred with a ticket.
- Prepare the late mechanical design change scenario: what you re-planned in the control software, whom you negotiated with and what you documented.
- Check every story has a result you can state truthfully, such as reduced downtime or a commissioned upgrade.
Final Stakeholder Interviews
Described as interviews with key stakeholders to assess overall fit and alignment. Nothing more specific is reported about who attends, so prepare for conversations with people outside your own discipline: the requirements candidates describe for the role stress cross-functional communication, stakeholder management and client-facing work.
What to demonstrate
- Overall fit and alignment with the role
- Cross-functional communication and stakeholder management
How to prepare
- Prepare a jargon-free explanation of one past control or SCADA project: what it did, what went wrong and what changed.
- Have a project outcome ready that you can state with real figures or concrete results, such as lowered downtime or a plant upgrade you commissioned.
- List questions about how software, electrical and field teams hand work to each other on a project, so the conversation runs both ways.
- Rehearse your answers on competing operational priorities and safety compliance, which cross over into this stage.
Where candidates lose points
Designing a telemetry pipeline as if it were a cloud service and ignoring the physical side
For each design, state what the outputs and local control do when the link, the controller or the server drops, and name the safe default. Do this before you discuss throughput.
Claiming a high-speed logging design never drops packets without saying where data waits
Point to the edge buffer, sequence numbers, bounded queues with an explicit overflow policy, store-and-forward on reconnect and idempotent writes. Say how you would detect a gap and what you do when one appears.
Debugging an intermittent communication fault or gateway memory leak by guessing and changing several things at once
Give a numbered method: capture evidence with timestamps, compare both ends, check the physical layer, change one variable at a time. For a leak, track memory over time, profile allocations, reproduce under load and confirm the fix with a soak test.
Answering the validation question with 'we test on site' and no staged path
Describe the layers before live hardware: logic unit tests, simulated I/O or hardware-in-the-loop, a bench controller, then a supervised release with a tested rollback.
Telling a commissioning story where the hero move skipped process, or where you cannot say what changed afterwards
Pick a story where you restored a safe state first, followed the change process under pressure and left behind a test, checklist or document that prevents a repeat.
Questions & practice
Archive a resource graph without breaking live references or recursing
Medium · graph traversal · topological order · tenant isolation
Resources reference other resources within a tenant; for the largest tenant the reference table holds up to 2,000,000 nodes and 8,000,000 edges. Archiving a resource must archive everything reachable from it that nothing outside the set still references, refuse when a live external referrer exists, and terminate when references form cycles, which they legitimately do. Produce the archive order and the refusal list, targeting O(V+E). Say what stops the traversal crossing a tenant boundary, and why recursion is the wrong control structure at this size.
Approach
- Load the subgraph with the tenant predicate on both endpoints of the edge, not only on the side you started from. Scoping the left table alone is the classic cross-tenant leak: one mis-entered edge then pulls another tenant's resources into the traversal and, worse, into the archive.
- Traverse iteratively with an explicit stack. A 2,000,000-node graph can hold a chain deep enough to exhaust a native stack in the low tens of thousands of frames, and that failure is a process crash rather than an error you can return.
- Treat cycles as data rather than corruption: compute strongly connected components with Tarjan in O(V+E) using its own explicit stack, then condense. The condensation is a DAG, so a topological order over it gives the archive order, and every member of a component archives in one transaction because no order within a cycle is valid.
- Decide refusals with reverse edges. A candidate is archivable only if every in-edge originates inside the candidate set, so build the transpose or count in-degrees restricted to the visited set, and emit each blocked resource with the id of the external referrer, which is the only part of the answer an operator can act on.
Follow-up
- The graph is read in one query and the archive writes a minute later. What can change in between, and how do you make the write safe?
- The candidate set is 400,000 resources. Is that one transaction, and if not, what does a half-finished archive look like to a reader?
Collapse a redelivered event batch into per-aggregate high-water marks
Easy · hashing · at-least-once · aggregation
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?
Canonicalise a request body into a stable idempotency fingerprint
Medium · parsing · canonicalisation · hashing
idempotency_key.request_fingerprint is a SHA-256 over the method, path and canonicalised body, and a retry whose fingerprint differs must be rejected with 422 rather than served the stored response. Write the canonicaliser. Bodies are JSON up to 256 KB nested at most 32 levels; clients vary key order, whitespace and unicode escaping, and some send 64-bit ids as JSON numbers. Produce a deterministic byte string such that semantically identical bodies match and any semantic difference does not. State your complexity and name two normalisations you refuse to perform.
Approach
- Parse once into a tree, then re-serialise under fixed rules: object keys sorted, array order preserved, one escaping convention, no insignificant whitespace. Parsing is O(n) and sorting keys is O(k log k) per object, so O(n log n) overall with O(depth) stack, and the 32-level cap is enforced during parsing because hostile nesting is how a canonicaliser becomes a stack overflow.
- Sort keys by their UTF-8 bytes and say why the obvious implementation is wrong in some runtimes: a default string comparison that orders by UTF-16 code units places surrogate pairs, meaning code points from U+10000 up, below U+E000 to U+FFFF, which is not UTF-8 byte order, so two services written in different languages disagree on the same document.
- Do not re-encode numbers through a double. IEEE-754 binary64 represents integers exactly only up to 2^53, so normalising a 19-digit id through a float changes it, and 1 against 1.0 cannot be reconciled without deciding whether they are the same value. Preserve the literal token, and require ids as strings at the API boundary if you want them comparable.
- Reject duplicate keys rather than picking one. JSON permits them and parsers disagree, most keeping the last, so any choice you make ties the fingerprint to a parser detail that the code handling the request does not necessarily share.
Follow-up
- A client sends the same logical request with an extra field your API ignores. Same key, different fingerprint, so you return 422. Is that the right answer?
- Where does the fingerprint get computed relative to request decompression and the body-size limit?
Find version gaps and relay lag with window functions
Medium · window functions · event tables · frame semantics
outbox_event holds event_id, aggregate_type, aggregate_id, aggregate_version, event_type, payload, status ('pending','published','dead'), attempts, created_at, published_at. A projection is missing rows and you must decide whether the relay skipped events or the consumer dropped them. Write three queries over the last seven days: one listing every aggregate_id whose published aggregate_version sequence has a hole, one giving per-day counts with a running total, and one returning the newest published event per aggregate. For each, say where the window function is evaluated relative to WHERE and LIMIT. PostgreSQL 16.
Approach
- Gaps: compute lead(aggregate_version) OVER (PARTITION BY aggregate_id ORDER BY aggregate_version) in a subquery, then filter next_version <> aggregate_version + 1 in the outer query. Window functions are evaluated after WHERE, GROUP BY and HAVING and before the outer ORDER BY and LIMIT, so the predicate cannot sit in the same WHERE clause and PostgreSQL 16 has no QUALIFY.
- Say what the seven-day filter does to the answer: it truncates every partition, so the first row per aggregate has no predecessor inside the window and a hole spanning the boundary is invisible. Widen the window, or join to resource.version as the authority for the true maximum.
- Running total: SELECT date_trunc('day', created_at) AS d, count() AS n, sum(count()) OVER (ORDER BY date_trunc('day', created_at) ROWS UNBOUNDED PRECEDING). An aggregate inside a window call is legal because grouping runs before windowing. The grouping key is unique per row here so ROWS and RANGE agree, but write the frame anyway — over ungrouped rows with tied timestamps the default RANGE frame pulls in every peer row and the total jumps.
- Newest per aggregate: DISTINCT ON (aggregate_id) ... ORDER BY aggregate_id, aggregate_version DESC is the cheap PostgreSQL-only form when an index matches that order; row_number() OVER (PARTITION BY aggregate_id ORDER BY aggregate_version DESC) = 1 is the portable form and needs a subquery for the same evaluation-order reason as the gap query.
Follow-up
- Relay failover redelivers events. Does a duplicate break the gap query, and how would you detect one from this table alone?
- Turn the gap check into a continuous monitor rather than a query someone runs after an incident. What does it watch?
Explain why the owner filter ignores the listing index
Medium · composite index · query plans · sort elimination
The only index on resource is (tenant_id, status, updated_at DESC, resource_id DESC). A new endpoint returns one user's resources across all statuses, newest created first: WHERE tenant_id = $1 AND owner_user_id = $2 ORDER BY created_at DESC LIMIT 20. On a tenant with 2M rows it takes 900 ms and EXPLAIN shows a sort above a large scan. Explain precisely why the existing index cannot serve it, give the index that can, and state which of these the new index still will not help: owner_user_id alone across tenants; the same query ordered by updated_at. PostgreSQL 16.
Approach
- Separate the two jobs an index does. For filtering, a composite btree is seekable only on a left prefix, so with no predicate on status the scan can at best range over tenant_id and test owner_user_id per row; PostgreSQL 16 has no btree skip scan to jump the unconstrained column.
- For ordering, the index is sorted by (status, updated_at) within a tenant and not by created_at, so the LIMIT cannot stop early: every matching row is read and then sorted. That is the 'Sort Method: top-N heapsort' line, and it is why the plan reads 2M rows to answer with 20.
- Derive the replacement from the access path — equality, equality, then the ordering column: CREATE INDEX CONCURRENTLY ON resource (tenant_id, owner_user_id, created_at DESC). The scan seeks to the (tenant, owner) range and walks 20 entries in order, so the Sort node disappears along with the row-read.
- Treat INCLUDE (title, status) as conditional, not free. An index-only scan still visits the heap for any row whose page is not marked all-visible, so on a table taking 1.2k writes/second the win depends on autovacuum keeping the visibility map current, and the wider index costs more on every insert.
Follow-up
- 90% of rows are status='active'. Would a partial index WHERE status = 'active' change your answer, and for which of the three queries?
- A dashboard runs this for 40 owners in one page load. What changes about the design?
1–2 sentences introducing the category and what it tests.
Medium · Technical Controls & Architecture
Approach
- Lay out the layers before any detail: field devices and I/O, PLCs or RTUs running logic on a fixed scan cycle (read inputs, execute logic, write outputs), the SCADA/HMI supervisory layer, the historian, then anything enterprise-facing. Say which layer owns which decision: interlocks and closed-loop control stay in the controller, never in the HMI or a server.
- Compare protocols by what they give you. Modbus (RTU over RS-485, or TCP on port 502) is polled registers with no timestamps and no built-in authentication. DNP3 adds timestamped event buffering and unsolicited reporting, which suits remote sites on weak links. OPC UA adds a typed information model, subscriptions and signed or encrypted sessions.
- Keep the control path separate from the data path: the PLC loop must never wait on a network or database call. Put a bounded buffer between them, timestamp at the source, and say what happens when the buffer fills (deadband or report-by-exception, not silent loss).
- For maintainable controller code, name the IEC 61131-3 languages (Ladder Diagram, Function Block Diagram, Structured Text, Sequential Function Chart) and when each fits: ladder for discrete interlocks a technician reads online, Structured Text for calculations and data handling, SFC for sequences. Reuse one function block or data type per device class.
- Finish with failure behaviour: what each output does on comms loss or controller fault (hold last state or go to a defined safe state), heartbeat or watchdog tags between layers, and why the right answer differs for a chemical dosing pump and an isolation valve.
Follow-up
- How would you detect that a PLC has stopped updating while the HMI still shows plausible values?
- Which logic would you never move out of the controller into a supervisory application, and why?
- How would you protect a Modbus TCP network when the protocol itself has no authentication?
1–2 sentences introducing the category and what it tests.
Medium · System Design & Integration
Approach
- Size it before drawing boxes: number of RTUs, tags per unit, sample rate and retention. For example 50 sites x 2,000 tags at 1 Hz is 100,000 points per second, which decides batching and storage. Also ask what latency operators need for live values versus history.
- At the edge, a collector per site timestamps at the source and writes to a durable, disk-backed queue before forwarding, so a WAN outage becomes a backlog rather than lost data. Forward with sequence numbers and acknowledgements: at-least-once delivery plus idempotent writes keyed on (tag, source timestamp) lets the receiver detect gaps and drop replays.
- Centrally, a broker decouples ingest from storage (MQTT with QoS 1 and persistent sessions, or Kafka). Partition by site or tag so ordering per tag holds, and let consumers batch-insert into a time-series store partitioned by time with an index on (tag, timestamp), plus pre-computed rollups for trend screens.
- State the backpressure story and the trade-offs: broker retention absorbs bursts when storage falls behind, consumers scale by partition, late or out-of-order points are placed by source timestamp rather than arrival time, and the connection stays outbound-only from the plant so nothing upstream can write to a controller.
Follow-up
- How would you prove that no samples were lost between an RTU and the database?
- One site's clock drifts by 90 seconds: what does that do to your data, and how do you correct it?
- What changes if operators also need sub-second live values on the HMI?
Bullet list of realistic example questions: How do you integrate legacy industrial control systems with modern
Medium · System Design & Integration
Bullet list of realistic example questions: How do you integrate legacy industrial control systems with modern cloud-based monitoring platforms? What factors do you consider when selecting between centralized and distributed control topologies for a new manufacturing line? Describe a scenario where you had to optimize a slow-performing application or database logging real-time sensor data. How do you ensure high availability and redundancy in critical safety instrumented systems? Explain your approach to managing software version control and CI/CD pipelines in an engineering environment that involves physical hardware.
Approach
- Legacy-to-cloud integration: leave the legacy controller untouched and add an edge gateway that reads it over its native protocol (Modbus, a vendor driver or OPC) and publishes upward over OPC UA or MQTT, outbound-only through a DMZ, using the Purdue levels and IEC 62443 zones and conduits to place it. Buffer at the edge for WAN outages and give the cloud read-only data.
- Centralized versus distributed control: one (often redundant) controller with remote I/O gives a single program and simple coordination but a larger blast radius; a controller per cell or skid isolates faults and allows independent commissioning, but needs peer interlocks over the network and version discipline across many programs. Decide on coupling between process areas, cost of a stop, wiring distance and who maintains it.
- Slow sensor database: first find whether writes or reads are slow. Typical fixes are batching inserts instead of one commit per row, time partitioning so retention drops a partition instead of running DELETE, a composite (tag_id, ts) index (in PostgreSQL a BRIN index suits append-only time columns), rollup tables for trend screens, and deadband logging to cut volume.
- Safety instrumented systems: keep the SIS independent of the basic process control system (own sensors, logic solver and final elements) under IEC 61511. Explain voting: 1oo2 trips if either channel demands it (safer, more spurious trips), 2oo3 tolerates one failed channel in either direction. Availability here means it trips on demand, which periodic proof testing confirms.
- Version control and CI/CD with hardware: export controller projects to text (PLCopen XML or the vendor's text export) so diffs and reviews work; the pipeline runs static checks and simulation or hardware-in-the-loop tests; the download to a real controller is a gated manual step with a change record, an online compare against what is running, a backup and a rollback.
Follow-up
- The cloud team wants to write setpoints back to the plant: what would you require before allowing it?
- How would you detect that the program in a controller no longer matches what is in version control?
- The sensor table has two billion rows and the trend screen times out: what do you check first?
1–2 sentences introducing the category and what it tests.
Medium · Problem-Solving & Field Operations
Approach
- Make it safe before diagnosing: put the process in manual or a known safe state, confirm the interlocks still hold, and agree the plan with operations. Then collect facts: when it started, what changed (firmware, program download, wiring, network), alarm and event logs and historian trends around the first occurrence.
- Localize the fault layer by layer: compare the raw value at the I/O card with the controller tag and with what the HMI shows. Where they first disagree tells you whether the problem is the field device, the wiring, the logic or the communications. Change one variable at a time and log each step so the result is reproducible.
- For a slow memory leak in a gateway service that runs continuously: trend resident memory, open file descriptors and sockets over days, and match each step up to an event such as a reconnect or comms timeout. Reproduce that event at an accelerated rate on a test unit under a heap profiler (heaptrack or Valgrind massif for C/C++, tracemalloc for Python), and rule out unbounded queues, caches and fragmentation before calling it a leak.
- Close the loop: an interim mitigation labelled as temporary (for example a watchdog restart with buffered data so nothing is lost), the root-cause fix, a regression test that replays the trigger, and an updated commissioning checklist or troubleshooting note for site technicians.
Follow-up
- The fault disappears whenever you connect a laptop to watch it: what does that suggest?
- How would you decide between rolling back to the previous program and patching on site?
- What would you leave behind so the next technician can diagnose this without you?
Bullet list of realistic example questions: How would you approach designing a fault-tolerant SCADA architectu
Medium · Technical Controls & Architecture
Bullet list of realistic example questions: How would you approach designing a fault-tolerant SCADA architecture for a distributed water treatment facility? What is your experience with PLC programming languages, and how do you structure ladder logic for maintainability? Explain how you handle real-time data communication protocols between field devices and upper-level enterprise software. How do you test and validate control code before deploying it to live industrial hardware? Walk through your process for troubleshooting an intermittent communication failure in an existing automated control loop.
Approach
- For the fault-tolerant SCADA design for a distributed water treatment facility, work from the failure list: each remote site's controller runs its process on its own when comms drop and buffers timestamped events; the central SCADA servers and historian run as a hot-standby pair; links are redundant (fibre ring plus cellular or radio backup); and a stale-site alarm fires when a site goes quiet.
- For ladder logic you can maintain: one routine per equipment module, standard function blocks or add-on instructions for pumps, valves and motors with the same fault, permissive and mode bits, descriptive tag names and rung comments, a separate alarm routine, and no output coil written in two places (the last rung evaluated in the scan wins, which hides bugs).
- For validating control code before it reaches live hardware: offline simulation with emulated I/O, then hardware-in-the-loop against a process model, then a factory acceptance test, then a site acceptance test with point-to-point I/O checkout. On a running plant, keep a backup of the program currently in the controller and a written rollback step before any download or online edit.
- For an intermittent communication failure in a control loop: read the diagnostic counters first (timeouts, retries, CRC errors) and line them up against time and plant events such as a drive or pump starting. Then split physical from protocol: on RS-485 check termination, biasing, grounding and cable shielding near VFDs; on Ethernet check switch port errors, duplex mismatch and IP conflicts. Capture traffic with Wireshark, which decodes Modbus and DNP3.
- For field-to-enterprise data, never let business systems poll controllers directly: put a gateway or OPC UA server in between, pass data upward through a DMZ, and keep any write back down gated, logged and limited to named tags.
Follow-up
- The failure happens about once a week and never while you are on site: what do you leave running to catch it?
- How would you test an interlock that you cannot safely trip on the real equipment?
- A remote site lost comms for six hours: how does the historian end up with a complete record?
Suggested practice checklist
The plan follows the reported rounds: project mapping first, then controls and SCADA, validation and troubleshooting, telemetry and integration design, stakeholder stories and a full spoken run-through.
Day 1 — Map the loop and your own projects
- Write the five reported rounds in order and note beside each which of your past projects you would draw on.
- List the PLC, SCADA, protocol, telemetry database and cloud IoT experience you really have, and mark each listed requirement strong, thin or missing.
- Pick the three thinnest areas to feed the following days.
Deliverable: A one-page loop map plus a requirements grid marked strong, thin or missing.
Day 2 — Controls and SCADA architecture
- Sketch a fault-tolerant SCADA layout for a distributed water treatment site and mark what keeps running locally when the link to the centre drops.
- Write how you structure PLC logic for maintainability (modular routines, tag naming, separate interlocks, comments) and say it aloud.
- Explain how data moves between field devices and enterprise software using protocols you have used, including timestamps and what happens on reconnect.
Deliverable: An annotated SCADA diagram, a logic-structure outline and a spoken protocol explanation.
Day 3 — Validation and troubleshooting playbooks
- Write a layered test strategy for control code: logic unit tests, simulated I/O or hardware-in-the-loop, a bench controller, supervised on-site release with rollback.
- Write a numbered playbook for an intermittent communication failure in a control loop, from timestamped capture to one-variable-at-a-time changes.
- Write a second playbook for a memory leak in a service that runs continuously on a gateway: memory trend, allocation profile, reproduction under load, soak test.
Deliverable: A test-strategy outline and two written troubleshooting playbooks.
Day 4 — Telemetry pipeline and the database behind it
- Design the data-logging pipeline for high-speed telemetry from several remote terminal units: source timestamps, sequence numbers, edge buffer, store-and-forward, bounded queues, idempotent inserts, gap detection.
- Write the tuning sequence for a slow database logging sensor data: measure the query plan first, then indexing, batching writes and time-based partitioning.
Deliverable: A pipeline diagram with a loss-and-duplicate accounting table, the completed practice exercises and a written tuning sequence.
Day 5 — Integration, topology and redundancy
- Write the legacy-to-cloud monitoring design: read-only gateway, protocol translation, no direct cloud writes to controllers, how you secure it.
- Make a trade-off table for centralized versus distributed control, then outline how you would refactor a monolithic control script into modular, testable components.
- Outline redundancy for a safety instrumented function and explain how version control and CI/CD change when the target is physical hardware.
Deliverable: A legacy-to-cloud design, a topology trade-off table and a redundancy and CI/CD outline.
Day 6 — Field stories and stakeholders
- Write STAR outlines for a commissioning failure, a schedule-versus-practice trade-off, a late mechanical design change and documentation for site technicians.
- Rewrite one technical control issue in plain language for a client or plant operator, with one consequence and one decision they must make.
- Write answers on gathering requirements from teams with competing priorities and on keeping automated solutions inside safety standards and regulation.
Deliverable: Four STAR outlines, a plain-language explanation and two completed behavioral exercises.
Day 7 — Full-loop spoken rehearsal
- Run the five stages in order aloud: recruiter summary, technical answers, a design walk-through, behavioral stories, a stakeholder conversation.
- Record yourself and mark every answer that skipped failure behavior, the safe state or a measurable outcome.
- Redo your weakest day's material and write questions to ask at each stage.
Deliverable: A recorded run-through plus a list of fixes applied to the weakest answers.
Commissioning, safety and stakeholder stories
Candidates describe the behavioral discussion as a conversation with engineering leaders about your experience and teamwork, followed by stakeholder interviews on overall fit. The example prompts for this role concern failures during commissioning, schedule pressure, explaining control issues to non-technical people, competing requirements and safety compliance. Each story should show a decision you made, how you protected safety and the process, how you communicated with people outside software, and what you changed afterwards.
- Tell me about a time when a critical control system failed during commissioning. How did you diagnose and resolve the issue under pressure?
- How do you balance software development best practices with urgent on-site deployment schedules?
- Describe a situation where you had to explain a complex technical control issue to a non-technical stakeholder or client.
- How do you approach gathering requirements from cross-functional teams with competing operational priorities?
- What steps do you take to ensure your automated solutions comply with industry safety standards and regulatory requirements?
- Describe a time when a deployment went wrong on-site and how you managed the rollback and remediation process.
Bullet list of realistic example questions: Tell me about a time when a critical control system failed during
Medium · Problem-Solving & Field Operations
Bullet list of realistic example questions: Tell me about a time when a critical control system failed during commissioning. How did you diagnose and resolve the issue under pressure? How do you balance software development best practices with urgent on-site deployment schedules? Describe a situation where you had to explain a complex technical control issue to a non-technical stakeholder or client. How do you approach gathering requirements from cross-functional teams with competing operational priorities? What steps do you take to ensure your automated solutions comply with industry safety standards and regulatory requirements?
Approach
- Choose one real commissioning or on-site failure where you made the calls, not one you watched. Give two sentences of context (the site, the control system, what failed) and spend most of the answer on your reasoning.
- Narrate the diagnosis in order. First bring the process to a safe state and say who you told. Then separate software from wiring, field device and network using evidence (controller diagnostics, I/O status, timestamped logs, packet capture), changing one variable at a time and naming a hypothesis you ruled out.
- Cover the fix and follow-through: whether you rolled back to the last known-good program or fixed forward and why, how you verified on the live system, and what you added afterwards (a simulated-I/O test, a pre-release checklist, documentation for technicians).
- For the related prompts in this group (practice versus urgent on-site schedule, explaining to a non-technical client, competing requirements, safety compliance), reuse the same skeleton: the constraint, the option you rejected, the evidence, the outcome. For the schedule prompt, name the practice you never skipped (peer review of the change, test on simulated I/O, a rollback path) and what you deferred.
- The mistakes that sink it: a story where someone else fixed the problem, no mention of safety or process risk, blaming the hardware team, or inflated numbers. Quantify only with figures you can defend, such as time to restore or downtime avoided.
Follow-up
- What would you change in your commissioning preparation so that failure is caught earlier?
- How did you decide between rolling back and fixing forward while the plant was waiting?
- How did you keep the client or operators informed while you were still diagnosing?
Unblock an engineer without taking the keyboard
Easy · mentoring · leases · at-least-once
A teammate has spent two days on a job handler that occasionally writes duplicate rows. They are certain the queue is delivering twice by mistake. You suspect a lease expiring under a slow handler, so the job is running concurrently with itself. Describe how you have unblocked someone in this position: what you asked before offering a hypothesis, what you showed them rather than told them, and what you left them owning. Then say what you would do if their theory turned out to be the right one.
Approach
- Ask before diagnosing, and ask for things answerable from data they already have: the attempt count on the job rows that produced duplicates, the handler's observed duration against its lease expiry, and whether the duplicate rows share a natural key that a unique constraint could have caught.
- Teach the shape rather than the answer. A lease cannot distinguish a dead worker from a slow one, so a handler that outruns its lease is running twice by design, and deploys deliver the other half by killing handlers mid-run on every rollout. Both of their candidate theories produce identical duplicate rows, which is why the evidence has to come from timings rather than from argument.
- Hand over a checklist they execute: a natural key on every write the handler performs so the second copy collides rather than appends, the record of intent written before any external effect, a lease heartbeat while running, and the metric that shows it working.
- Keep ownership with them deliberately. Pair on the first write, then step back; if you finish it yourself you have closed one ticket and left the same person stuck on the next redelivery.
Follow-up
- How would you distinguish a genuine double-delivery from a lease expiry using only the data already stored?
- Their handler calls an external endpoint before recording that it did. What do you tell them to change first?
Tell callers you do not own that their integration breaks
Medium · deprecation · compatibility · stakeholders
A field in a write endpoint's response must change shape. You own the endpoint; you do not own the four internal callers or the outbound webhook consumers who read it. Describe a deprecation you were responsible for: what you shipped first, how you established who was actually reading the field, the window you gave and what set its length, what you did about the consumer who never moved, and how you decided removal was safe. Name the signal you used, not the announcement you sent.
Approach
- Establish the reader set empirically rather than from a wiki of owners: per-field usage counters keyed by principal, or access logs attributed to a consumer. State the blind spot of whichever you pick, since a consumer that reads the field only on a monthly job will not appear in a week of logs.
- Ship additive first. Populate the new field alongside the old one so no reader is forced to move, which is also what keeps a rolling deploy safe, because old and new instances answer the same requests at the same time and a rollback must still find the old shape present.
- Set the window from the slowest legitimate consumer's release cadence, not from your calendar, and decide separately what to do for a consumer with no release process at all, such as an external webhook endpoint you can only email.
- Convert silence into evidence before you rely on it: a short, low-traffic removal window that makes a still-dependent consumer fail visibly and loudly while you are watching, rather than at three in the morning after you have moved on.
Follow-up
- How would you detect a consumer that reads the field only during a monthly export?
- One caller refuses to move and has a commercial relationship behind it. What changes in your plan and what does not?