!Resume
schema: 
  https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json
awards:
basics: !Basics
  email:
  image: ''
  label: Senior backend developer | Tech lead
  location: !Location
    address:
    city: Oslo
    country_code: NO
    postal_code:
    region:
  name: John Mikael Lindbakk
  phone:
  profiles:
  - !Profile
    network: GitHub
    url: https://github.com/atomfinger/
    username: atomfinger
  - !Profile
    network: LinkedIn
    url: https://www.linkedin.com/in/john-mikael-gundersen/
    username: john-mikael-gundersen
  summary: Senior backend developer and tech lead who builds robust, 
    maintainable software. Cares about architecture that can evolve, teams that 
    can sustain a pace, and code the next person can actually read. More than 13
    years across healthcare, banking and insurance, and since 2023 as a 
    consultant. Does open source and public speaking.
  url: https://lindbakk.com
certificates:
- !Certificate
  date: 2024-03-01 00:00:00
  issuer: Confluent
  name: Confluent Certified Developer for Apache Kafka
  url:
- !Certificate
  date: 2021-05-01 00:00:00
  issuer: OWASP
  name: OWASP course
  url:
education:
- !Education
  area: Computer Science
  courses:
  - CS38010 - Space Robotics
  - CS36410 - Intelligent Robotics
  - CS38110 - Open Source Development Issues
  - CS31310 - Agile Methodologies
  end_date: '2013-06-01'
  institution: Aberystwyth University
  score:
  start_date: '2010-08-01'
  study_type: Bachelor of science
  url: https://www.aber.ac.uk/en/
interests:
- !Interest
  keywords:
  - Dungeon & Dragons
  - Headphones (Good audio)
  - My dog
  - Discworld
  - Whiskey
  name: Stuff I like in general
- !Interest
  keywords:
  - Battlestar Galactica
  - Firefly
  - Red Dwarf
  - Doctor Who
  name: Shows I like
- !Interest
  keywords:
  - Clean Series
  - Pragmatic Programmer
  - The Phoenix Project/The Unicorn Project
  - The Art of Unit Testing
  - The Software Craftsman
  - Working effectively with legacy code
  name: Developer books I recommend
languages:
- !Language
  fluency: Fluent
  language: English
- !Language
  fluency: Native speaker
  language: Norwegian
meta:
projects:
- !Project
  description: A Gleam implementation of PASETO (Platform-Agnostic SEcurity 
    TOkens), a safer alternative to JWT. Supports v3 and v4 local and public 
    tokens, is verified against the official test vectors, and comes with 
    gaseto_http for using it over HTTP.
  end_date:
  entity:
  highlights:
  keywords:
  - gleam
  - library
  - security
  name: Gaseto
  roles:
  start_date: '2025-08-01'
  type:
  url: https://gaseto.hexdocs.pm/
- !Project
  description: A simple website showcasing how to (not) use AI when working with
    other people.
  end_date:
  entity:
  highlights:
  keywords: []
  name: No Meat Proxy
  roles:
  start_date:
  type:
  url: https://nomeatproxy.com/
- !Project
  description: A public tool that exposes systemic delay patterns in the 
    Norwegian rail network through open data — because the official statistics 
    don't tell the full story.
  end_date:
  entity:
  highlights:
  keywords:
  - gleam
  - erlang/otp
  - open data
  name: Surtoget
  roles:
  start_date:
  type:
  url: https://surtoget.no/
- !Project
  description: A programming language built for Norwegian speakers — using 
    Nynorsk keywords (forKvart, prøv, gjevTilbake) so code reads naturally in 
    the language you think in. Built in Zig, it compiles to native binaries and 
    WebAssembly.
  end_date:
  entity:
  highlights:
  keywords:
  - zig
  - wasm
  - language design
  name: Brunost
  roles:
  start_date:
  type:
  url: https://atomfinger.github.io/brunost/
