Hello World

👩🏻‍💻 Why do I do this?

My Masters degree is concentrated on political philosophy, feminism and metaethics, but my work experience, and half my Bachelors degree, is in tech. For a long time, I didn't understand the connection between these fields, but I think I do now.

My current self-understanding is that to design a user interface is to philosophize. Product design, when done right, is about confecting and asserting ontologies, an activity traditionally the purview of philosophers. How is this? Well, think of it this way.

🍕

Let's say your building a pizza-ordering app. In order to build this app, you have to have a theory of your user's needs and wants. This means you have to understand how your user thinks about the world: what a pizza is for them. For example, the user is probably not going to want to order a pizza which is a sphere with a radius of one meter. Nor are they going to want a pizza which is a mobius strip, or a living elephant with sauce and cheese tossed on its back, or the colour blue.

This seems like a silly example, but's as deep as you please (unlike pizzas — no offense to Chicago deep dish!) Every aspect of software development is shot through with philosophizing, from database schema to dropdown menu. The whole thing is philosophy. An app is an argument for a particular way of seeing the world, and it's the honour of software developers to have a chance to enact this living, vital form of philosophy.

Anyway. That's the theory. But the difference between theory and practice is much greater in practice than in theory!

So in the spirit of staying close to the practice of coding—of philosophizing with a hammer of keystrokes—behold now a List of Things I Both Like and Know Something About, Except for Python, which, Spoiler Alert, I Know but Do Not Like.

Neovim

I am writing this sentence, like so many sentences before it, in Neovim. I code in Neovim. I keep my journal in Neovim. I open Neovim as often as I open a web browser, and, speaking of web browsers, my Firefox is kitted out with at least three extensions to make it work like Neovim.

Neovim introduced me to Lua, a beautiful new friend, and if that were as deep as it went, it would still be a profound life experience. But as it is, my whole world is filtered through this one, singular interface.

Now, on its own Neovim is good, but, as the cliché goes, it is indeed the community that makes or breaks the product—and in this case, binds me ever-closer to it.

I cannot tell you how many blissful evenings I have spent putting the most finishing of delicate touches on my Neovim config, nor how gratifying it is to live within an interface that you have effectively built up over time, like a bivalve building its shell. For Neovim is my shell: its shortcuts are fused deep in my muscle memory. Before Neovim I used Vim, and before that, I used Vi. In total, I have spent two decades learning this editor, and there is still new stuff I discover every day. What a delight.

I cannot tell you what will happen after we die, but if I ever reincarnate, I do believe I will still be cursing when I encounter lesser text editors and word processors that do not heed my :wq.

Here is my complete neovim config.

Typescript & JavaScript/ECMAScript

TypeScript logoJavaScript logo

Over my career, I've watched JavaScript grow from a scrappy little language with inconsistent browser support into what has to be my favourite tool for encoding procedural thought, which is to say, code.

I remember when JavaScript first came out with Netscape Navigator 2.0, because I am that old, and I started young. I remember laughing at it, and thinking it was no match for Java, which then was the language of my dreams.

And then I remember ignoring it for ten years.

When I looked again, O'Reilly had released JavaScript: the Good Parts, a book which fundamentally reshaped how I saw the language. Hidden under all that Java-wannabe OOP cruft was a simple, spare, elegant language, struggling to come out!

And did it ever. Every year has brought the world a better, bolder, and more elegant way of programming the Internet.

I'm particularly grateful to my former colleagues at Microsoft, who created the incomparably elegant, rigorous, and just plain pretty TypeScript, embracing and extending, not to extinguish, but to raise up.

If you had told me in 1998 that, in 2023, I would be thrilled to be programming in a descendant of JavaScript, I would have laughed in your face. But here I am. In my lane. Moisturized. Kicking butt with curly braces.

Which is not to say the language is perfect. Node, while brilliant, shows signs of hasty construction.

The future, I think, will be in Deno land.

React

React logo

React has so permeated my thinking about web development I find it difficult to remember any other way of thinking; it is that good, and that dangerous.

