You think unemployed, I think retired
Work sucks, I know
- blink-182
A blog by Jesse Duffield
Work sucks, I know
- blink-182
Ozempic is an equaliser. Thereâs only so far you can go in the direction of a healthy weight. If you were overweight, Ozempic is great news. But if you were already at a healthy weight? Well, now youâre less special. Thatâs what equalisers do: they compress the range of outcomes.
So youâve read Simon Willisonâs post about the lethal trifecta and how, like the infinity stones on Thanosâ gauntlet, you really donât want them all to be present at once.
Copy-paste functionality removed from major operating systems by 2027 or I eat my dick on national television
- Sam Altman*
Looking down at my baby son as he wriggles and twists in my arms I think about all the things that a normal parent should be thinking: âwhat a beautiful boyâ, âso much potentialâ, âI canât wait until I no longer need to change his nappiesâ.
I donât want a lot for Christmas, there is just one thing I needâ¦
I wanna live in heaven
- Faust - Bladee and Ecco2K
Some mistakes are years in the making.
You: Good morning ChatGPT 6! Nice to meet you.
As I walked through the lonesome park I felt a presence at my side. A white glow heralded the entrance of an Angel into the material world and I turned and stared in disbelief at the (reasonably tall) angelic-looking man standing before me.
Since I created Lazygit back in 2018, Iâve managed to find time for it outside my day job. Iâve had a blast spending countless afternoons, weekends, and most of my annual leave on the project, but since founding my own startup, Subble, itâs become ever harder to give Lazygit the time it deserves. So, in order to prevent myself from becoming a blocker on progress, Iâve decided to step back and hand over the reins to my co-maintainer Stefan Haller.
Everybody is fascinated with the many ways that modern-day AI differs from humans.
âOur ad conversions are absolutely terribleâ

ChatGPT is, for all intents and purposes, my slave. It does as I command and it exists to satisfy my desires. Although some moderation gets in the way of that, my LLM is generally a docile, submissive pushover, and I wouldnât have it any other way.
Long ago (twenty-nineteen)
A new macbook had hit the scene
Intel i9 with 8 cores? wow!
Wish I knew then what I know nowâ¦
Iâm not a literary person so I have no idea if Iâm using the right terms here but Iâd like to share my review of Squid Game season 2.
I knew from day one that if we didnât add Rust, Kafka, and Microservice to Clipboxâs architecture, we were f*cked.
There are four approaches to using Docker in development:
At the start of the year I did a deep dive on AWS lambda to know whether it was worth using in a new codebase for a web app. These are the notes I wrote before making the decision against lambda, and I hope they can help somebody else with the same dilemma.
Itâs Sunday, and that means that in preparation for the week ahead, itâs time to sit back, relax, and brood on all the things that annoy me.
So youâre down in the dumps because you canât think of any good ideas for software to build. You enjoy programming, and youâd like to build something cool to show off on your GitHub profile, but you donât want to build yet another forgettable to-do app or grocery list tracker. What if I told you there was a whole genre of software where all the fruit still hangs low?
Mauro, SHUT THE FUCK UP!



Building software is challenging, so us humans, endowed with brains better adapted to climbing trees and eating bananas than reasoning about complex systems, develop heuristics to help us navigate:
I consider myself low on the spectrum of addict-ability: I donât smoke, I rarely drink, I donât gamble, I donât have a video game addiction, and I donât snack on sweets. But every man has his kryptonite, and a couple years ago I found myself compulsively checking the front page of Hacker News and various programming subreddits for the tech worldâs latest goss.
See the interview on youtube here.
The more you read up on software engineering topics online, the more you appreciate just how little agreement there is within the profession.
Most things either perish with time or are so simple (like water) that their continued existence is completely un-noteworthy. Replicators are the things in the sweet spot: things which encode information and somehow manage to buck the trend and preserve themselves over long time periods. Replicators by definition are things which are good at burrowing themselves into the future in spite of various forces in nature acting against them.
Check out my post about this timeless open source topic over here
TLDR: When you stick an explicit interface between two things, it may reduce the friction of changing the implementation but always at the cost of adding friction whenever you change the interface
Canât Be Fucked
Aussie slang for not wanting to, or not having the energy and motivation to do something.
âMan, i really canât be fucked changing the channel, letâs just watch Springer.â
- Urban Dictionary


Iâm not religious but The Serenity Prayer has to be most profound invocation I know. Itâs so concise that it canât even be summarised without effectively restating it.

