I’m Adam Bates, a Senior Software Engineer. I work across distributed services, physical-device interfaces, and the tools that make their behavior easier to test and understand.
At JPMorgan Chase, I implemented Kafka messaging for a Java/Spring Boot trade-routing platform. At Capital One, I built customer-facing ATM interfaces, led the interface modernization team, and developed Python/Playwright automation to check behavior and visual changes on QA hardware. Earlier, I built Python NLP services at Width.ai. My graduate research connects this work to applied optimization under capacity and delay constraints.
Much of my professional work lives in proprietary employer repositories. These independent projects let me show the decisions, tests, and experiments behind my engineering without publishing employer systems.
| Project | Start here | What to look for |
|---|---|---|
| Device Recovery Lab | Break communication, inspect recovery → | Durable worker ownership, externally injected faults, actual process crashes, and matched concurrency experiments. |
| Placement Tradeoffs | Explore recorded experiments → | How I define constraints, compare algorithms fairly, and explain when a simpler method is enough. |
Both browser viewers show recorded output from real local runs. Each
repository also starts with python run.py for live experiments, without a cloud
account or runtime package installation.
The door opened. The reply didn’t.
I built a parcel-locker simulator with separate service and device processes, durable journals, and a visible event timeline. Introduce duplicate delivery, lose a completion response, or disconnect the device and restore its link. The recovery controller queries the execution journal before deciding to resend. The illustration follows captured observations; the local lab runs the processes.
Then I remove the assumption that makes reconciliation possible: terminate the actual controller process before or after a pulse, while completion is still unrecorded. Both restarted journals report the same uncertainty. One locker has acted; the other has not. The service preserves that uncertainty and requires inspection because retrying would risk repeating a completed action.
I also compare one and four recovery workers under identical queued workloads, with faults injected by a separate HTTP proxy. Durable claims prevent stale workers from overwriting newer decisions. The tests kill the service during an outstanding response and reject a deliberately broken worker that claims success without completion evidence.
In the recorded experiment, all 864 measured operations passed the recorded invariants. Four workers reduced the typical completion time, but one mixed-fault batch was slower with four. I keep that exception visible because the experiment supports a conditional result, not a universal speedup.
Inspect: expected behavior · recovery controller · process-crash tests · worker ownership tests · matched workloads and the slower run
The diagnostic device panel can see behind a broken link; the service cannot use that panel as completion evidence. These are synthetic correctness experiments; they do not establish exactly-once physical execution or power-loss safety.
A placement can be feasible and still block a better combination.
I compare greedy placement, seeded genetic search, and an exhaustive reference on the same small model. Change capacity, deadlines, or cost, then inspect the admitted requests, rejected requests, capacity use, and objective gap.
In the recorded experiment, greedy reaches the optimum in three configurations. Under tighter deadlines it scores 23 against an optimum of 27; genetic search reaches 27 in the five tested seeds. I retain the inputs, timings, variability and source revision so the tradeoff can be checked rather than generalized from a headline.
Inspect: model contract · three solvers · hand-solved correctness checks
This is a new October 2026 implementation. My 2022 master’s thesis at Christopher Newport University addressed a richer VNF-placement problem with Python, NumPy, NetworkX and a Gurobi MILP comparison. I keep the historical research and current experiments separate: read my thesis note.
I use AI assistance in these projects. The useful part is what I can verify: an explicit behavior contract, a small reproducible case, and results that retain their workload and measurement conditions. A passing test supports the behavior it exercised; a simulation result stays a simulation result.