Dangerous, because any product that blots out all thought of alternatives is no longer a product, but an ideology. React is definitely that. Moreover, it partially competes with genuine W3C standards, like Web Components. And this is not to mention all the alternative renderers (or targets) supported by React! There is of course React Native; but there is also React for terminal applications and literally dozens more.

Let me be clear: React comes with some terrible trade-offs. First, there is complexity; second, there is bundle size; third, there is the fact that one is forevermore beholden to the React development team, which is to say, Meta.

But what you get for that spend really is worth it. The React ecosystem is a paradise of choice, a garden of options. I do not have to think too hard about reinventing the wheel, ever. I just go on GitHub and grab what I need.

Elm is more perfect; Svelte is more spare. And for mobile development, Flutter is probably the best developer experience. But React, with all its warts, its moving parts, its pointless complexity? React is power. That is just how it is.

Next.js

React was always great, but Next takes it to the (ahem) next level. While there is understandably some angst in the React community about the move to server components, my position is that (a) there is a lot more to Next than just server components and (b) server components, while definitely a change, are awesome and necessary things.

This very blog relies on the supple, elastic blend of client and server code that Next 13 makes possible, and I like it so much I built my own blogging engine, sbstr8, to take advantage of it.

I could not be more enthusiastic about Next.js if I tried.

NixOS Linux

NixOS is as close to the platonic ideal of a Linux distro as it is possible to be. I have, in my time, tried and loved every major linux distribution on the planet, from Ubuntu to Fedora to Arch Linux to Debian to the great granddaddy of them all.I got into Linux when I was a teenager. As an undergrad intern, I even created an embedded Linux distribution! But there is absolutely nothing to compare with NixOS.

NixOS (and its underlying build system, Nix) are an idempotent, declarative configuration tool. I do not have scope here to explain it fully, but imagine fully specifying your entire OS experience, from your email accounts down to the version of Neovim that you prefer, in a single, easy-to-read file, that you can use to regenerate that environment on any machine that you sit down in front of.

Now, imagine that the whole system can be rolled forward and backward, so any change you make to your config can be reversed!

Do you miss your config from a week ago? Simply reboot into that environment!

Did you want to replicate your home workstation on your laptop, right down to the keyboard shortcuts? NixOS got u, bb.

Of course, all that power comes with one hell of a learning curve. I probably lost a good six months of productivity to NixOS. But I regret nothing, I am now cybernetically enhanced, none can stand against me.

There is a book about NixOS in me. Here is also a promissory note: Once I have cleaned up my repo, I will post my full NixOS configuration to GitHub.

Sbstr8

Sbstr8 logo

This website is powered by Sbstr8, a blogging engine I developed atop NextJS, React, GraphQL, and I'm super excited about it. The idea is to create an environment for blogging that is SEO-friendly and also gives you access to the superlative ecosystem that has grown up around React. It's working great!

Here's an article I wrote about it.

More to come; watch this space.

Lua

While I'm just starting my Lua journey (which began via Neovim), I am besotted with this elegant little language, rivalling Scheme or Forth in its simplicity and purity. An appreciated antidote to modern web development.

Tailwind

Tailwind logo

Tailwind is relatively new acquaintance for me – I first embraced it while making this very website.

To be honest, I was really skeptical at first – it does not sound like much when you describe it in plain English (‘a set of CSS classes that do basic things’) and, meanwhile, there are so many CSS enhancements out in the world already, everything from the venerable Sass to modern stuff like CSS-in-JS solutions like Emotion. Meanwhile, Next.js offers a fantastic way of doing modular CSS baked right into the directory structure. Why, I thought, would anyone Tailwind?

Well, it turns out that Tailwind lets you code faster. Once you commit to learning its vocabulary of CSS classes, it becomes trivial to confect complex user interfaces in React. It is simply a faster, cleaner way of styling things, and all of CSS is still there if you ever need something that Tailwind does not provide.

Despite my initial skepticism, I have become a Tailwind convert. I even bought their commercial offering. Combined with Headless UI, you have a simple, server-component-friendly (and thus SEO-friendly) user interfaces. It pairs so well with Next.js that it almost hurts. I would not greenfield a new project without it.

OpenBSD

OpenBSD logo

