This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2024-04-16
Channels
- # announcements (1)
- # architecture (319)
- # babashka (27)
- # beginners (101)
- # biff (1)
- # calva (30)
- # cider (6)
- # clj-kondo (38)
- # clojure (41)
- # clojure-boston (1)
- # clojure-europe (80)
- # clojure-nl (1)
- # clojure-norway (21)
- # clojure-uk (4)
- # community-development (7)
- # conjure (1)
- # data-science (18)
- # datalevin (6)
- # datascript (30)
- # datomic (2)
- # events (2)
- # fulcro (1)
- # graalvm (3)
- # holy-lambda (2)
- # hyperfiddle (10)
- # jobs (3)
- # lsp (2)
- # malli (9)
- # matcher-combinators (3)
- # missionary (72)
- # nbb (40)
- # off-topic (1)
- # other-languages (14)
- # planck (5)
- # re-frame (2)
- # releases (4)
- # rewrite-clj (22)
- # shadow-cljs (3)
- # sql (2)
- # squint (17)
- # yamlscript (1)
God morgen! Litt på siden, men her er enda en liten bloggpost om NATS, denne gangen om key/value storen. Kommer snart et Clojure-bibliotek for dette nydelige systemet 😄 https://parenteser.mattilsynet.io/nats-kv/
Blir nesten litt skeptisk når ett system kan løse så mange forskjellige ting på en gang 😂
Ja, det var min første reaksjon også. Men når jeg forstod hvordan det hang sammen syns jeg det ga veldig mening.
Vi bruker NATS til to ting enn så lenge: • En arbeidskø for å importere data fra et gammelt system • Et command-system som baserer seg på en persistent logg
• Et command-system som baserer seg på en persistent logg• Hvor har dere persistensen når dere kjører i prod? • Hvor er persistensen når dere kjører i dev?
"På disk" er svaret på begge. Akkurat hva det betyr i prod er jeg litt usikker på, for vi har et infrastruktur team som drifter nats i prod for oss 😅
@U3X7174KS det er helt standard VM-er (på GCP for vår del) med block storage. Så ja, "disk" 😅
Dagens lille design nøtt: Den beste måten å designe for edge-caser er å ikke.
Det minner meg om et mantra i Erlang miljøet: "Let it crash." Man koder kun for "happy path" og gjør ikke noe exception handling. Prosessene (actors) er strukturert opp i et slags hierarki av "overseere" og "arbeidere," som vet hva de skal gjøre når noe dør. Programmene er "self-healing" hvis man setter ting opp riktig ved hjelp av ulike konvensjoner og OTP (standardbiblioteket). Det er en av tingene jeg digget med Erlang: Det er veldig "ren" kode, typ kun det som må være der, og veldig lite "clutter." Den Prolog-aktige syntaksen tar en del tid å venne seg til, men den er simpel (veldig få primitiver og syntaktiske strukturer, nesten som Clojure [men ikke like bra]).
Jeg har angret på at jeg har “prøvd å være for lur” mange ganger. Seinest i går. Da brukte jeg to timer på å fjerne en “for bred” abstraksjon. Jeg tror jeg aldri har angret på at jeg gikk for å “løse problemet jeg har akkurat nå“.
Samtidig er det noe i hvordan Rich designer åpne systemer. Noe med hvilke funksjoner som bør ta parametre (feks funksjoner som jobber med en database-tilkobling). Jeg klarer ikke helt sette fingeren på akkurat hva det er. Men det handler kanskje mer om å plukke ting fra hverandre enn å forutse edge-caser.
her kan typesystemer være litt vriene og. Når jeg skal kjøre et kjapt eksperiment i TypeScript, må det også types. Prøver å ungå å bruke any
og unknown
og sånt, for det er så fort gjort at det blir værende igjen. Så da ender man opp med å designe typene og dataflyten før du har implementert noe
skulle ønske alle typesystemer kunne toggle av og på “lekemodus”. Ikke lov å sjekke lekekode inn i prod, men fint å kunne utvikle typeusikker kode og heller fase inn typer senere
I Go/Haskell liker jeg å se etter muligheter til å bruke interfaces (Go) og typeklasser (Haskell) når jeg skal skrive kode som jeg ikke vil at skal være avhengig av konkret implementasjon. Men enig, jeg synes dette er lettere å få til feks i Clojure enn i feks Go.
Men det er en liten luregreie her. Hvis du bygger bottom up, dvs små byggeklosser som kan komponeres for å løse det vanlige use-caset, så kan man løse edge-casene ved å bygge litt anderledes med de samme byggeklossene. Men hvis du begynner top-down, så har du kanskje ingen mindre byggeklosser og du må løse edge-casene dine i den store top-down byggeklossen. Som da blir veldig komplisert, og ikke noe gøy å bruke
Det minner meg om et mantra i Erlang miljøet: "Let it crash." Man koder kun for "happy path" og gjør ikke noe exception handling. Prosessene (actors) er strukturert opp i et slags hierarki av "overseere" og "arbeidere," som vet hva de skal gjøre når noe dør. Programmene er "self-healing" hvis man setter ting opp riktig ved hjelp av ulike konvensjoner og OTP (standardbiblioteket). Det er en av tingene jeg digget med Erlang: Det er veldig "ren" kode, typ kun det som må være der, og veldig lite "clutter." Den Prolog-aktige syntaksen tar en del tid å venne seg til, men den er simpel (veldig få primitiver og syntaktiske strukturer, nesten som Clojure [men ikke like bra]).