Category Archives: Personal

2026 4DX: First Discipline

This is the first post in a four post series that will show how I implement The 4 Disciplines of Execution [affiliate] (4DX) for my aspirational goals.

The first discipline is to identify your Wildly Important Goal (WIG). In the book, the authors make a distinction between the “whirlwind” of activity that you must do to keep the lights on and a WIG that will in some way transform your business (or life, or whatever). I use their method to set a WIG in three segregated parts of my life: business, personal, and fitness. To find this goal, I use the suggestion of The ONE Thing [affiliate], which has you identify the ONE goal that makes all other goals easy or unnecessary.

A WIG is similar to a SMART goal (Specific, Measurable, Achievable, Relevant, and Time-Bound) or an OKR (Objective and Key Result). It should be easy to assess if you have achieved them. For a sports team, a WIG is winning the championship, which is a binary outcome on a specific date, but not a plan. For a battalion, it might be blowing up a bridge. We might change plans all year to achieve these goals, but hopefully, the goal is stable.

For the past month, and until the end of the year, I am doing experiments that will help me finalize them. Here are my ideas so far.

For my business, I want my book, Swimming in Tech Debt, to have reached its next stage of growth. Right now, I am not concerned with maximizing profit, because the book is in the seed marketing stage, where my goal is to get readers that will be future recommenders (following the techniques in Write Useful Books [affiliate]). My 2026 WIG is to have left the seed marketing stage and to move into a stage where ads are break-even.

For fitness, my WIG will be based around strength. I started a training program in November and it seems to be working, but that’s normal for untrained people—early gains are easy. I will finalize the exact goal at the end of the year, but it’s something like X pounds of gain on five lifts (Bench, Press, Row, Pull Down, Squat) while maintaining my body weight.

For personal growth, I have a lifelong plan to learn Spanish. I haven’t settled on a WIG. The easiest thing would be to pick a CEFR level and then find an assessment. DuoLingo uses this, but I’d like to find a different source to assess myself.

Tomorrow, I’ll go through the 2nd discipline which has you find a leading indicator that you can work on each day and will build up to your WIG.

Experiments for 2026

Near the end of the year, I start thinking of some aspirational goals for the next year. Rather than wait for January, I usually just start working on them now. I start experiments to see if I really want to do them.

For fitness, I’ve decided to really try to do a strength program. I found Radically Simple Strength [affiliate] by Paul Horn and read it on a flight. I started doing his beginner plan in November, and so far it’s going great. He has a simple way to measure progress—small increments of weight. It’s the perfect leading indicator (in the 4DX sense). My lagging indicator is my body fat percentage, which I measured with a DEXA scan and will check in on in 6 months or so. I think I’ll be able to just see the effect, though. I am also monitoring my weight. My goal is to be able to lift more weight, but weigh the same.

For my business, my goal is to sell copies of Swimming in Tech Debt, and my plan is to do one book marketing action each day. If I can’t keep a good enough selling pace, I will have to change that plan. In November, my experiment was to blog every day, which helps me reach my RSS subscribers. It also generates LinkedIn Post, substack, and email marketing ideas. So far, it’s been good enough to keep doing this in December.

For my personal improvement, I am embarking on a multi-year plan to become fluent in Spanish. I started six months ago with DuoLingo and my own flashcards. I do some studying every day, but in 2026, this will have to become more serious. This month, I will have to try to develop that plan, probably from looking through Fluent Forever.

2025 Retrospective

It’s not the end of 2025, but I usually spend December on setting next year’s goals and getting rest. So I’m not going to get much more done on my yearly goals. Before I think about 2026, though, it’s time to reflect on the past year. As usual, I picked a business, personal, and fitness goal to work on.

My business goal for 2025 was to finish my book, which I did. I had a successful launch and am halfway through my total sales goal. For 2026, I’ll concentrate on a process goal (4DX style). For example, to support the launch, I appeared on some podcasts, spoke at a conference, sent email to my list, and was lucky to have my Show HN do well on Hacker News. I’ll continue marketing the book in 2026 in this slow and steady way.