If NixOS is the platonic ideal of a Linux distribution, then OpenBSD is the platonic ideal of an OS. Period.

The OpenBSD project remains the one OS that authoritarians despise. It is unbelievably secure.

Like a shark, OpenBSD has remained in its bauplan almost entirely unchanged since I first encountered it, back in the early 2000s.

While I prefer NixOS for my ‘edge’ devices, mostly because of driver and device compatibility, I am also never without an instance of OpenBSD, which remains the root-of-trust for all my operations.

And because OpenBSD exists, I can call myself “only the second most paranoid thing to come out of Alberta, Canada.”

Rust

Rust logo

Like every other coder with available brain cells, I am in the process of filling them with Rust. There is plenty to admire in this language, and every day brings new joy and pleasure, borrow checker notwithstanding.

Rust feels like the actual successor to C, not C++. Rust feels like an incursion from a timeline where things are indisputably better, more sane, and more reliable. I profoundly admire its toolchain, and I don't find the build times as horrible as everyone says they are. (Perhaps my projects simply are not yet big enough.)

I will keep a journal of my Rusty discoveries on this very website. Stay tuned.

C/C++

ISO C logoISO C++ logo

C is literally the first real programming language I learned. I taught it to myself. I was sixteen. These days, that is not unsual, but in 1996, in the countryside of northern Alberta, Canada, it was rare. It was a respite from the pathos of high school and, when I adopted Linux the following year, my command of C gave me instant power over this strange new world.

C++ came later for me, and for a while, I was hypnotized by all of its powerful features (or, as some would call them, footguns.) It was never home to me, though, in quite the same way that C was. I used C++ extensively in my undergrad degree, along with Java, but petered out after that.

Sadly, it has been several years since I needed to work in C or C++ in a professional capacity, but this is a trend I would dearly love to reverse. Once I am finished learning Rust, I will re-familiarize myself with C++23 , and all the new features it has to offer.

Python

Python logo

…I have a confession: I don't like Python very much.

Before you revoke my nerd card, please allow me to explain that I know Python, have been working in Python for (at this point) over two decades, and admire many things about Python.

But in that time, I've watched Python eat the world, usually at the expense of more interesting languages. MIT no longer teaches 101 in Scheme; they use Python. Ruby? No, backend webdev went off the Rails some time ago. OK, but what about Julia for computation? Well, you could, but heaven help you if you want to mess around with someone's Jupyter notebook.

While v3 brought useful innovations, Python has traditionally it unnecessarily hard to program in a functional style, locking down its users' mindset into an OOPy, goopy mess. I am a firm believer that Object-oriented Programming is Inherently Harmful. But because Python is an opinionated developer experience, and because its libraries were all written by humans who had apparently never heard of tail recursion, much less a map-reduce, you are stuck doing for-loops like a first-year CS student.

And don't even get me started on the batsh_ttery inherent in Python version and package management. You've got virtualenv, pip, poetry, if you're lucky, and if you're not lucky, which is often, you'll be saying hello to Anaconda, Miniconda, IronPython, or whatever other nonsense has come out in the past week.

Moreover, Python is slow. Moreover, whitespace-sensitive languages are unaesthetic. (This last point, I admit, is a personal opinion.)

So, like everyone else in 2023, I touch Python quite a bit. No, I do not like it. Yes, modern ECMAScript is better. And TypeScript is heaven. Fight me.

Raspberry Pi

There are few things in this world that I regard as unalloyed goods. Most advances are also retreats. As Heidegger put it, all truth is revealing, and to reveal is also to conceal. In other words, your latest insight blots out a previous understanding. Creation is always destruction, and there are no pure things in this world.

Heidegger obviously never played with a Raspberry Pi. These things, especially in their fourth-generation edition, are basically the most angelic, perfect artefacts of modern civilization: inexpensive, sophisticated, and infinitely useful.

An overly-elaborate Raspberry Pi project by yours truly.
A very-extra Raspberry Pi project by yours truly.

GraphQL

GraphQL logo

GraphQL is another polarizing platform choice that I firmly support. While some developers argue that GraphQL creates unnecessary overhead and complexity, while also moving away from the sacred REST principles which govern most API endpoints on the web, I think of it as being similar in stature and importance to that other big thought product from Meta, React.

