Summary
Software engineer with nine years building the unglamorous layer between industrial control systems and the analytics that depend on them. I build historian integrations, ingestion services and SQL data pipelines that have to keep their promises on a bad night in a plant nobody can get to. Strongest in .NET and Python, deepest in time-series semantics — timestamps, interpolation, quality codes and the arithmetic of backfill. I care most about the failure paths, because that is where an integration is actually judged.
Experience
Solo consultancy. Contract integration engineering for process manufacturing and utilities clients.
- Built a .NET ingestion service reading from a PI historian for a specialty chemicals client, covering roughly 180,000 tags and replacing a nightly CSV export with streaming reads — analysis latency went from 19 hours to under a minute.
- Built a reconciliation harness that replays a historian window through both the legacy export and the new pipeline and diffs sample-for-sample, including quality codes — the tool that actually got the migration signed off.
- Diagnosed a long-standing “phantom gap” defect at a water utility — an upstream device emitting timestamps in local time across a DST boundary, silently discarded by the ingestion layer. Wrote the detection check now run against every new data source.
- Ported a Python ingestion prototype to a supervised .NET agent with bounded-memory buffering and at-least-once replay, sustaining ingest through a 6-hour network partition with zero sample loss.
- Acted as the escalation engineer for three clients’ integration stacks, including on-call for plant-hours incidents.
Mid-size vendor of asset-performance software for marine and port operations.
- Owned the shared integration framework behind every first-party data source — lifecycle, credential handling, retry/backoff, schema mapping and observability — adopted across nine source systems.
- Reduced steady-state ingestion cost by 62% by replacing per-tag polling with OPC UA subscriptions and deadband filtering, without loss of fidelity on step-change signals.
- Introduced a protocol simulator that reproduces historian misbehaviour (duplicate timestamps, quality flapping, mid-query disconnects) in CI; integration escapes fell by roughly two thirds over the following year.
- Led the security review and remediation of the on-premise agent — moved from stored plaintext credentials to OS keystore integration and short-lived tokens, and removed an outbound-port requirement that had been blocking three enterprise deals.
- Mentored four engineers; ran the internal “time is not a number” workshop on time-series pitfalls, now part of onboarding.
Systems integrator serving pulp, paper and food processing clients.
- Built and deployed OPC UA and Modbus collectors across eleven plant sites, several with no reliable WAN, using store-and-forward buffering sized to survive a 72-hour outage.
- Implemented asset-model mapping that translated inconsistent per-site tag naming into a common hierarchy, making cross-site comparison possible for the first time.
- Worked directly with process engineers on-site to validate that ingested series matched control-room behaviour — the habit that shaped how I test everything since.
- Built SQL ingestion pipelines landing plant data into a central SQL Server warehouse on a fixed schedule, with idempotent loads so that a re-run after a failed night could not double-count.
- Wrote the commissioning runbook used for subsequent site rollouts.
Data-acquisition hardware and companion software for environmental monitoring.
- Developed firmware-adjacent acquisition software in C and C# for multi-channel sensor units, including calibration and drift compensation.
- Built the desktop tooling field technicians used to configure and diagnose deployed units, cutting typical site-visit time roughly in half.
Selected projects
- tsdiff
- Open-source CLI that diffs two time-series windows across systems and reports discrepancies by sample, gap and quality code rather than by row. Written after doing the same comparison by hand one too many times.
- historian-sim
- Fake historian endpoint that misbehaves on purpose — configurable disconnects, clock skew, duplicate timestamps, quality flapping — for testing ingestion code in CI.