▶ Open ORCA Simulator ← Mission Launcher

SPA ORCA Technical Screen & Whiteboard Cheatsheet

Candidate: Aidan McDowell  |  Target: Systems Planning and Analysis, Inc. (SPA) — SLA Division / ORCA Group  |  Classification: UNCLASSIFIED

1. Strategy & Dynamics 2. C# → Java Translation 3. 5-Step Execution Framework 4. 3 Problem Archetypes 5. Verbatim Speaking Scripts 6. Defense Domain Primer 💻 Test in ORCA Console

1. Strategy for Hiring Team (Engineering Leads & OR Analysts)

↑ Back to Top
Who You Are Talking To & What They Value
The ORCA group at SPA does not build generic web apps — they build defense simulation engines that Pentagons brief on.

Your interviewers will consist of Senior Software Engineers, Modeling & Simulation Developers, and Operations Research Analysts. Their priorities are fundamentally different from Big Tech:

2. C# to Java Translation Cheatsheet (Your Rapid Reference)

↑ Back to Top

You have strong C# intuition. Java is 90% identical, but small syntax differences will trip you up on a whiteboard. Use this exact comparison table:

Concept C# (Your Comfort Zone) Java (Target Language) Whiteboard Note
Inheritance / Interface class A : Base, IFoo class A extends Base implements Foo Use extends for class, implements for interface
Print to Console Console.WriteLine(x); System.out.println(x); Never write Console.WriteLine in Java
Dynamic List List<T> list = new(); List<T> list = new ArrayList<>(); Interface on left, concrete type on right
List Size list.Count list.size() Method call in Java (with parentheses)
Dictionary / Map Dictionary<K,V> map = new(); Map<K,V> map = new HashMap<>(); Interface is Map, concrete is HashMap
Map Operations map[k] = v;
map.ContainsKey(k);
map.put(k, v);
map.containsKey(k);
No square bracket indexing on Java Maps!
Map Get with Default map.GetValueOrDefault(k, def) map.getOrDefault(k, def) Exact same O(1) semantics
String Length & Empty s.Length
string.IsNullOrEmpty(s)
s.length()
s == null || s.isEmpty()
Always check null first before isEmpty()
Base Class Constructor base(id, speed) super(id, speed); super(...) must be line 1 of constructor
Constants const int MAX = 100; final int MAX = 100; Use final in Java
PriorityQueue (Min-Heap) PriorityQueue<T, P> (.NET 6+) PriorityQueue<Track> pq = new PriorityQueue<>((a,b) -> Double.compare(a.getTti(), b.getTti())); Crucial for threat evaluator problems
Thread-Safe Map ConcurrentDictionary<K,V> ConcurrentHashMap<K,V> For multi-threaded simulation loops
Freeze Recovery Technique
If you blank on a method name on the whiteboard:
"In Java I'll use map.getOrDefault() here — exact same semantics as C#'s GetValueOrDefault(). We want O(1) retrieval without throwing KeyNotFoundException."

The interviewers will nod and tell you to proceed. They evaluate your architectural choices and data structures, not memorized syntax.

3. The 5-Step Incomplete-Problem Whiteboard Execution Framework

↑ Back to Top

SPA interviewers typically give you an incomplete class hierarchy or a buggy method and ask: "Complete this method so our radar tracker correctly handles this scenario." Follow this exact 5-step framework:

