cv/cv.html

236 lines
14 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Jyri Genral - Senior Software Engineer</title>
<meta name="description" content="Jyri Genral - senior software engineer. Distributed and embedded systems, streaming platforms (eg. Kafka), Kubernetes and cloud infrastructure. London, UK.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@500;600;700&family=IBM+Plex+Serif:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
<style>
:root{
--paper:#fdfdfe;
--ink:#1b2230; /* near-black, faint cool */
--ink-soft:#39404d;
--muted:#7b828e;
--rule:#aac4e0; /* light-blue rule */
--line-soft:#e7ebf1;
--accent:#2f6aa8; /* deeper blue for links/emphasis */
--serif:"IBM Plex Serif",Georgia,"Times New Roman",serif;
--sans:"IBM Plex Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
--maxw:800px;
}
*{box-sizing:border-box;}
html{-webkit-text-size-adjust:100%;}
body{
margin:0;background:var(--paper);color:var(--ink);
font-family:var(--serif);font-size:15.5px;line-height:1.5;font-weight:400;
}
.sheet{max-width:var(--maxw);margin:0 auto;padding:58px 56px 70px;}
a{color:var(--accent);text-decoration:none;}
a:hover{text-decoration:underline;text-underline-offset:2px;}
/* ---------- Masthead: \maketitle ---------- */
.masthead{text-align:center;padding-bottom:16px;border-bottom:1px solid var(--ink);margin-bottom:26px;}
.name{font-family:var(--serif);font-weight:600;font-size:clamp(32px,5vw,42px);letter-spacing:.01em;margin:0;}
.role{font-family:var(--sans);font-weight:500;font-size:15px;color:var(--ink-soft);margin:9px 0 0;}
.tagline{font-style:italic;font-size:14.5px;color:var(--muted);margin:7px 0 0;}
.contacts{font-family:var(--sans);font-size:12.5px;color:var(--ink-soft);margin:13px 0 0;line-height:1.7;}
.contacts a{color:var(--ink-soft);}
.contacts a:hover{color:var(--accent);}
.contacts .sep{color:var(--rule);margin:0 8px;}
/* ---------- Section: \section + \titlerule ---------- */
section{margin:0 0 16px;}
.sec-title{
font-family:var(--sans);font-size:15px;font-weight:600;letter-spacing:.01em;
color:var(--ink);margin:0 0 13px;padding-bottom:5px;border-bottom:1.5px solid var(--rule);
}
/* ---------- Body / justified ---------- */
.summary p{
font-size:15.5px;line-height:1.55;margin:0;color:var(--ink);
text-align:justify;hyphens:auto;-webkit-hyphens:auto;
}
.summary .lead{font-weight:600;}
/* ---------- Skills ---------- */
.skills-grid{display:grid;grid-template-columns:1fr 1fr;gap:11px 36px;}
.skill dt{font-family:var(--sans);font-size:12px;font-weight:600;color:var(--muted);margin:0 0 2px;}
.skill dd{margin:0;font-size:14.5px;color:var(--ink-soft);line-height:1.45;}
.skill dd b{color:var(--ink);font-weight:600;}
/* ---------- Experience ---------- */
.entry{margin:0 0 11px;}
.entry:last-child{margin-bottom:0;}
.entry-head{display:flex;justify-content:space-between;align-items:baseline;gap:16px;}
.entry-org{font-family:var(--serif);font-weight:600;font-size:17px;margin:0;}
.entry-meta{font-style:italic;font-size:13px;color:var(--muted);text-align:right;white-space:nowrap;}
.entry-role{font-style:italic;font-size:14px;color:var(--ink-soft);margin:1px 0 9px;}
.bullets{list-style:none;margin:0;padding:0;}
.bullets li{
position:relative;padding-left:16px;margin:0 0 5px;font-size:14.5px;line-height:1.46;color:var(--ink);
text-align:justify;hyphens:auto;-webkit-hyphens:auto;
}
.bullets li::before{content:"•";position:absolute;left:0;top:0;color:var(--accent);}
.bullets li b{font-weight:600;}
.metric{font-weight:600;color:var(--accent);}
/* ---------- Footer blocks ---------- */
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:15px 36px;}
.block .sec-title{font-size:13px;}
.block p,.block li{font-size:14px;color:var(--ink);line-height:1.5;}
.block .item{margin:0 0 8px;text-align:justify;hyphens:auto;}
.block .item b{font-weight:600;}
.block .item .when{font-style:italic;color:var(--muted);}
.proj{margin:0 0 8px;font-size:14px;color:var(--ink);text-align:justify;hyphens:auto;}
.proj b{font-weight:600;}
.langs{list-style:none;padding:0;margin:0;}
.langs li{display:flex;justify-content:space-between;border-bottom:1px dotted var(--line-soft);padding:3px 0;font-size:14px;}
.langs .lvl{font-style:italic;color:var(--muted);}
/* ---------- Colophon ---------- */
.colophon{margin-top:30px;padding-top:10px;border-top:1px solid var(--line-soft);
font-family:var(--sans);font-size:11px;color:var(--muted);
display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;}
@media (max-width:680px){
.sheet{padding:38px 22px 50px;}
.skills-grid,.grid-2{grid-template-columns:1fr;}
.entry-head{flex-direction:column;gap:1px;}
.entry-meta{text-align:left;}
}
/* ---------- Print / PDF ---------- */
@page{size:A4;margin:12mm 15mm;}
@media print{
body{background:#fff;font-size:10.3pt;line-height:1.38;}
.sheet{max-width:none;margin:0;padding:0;}
.name{font-size:25pt;}
.role{font-size:11.5pt;}
a{color:var(--accent);}
.entry-head,.skill{break-inside:avoid;}
.sec-title{break-after:avoid;}
.colophon{display:none;}
}
</style>
</head>
<body>
<div class="sheet">
<header class="masthead">
<h1 class="name">Jyri Genral</h1>
<p class="role">Senior Software Engineer - Embedded systems and Event-driven Platforms, Streaming &amp; Cloud Infrastructure</p>
<p class="tagline">Interests from the subatomic nature to the cloud</p>
<p class="contacts">
<a href="mailto:jyri@genral.fi">jyri@genral.fi</a><span class="sep">·</span>London, UK<span class="sep">·</span><a href="https://github.com/jyrama">github.com/jyrama</a><span class="sep">·</span><a href="https://www.linkedin.com/in/jyri-genral">linkedin.com/in/jyri-genral</a>
</p>
</header>
<section class="summary">
<h2 class="sec-title">Profile</h2>
<p>Senior engineer with ~8 years building the embedded systems, integration and provisioning infrastructure behind supply-chain platforms. I work end-to-end within small teams - I like designing both architecture and authoring RFCs, through implementation, Kubernetes deployment, security and on-call. I focus on embedded and event-driven systems such as Apache Kafka, workflow orchestration and infrastructure-as-code. I am triple trained in military, aviation and physics, so I like to reason things such as distributed-systems problems from first principles, eg. consensus, CRDTs, idempotency, and try to deliver back decisions with measurable outcomes. I have served not only as the all-arounder occasional lead but also as the occasional mentor, and sometimes I am a student. I write the design docs, and drive architecture across teams. Be it ending up debugging hardware or reverse-engineering, I will find a way and enjoy learning on the way from the odd challenges. That is what keeps me going.</p>
</section>
<section class="skills">
<h2 class="sec-title">Core Stack</h2>
<dl class="skills-grid">
<div class="skill"><dt>Languages</dt><dd><b>Go</b>, <b>Python</b>, <b>Rust</b>, TypeScript · SQL, Bash, Nix, C <i>(with interests in eg. Haskell and Perl)</i></dd></div>
<div class="skill"><dt>Streaming &amp; Events</dt><dd><b>Apache Kafka</b>, <b>Confluent Cloud</b>, Schema Registry · event-driven architecture, <i>and sometimes MQTT and Websockets just for fun</i></dd></div>
<div class="skill"><dt>Orchestration &amp; Runtime</dt><dd><b>Kubernetes</b>, <b>Temporal</b> · Helm, Flux (GitOps), Docker / Podman</dd></div>
<div class="skill"><dt>Infrastructure as Code</dt><dd><b>Terraform / OpenTofu</b> · GitLab CI, Azure DevOps, Nix / NixOS</dd></div>
<div class="skill"><dt>Cloud &amp; Data</dt><dd><b>Microsoft Azure</b> (AKS, Container Apps, Entra ID, networking) · PostgreSQL, CosmosDB, AWS</dd></div>
<div class="skill"><dt>Observability &amp; Security</dt><dd>Datadog, Prometheus, Vector collection pipelines, OpenTelemetry, OAuth2 & OpenID Connect, Azure Workload Identity, Hashicorp Vault, Keycloak, X509 and friends, the CycloneDX ecosystem</dd></div>
</dl>
</section>
<section class="experience">
<h2 class="sec-title">Experience</h2>
<div class="entry">
<div class="entry-head">
<h3 class="entry-org">RELEX Solutions</h3>
<span class="entry-meta">Nov 2021 - present · London / Remote</span>
</div>
<p class="entry-role">Senior Software Developer - Shared Services / Data Bridge</p>
<ul class="bullets">
<li>Tech lead for a product REST API integration -- owning systems end-to-end from RFC and architecture to production deployment and on-call on both sides.</li>
<li>Re-architected customer-infrastructure provisioning onto Temporal durable workflows and direct cloud APIs, cutting deployment latency from tens of minutes to seconds while making it idempotent and observable.</li>
<li>Designed and shipped Azure Blob Storage deployment self-service with environment-isolated RBAC (a thorough test suite preventing test→prod writes), then migrated the entire existing customer base onto it.</li>
<li>Hardened internal platform identity: implemented AKS Workload Identity (added per-tenant, least-privilege OIDC) and migrated off SAS tokens and AKV2K8S ahead of deadlines, contributing the enabling upstream platform patches.</li>
<li>Built customer data ingestion (API Gateway deployment and data validation and authz plugins (Golang) + Kafka streaming message preprocessor microservice (Rust)) and automated new-customer onboarding taking it from multiple days to maximum of hours.</li>
</ul>
</div>
<div class="entry">
<div class="entry-head">
<h3 class="entry-org">Etteplan Oyj</h3>
<span class="entry-meta">Aug 2018 - Nov 2021 · Finland</span>
</div>
<p class="entry-role">Software Designer</p>
<ul class="bullets">
<li>Delivered production Rust now sailing aboard Carnival Cruise Line's <i>Mardi&nbsp;Gras</i>, a cross-ship navigational data relay over a custom private wireless network; a Business&nbsp;Finland-backed project.</li>
<li>Embedded software and firmware in C/C++ for both battery and mains powered Bluetooth, LoRa and LoRaWAN devices, including protocol reverse-engineering and forensic reconstruction.</li>
<li>Built data-to-cloud pipelines and scientific edge-computing in Python; TypeScript / React web interfaces for industrial clients.</li>
<li>Occasional UI work in HTML5 / Typescript, JavaScript, and sometimes Python or C++</li>
</ul>
</div>
<div class="entry">
<div class="entry-head">
<h3 class="entry-org">Cinia Oy</h3>
<span class="entry-meta">Dec 2017 - Jun 2018 · Finland</span>
</div>
<p class="entry-role">Junior Software Developer</p>
<ul class="bullets">
<li>Built test automation and orchestration, regression and exploratory testing, and DevOps tooling for Java Spring Boot projects.</li>
<li>Recruited directly out of university physics studies to join the team.</li>
</ul>
</div>
</section>
<section class="leadership">
<h2 class="sec-title">Leadership &amp; Open Source</h2>
<p class="item"><b>International Association of Physics Students (IAPS)</b> <span class="when">-- President 2019-20; IT Manager &amp; Data Protection Officer 201820.</span> Led a worldwide volunteer organisation and ran its IT and GDPR compliance.</p>
<p class="item"><b>Pro-bono solutions architect &amp; tech lead</b> <span class="when">-- since 2017.</span> Hands-on architecture for IT / ICT projects backed by the Finnish state and industry, mainly for defence.</p>
<p class="proj"><b>Open source</b> · <a href="https://github.com/jyrama">github.com/jyrama</a> <i>(public mirror of selected projects on the self-hosted <a href="https://tea.jrd.fi/jyrama">tea.jrd.fi/jyrama</a>)</i></p>
</section>
<div class="grid-2">
<div class="block">
<h3 class="sec-title">Education</h3>
<p class="item"><b>Physics</b> -- University of Jyväskylä. <span class="when">Left to enter industry, 2017.</span></p>
<p class="item"><b>Private Pilot Licence, PPL(A)</b> -- Blue Skies Aviation, 2013.</p>
<p class="item"><b>Mil</b> -- Finnish Defence Forces</p>
</div>
<div class="block">
<h3 class="sec-title">Languages</h3>
<ul class="langs">
<li><span>Finnish</span><span class="lvl">native</span></li>
<li><span>English</span><span class="lvl">near-native</span></li>
<li><span>German</span><span class="lvl">basic</span></li>
<li><span>Swedish</span><span class="lvl">basic</span></li>
</ul>
</div>
<div class="block">
<h3 class="sec-title">Beyond Code</h3>
<p class="item">Electronics &amp; RF -- designed and ran <b>Radio Maxwell</b>, a compliant FM broadcast system (signal-chain design, distributed control). Embedded / FPGA / DSP tinkering with GNU Radio.</p>
<p class="item">A jack of all trades sysadmin and RF focused developer at <a href="https://mpk.fi/tietoa-meista/">MPK</a></p>
</div>
<div class="block">
<h3 class="sec-title">Interests</h3>
<p class="item">Aviation, cycling, data analytics along ML algorithms, low-level systems &amp; CPU architecture, reverse engineering, electronics and tuning the Linux kernel.</p>
</div>
</div>
<div class="colophon">
<span>Jyri Genral - Curriculum Vitae</span>
<span>Updated 25th ofJune 2026</span>
</div>
</div>
</body>
</html>