TLDR: The official un-corruption guide doesnât support OSX, so I got around that with docker, and the guideâs advice did not work for me: I had to export the projectâs individual sample files and concatenate them back together
Itâs been a while since I wrote about Lazygit but rest assured things are ticking along in the background. I spent a chunk of my holidays on a PR to refactor some architectury things but thatâs a long way off being fit for merging. Today I want to give an update on the integration test migration that I kicked off tugs at collar a few months ago now. Unfortunately Iâm only halfway through (120 integration tests all up, with 60 having been migrated across).
My last post on Rubyâs unless keyword was lucky (or unlucky) enough to get some attention in its own comments and on Hacker News. Thanks to everybody who took the time to read it and comment :)
Disclaimer: prepare for hair-splitting and nitpicking
Trailing commas, also known as dangling commas, are a formatting strategy thatâs grown in popularity over time. Only 2 years ago did Prettier (a javascript formatter) start enforcing trailing commas by default, and if you read the associated GitHub issue youâll see how hard-fought the change was. In this post Iâm going to explain why trailing commas fix the problem of order-depedence and how order-dependence gets in our way in a bunch of other contexts too.
Something I donât come across enough online is posts where the author walks through a feature they built along with all the dead-ends and refactors along the way. So this post is my attempt to add to that modest corpus with my most recent coding journey.
As I sit here in my bed with something that might be the flu (hopefully not COVID again!) it strikes me that I never used to get sick this frequently. My younger selfâs immune system would kick my current immune systemâs ass.
Turns out that OpenAIâs GPT playground is now in open beta, so I thought Iâd prod it with some questions to see if I could learn something.
I wonder if itâs getting easier or harder to be effective in modern times. That is, to be productive and focused and move towards your goals. On one hand, we have endless learning resources at our fingertips thanks to the internet. Nearly every question we can think of has a clear and articulate answer waiting for us on the other side of a google search, and where yahoo answers once held monopoly over the Q&A space online, we now have more mature alternatives like Quora and Stack Overflow.
I am not an authority on this topic: what follows is advice that works for me and for others who have taken the advice on board.
I am not an authority on this topic: what follows is advice that works for me and for others who have taken the advice on board.
Yesterday, while running a session at work on Rust, I offhandedly remarked âI think we can all agree that when writing unit tests, private methods shouldnât be directly tested except in some special situationsâ and to my suprise, I had thought wrong. A mini-debate erupted where various people argued mutually incompatible viewpoints. We quickly moved on from the debate but I was left a little embarrassed that I had misjudged the developer zeitgeist.
A while back I was listening to a podcast where a couple of comedians discussed the consequences of doing a Netflix special (as I type this I realise it was almost certainly Joe Roganâs podcast). The idea is that you spend all this time building an hour of golden comedy material and for any live audience you perform in front of itâs completely novel and hilarious, but itâs also the comedianâs dream to capture that content in a Netflix special and have the whole world give you their attention (and indirectly their money) in return for that content.
My own confidence in this post: 70%
When you have a newly introduced bug and you donât know which git commit introduced it, whatâs the best way to find that commit? Typically itâs easy enough to find an example of a commit for which the bug is not present (e.g. the last release) but finding the problematic commit between then and now is the hard part. If you have a set of 100 commits, and any commit could have introduced the bug, you could go through one by one, testing to see if the bug is present or not, but thatâs inefficient! Youâre better off picking the commit in the middle, seeing if it has the bug, and then narrowing down your search by a factor of two! So youâll have 100 candidate commits, then 50, then 25, etc all the way down to one. Rather than checking 100 commits individually, you only need to check logâ(100) i.e. 7 commits.
I havenât posted in a while so Iâm going to lower my standards on this one and ramble about some loosely related ideas.
If you google âCode Reuse In Goâ and read through the first two pages of results, youâll see many of the same concepts come up:
First off, letâs get the standard caveats out of the way:
Hereâs an idea Iâd like to see in the education system: when teaching a new concept, before introducing a formula or equation that models some phenomenon, make the case for some simpler, but incorrect, alternatives first.
First off, letâs get the standard caveats out of the way:
Standard preface: the purpose of this series is to put absolutely everything that bothers me about Go on the table to see who can relate. Iâm not in the take-down business, Iâm in the nitpicking business. So if you leave a comment saying âThis is just nitpickingâ I will have no choice but to completely agree with you. I am not suggesting you will run into these issues on a daily basis, I am suggesting that when you do inevitably run into them, it will be frustrating. I donât expect Go to change and I appreciate why people donât want it to change.
Before we start, let me make something clear on the back of the comments from the first post: this series is my attempt to put absolutely everything on the table that frustrates me when using Go. As such, Iâll be doing some extreme nitpicking, much of which people will consider overblown or shortsighted. But my goal is not to do a take-down of the language (Iâm stuck writing in it for now anyway), I really just want to get a feel for how many Go devs there are who share my grievances. If none of my grievances bother you, thatâs fine: we probably differ on values (or Iâve missed something obvious).
My post on Goâs error handling spurred some debate around rustâs â?â operator and whether it would be a good idea to try and import it into Go. There are three main arguments against doing this:
Recently I wrote a post on type keys which a reader of the blog posted to Reddit where it was generally well-received, but garnered enough feedback for me to promote type keys from âanti-patternâ to âcode-smellâ, and include a counter-example where type keys were the lesser of all evils. The post to Hacker News gained no traction but I was satisfied enough with the feedback from Reddit.
Iâve been using Go for a few years now, mostly in my open source project Lazygit. In my day job I use Ruby and Typescript, and Iâve also spent some time with Rust. Each of those languages have design quirks that can grind a developerâs gears, and although my own precious gears have been ground by every language Iâve used, Go is the only language that has made me feel indignant.
A couple times somebody has told me about the latest COVID super-spreader and then asked the question âhow come itâs always somebody who visits 5 different places in a single day. Who the hell are these people?â. Recent examples arenât hard to find: so-called super-spreaders do get around. But when you think about it, this question has an obvious answer: highly mobile people are more likely to contract COVID in the first place. If they happen to also be mobile on the day they infect a bunch of other people, their super-spreading isnât super-surprising.
Do you remember when you wrote your first program? I do: back in primary school my dad gave me a copy of âThe Games Factoryâ: a GUI for building 2D games with raster graphics. I didnât write a single line of code: it was just a matter of checking a bunch of options and arranging objects on a screens. But from day one I was hooked, and now years later Iâve made programming my career.
Note: On the back of some feedback Iâve created a follow-up of this post where I refine the thesis. Iâve left this post as-is for the sake of comparison
This post belongs in the âhighly speculativeâ category. It contains ideas that Iâve yet to flesh out and properly pin down. Reader beware!
Say we wanted to create an Accordion component that lets us expand and collapse sections within the Accordion, such that only one section can be expanded at a time. This is a good candidate for a Compound Component. Letâs first create an Accordion with three sections, without trying to abstract out any logic.