Step 1: Read & Trace Aloud (Don't Write Code Yet!)

Spend the first 60 seconds reading the given code aloud:

Step 2: Clarify Constraints & Edge Cases

Ask 2–3 sharp questions that prove defense modeling maturity:

Step 3: Identify the Missing Pattern / Gap

Diagnose what's missing in the provided code:

Step 4: Implement Cleanly with Helper Methods

Write clean, structured code on the board. Break large logic into readable helpers:

// Clean structure
public void ingest(Track track) {
    if (!isValid(track)) return; // Guard clause
    activeTracks.put(track.getTrackId(), track); // Upsert
}
Step 5: Dry-Run Edge Cases with Concrete Values & State Big-O

Before saying you're done, trace 3 edge cases on the board:

  1. track == null → caught by guard clause, no NullPointerException.
  2. Duplicate trackId → activeTracks.put() cleanly overwrites previous record, size stays constant.
  3. Out-of-bounds coordinates (e.g. lat = 105.0) → rejected before reaching internal collection.
  4. State Time & Space Complexity: "Ingestion is O(1) amortized lookup/insert for HashMap, O(n) space where n is active track count."

4. The 3 SPA Defense Modeling Problem Archetypes

↑ Back to Top

Archetype A: PriorityQueue Threat Allocator (Min-Heap by TTI)

The Problem: DDG-79 has 15 hostile contacts. You must allocate weapons to the most urgent threats first (lowest Time to Impact = highest danger).

// Java Implementation — Target Interview Code
import java.util.*;

public class ThreatEvaluator {

    public List<Track> getHighestPriorityThreats(List<Track> tracks, int k) {
        // 1. Guard against null, empty list, or non-positive k
        if (tracks == null || tracks.isEmpty() || k <= 0) {
            return Collections.emptyList();
        }

        // 2. Min-Heap: smallest TTI comes off first
        PriorityQueue<Track> pq = new PriorityQueue<>(
            (a, b) -> Double.compare(a.getTimeToImpact(), b.getTimeToImpact())
        );

        // 3. Filter: only active, un-neutralized hostiles
        for (Track t : tracks) {
            if (t != null && t.isHostile() && !t.isNeutralized()) {
                pq.offer(t);
            }
        }

        // 4. Extract top-K threats
        List<Track> result = new ArrayList<>();
        while (!pq.isEmpty() && result.size() < k) {
            result.add(pq.poll());
        }

        return result;
    }
}
Analyst Discussion Points for Archetype A

Archetype B: Track Ingestion & Boundary Filter (Upsert & Validation)

The Problem: Write ingest(Track track) to validate incoming radar tracks against geographic boundaries and store them in the active map.

// Java Implementation
public class TrackManager {
    private final Map<String, Track> activeTracks = new HashMap<>();

    public void ingest(Track track) {
        // 1. Null check guard
        if (track == null) return;

        // 2. Empty ID guard
        if (track.getTrackId() == null || track.getTrackId().trim().isEmpty()) return;

        // 3. Boundary validation
        double lat = track.getLat();
        double lon = track.getLon();
        if (lat < -90.0 || lat > 90.0 || lon < -180.0 || lon > 180.0) return;

        // 4 & 5. Upsert: overwrites existing record if present, inserts if new
        activeTracks.put(track.getTrackId(), track);
    }

    public Map<String, Track> getActiveTracks() {
        return Collections.unmodifiableMap(activeTracks);
    }
}

Archetype C: Extensible Sensor Parser (Factory / Registry Pattern)

The Problem: Replace a fragile if/else-if parser with an extensible design that adheres to the Open/Closed Principle.

// Java Implementation
public interface SensorParser {
    Track parseRecord(byte[] payload);
}

public class SensorIngestionService {
    // Registry of parsers by sensor type
    private final Map<SensorType, SensorParser> parsers = new HashMap<>();
    private final Map<String, Track> activeTracks = new ConcurrentHashMap<>();

    public void registerParser(SensorType type, SensorParser parser) {
        if (type != null && parser != null) {
            parsers.put(type, parser);
        }
    }

    public void ingest(SensorType type, byte[] payload) {
        SensorParser parser = parsers.get(type);
        if (parser == null) {
            throw new IllegalArgumentException("No parser registered for: " + type);
        }

        Track track = parser.parseRecord(payload);
        if (track != null && track.isValid()) {
            activeTracks.put(track.getTrackId(), track);
        }
    }
}

5. Verbatim Speaking Scripts for the Room

↑ Back to Top
Scripts for Key Moments
Scenario What to Say Verbatim
Selecting Data Structure "I'm choosing a PriorityQueue with a min-heap comparator here because we need O(log n) insertions as radar sweeps detect new contacts, and O(1) retrieval of the earliest impact threat."
Refactoring if/else Chain "This hardcoded if/else violates the Open/Closed Principle. When the Navy adds the SPY-6 radar next year, we shouldn't have to modify this battle-tested class. A Registry pattern lets us register new parsers without touching core ingestion."
Addressing Simulation Threading "In a live simulation loop where radar ticks run on an asynchronous worker and the UI renders on the main thread, I'd swap the HashMap for a ConcurrentHashMap to avoid ConcurrentModificationException."
Finishing Code on Board "The implementation is complete. Before stepping back, let me walk through 3 test cases: null payload, duplicate track ID, and coordinate boundary limits."

6. Defense Domain Primer for Software Engineers

↑ Back to Top
Terminology OR Analysts Use Every Day
▶ Open ORCA Interactive Console 🚀 Open Rocket Lab Simulator ← Mission Launcher Hub