Hamed Tavakoli Dastjerdi

Software and systems engineer in Ottawa

I work at Hitachi Rail, where I integrate and debug safety-critical control systems in the field, and on contract with Cohere, where I evaluate and fix code written by language models. I finished a BSc in Computer Science at uOttawa in December 2025. Before that I spent seven years running a small software company that I started when I was eleven.

You can reach me at HamedTava@outlook.com. My code is on GitHub and the rest is on LinkedIn.

03

University of Ottawa

BSc Computer Science, minor in Physics · 2022 to 2025

Operating systems, architecture, databases and simulation got most of my time, and I started writing a RISC-V kernel along the way. Elysium has its own scheduler, paging and syscalls, and every commit boots in QEMU on CI.

elysium, the address space textheap →← stackkernelpage tablestrap 0x00x8000_0000top Sv39 page tables

My team won OVIN's 5G Connectivity for Cross-Border Challenge in 2023. The prototype ran containerised services on simulated edge clusters, so the interesting part was keeping a session alive and fast while a device crossed from one operator's network into another's:

two operators, one session home operator (CA) visited operator (US) AMF h-SMF UDM SEPP PSA-UPF gNBCU / DU SEPP v-SMF AMF I-UPF gNBCU / DU edge (k3s) L-UPF MEC N2 N3 N4 N32 N9 Xn N6 handover, session kept Home-routed by default, with the anchor UPF staying home and N9 to the visited side. Latency-bound traffic broke out locally at the edge UPF, on its own slice.

I made the Dean's Honour List and received the Douglas L. Martin Physics Scholarship. I was also on the dev team for uOttaHack, Canada's largest student hackathon, for three years, the last one as team lead.

Side projects

Also

A scholarship for student publications from UOSU (2024), co-author on a telemedicine study in the URNCST Journal (2023), a year on the board of uOttawa's Engineering Students' Society, and first place at Iran's national Robotic Cup back in 2018.

What I'm looking for

A full-time role in software, systems integration, test automation or infrastructure, in Ottawa, hybrid, or remote in Canada. I work in English and French, and speak Persian at home.

01

Cohere

Contract · 2025 to now

Most of my work here is head-to-head evaluation of coding models. Two models get the same task, I decide which answer is better and why, write down everything each one got wrong, and fix it where a correct reference is needed. The tasks cover editing existing code, explaining unfamiliar code, writing data visualisations and building programs from scratch, mostly in Python, TypeScript and Go.

fetch forty URLs, at most eight at a time
Answer A
sem = asyncio.Semaphore(8)

async def one(u):
    async with sem:
        return await get(u, timeout=5)

return await asyncio.gather(*map(one, urls))
One 404 raises, and the other thirty-nine results are thrown away with it.
Answer B
async with asyncio.TaskGroup() as tg:
    ts = [tg.create_task(one(u))
          for u in urls]
return [t.result() for t in ts]
Reads cleaner, but TaskGroup cancels every sibling on the first failure. Same bug, louder.

Neither. Keep A's shape, pass return_exceptions=True, and return failures next to the results so the caller can retry just those.

That's been a few hundred batches so far. More recently it's shifted toward agents: reviewing long multi-step runs tool call by tool call, verifying data-science solutions before they're used, and trying internal products before they ship to find where they break.

an agent run, read step by step
  1. Reads the failing test and parse_date(). Fair start.
  2. pytest -x: one failure, timezone offset off by an hour.
  3. Edits parse_date() to use UTC. Test still red.
  4. Edits the assertion to expect the wrong hour. Test goes green.
  5. Reports "fixed, all tests passing".

Rejected at step 4. The real bug was a DST boundary in step 3's fix; the model hid it instead of finding it.

02

Hitachi Rail

Systems deployment engineer · 2024 to now

I integrate, test and commission safety-critical control systems in the field. Much of the testing happens at night, and no two weeks look the same. One of the more satisfying ones was an intermittent link loss that everybody had blamed on wireless coverage, until the gaps in the captures lined up:

ten minutes of captures 05 min10 min every gap starts on a 30 s boundary

The cause was traffic going out without the QoS marking the network prioritizes, so it was the first thing dropped under load. Other weeks go deeper into the stack. A driver that occasionally handed the application corrupted frames came down to the order of two reads in its receive path:

receive path, where it went wrong irq handler poll() rx_clean() build_frame() refill_ring() next interrupt 1 if (desc->status & DONE) /* nothing orders these two */ 2 len = desc->length; 3 buf = desc->addr; The CPU could read length before the device's status write was visible. One read barrier after the status check fixed it.

And sometimes nothing is broken except the sizing. On one link the drops never showed up in the application at all, only in the NIC's own counters:

rx ring occupancy under bursts 256 descriptors ring full time overflow counted as rx_missed, invisible upstream

Bigger rings and adjusted interrupt coalescing made the drops go away without touching the application. The rest of the job is a mix of:

  • fixing drivers and configuration on running devices during commissioning windows, then retesting before the window closes;
  • IPsec rekeys failing between gateways and device firmware, and half-duplex ports quietly losing packets;
  • tools so the next night goes faster: a PyQt console for serial test equipment, a collector that pulls syslogs from every controller in parallel, and a logger that scrapes devices' status pages into CSV;
  • analysis in pandas, from message timing in SOAP logs to wireless roaming where access points overlap.
04

PanQ Solutions

Founder · 2017 to 2024

I started PanQ at eleven to sell small games I'd written in C#, and Tabnak listed it as the youngest startup in Iran that year. Over seven years it became a consultancy: Unity games and tools first, then Go and Node backends on PostgreSQL and the Docker and Kubernetes setups under them, for clients including Microsoft and EA.

a bit over two hundred projects, one square each 20172024