- !Project
  description: Getting started with Gleam is easy. Getting something production 
    ready is less so, regardless of the language. Bygg aims to help developers 
    getting started by generating projects with sensible defaults already 
    configured and ready to go.
  end_date:
  entity:
  highlights:
  keywords:
  - gleam
  name: Bygg
  roles:
  start_date:
  type:
  url: https://atomfinger.github.io/bygg/
- !Project
  description: A WireMock-style HTTP mock server for Gleam integration tests. 
    Start a real HTTP server in your test, tell it what to respond to, make 
    requests against it, and verify what was called — on both Erlang and 
    JavaScript targets.
  end_date:
  entity:
  highlights:
  keywords:
  - gleam
  - library
  - testing
  name: HTTP Mock Server for Gleam
  roles:
  start_date:
  type:
  url: https://hexdocs.pm/http_server_mock/
- !Project
  description: A small library that creates human-readable and deterministic 
    UUIDs for testing purposes.
  end_date:
  entity:
  highlights:
  keywords:
  - Java
  - Kotlin
  - Testing
  name: toUUID
  roles:
  start_date: '2020-10-09'
  type:
  url: https://github.com/atomfinger/toUUID
- !Project
  description: 'On exploring a different language on a different VM: how Gleam brings
    a statically-typed, functional, immutable language with no exceptions to the BEAM,
    where every process is tiny, isolated, communicates via messaging, and embraces
    "let it crash".'
  end_date:
  entity: JavaZone
  highlights:
  keywords:
  name: 'Gleam and BEAM: Looking beyond the JVM'
  roles:
  - Speaker
  start_date: 2026-09
  type: talk
  url: https://vimeo.com/1223666800
- !Project
  description: Here I shared advice for graduates touching on AI, automated 
    testing, legacy code, and the importance of understanding practical 
    implementations of theory and concepts.
  end_date:
  entity: Aberystwyth University
  highlights:
  keywords:
  name: My advice to CompSci graduates
  roles:
  - Speaker
  start_date: 2026-02
  type: talk
  url: https://speakerdeck.com/atomfinger/my-advice-to-compsci-graduates
- !Project
  description: 'A two-part talk: first on how technical skills can help shed light
    on real-world societal problems — using surtoget.no as a case study — then on
    driving correctness through the type system.'
  end_date:
  entity: Gleam Gathering
  highlights:
  keywords:
  name: 'Riding the Sour Train: Building surtoget.no with Gleam'
  roles:
  - Speaker
  start_date: 2026-02
  type: talk
  url: https://www.youtube.com/watch?v=gq2-eR10vn8
- !Project
  description: A talk all about thinking about architecture in terms of 
    dependencies, and how these dependencies connect, but also how the size and 
    complexity of the codebase impacts architecture.
  end_date:
  entity: bspoke
  highlights:
  keywords:
  name: Thinking Architecturally
  roles:
  - Speaker
  start_date: 2025-05
  type: talk
  url: https://speakerdeck.com/atomfinger/thinking-architecturally
- !Project
  description: On writing testable systems and what testability actually means 
    in practice. Demonstrated different approaches to automated testing, 
    including contract and approval testing.
  end_date:
  entity: JavaZone
  highlights:
  keywords:
  name: Modern testing — Test more and better with less friction
  roles:
  - Speaker
  start_date: 2024-09
  type: talk
  url: https://vimeo.com/showcase/11348501/video/1006510177
publications:
references:
skills:
- !Skill
  keywords:
  - Kotlin/Java
  - C# .NET
  - Gleam and Erlang/OTP
  - Python
  - SQL of various kinds and MongoDB
  - Microservices and modular monoliths
  - Kafka and Azure Service Bus
  - Architecture and Domain-Driven Design
  - Contract first
  - gRPC
  level:
  name: Developer
- !Skill
  keywords:
  - GitHub Actions
  - TeamCity
  - Jenkins
  - Docker
  - Kubernetes
  - Helm and GitOps
  - Azure DevOps
  - Datadog, Grafana and OpenTelemetry
  - Solution design
  level:
  name: DevOps
- !Skill
  keywords:
  - OWASP
  - OAuth 2.0
  - Open Policy Agent
  - PASETO
  level:
  name: Security
