topic: software development
Everything I’ve written on the subject, from the beginning of this version of the site.
-
2019
-
Nov
-
28
-
A JSON Feed Apology and Explanation—JOURNAL
All my best efforts and this is still where we end up!
-
-
-
-
2020
-
Apr
-
24
-
29
-
The Infra Engineer’s Blind Spot—JOURNAL
Why I ended up down a rabbit hole instead of shipping.
-
-
-
May
-
03
-
find, grep, xargs, and newlines and null—JOURNAL
Turns out
tr
is your friend for this kind of thing.
-
-
04
-
Follow-Up on Command-Line Finding and Filtering—JOURNAL
A simpler solution that doesn’t require
tr
… if you have GNU utils or other alternatives.
-
-
08
-
This Week I Learned #3—JOURNAL
Less reading this week… because more composing.
-
-
13
-
mut
(andset
) and autotracking in Ember Octane —JOURNALUnderstanding a surprising behavior—and fixing a refactoring hazard.
-
-
15
-
Designing an Atomic CSS System—JOURNAL
Making my CSS scalable from the outset.
-
-
24
-
25
-
Making Illegal States Unrepresentable—In TypeScript—JOURNAL
Showing how Scott Wlaschin’s approach in F♯ translates to a language with a very different type system.
-
-
-
Jun
-
07
-
Building the Slow Way—JOURNAL
Or, part of why rewrite is taking a while: I’m in this for the long haul.
-
-
-
Jul
-
01
-
A Git Workflow for Managing Long-Running Upgrades—JOURNAL
Using some lessons learned in the trenches of large upgrades.
-
-
-
Aug
-
17
-
Migrating Off of
PromiseProxyMixin
in Ember Octane —JOURNALAn important refactor for getting rid of mixins and proxies.
-
-
28
-
Async Data and Autotracking in Ember Octane—JOURNAL
Digging into the
load
helper andAsyncData
type I introduced in an earlier post.
-
-
-
Sep
-
04
-
Tracking in the Glimmer VM↩︎—❈—ELSEWHERE
Chris Garrett (@pzuraq) explains to me how autotracking and the Glimmer (Ember) template layer connect!
-
-
05
-
Data Constructors, Part 1: Understanding by Implementing —JOURNAL
Understanding an idea from Standard ML-like languages by implementing it in (boring) TypeScript.
-
-
22
-
Autotracking: Elegant DX Via Cutting-Edge CS —JOURNAL
A modern JavaScript reactivity system powered by Lamport clocks and incremental computation and depth-first searches: oh my!
-
-
26
-
Things I Was Wrong About: Types —JOURNAL
Because it would do us all good to be a little more honest about where we’ve changed our minds or simply been mistaken.
-
-
-
Oct
-
06
-
Initializing Class Fields in Ember Octane —JOURNAL
One of the many small-but-lovely benefits of getting to use native classes in Ember Octane.
-
-
24
-
Writing Robust TypeScript Libraries—JOURNAL
A subtler art than it might at first appear, if you intend to support JS or even loose mode TS.
-
-
31
-
Notes on Thoughtbot’s “Stop Using 'any'”—JOURNAL
A couple tweaks and improvements to a good post!
-
-
-
Dec
-
22
-
Understanding
args
in Glimmer Components—JOURNALClearing up a common confusion with a worked example.
-
-
-
-
2021
-
Feb
-
13
-
Announcement: Speaking at EmberConf 2021 —ELSEWHERE
In which I’ll be speaking for 30 minutes at a JS conference… and will spend only about 5 of those minutes on JS.
-
A Useful Approach to Problem-Solving—JOURNAL
(It’s useful to me, at least.)
-
-
28
-
A Gap in (My Knowledge of) the Developer Productivity Literature —JOURNAL
Where is the equivalent of Accelerate for anything outside of DevOps?
-
-
-
Mar
-
08
-
Naming and Framing—JOURNAL
Or, why did Accelerate matter for DevOps?
-
-
13
-
Introducing “Heuristics for Good Software Design”—JOURNAL
A series of posts in which I explain how I think about effective software design.
-
-
21
-
Progressive Disclosure of Complexity and Typed FP Languages—JOURNAL
Or, one part of why to some extent Elm, and to a significant degree PureScript Halogen, can be quite difficult for users to get their heads around at first.
-
-
23
-
RFC: Semantic Versioning for TypeScript Types ↩︎—❈—ELSEWHERE
In which years of thinking and months of design come to fruition.
-
-
29
-
Impromptu EmberConf 2021 AMA↩︎—❈—ELSEWHERE
In which my friend David Baker put me on the spot… and it was great!
-
-
31
-
Keep It Local—ELSEWHERE
Or: (part of) what “reasoning about your code” really means; being my EmberConf 2021 talk.
-
-
-
May
-
27
-
Chatting About Web Dev ↩︎—❈—ELSEWHERE
Ember CLI history, ember-auto-import, web bundling, and more
-
-
-
Aug
-
07
-
MusicXML and Percussion Notation—JOURNAL
Digging into How Dorico and StaffPad represent percussion differently.
-
-
-
Dec
-
12
-
Small, Non-Trivial Projects for Learning—JOURNAL
For learning effectively, nothing is better than a real project which gives you a place to experiment and play.
-
-
-
-
2022
-
Jan
-
07
-
28
-
Announcement: Speaking at TypeVille 2022 —ELSEWHERE
On the subject of “Types as Tools for Thought”
-
-
-
Apr
-
18
-
Semantic Versioning for TypeScript Types 1.0.0-beta.1↩︎—❈—ELSEWHERE
After years of work, I’ve published the first beta of the spec for semantic versioning for TypeScript types!
-
-
22
-
SemVer for TS in Practice—JOURNAL
Showing how the recommendations from www.semver-ts.org can actually work in the real world.
-
-
28
-
Misusing TypeScript Assertion Functions for Fun and Profit—JOURNAL
A horrible (but very useful) hack I came up with yesterday for adding types to some old code.
-
-
-
Jul
-
08
-
A Pleasing Symmetry in Rust—JOURNAL
Appreciating how Rust
enum
variants are mirrors of its kinds ofstruct
s.
-
-
-
Aug
-
05
-
On the Ember Blog: Plain Functions as Helpers ↩︎—❈—ELSEWHERE
Making sure people understand a new feature we shipped which is a big deal.
-
-
28
-
Flow State—JOURNAL
Maybe it’s less important than we like to think?
-
-
-
Sep
-
25
-
Marco’s Rule of Software Stacks (Expanded)—JOURNAL
On being the biggest user of a given technology.
-
-
-
Oct
-
06
-
Trade-offs—JOURNAL
They are real; but too often offered as an excuse to avoid thinking rather than a reason to think harder.
-
-
24
-
-
Nov
-
04
-
Organizing Many Software Projects—JOURNAL
How I lay out my file system and how I tweak Git for working on literally dozens of different repositories.
-
-
-
Dec
-
09
-
Reasoning About Reference Cycles—JOURNAL
Rust’s lifetime types are challenging, but they bring a capability I miss all the time in other languages.
-
A UML Comeback?—JOURNAL
Because the tools are positioned for sketching, now?
-
-
-
-
2023
-
Jan
-
08
-
Product Idea: Meal Tracking for Athletes —JOURNAL
All of the existing tools need broader design vocabularies.
-
Special Null Syntax vs. Types and Functions—JOURNAL
Why does
Maybe.map
feel better than??
and friends to me? A sketch.
-
-
13
-
16
-
Feature Idea: Week-Level Smart Training Plans —JOURNAL
Training (at my level, anyway) is less about individual day-to-day work and more about what I do each week. The tools should support that!
-
-
-
May
-
23
-
Competencies—JOURNAL
An observation on the dynamics of (sufficiently) large organizations.
-
-
27
-
-
Jun
-
10
-
Is GitHub Copilot Any Good?—JOURNAL
Betteridge’s Law applies, but the details of why I think so might still interest you.
-
-
11
-
15
-
Writing Tools—JOURNAL
Obsidian, Bear, high-quality native apps vs. cross-platform Electron apps…
-
-
23
-
On Ember’s New Major Version Cadence—JOURNAL
Not just how this one specific process for one JavaScript framework is changing, but why—and why I hope it will be useful to other projects as well!
-
-
-
Jul
-
01
-
Trying BBEdit and Nova—JOURNAL
I am taking some time off, and this seems like a great time to mess with alternatives for my software stack.
-
-
11
-
Je ne sais quoi—JOURNAL
Programming languages, cameras, computers, and other technologies—and feel.
-
-
17
-
Is TypeScript Good?—A Reply to Rach Smith—JOURNAL
Taking a thoughtful post as an excuse to discuss software system dynamics through the lens of TypeScript.
-
-
29
-
My Current Mac Stack—JOURNAL
The software I use every day, with commentary.
-
-
30
-
Extended Time Off Report—JOURNAL
What I got up to over the past month! Because I relax by learning and doing.
-
-
31
-
Reflections on a Month with BBEdit and Nova—JOURNAL
What works, what doesn’t, and where did this experiment lead me in the end?
-
-
-
Aug
-
02
-
05
-
Stay Curious About Your Tools—JOURNAL
I have lately enjoyed digging further into Unix and macOS fundamentals—and it has reminded me to stay curious about my tools!
-
-
08
-
Just Keep Climbing—JOURNAL
Or: how to make progress.
-
-
16
-
26
-
Unmeasurable Costs and Benefits—JOURNAL
One major reason standard advice about “demonstrating value (or impact)” does not work well for foundational software, including (but not only) open-source library code.
-
-
-
Sep
-
24
-
Brain Rewiring in Progress—JOURNAL
Learning Racket is making my head hurt in the best way.
-
-
-
Oct
-
03
-
Do It the Dumb Way Sometimes—JOURNAL
Simple tools for small, well-scoped problems, please!
-
-
30
-
Versioning and Big Binary Blob Art Files—JOURNAL
Sharing my ad hoc version management for writing musical scores. (It works for Photoshop just as well!)
-
-
-
Nov
-
02
-
Where DRY Applies—JOURNAL
The rule is taught early and often, but it ought to come with a clarification.
-
-
03
-
How to Do a TypeScript Conversion —JOURNAL
Addressing a very common question: do-it-as-you-go or follow the dependency graph?
-
-
06
-
Seven Languages in Seven Weeks—LIBRARY
A now-classic read for software developers. How did it age?
-
-
12
-
Next—JOURNAL
Leaving LinkedIn, taking a 3-month sabbatical, and thinking about what comes next.
-
Next: Role?—JOURNAL
Ratchets over levers.
-
Now: Sabbatical—JOURNAL
Resting well and (by?) working hard.
-
-
-
Dec
-
07
-
The Wizardry Frontier—JOURNAL
Against the idea that accessibility and reliability (or other such dichotomies) must remain at odds in programming languages.
-
-
18
-
Why Not OpenDoc-Alikes?—JOURNAL
Maybe apps, for all their limitations, actually have some things going for them.
-
-
28
-
-
-
2024
-
Jan
-
09
-
LambdaConf 2024—Two Talks!—ELSEWHERE
One technical deep dive on versioning, one philosophical exploration of our limits as software engineers.
-
-
-
Feb
-
02
-
10
-
Garmin Training Status – A Complaint—JOURNAL
The feature ends up being useless to me because it does not model my real-world training very well.
-
-
-
Mar
-
12
-
You Have to Type It Out—JOURNAL
A note on how learning works (in my experience, anyway).
-
-
-
Apr
-
26
-
Upcoming: Substrate Engineering (StaffPlus New York 2024)—ELSEWHERE
Coming in September: a talk on “Engineering Foundations in a World of LLMs”.
-
-
-
May
-
06
-
The Cutting Edge of Versioning (LambdaConf 2024)—ELSEWHERE
Semantic Versioning, library & framework evolution, programming language design, type systems, and you.
-
-
07
-
Seeing Like a Programmer (LambdaConf 2024)—ELSEWHERE
Resiliency, Limits, and Moral Hazards in Software Engineering
-
-
22
-
Using
cargo tree
to Explain Dependencies—JOURNALOr, the equivalent of
npm why
,yarn why
,pnpm why
, etc. that you might be looking for.
-
-
-
Jun
-
21
-
Weeknote: June 17–21, 2024—JOURNAL
-
Pest.rs’ Syntax Tree is Very Low-Level—JOURNAL
Which is fine, mostly, but it means you have to do two passes to get a typed AST!
-
-
26
-
Changelog Interviews #597: Major.Semver.Patch ↩︎—❈—ELSEWHERE
Teaming up with Predrag Gruevski to talk SemVer with Adam and Jerod.
-
-
29
-
-
Jul
-
02
-
An Observation on Constructor Syntax—JOURNAL
From debating whether to implement them in my little programming language.
-
-
05
-
13
-
Fast Tools are Wonderful—JOURNAL
A real-world example: Markdown-, HTML-, Unicode-aware word counting.
-
Weeknote: July 6–13, 2024—JOURNAL
-
-
-
Aug
-
02
-
count-md: a New Rust Tool and Library ↩︎—❈—ELSEWHERE
Counting words in a Markdown files in a way that actually makes sense.
-
-
-
Sep
-
09
-
StaffPlus NY 2024: Substrate Engineering —ELSEWHERE
Engineering Foundations in a World of LLMs
-
-
19
-
Read the Manual: open —JOURNAL
open files and directories on macOS!
-
-
26
-
Read the Manual: less —JOURNAL
Sorry, “opposite of more” doesn’t tell me much.
-
-
-
Oct
-
03
-
Read the Manual: last —JOURNAL
A tiny tool I used for the first time in late September, 2024.
-
-
11
-
Read the Manual: cd—JOURNAL
One of the few Unix tools that actually follows the Unix philosophy! Mostly, anyway.
-
-
17
-
Read the Manual: du—JOURNAL
Disk utility. Not that Mac app you might be thinking of, the older one.
-
-
24
-
Read the Manual: rm—JOURNAL
Another old Unix standby… without too many extra flags.
-
-
31
-
Read the Manual: uptime—JOURNAL
It tells you how long your computer has been running. Handy, occasionally!
-
-
-
Nov
-
07
-
Read the Manual: pbcopy and pbpaste—JOURNAL
Two of my favorite command line tools: copy and paste to the macOS clipboard. (Actually to one of… several clipboards?)
-
-
14
-
Read the Manual: lsof—JOURNAL
Like
ls
, but it’s about open files instead of files in a directory. Neat!
-
-
21
-
Read the Manual: id—JOURNAL
When you need to know a bit more about how the system identifies a given user.
-
-
-
Dec
-
02
-
brew services uses launchctl or systemctl—NOTES
-
The DefinitelyTyped dprint Setup—NOTES
Much, much simpler than I expected!
-
-
03
-
dprint—NOTES
A very fast auto-formatter!
-
True Myth 8.1.0—ELSEWHERE
Adding some test helpers!
-
-
04
-
PSA: Default to
cargo install --locked
—NOTESThere are reasons this is not the default, but you can make it your default.
-
On
cargo install
Not Defaulting to--locked
—NOTESA few details, as I best I know them, because a friend asked after reading my last post!
-
-
05
-
06
-
dprint for Nova—ELSEWHERE
I like nice, fast tools, so dprint and Nova make a great pair.
-
2024 State of Rust Survey↩︎—❈—NOTES
An opportunity to provide real and actionable information to the Rust project leadership. Take it!
-
-
11
-
12
-
Read the Code: Using Drop Safely in Rust—JOURNAL
A deep dive into Rust’s
vec::Drain
and itsDrop
implementation as an example of how ownership prevents subtle bugs—memory and otherwise!
-
-
14
-
Runtime or Types?—NOTES
A false dichotomy! They always go together.
-
Buttondown’s Alternatives Page—NOTES
Would that all software companies acted this way.
-
-
16
-
jj tip: ignore
gh-pages
by default—NOTESI want my log to show me only useful information. Revsets let me do that!
-
To Throw or Not to Throw in TypeScript?—NOTES
Taking a bit of inspiration from Rust and ending up with much more reliable TypeScript.
-
-
18
-
Configure Zed to Use the Project’s rust-analyzer—NOTES
Because it is not nice for your editor tooling to stop working!
-
-
19
-
Publishing to GitHub Pages via GitHub Actions—NOTES
Including two tips for bits that were very much not obvious about the project settings!
-
-
20
-
fish shell v4 beta 1—NOTES
A bunch of small nice improvements… and a rewrite in Rust!
-
rust-analyzer version via rust-toolchain.toml—NOTES
If you use an older toolchain, this will make for a better developer (and contributor!) experience.
-
-
30
-
Announcement: LambdaConf 2025 Keynote—ELSEWHERE
Infrastructure, Common Goods, and the Future of Open Source Software
-
-
-
-
2025
-
Jan
-
02
-
A Year of Shipping—NOTES
…details to be determined as I go.
-
True Myth v8.2.0—Now With a
Task
Type!—ELSEWHERELiterally seven years in the making. But it happened!
-
-
09
-
True Myth v8.3.0—ELSEWHERE
Lots of async combinators, a new
Result
helper… and some deprecations.
-
-
11
-
True Myth v8.4.0—ELSEWHERE
Probably the last 8.x release:
Task
is feature complete!
-
-
15
-
JavaScript’s
Promise.race
andPromise.all
Are Not “Fair”—NOTESJust like life! And just like life, you just have to deal with it.
-
-
21
-
The Essence of Successful Abstractions—JOURNAL
Complexity has to live somewhere; but it does not have to live everywhere.
-
-
22
-
jj tip: describe multiple revisions at once—NOTES
Revsets and filesets remain mind-blowing.
-
-
24
-
A Reasonable Error Printing Utility in TypeScript—NOTES
Something I want all the time in JS/TS now that I am used to it in Rust—thanks to anyhow!
-
Tasks You Can Retry: True Myth v8.5.0 —ELSEWHERE
I know, I said we were done, but then someone had a good suggestion!
-
-
25
-
The Curse of Knowledge and True Myth’s Documentation—NOTES
Writing good introductory documentation and teaching materials is hard.
-
-
29
-
TypeScript 5.8 Checks Runtime Code for Conditional Types!—NOTES
One of those “if you know, you know” releases.
-
minijinja tip: What That Custom Function’s Type Error Means —NOTES
If the error message involves
Function
, the problem is reallyViaDeserialize
.
-
-
30
-
minijinja tip: Template Values Must Round Trip—NOTES
A general lesson about de/serialization applied in this specific context.
-
-
-
Feb
-
04
-
Big Packages or Many Dependencies—NOTES
Pick which you prefer, but you cannot be mad about both!
-
-
13
-
15
-
How Progress Feels—JOURNAL
In everything, by way of analogy with running.
-
-
17
-
Axum Handler Errors Need to Implement
IntoResponse
—NOTESThis has some interesting implications for
Result
.
-
-
20
-
fish tip: Launching
$EDITOR
to Edit the Current Terminal Command —NOTESSomething I end up doing surprisingnly often!
-
-
21
-
The Rust Programming Language, 2024 Edition—ELSEWHERE
That’s my name in the authors list! Whoa!
-
-
24
-
Separation of Concerns—NOTES
…for web domain management.
-
-
25
-
Why Hover for Domain Registration?—NOTES
Because unlike most other registrars, they genuinely don’t suck.
-
-
28
-
Cloudflare Worker Responses Require Manual Caching—NOTES
This was not intuitive or obvious, but at least it isn’t hard, either.
-
-
-
Mar
-
04
-
Yes, Hallucinations are the “Least Dangerous”—Exactly—NOTES
A rejoinder to Simon Willison’s rant last week.
-
-
11
-
TypeScript Native Port: Some Questions—NOTES
Faster is good! The rest of this announcement is… strange.
-
-
-
Apr
-
15
-
True Myth Releases: 8.6, 9.0, and a New Docs Site!—ELSEWHERE
Continuing the year of shipping with more True Myth goodies.
-
-
25
-
Next: Vanta—JOURNAL
The next order of magnitude I haven’t seen before.
-
-
27
-
Using mise-en-place for dotfiles—NOTES
Lots of ways to do this; this is mine for now.
-
-
28
-
The Git “Invalid username or password” error—NOTES
Spoilers: If you’re me, it’s probably your personal access token.
-
-
-
May
-
13
-
Infrastructure, Common Goods, and the Future of Open Source Software—ELSEWHERE
My LambdaConf 2025 Opening Keynote
-
-
-
Jun
-
06
-
History and Disposition—NOTES
I have spent my career on large, legacy systems, and that informs an awful lot about me—including my views on LLMs.
-
-
07
-
BBEdit Syntax for Jujutsu Commit Messages↩︎—❈—ELSEWHERE
Because I want
JJ:
lines to be treated like comments, dagnabbit!
-
-
14
-
true-myth-zod—ELSEWHERE
The Year of Shipping continues!
-
-
22
-
Some Products Just Aren’t Big Companies—JOURNAL
A reflection on Mozilla shutting down Pocket.
-
-
-
Jul
-
05
-
Subscriptions That Respect Users—NOTES
A decade on, no one has done better than JetBrains on this.
-
-
10
-
22
-
CleanShotX: Another Example of a Good ‘Subscription’ Model—NOTES
I will celebrate every piece of software I use that gets this right.
-
-
31
-
true-myth-zod v0.1.2—ELSEWHERE
AKA the first version that actually works.
-
-
-
Aug
-
01
-
isolatedDeclarations
and Zod —NOTESOne strategy for using TypeScript’s
isolatedDeclarations
flag with inference-driven libraries like Zod.
-
-
24
-
True Myth 9.1.0: Standard Schema and More!—ELSEWHERE
Doing my best to keep making True Myth more useful in more places.
-
-
-
Sep
-
05
-
Software, change, stability, imperfect markets…—NOTES
Some reflections on 1Password.
-
-
-
That’s it for this topic… but there are many, many more!