Gå til indhold

Erfaren udvikler · Fra produkt til drift

Fra produktidé til systemer, du kan drive.

Brugerflader, typede grænser, asynkrone opgaver, deployment og fejlhåndtering. Direkte teknisk involvering på tværs af produktet og de systemer, der holder det kørende.

Teknik i praksis

Gør de vigtige grænser eksplicitte.

Illustrative kodeudsnit, forenklet til én beslutning ad gangen. Hvert eksempel gør en antagelse, fejl eller livscyklus lettere at forstå.

Validér eksterne svar, før de kommer ind i applikationen. En uventet datastruktur bliver til en identificerbar integrationsfejl.

Implicit antagelse
async function loadUser(id: string) {
  const response = await fetch(`/api/users/${id}`);
  const data = await response.json();
  return data.profile.name;
}
Eksplicit grænse
const User = z.object({
  id: z.string().uuid(),
  profile: z.object({ name: z.string() })
});

async function loadUser(id: string) {
  const response = await fetch(`/api/users/${id}`);
  if (!response.ok) throw new Error("HTTP failure");
  const user = User.parse(await response.json());
  return user.profile.name;
}

Repræsentér forventede fejl i returtypen, så den kaldende kode skal tage stilling til dem. Registrér relevant kontekst til fejlsøgning.

Implicit antagelse
async function loadReport(id: string) {
  try {
    return await reports.get(id);
  } catch {
    return null;
  }
}
Eksplicit grænse
type ReportResult =
  | { ok: true; report: Report }
  | { ok: false; reason: "unavailable" };

async function loadReport(id: string): Promise<ReportResult> {
  try {
    return { ok: true, report: await reports.get(id) };
  } catch (error) {
    telemetry.capture(error, { reportId: id });
    return { ok: false, reason: "unavailable" };
  }
}

Beskriv infrastrukturen i versionsstyring, så ændringer kan gennemgås, og miljøer genskabes. Udsnittet viser lagerkonfiguration, ikke et komplet deployment.

Implicit antagelse
Azure Portal
  → Create storage account manually
  → Choose settings from memory
  → Repeat for the next environment
Eksplicit grænse
resource "azurerm_storage_account" "results" {
  name                     = var.storage_name
  resource_group_name      = var.resource_group_name
  location                 = var.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
  min_tls_version          = "TLS1_2"
  allow_nested_items_to_be_public = false
}

Beregn afledte værdier, og giv abonnementer en eksplicit levetid. Immutable opdateringer undgår forældet tilstand, og oprydning forhindrer dobbelte lyttere.

Implicit antagelse
useEffect(() => {
  socket.on("item", (item: Item) => {
    items.push(item);
    setItems([...items]);
  });
}, [items]);
Eksplicit grænse
useEffect(() => {
  const receive = (item: Item) => {
    setItems(current => [...current, item]);
  };
  socket.on("item", receive);
  return () => { socket.off("item", receive); };
}, [socket]);

const total = items.reduce(
  (sum, item) => sum + item.value, 0
);

Udvalgte projekter

Systemerne bag produktet.

Se kravene, arkitekturen og driftsbeslutningerne bag fire lancerede produkter.

Rekruttering · AI-workflows

Skilltage

Et multi-tenant-produkt med typede API'er, asynkron inferens, eksplicitte adgangsgrænser og et driftslag designet sammen med brugerrejserne.

Behandling
Lambda-API'er, SQS-workers, retries og dead-letter queues.
Kontrakter
Schema-valideret evidens med sporede behandlingstrin.
Drift
Idempotent forbrugsmåling, Stripe-betaling og retention-jobs.
Læs om projektet

Geodata · Forbrugerprodukt

Skyggeplaner

En geospatial simulationskerne forbundet med adressekontrol, engangsbetaling, købaseret rendering og privat resultatlevering.

Input
Officielle matrikel-, bygnings- og højdedata.
Beregning
Solgeometri og reproducerbar asynkron rendering.
Livscyklus
Konservativ forhåndskontrol og tidsbegrænsede private resultater.
Læs om projektet

Mobil · AI-stemmecoaching

soil.health

Stemmecoaching på tværs af platforme med lange lydsessioner, vedvarende samtalekontekst, abonnementer og løbende appudgivelser.

Platforme
Et fungerende produkt til iOS og Android.
Produktflow
Lydsessioner, personlige refleksioner og hukommelse.
Levering
Abonnementsflows og fortsatte opdateringer i appbutikkerne.
Læs om projektet

Offentlige data · Søgeplatform

danskegrundskoler.dk

Fragmenterede offentlige datasæt samlet i skole- og kommunevisninger med filtrering, sammenligning, analyse og struktureret søgning.

Data
Offentlige datasæt samlet i en sammenhængende brugerflade.
Visninger
Skole- og kommunevisninger med fælles sammenligninger.
Drift
Fortsat vedligeholdelse af datakvalitet og brugeroplevelse.
Læs om projektet
Janus Jektvik

Janus Jektvik · Stifter

Din tekniske sparringspartner.

Du arbejder direkte med Janus, softwarekonsulent med erfaring inden for backend, frontend, mobil, cloud og regulerede miljøer.

Jeg er med fra produktbeslutninger til implementering og drift. Arkitekturen skal understøtte opgaven, og arbejdet skal være til at forstå. Ekstra kapacitet bliver koblet på, når projektet kræver det.

Tidligere roller hos Dawn Health og Netcompany spænder over sundhedssoftware, enterprise-systemer og bank. Den erfaring præger min tilgang til produktudvikling i dag.

Mere om Janus

Lad os tale om din tekniske udfordring.

Et nyt produkt, en arkitekturbeslutning eller et system, der kræver opmærksomhed. Tag konteksten med, så kan vi gennemgå rammerne og arbejdet, der ligger foran jer.

Skift perspektiv ↑