- !Skill
  keywords:
  - Testcontainers
  - System tests
  - Mockserver
  - Contract testing
  - Narrow & Wide integration tests
  - Spock/Junit/Mockito/Nunit/etc
  level:
  name: Testing
- !Skill
  keywords:
  - Claude Code
  - Codex
  - Gemini CLI
  level:
  name: AI-assisted development
volunteer:
work:
- !Work
  description:
  end_date:
  highlights:
  - 'Architect on a greenfield logistics platform: a modular monolith built with Domain-Driven
    Design, event sourcing and event-driven integration, delivered by up to three
    teams'
  - Team lead and tech lead for the core credit-card systems at a large Nordic 
    IT services company, where I set the test strategy, introduced contract 
    testing and took part in the PCI audit
  - Architect for a public health institute's move to a new Azure and Kubernetes
    platform
  - Brought in at the end of a critical telecom infrastructure project, after 
    its two original developers had left, to do a security audit, fix the 
    remaining bugs and bring it to the finish line
  - Developer on a restaurant ordering platform, building integrations with 
    point-of-sale systems
  - Mentored developers, gave internal talks and held technical interviews
  location: Oslo, Norway
  name: bspoke
  position: Senior Consultant
  start_date: '2023-05-01'
  summary: Consulting as a senior backend developer, architect and tech lead in 
    client teams, across logistics, finance, public health and telecom.
  url: https://www.bspoke.no/
- !Work
  description:
  end_date: '2023-05-31'
  highlights:
  - Tech lead across several teams, responsible for architecture, coaching and 
    how the developers worked day to day
  - Owned the test strategy and the CI/CD pipelines, including the move from 
    TeamCity to GitHub Actions
  - 'Introduced practices that stuck: post-incident reviews, Architecture Decision
    Records, self-updating dependencies and DORA metrics'
  - Built an initialiser that generates production-ready services, which became 
    the foundation of every new application
  - Replaced authorisation logic scattered across codebases with central 
    policies and audit logging
  - Led a project that geolocated more than 90% of the insured buildings in the 
    UK, and built the reinsurance application used for risk analysis
  - Took part in most major technology decisions during my time there
  location: Oslo, Norway
  name: Protector Forsikring
  position: Tech Lead
  start_date: '2020-12-01'
  summary: 'Improved how the developers worked: architecture, test strategy, CI/CD
    and coaching.'
  url: https://protectorforsikring.no/
- !Work
  description:
  end_date: '2020-11-30'
  highlights:
  - 'Built and maintained core backend systems for multiple banks: reporting, integrations
    and a generic changelog'
  - Created automated integration testing that cut a week-long manual test of a 
    bank's core systems to 15 minutes, and improved CI/CD pipelines
  - Authored developer guidelines for a cleaner and more maintainable codebase
  - Team lead for the team responsible for our PCI compliant systems
  - Project architect for new banks joining the platform, responsible for the 
    technical side from sale to delivery
  - Worked closely with partners in India
  location: Oslo, Norway
  name: TietoEvry
  position: Senior Consultant
  start_date: '2018-05-01'
  summary: Maintained and created core solutions for major Nordic banks.
  url: https://www.tietoevry.com/
- !Work
  description:
  end_date: '2018-04-30'
  highlights:
  - Responsible for the development of the core product, an electronic health 
    record system
  - 'Team lead: estimated, planned and followed up projects, and gathered requirements
    from customers'
  - Built integrations with payment terminals, accounting systems and video 
    chat, and a system for migrating customers between vendors
  - Worked closely with the business by planning and implementing new features
  - Worked closely with an outsourcing team in Vietnam, and lived there for a 
    few months to do it
  location: Seljord, Norway
  name: Aspit
  position: System Developer → Senior System Developer
  start_date: '2013-09-01'
  summary: Made electronic health record systems for the privatized healthcare 
    sector in Norway. Started as a system developer and was eventually promoted 
    to team lead.
  url: https://www.aspit.no/