My fitness goals are a mixed bag. I have no problem doing regular exercise, but my fitness level feels stagnant (or put more positively: stable). In 2026, I am going to try something new.

I didn’t make much progress on my personal goal of building developer tools. In a way, my book’s spreadsheet is a developer tool, and that is now public (sign up here to get it). I have started building a tool based on it.

This progress is fine with me because these are aspirational goals. They are in addition to what I have to do. The book is meant to grow my business, not be profitable right away. I wanted to improve my fitness, and tried, but holding steady is ok too. Next year’s goals will be chosen because I seem to have some intrinsic desire to do them.

November 2025 Blog Roundup

I decided to try to blog every day in November in a tribute to NaNoWriMo. One trick I learned from Art and Fear, was to try not to have ideas for a blog post, but instead, have ideas for a series of posts. So, in the beginning of the month, I started with a ten-part series covering my new dev stack.

It starts with: Changing my Dev Stack (2025), Part I: Simplify, Simplify, and continues on to discuss Linux, Django, HTMX, VSCode and Copilot, Bulma, Sqlite, uv, other tooling, and networking. I also documented how my setup and philosophy helps me be more resistant to supply chain attacks.

I wrote about how I interleave reading, what I am currently reading, and what’s in my antilibrary (books I own, but have yet to read).

The rest of the posts were drawn from my current work. I wrote more about HTMX. I wrote about how fuzzy logic inference might be a better fit than LLMs for my project.

I’m not sure that I will keep doing this in December, but I do think I will write more here.

Thankful for Randomness

This Thanksgiving, I’m thinking about the random events in my childhood and teen years that led to my career as a software developer.

In middle school, I was lucky to have teachers like Mr. Abbey and Mr. Penner who got me into my first programming class, and Mrs. Cohen, who taught me to type.

My mom, who got me my first computer at Radio Shack.

My Aunt Grace, who got me a summer job in her office where a random programmer there took me aside and taught me SQL and where they had me make all of the spreadsheets in Lotus.

To the random guy at Barnes and Noble, who saw me in the programming book area and hired me to help him with a program he needed for his business.

Very thankful to the Randomness, the Great Creator.

My Current (late 2025) Interleaved Reading List

Yesterday, I wrote about Interleaved Reading (reading multiple books at once) and how it gives me a chance to reflect and retain a book’s contents. I try to pick very different books so that I have one to pick back up to match my energy.

I started Hypermedia Systems [affiliate] to give me a foundation on HTMX for a new project. A couple of chapters in, I decided to just try it. Now that I have something working, I went back to read the more advanced chapters. I like learning new tech this way rather than just reading because the building reinforces what I read. I also don’t want to just build because books like this are also about mindset, architectural patterns, and theory. Now that I have something working, I’ll just read the book through and should be done soon.

Earlier this year, I went to Germany and I wanted to be able to speak a little German while I was there. I had three months, so I crammed with DuoLingo and picked up Fluent Forever [affiliate] (here’s my review of it and the Fluent Forever app). There was no way I could implement that whole book in three months, but it did really help.

When I got back from my trip, I decided to switch to Spanish. I’ve been doing that for about six months and I’m ready to resume the book for more tips. This is a book I am reading just enough to implement the technique and then putting down. It might take months to finish.

I decided to pick up The Inferno [affiliate] by Dante (Cialdi translation) because I heard that there were references to it in Severance. I technically started it by reading the front matter and the first chapter (Canto), but I haven’t been able to get it into my routine. I have a small trip soon with flights back and forth. I should be able to finish it then.

I got Thinking in Systems [affliliate] by Donella Meadows as research for Swimming in Tech Debt, but stuck to the chapters on feedback loops (which is why I was reading it). It was hard to put it down, but I had to, and now I’m finishing it.