Like React, GraphQL is highly ‘ideological’. While not itself a framework, the way of thinking that it imposes is sufficiently different from lower-level constructs (like HTTP GET, POST, etc.) that excessive exposure to GraphQL makes it hard to think in other paradigms.

While this phenomenon arguably endangers Good Old Web Development principles, my claim is that the tradeoffs are worth it.

I argue that any project of sufficient size will eventually require a bunch of Swagger files anyway, and if the choice is between Swagger and GraphQL, I would take GraphQL any day.

I have read somewhere (and I cannot remember where!) that a GraphQL schema can be thought of as a sort of contract between the front and back end of a project, and that has been my experience in practice.

Which is to say, GraphQL is a sort of social technology, lubricating the interactions between the two teams that, by Conway's Law, must always emerge from a SaaS development company.

Once you start thinking in GraphQL, it is hard to stop. I argue that this is not a bad thing.

Microsoft Azure

Microsoft Azure logo

Having contributed to a major chunk of Microsoft Azure over a period of several years, I have, uh, some good things to say about it.

Azure these days has good documentation and a reasonably deep set of offerings. The APIs are good-ish, and it's not terrible to build a whole company in this environment.

What I don't love about Azure are the costs, which tend to be higher than other cloud offerings, and the uptime. There was also a rash of really embarrassing security holes found in fundamental components of Azure back in 2021, and I am still mistrustful of, say, CosmoDB as a result.

Also, the Azure CLI seems to keep inflating. It now contains its own complete version of Python, and clocks in at over 4GiB.

The best I can say is that if you have free Azure credits, it's good enough. If you don't, maybe look elsewhere?

Amazon Web Services (AWS)

Amazon Web Services logo

I have mixed feelings about AWS. While I have used it extensively for over a decade, it consistently feels like a vacuum cleaner attached to my purse. Every skill I acquire that is AWS-specific or AWS-centric feels like lock-in. It feels inevitable, like death, or taxes, or deja-vu.

That said, AWS invented the cloud, by many accounts was the cloud for the better part of a decade, and launched ten thousand startups. It is no exaggeration to say that the modern world was created in Seattle by Amazon.

And they are still, in my surmise, one of the better cloud offerings, trouncing my former employer in uptime and security.

And yet. And yet. I keep looking to see new clouds on the horizon.

PostgreSQL

PostgreSQL logo

While I have at many stages of my career maintained PostgreSQL deployments, was not until recently that I really dug in and got to better know this stalwart constant of Open Source development.

And I am so glad I did! This clumsy old pachyderm has seen the NoSQL movement rise and fall; has watched MySQL go closed source, turn into MariaDB, and then (in my opinion) turn into a mess; and it has remained competitive with monster commercial offerings like Oracle, MSSQL, and, most recently, all the cloud-based services that purport to base your data. (As it were)

But Postgres, it' always been you, hasn't it?

You were there when the old lore was written. You will be there when the new lore becomes old lore, and the old lore is forgotten. You have fabulous replication characteristics, and long after I myself have off this mortal coil shuffled, you will still be there, rocking fresh extensions and languages.

PostgreSQL, if you were a bank, I would keep all my money in you.

PostgreSQL, thank you.

Docker/Podman & Kubernetes

Docker logoKubernetes logo

Among developers of a certain age, Docker and K8S are strangely polarizing topics. I have several friends, cherished and respected, who regard them as (and I quote) “brittle overhead” and I cannot help but demur.

I do not have bandwidth to argue the full case for Docker and K8S here, but the thumbnail of my view is that container orchestration has turned Linux into the OS with which we program the planet. There is literally no problem you cannot solve with a sufficient application of this stuff. Sure, it' complicated, but it is also one of those foundational skills that opens wide the addressable space of possible programs.

Kubernetes and containers make it possible to dream big. I stan.

This website will itself be deployed/hosted in K8S by the end of the summer of 2023. I have an extensive background in bootstrapping startups with Docker, and I'm now picking up K8S, and finding it easy.

Calligraphic embellishment of the name 'Liz'