UP | HOME

Software Development

I’ve been having fun this past year or so going deeper into software development tooling.

Here are the tools I’ve been spending the most time with, and the opinions I’ve developed.

Tools I love:

Emacs

I have a a whole page about emacs, but it deserves a bullet here.

I love being able to shape my editor into a glove that fits me and my idiosyncrasies. It’s so much better than shaping myself to fit an awkward tool. Getting good at emacs has made development a million times more fun, and this leads to more flow, and to more creativity.

Org-mode

Although I’m a professional data scientist, I don’t use jupyter notebooks, I use org babel in Emacs org mode!

This is great because it:

  • Enables reproducible science via version controlled text based notebooks
    • This also applies to devopsy work, not just research.
  • Enables literate programming that is integrated with org modes project management system.
  • Is part of the vast emacs ecosystem.
  • Is really aesthetic and fun, and just as extensible as the rest of emacs.

Nix

I do most of my personal development through a nixos vm running with UTM on my mac. I love being able to version my system configuration, and steal bits of config from friends.

I also use nix as my package manager for python environments at home. Sometimes requires terrible overlays but at least it’s hermetic, reproducible and aesthetic. ^^ It also integrates smoothly with eglot and pyright, which can be a headache, see my python project defaults.

Configuring nix also meshes well with LLMs, because you can tell it about the status of your configurations with text. :3

I like having these linux shenanigans live inside of a computer that’s stable, and that just works and interfaces as a first class citizen with the rest of the world.

Git

I love git so much.

I didn’t always love git, I used to be afraid of messing things up, but now I understand that it’s a tool that enables safe experimentation. It’s quite the opposite from my original feeling!

I changed by asking for help from more senior developers and getting a lot of it, and using git constantly because of Emac’s built in git-wrapper Magit. Magit was great since it meant I didn’t have to remember lots of commands, and the menu of options made my option space concrete in a way that is hard with command lines, but at the same time it didn’t hide git, like a lot of other UIs.

Did I mention emacs is great?

The book pro-git was also a great reference. Like a lot of people I was walking around with a the incorrect and confused model of commits as differences, and learning about how the key-value database stores snapshots (that are later compressed) clarified a lot.

LLMs

I wouldn’t have been able to make such rapid progress on stuff without LLMs to get me unstuck. They can be great tutors for learning new pieces of technology; I think they’re especially useful for learning new languages. I’ve also benefit from using them as style pointers.

I think they’re especially nice in the stage of mastery where you know that concepts can fit together in a certain way, but you don’t know the syntax; digging around for the syntax is purely wasted time vs just outlining the code and getting LLMs to fill it in.

I like this post by Nicholas Carlini for inspiration on ways to use LLMs. I think “body-doubling” with LLMs can an effective way to have more fun coding, and of course emacs makes it easy to have a smooth and extensible LLM companion.

Tests!

This is less of a tool, but I love test driven development – it makes for a fun feedback loop, and it’s comforting to be able to refactor with confidence.

Recently I’ve been experimenting with using org babel files as literate expect tests – I like that you get documentation and tests at the same time!

Text

The universal interface. :3

Opinions:

Safe to fail

A thing that tools I like have in common is that they’re safe to fail in, or they make it safe to fail.
I like to learn by experimenting with things.

  • Broke your nixos config? Just boot an earlier one. Plus it’s version controlled with git.
  • Unclear if something works? That’s what tests are for.

Fun

It’s good when tools are fun and create flow. When you’re engaged you’re at your best, so you should optimize for fun!

Recently I’ve been applying this to my mathematical studies as well!

Design or modify tools to fit yourself, don’t bend yourself to fit tools.

Being able to iterate towards a tool that fits you like a glove is one of the beauties of a system like emacs.

Find ways to develop iteratively and build positive feedback loops

This manifestly strongly when working on workflow tooling, because I immediately get a positive reward from improving a tool. This also shows up in writing tests and releasing code for review or use by other people, or that otherwise encounters reality in some way.

On the latter aspect, there is this memorable quote from von Neumann:

…mathematical ideas originate in empirics, although the genealogy is sometimes long and obscure. But, once they are so conceived,
the subject begins to live a peculiar life of its own and is better
compared to a creative one, governed by almost entirely aesthetical
motivations, than to anything else and, in particular, to an empirical
science. There is, however, a further point which, I believe, needs
stressing. As a mathematical discipline travels far from its empirical
source, or still more, if it is a second and third generation only
indirectly inspired by ideas coming from ’reality’, it is beset with
very grave dangers. It becomes more and more purely aestheticising,
more and more purely* Tart pour Tart. This need not be bad, if the
field is surrounded by correlated subjects, which still have closer
empirical connections, or if the discipline is under the influence of
men with an exceptionally well-developed taste. But there is a grave
danger that the subject will develop along the line of least resistance,
that the stream, so far from its source, will separate into a multitude
of insignificant branches, and that the discipline will become a disorganised mass of details and complexities. In other words, at a
great distance from its empirical source, or after much ’abstract’
inbreeding, a mathematical subject is in danger of degeneration.

– von Neumann (from the first paper in his collected works)

You can just get good at things!

Useful subskills:

  • Being able to humble yourself and learn from people who have more knowledge or better heuristics
  • Agency - you can just do things!
  • Willingness to practice; comfort failing repeatedly and comfort working on things that are hard.

Author: Elle Najt

Email: LNAJT4@gmail.com

Created: 2024-10-31 Thu 12:01

Emacs 29.4 (Org mode 9.6.15)