Even though some books take a while to finish, I sometimes find a book that I just want to read and finish immediately. Mostly this is because there is some information in the book I need. For example, when I went to LA recently, I bought and read Radically Simple Strength [affiliate] by Paul Horn after hearing him on a podcast. I have been wanting to lift weights more seriously, but I always overdo it and then stop. Horn’s method sounded like what I needed, and I finished it on the flight. It’s been working so far.

Before I interleaved books, I might have not bought a new book or waited until I was finished with my current one. Now, it’s more natural for me to be juggling a few for different time periods, so I can always put them all down if I just want to finish one.

I don’t know why it took me so long to interleave my reading. I consume other media this way naturally (e.g. TV series, podcasts, blogs, music). It might have made more sense when I needed to physically have the book on me, but they are mostly in Kindle now (and so on every device I own), so I have them all with me and can switch whenever I want.

If you don’t do this, it might sound confusing, but since I am usually working to retain the knowledge in between reading, it’s actually easy to pick the book up again.

Interleaved Reading

After graduating college, my book choices have been self-determined, and for a long time, I read them serially. This is weird because up until then I was always reading more than one book at time (by necessity).

But, a few years ago, while researching learning methods and incorporating spaced-repetition (i.e. flash cards) into my life, I saw a recommendation to interleave reading. The idea is simple: You read more than one book at a time. This might be obvious to some, but it wasn’t to me. It was liberating.

One problem of reading a book all the way through is that you don’t have time to consider a chapter before moving on. When you interleave books, you have time to ruminate on them in the background. Better than that, you can use spaced-repetition to build flash cards that you practice before moving on. Then, while you are reading, the older chapters are periodically shown to you, reinforcing the whole book as you read.

Another exercise is to write your own synthesis of the chapter, applying it to your personal interests. This kind of note can be a blog post or a page in your Digital Zettelkasten. Over time, these original thoughts might build up to something bigger. For me, it was my book.

Finally, I read a lot of books that are meant to be used, not just read. They offer their own exercises. For example, here’s a post about the way I use The Artist’s Way, a quintessentially useful book, which encourages you to read a chapter a week and then do some work.

Before I did this, retention was hard. Now, it’s effortless (a few minutes a day in Anki) or the effort is welcome (it generates a blog post). But, it does mean I put books down intentionally, and so I need a different one to read while I work on retaining the first one.

(I meant to write about what I’m currently reading today, but I thought it would be good to write about this first so I can reference it. I’ll get to my current reading list tomorrow)

My Antilibrary

I buy books as soon as I think I will read them (usually from a recommendation), but it might take time for me to get to them. I used to lament this, but then I read this take. In The Black Swan: The Impact of the Highly Improbable [affiliate], Nassim Nicholas Taleb writes:

You will accumulate more knowledge and more books as you grow older, and the growing number of unread books on the shelves will look at you menacingly. Indeed, the more you know, the larger the rows of unread books. Let us call this collection of unread books an antilibrary.

Here’s what’s menacing me now from my antilibrary and will probably read soon:

  • Write a Must-Read [affiliate] by AJ Harper: This was recommended in my writer’s accountability group as something to read before you write a book. It’s too late for that, but I have a general interest in the topic. I’ve only had this for a week.
  • Software Productivity [affiliate] by Harlan D. Mills. I found a reference to this book in a reread of Peopleware [affiliate] almost exactly a year ago. It’s out of print, but I found a cheap used copy and got it. It’s been on my desk almost since then.
  • Vibe Coding [affiliate] by Gene Kim and Steve Yegge. I got this when it went on presale a few months ago. I better read this soon, because it will age quickly.
  • The Real Play Revolution [affiliate] by Ash Perrin. Ash is a clown who travels worldwide to refugee camps to entertain children. I saw him speak at PINC in Sarasota two years ago and bought the book there (mostly to support his efforts). There’s another PINC coming in a few weeks (Dec 11-13), which I highly recommend if you are in the area.