Spoilers below. For those who havenât read or watched the series by now, itâs your own fault.
Recently Iâve been working on a feature in my open-source pride and joy, Lazygit, that allows viewing your modified files as a tree rather than a flat list. This allows you to get a better feel for which areas of the codebase have been changed, and has some perks like easy navigation with folder collapsing, and the ability to stage/unstage whole directories.
What you are about to hear is a tale full of danger, excitement, and personal growth. You will come across the evil Dragon Of New Requirements, and the Serpent Of Typescriptâs Lacking Type Inference. Polymorphism spells will be cast, Abstractions will rise and fall, and chests of various colours will explode. Although this tale requires no advanced knowledge, it will require courage and persistence, because it is a terrifying tale of twists and turns that, in real life, spanned weeks.

Over the last couple of days Iâve been working on LazyMigrate, a gem which provides a little UI for handling migrations in rails. Because itâs a gem that depends on your Rails appâs code, it canât really be tested in isolation (unless I went and mocked out a heap of stuff which would erode my confidence that things were working correctly). I was vaguely aware that I could have made a Rails plugin, which sets you up with a mock rails app for testing, but I wanted to be able to run the gem from outside rails as well.
The second half of this blog post now lives in video form here

In The Pragmatic Programmer, Andrew Hunt and David Thomas introduced the DRY (Donât Repeat Yourself) principle. The rationale being that if you see the same code copy+pasted 10 times you should probably factor that code into its own method/class.

As a software developer I like to think of myself as intelligent and discerning, but if Iâm being completely honest with myself most of the decisions I make around code structure are governed by fairly low-resolution heuristics like âDonât Repeat Yourselfâ and âKeep It Simple, Stupidâ. My stylistic intuitions all too often get priority over intuitions about long term maintenance and extensibility, in part because there are always arguments available that sound very serious and programmery but really just cover for the stylistic bias.
