Building software that behaves the way it should.
I build with F#: types that make illegal states impossible to write, and a compiler that does the babysitting.
Also open for contract and full-time work.
// WillTheEngineer.fstype Employment = | Contract | FullTime | Bothlet careerState = Both // currently lookinglet whatItMeans (state: Employment) = match state with | Contract -> "Bring me a scope. I'll bring the receipts." | FullTime -> "Hiring? You get types and code that ships." | Both -> "Contract or full-time. Let's build something simple."type Language = | CSharp | FSharptype WebBackend = | Falco | MinimalApitype WebFrontend = | Datastar | SPAtype DataLayer = | Marten | EfCorelet chooseWeb (lang, backend, frontend, data) = match lang, backend, frontend, data with | FSharp, Falco, Datastar, Marten -> "This site. One project, pure core, " + "the compiler as my safety net." | CSharp, MinimalApi, SPA, EfCore -> "Been there, done that. " + "Let me show you a simpler way."let webStacks = [ (FSharp, Falco, Datastar, Marten) (CSharp, MinimalApi, SPA, EfCore) ] |> List.map chooseWeblet frontend = function | Datastar -> Ok "HTML over the wire. SSE. As intended." | SPA -> Error "Five MB of JS for a login form? I refuse."// Engineer.fstype Employment = | Contract | FullTime | Bothlet careerState = Both // currently lookinglet whatItMeans (state: Employment) = match state with | Contract -> "Bring me a scope. " + "I'll bring the receipts." | FullTime -> "Hiring? You get types " + "and code that ships." | Both -> "Contract or full-time. " + "Let's build something simple."type Language = | CSharp | FSharptype WebBackend = | Falco | MinimalApitype WebFrontend = | Datastar | SPAtype DataLayer = | Marten | EfCorelet chooseWeb (lang, backend, frontend, data) = match lang, backend, frontend, data with | FSharp, Falco, Datastar, Marten -> "This site. One project, pure core, " + "the compiler as my safety net." | CSharp, MinimalApi, SPA, EfCore -> "Been there, done that. " + "Let me show you a simpler way."let webStacks = [ (FSharp, Falco, Datastar, Marten) (CSharp, MinimalApi, SPA, EfCore) ] |> List.map chooseWeblet frontend = function | Datastar -> Ok "HTML over the wire. SSE. As intended." | SPA -> Error "Five MB of JS for a login form? " + "I refuse."A disk that says saved before it is
63 of 85 saved writes gone
I made the disk do that, then cut the power. Three runs lost 63, 64 and 63.
experimental recordA node cut off from its cluster
Every member removed, itself included
I cut one node off a three-node cluster. Akka.NET's default settings worked as designed.
experimental recordFour threads
50 different answers in 50 runs
A program with four threads, run 50 times on an ordinary computer.
experimental recordMolina settles an argument about a failure with an experiment. I run your software through failures like these on my machine, install nothing on yours, and hand over a recording of what happened.
Two things I built because of how I work: SageFS, a live F# REPL for your editor and your AI agents, and Molina, a service that reproduces failures.
.png)