I usually read multiple books at the same time, picking up the one I have energy for at any given time. I try to keep them different from each other, but they are usually all non-fiction. I’ll write about that tomorrow.

Early Thoughts on HTMX

I found out about HTMX about a year ago from a local software development friend whose judgement I trust. His use case was that he inherited a large PHP web application with very standard request/response page-based UI, and he had a need to add some Single Page Application (SPA) style interactions to it. He was also limited (by the user base) to not change the application drastically.

HTMX is perfect for this. It builds on the what a <form> element already does by default. It gathers up inputs, creates a POST request, and then expects an HTML response, which it renders.

The difference is that, in HTMX, any element can initiate any HTTP verb (GET, POST, DELETE, etc) and then the response can replace just that element on the page (or be Out of Band and replace a different element). This behavior is extended to websockets, which can send partial HTML to be swapped in.

To use HTMX on a page, you add a script tag. There is a JavaScript API, but mostly you add custom “hx-*” attributes to elements. It’s meant to feel like HTML. I would say more, but I can’t improve on the HTMX home page, which is succinct and compelling.

My app is meant to allow users to collaboratively score and plan technical debt projects. My intention is to improve on a Google Sheet that I built for my book. So, to start, it needs to have the same collaborative ability. Every user on a team needs to see what the others are doing in real-time. HTMX’s web socket support (backed by Django channels) makes this easy.

Since the wire protocol of an HTMX websocket is just HTML partials, I can use the same template tags from the page templates to build the websocket messages. Each HTML partial has an id attribute that HTMX will use to swap it in. I can send over just the elements that have changed.

Tomorrow, I’ll compare this to React.

Dev Stack 2025, Part X: networking

This is part of a series describing how I am changing my entire stack for developing web applications. My choices are driven by security and simplicity.

This last part about my new dev stack environment will be about how my machines are set up to work together. As I mentioned in the introduction to this series, my primary concern was to get development off of my main machine, which is now all on a Framework desktop running Ubuntu.

Before this, my setup was simple. I had a monitor plugged into my laptop over Thunderbolt and my keyboard and mouse were attached via the USB hub the monitor provided (keyboard) or bluetooth (mouse). When I introduced the Framework, I moved to a USB mouse in the hub, and now I could switch my whole setup from Mac to Framework by unplugging/plugging in one USB-C cable.

But I had a few development use cases that this didn’t support well:

  1. I sometimes need to code with someone over Zoom. My webcam, mic, and headphones are staying connected to the Mac.
  2. I regularly program outside of my office in co-working environments.
  3. I need to support programming while traveling.
  4. I want to be able to go back and forth to between the machines while working at my desk.

To start with, I tried using remote desktop. There’s an official client for Mac made by Microsoft and it’s built into Ubuntu. As I mentioned in my Linux post, I was surprised at how hard this way to troubleshoot. The issue is that you can’t RDP to a Linux box unless it is actively connected to a monitor. So, at first I just left it plugged in while taking the laptop outside. But, this was not ideal.

There are a few solutions for this, but the easiest for me was just buying a virtual HDMI plug. They are cheap and fool the machine into thinking it has a monitor.

To even get RDP to work at all though I needed to make some way for the two machines to see each other. Even in my home office, I put them on different networks on my router. But, I would also need to solve this for when I’m using my laptop outside of my network. This is what Tailscale was made for.

Tailscale is a VPN, but what sets it apart is its UX. You install it on the two machines, log them in to Tailscale, and now they are on a virtual private subnet. I can RDP at my desk or from a café. I can share the Mac “space” that is running RDP over Zoom. The setup was trivial.

So far this has been fine. I don’t even notice the VPN when I am coding at home. When I am outside, it’s a little sluggish, but fine. AI coding makes it more acceptable, since I don’t have to type and navigate code as much.