Add links
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
adoptopenjdk
|
||||
aeropress
|
||||
agentic
|
||||
altavista
|
||||
appname
|
||||
askjeeves
|
||||
@@ -59,6 +60,7 @@ iamakey
|
||||
idigdurham
|
||||
indieweb
|
||||
inputrc
|
||||
janky
|
||||
javac
|
||||
jcenter
|
||||
journaler
|
||||
@@ -78,6 +80,7 @@ lucene
|
||||
macwright
|
||||
magick
|
||||
manosphere
|
||||
marky
|
||||
mdrenum
|
||||
melodica
|
||||
microblogs
|
||||
@@ -108,6 +111,7 @@ redownload
|
||||
reindex
|
||||
repage
|
||||
repages
|
||||
repitching
|
||||
rerunfailures
|
||||
résumé
|
||||
rightwing
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
require "rss"
|
||||
require "open-uri"
|
||||
|
||||
FEED_URL = "https://feeds.pinboard.in/rss/u:DCE/"
|
||||
FEED_URL = "https://bookmarks.davideisinger.com/u:dce.rss"
|
||||
|
||||
index = (ARGV.pop || 1).to_i
|
||||
content = []
|
||||
@@ -72,4 +72,6 @@ URI.parse(FEED_URL).open do |rss|
|
||||
feed.items.each do |item|
|
||||
process_item[item]
|
||||
end
|
||||
|
||||
puts result.call
|
||||
end
|
||||
|
||||
@@ -4,6 +4,31 @@ date: 2025-11-05T22:43:42-05:00
|
||||
draft: false
|
||||
tags:
|
||||
- dispatch
|
||||
references:
|
||||
- title: "Software is supply-constrained (for now) | justin․searls․co"
|
||||
url: https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now
|
||||
date: 2025-11-06T05:03:05Z
|
||||
file: justin-searls-co-y5dsjo.txt
|
||||
- title: "Why engineers can't be rational about programming languages | spf13"
|
||||
url: https://spf13.com/p/the-hidden-conversation/
|
||||
date: 2025-11-06T05:07:24Z
|
||||
file: spf13-com-enwyvy.txt
|
||||
- title: "Scripts I wrote that I use all the time"
|
||||
url: https://evanhahn.com/scripts-i-wrote-that-i-use-all-the-time/
|
||||
date: 2025-11-06T05:07:26Z
|
||||
file: evanhahn-com-6hstph.txt
|
||||
- title: "What if people don't want to create things - macwright.com"
|
||||
url: https://macwright.com/2025/10/21/what-if-they-dont-want-to.html
|
||||
date: 2025-11-06T05:07:29Z
|
||||
file: macwright-com-rbiipx.txt
|
||||
- title: "Just Talk To It - the no-bs Way of Agentic Engineering | Peter Steinberger"
|
||||
url: https://steipete.me/posts/just-talk-to-it
|
||||
date: 2025-11-06T05:07:36Z
|
||||
file: steipete-me-ayczze.txt
|
||||
- title: "Vibe engineering"
|
||||
url: https://simonwillison.net/2025/Oct/7/vibe-engineering/
|
||||
date: 2025-11-06T05:07:42Z
|
||||
file: simonwillison-net-yekorg.txt
|
||||
---
|
||||
|
||||
I fear the days of Big Baby Nico are coming to a close. My man's walking, talking, making his desires known. It was a good run, 17 months almost. It felt like Nev sort of skipped this phase, so this was a novel experience, and Tiny Toddler Nico is awesome. The best is when we're putting on a fresh diaper and he looks down, waves, and says, "bye bye my penis."
|
||||
@@ -50,7 +75,6 @@ I ran the Bull City Race Fest half-marathon for the fourth year in a row. I didn
|
||||
|
||||
[8]: /journal/dispatch-33-november-2025/bcrf-2025-result.pdf
|
||||
[9]: /journal/dispatch-33-november-2025/bcrf-2025-cert.png
|
||||
[21]: https://macwright.com/2025/11/02/fewer-people-should-run-marathons.html
|
||||
|
||||
We did a weekend at [Fairy Stone State Park][10] with a bunch of Durham friends. Great times, wholesome family fun.
|
||||
|
||||
@@ -85,10 +109,28 @@ I went to Nashville for a team offsite last week. Highlights included [Third Man
|
||||
|
||||
### Links
|
||||
|
||||
* [Title][18]
|
||||
* [Title][19]
|
||||
* [Title][20]
|
||||
* [Why engineers can't be rational about programming languages | spf13][18]
|
||||
|
||||
[18]: https://example.com/
|
||||
[19]: https://example.com/
|
||||
[20]: https://example.com/
|
||||
> Every time an engineer evaluates a language that isn’t “theirs,” their brain is literally working against them. They’re not just analyzing technical trade offs, they’re contemplating a version of themselves that doesn’t exist yet, that feels threatening to the version that does. The Python developer reads case studies about Go’s performance and their amygdala quietly marks each one as a threat to be neutralized. The Rust advocate looks at identical problems and their Default Mode Network constructs narratives about why “only” Rust can solve them.
|
||||
|
||||
* [Scripts I wrote that I use all the time][19]
|
||||
|
||||
> In my decade-plus of maintaining my dotfiles, I’ve written a lot of little shell scripts. Here’s a big list of my personal favorites.
|
||||
|
||||
* [What if people don't want to create things - macwright.com][20]
|
||||
|
||||
> When I look back on TileMill in 2010, Mapbox Studio, Observable, the whole arc: I can’t help but worry about the supply of creativity in society. In particular: If we give everyone the tools to build their dreams, very few people will use them.
|
||||
|
||||
* [Just Talk To It - the no-bs Way of Agentic Engineering | Peter Steinberger][21]
|
||||
|
||||
> The benchmarks only tell half the story. IMO agentic engineering moved from “this is crap” to “this is good” around May with the release of Sonnet 4.0, and we hit an even bigger leap from good to “this is amazing” with gpt-5-codex.
|
||||
|
||||
* [Vibe engineering][22]
|
||||
|
||||
> I feel like vibe coding is pretty well established now as covering the fast, loose and irresponsible way of building software with AI—entirely prompt-driven, and with no attention paid to how the code actually works. This leaves us with a terminology gap: what should we call the other end of the spectrum, where seasoned professionals accelerate their work with LLMs while staying proudly and confidently accountable for the software they produce?
|
||||
|
||||
[18]: https://spf13.com/p/the-hidden-conversation/
|
||||
[19]: https://evanhahn.com/scripts-i-wrote-that-i-use-all-the-time/
|
||||
[20]: https://macwright.com/2025/10/21/what-if-they-dont-want-to.html
|
||||
[21]: https://steipete.me/posts/just-talk-to-it
|
||||
[22]: https://simonwillison.net/2025/Oct/7/vibe-engineering/
|
||||
|
||||
418
static/archive/evanhahn-com-6hstph.txt
Normal file
418
static/archive/evanhahn-com-6hstph.txt
Normal file
@@ -0,0 +1,418 @@
|
||||
Scripts I wrote that I use all the time
|
||||
|
||||
|
||||
by [1]Evan Hahn
|
||||
, posted Oct 22, 2025
|
||||
|
||||
In my [2]decade-plus of maintaining my dotfiles, I’ve written a lot of little
|
||||
shell scripts. Here’s a big list of my personal favorites.
|
||||
|
||||
Clipboard
|
||||
|
||||
[3]copy and [4]pasta are simple wrappers around system clipboard managers, like
|
||||
pbcopy on macOS and xclip on Linux. I use these all the time.
|
||||
|
||||
# High level examples
|
||||
run_some_command | copy
|
||||
pasta > file_from_my_clipboard.txt
|
||||
|
||||
# Copy a file's contents
|
||||
copy < file.txt
|
||||
|
||||
# Open a file path from your clipboard
|
||||
vim "$(pasta)"
|
||||
|
||||
# Decode some base64 from the clipboard
|
||||
pasta | base64 --decode
|
||||
|
||||
[5]pastas prints the current state of your clipboard to stdout, and then
|
||||
whenever the clipboard changes, it prints the new version. I use this once a
|
||||
week or so.
|
||||
|
||||
# High level example
|
||||
pastas > everything_i_copied.txt
|
||||
|
||||
# Download every link I copy to my clipboard
|
||||
pastas | wget -i -
|
||||
|
||||
[6]cpwd copies the current directory to the clipboard. Basically pwd | copy. I
|
||||
often use this when I’m in a directory and I want use that directory in another
|
||||
terminal tab; I copy it in one tab and cd to it in another. I use this once a
|
||||
day or so.
|
||||
|
||||
File management
|
||||
|
||||
[7]mkcd foo makes a directory and cds inside. It’s basically mkdir foo && cd
|
||||
foo. I use this all the time—almost every time I make a directory, I want to go
|
||||
in there.
|
||||
|
||||
[8]tempe changes to a temporary directory. It’s basically cd "$(mktemp -d)". I
|
||||
use this all the time to hop into a sandbox directory. It saves me from having
|
||||
to manually clean up my work. A couple of common examples:
|
||||
|
||||
# Download a file and extract it
|
||||
tempe
|
||||
wget 'https://example.com/big_file.tar.xz'
|
||||
tar -xf big_file.tar.xz
|
||||
# ...do something with the file...
|
||||
|
||||
# Write a quick throwaway script to try something out
|
||||
tempe
|
||||
vim foo.py
|
||||
python3 foo.py
|
||||
|
||||
[9]trash a.txt b.png moves a.txt and b.png to the trash. Supports macOS and
|
||||
Linux. I use this every day. I definitely run it more than rm, and it saves me
|
||||
from accidentally deleting files.
|
||||
|
||||
[10]mksh makes it quick to create shell scripts. mksh foo.sh creates foo.sh,
|
||||
makes it executable with chmod u+x, adds some nice Bash prefixes, and opens it
|
||||
with my editor (Vim in my case). I use this every few days. Many of the scripts
|
||||
in this post were made with this helper!
|
||||
|
||||
Internet
|
||||
|
||||
[11]serveit starts a static file server on localhost:8000 in the current
|
||||
directory. It’s basically python3 -m http.server 8000 but handles cases where
|
||||
Python isn’t installed, falling back to other programs. I use this a few times
|
||||
a week. Probably less useful if you’re not a web developer.
|
||||
|
||||
[12]getsong uses yt-dlp to download songs, often from YouTube or SoundCloud, in
|
||||
the highest available quality. For example, getsong https://www.youtube.com/
|
||||
watch?v=dQw4w9WgXcQ downloads that video as a song. I use this a few times a
|
||||
week…typically to grab video game soundtracks…
|
||||
|
||||
[13]getpod similarly uses yt-dlp to download something for a podcast player.
|
||||
There are a lot of videos that I’d rather listen to like a podcast. I use this
|
||||
a few times a month.
|
||||
|
||||
[14]getsubs downloads the English subtitles for a video. (There’s some
|
||||
fanciness to look for “official” subtitles, falling back to auto-generated
|
||||
subtitles.) Sometimes I read the subtitles manually, sometimes I run getsubs
|
||||
https://video.example/foo | ollama run llama3.2 "Summarize this", sometimes I
|
||||
just want it as a backup of a video I don’t want to save on my computer. I use
|
||||
this every few days.
|
||||
|
||||
[15]wifi off, wifi on, and wifi toggle are useful for controlling my system’s
|
||||
wifi. wifi toggle is the one I use most often, when I’m having network trouble.
|
||||
I use this about once a month.
|
||||
|
||||
[16]url "$my_url" parses a URL into its parts. I use this about once a month to
|
||||
pull data out of a URL, often because I don’t want to click a nasty tracking
|
||||
link.
|
||||
|
||||
url 'https://evil.example/track-user-link?url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba#cookie=123'
|
||||
# original: https://evil.example/track-user-link?url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba#cookie=123
|
||||
# protocol: https
|
||||
# hostname: evil.example
|
||||
# path: /track-user-link
|
||||
# query: url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba
|
||||
# - url https://url-i-want-to-visit.example
|
||||
# - track 06f8582a-91e6-4c9c-bf8e-516884584aba
|
||||
# hash: cookie=123
|
||||
|
||||
Text processing
|
||||
|
||||
[17]line 10 prints line 10 from stdin. For example, cat some_big_file | line 10
|
||||
prints line 10 of a file. This feels like one of those things that should be
|
||||
built in, like head and tail. I use this about once a month.
|
||||
|
||||
[18]scratch opens a temporary Vim buffer. It’s basically an alias for $EDITOR $
|
||||
(mktemp). I use this about once a day for quick text manipulation tasks, or to
|
||||
take a little throwaway note.
|
||||
|
||||
[19]straightquote converts “smart quotes” to “straight quotes” (sometimes
|
||||
called “dumb quotes”). I don’t care much about these in general, but they
|
||||
sometimes weasel their way into code I’m working on. It can also make the file
|
||||
size smaller, which is occasionally useful. I use this at least once a week.
|
||||
|
||||
[20]markdownquote adds > before every line. I use it in Vim a lot; I select a
|
||||
region and then run :'<,'>!markdownquote to quote the selection. I use this
|
||||
about once a week.
|
||||
|
||||
[21]length foo returns 3. (I should probably just use wc -c.)
|
||||
|
||||
[22]jsonformat takes JSON at stdin and pretty-prints it to stdout. I use this a
|
||||
few times a year.
|
||||
|
||||
[23]uppered and [24]lowered convert strings to upper and lowercase. For
|
||||
example, echo foo | uppered returns FOO. I use these about once a week.
|
||||
|
||||
[25]nato bar returns Bravo Alfa Romeo. I use this most often when talking to
|
||||
customer service and need to read out a long alphanumeric string, which has
|
||||
only happened a couple of times in my whole life. But it’s sometimes useful!
|
||||
|
||||
[26]u+ 2025 returns ñ, LATIN SMALL LETTER N WITH TILDE. A quick way to do a
|
||||
lookup of a Unicode string. I don’t use this one that often…probably about
|
||||
once a month.
|
||||
|
||||
[27]snippets foo cats ~/.config/evanhahn-snippets/foo. I use snippet arrow for
|
||||
→, snippet recruiter for a quick “not interested” response to job recruiters,
|
||||
snippet lorem to print a “Lorem ipsum” block, and a few others. I probably use
|
||||
one or two of these a week.
|
||||
|
||||
REPL launchers
|
||||
|
||||
Inspired by Ruby’s built-in irb REPL, I’ve made:
|
||||
|
||||
• [28]iclj to start a Clojure REPL
|
||||
• [29]ijs to start a Deno REPL (or a Node REPL when Deno is missing)
|
||||
• [30]iphp to start a PHP REPL
|
||||
• [31]ipy to start a Python REPL
|
||||
• [32]isql to start a SQLite shell (an alias for sqlite3 :memory:)
|
||||
|
||||
Dates and times
|
||||
|
||||
[33]hoy prints the current date in ISO format, like 2020-04-20. I use this all
|
||||
the time because I like to prefix files with the current date.
|
||||
|
||||
[34]timer 10m starts a timer for 10 minutes, then (1) plays an audible ring
|
||||
sound (2) sends an OS notification (see notify below). I often use bb timer 5m
|
||||
to start a 5 minute timer in the background (see bb below). I use this almost
|
||||
every day as a useful way to keep on track of time.
|
||||
|
||||
[35]rn prints the current time and date using date and cal. I probably use it
|
||||
once a week. It prints something like this:
|
||||
|
||||
4:20PM on Wednesday, October 22, 2025
|
||||
|
||||
September 2025
|
||||
Su Mo Tu We Th Fr Sa
|
||||
1 2 3 4 5 6
|
||||
7 8 9 10 11 12 13
|
||||
14 15 16 17 18 19 20
|
||||
21 22 23 24 25 26 27
|
||||
28 29 30
|
||||
|
||||
Audio and video and pictures
|
||||
|
||||
[36]ocr my_image.png extracts text from an image and prints it to stdout. It
|
||||
only works on macOS, unfortunately, but I want to fix that. (I wrote [37]a post
|
||||
about this script.)
|
||||
|
||||
[38]boop (an alias, not a shell script) makes a happy sound if the previous
|
||||
command succeeded and a sad sound otherwise. I do things like run_the_tests ;
|
||||
boop which will tell me, audibly, whether the tests succeed. It’s also helpful
|
||||
for long-running commands, because you get a little alert when they’re done. I
|
||||
use this all the time.
|
||||
|
||||
[39]sfx foo basically just plays ~/.config/evanhahn-sfx/foo.ogg. Used in boop
|
||||
and timer above.
|
||||
|
||||
[40]tunes uses mpv to play audio from a file. I use this all the time, running
|
||||
tunes --shuffle ~/music.
|
||||
|
||||
[41]pix uses mpv to show a picture. I use this a few times a week to look at
|
||||
photos.
|
||||
|
||||
[42]radio is a little wrapper around some of my favorite internet radio
|
||||
stations. radio lofi and radio salsa are two of my favorites. I use this a few
|
||||
times a month.
|
||||
|
||||
[43]speak reads from stdin, removes all Markdown formatting, and pipes it to a
|
||||
text-to-speech system (say on macOS and espeak-ng on Linux). [44]I like using
|
||||
text-to-speech when I can’t proofread out loud. I use this a few times a month.
|
||||
|
||||
[45]shrinkvid is an ffmpeg wrapper that compresses a video a bit. I use this
|
||||
about once a month.
|
||||
|
||||
[46]removeexif removes EXIF data from JPEGs. I don’t use this much, in part
|
||||
because it doesn’t remove EXIF data from other file formats like PNGs…but
|
||||
I keep it around because I hope to expand this one day.
|
||||
|
||||
[47]tuivid is one I almost never use, but you can use it to watch videos in the
|
||||
terminal. It’s cursed and I love it, even if I never use it.
|
||||
|
||||
Process management
|
||||
|
||||
[48]each is my answer to xargs and find ... -exec, which I find hard to use.
|
||||
For example, ls | each 'du -h {}' runs du -h on every file in a directory. I
|
||||
use this infrequently but I always mess up xargs so this is a nice alternative.
|
||||
|
||||
[49]running foo is like ps aux | grep foo but much easier (for me) to read—just
|
||||
the PID (highlighted in purple) and the command.
|
||||
|
||||
[50]murder foo or murder 1234 is a wrapper around kill that sends kill -15
|
||||
$PID, waits a little, then sends kill -2, waits and sends kill -1, waits before
|
||||
finally sending kill -9. If I want a program to stop, I want to ask it nicely
|
||||
before getting more aggressive. I use this a few times a month.
|
||||
|
||||
[51]waitfor $PID waits for a PID to exit before continuing. It also keeps the
|
||||
system from going to sleep. I use this about once a month to do things like:
|
||||
|
||||
# I want to start something only after another process finishes
|
||||
waitfor 1234 ; something_else
|
||||
|
||||
# I started a long-running process and want to know when it's done
|
||||
waitfor 1234 ; notify 'process 1234 is done'
|
||||
|
||||
[52]bb my_command is like my_command & but it really really runs it in the
|
||||
background. You’ll never hear from that program again. It’s useful when you
|
||||
want to start a daemon or long-running process you truly don’t care about. I
|
||||
use bb ollama serve and bb timer 5m most often. I use this about once a day.
|
||||
|
||||
[53]prettypath prints $PATH but with newlines separating entries, which makes
|
||||
it much easier to read. I use this pretty rarely—mostly just when I’m debugging
|
||||
a $PATH issue, which is unusual—but I’m glad I have it when I do.
|
||||
|
||||
[54]tryna my_command runs my_command until it succeeds. [55]trynafail
|
||||
my_command runs my_command until it fails. I don’t use this much, but it’s
|
||||
useful for various things. tryna wget ... will keep trying to download
|
||||
something. trynafail npm test will stop once my tests start failing.
|
||||
|
||||
Quick references
|
||||
|
||||
[56]emoji is my emoji lookup helper. For example, emoji cool prints the
|
||||
following:
|
||||
|
||||
😛
|
||||
😒
|
||||
😎
|
||||
🪭
|
||||
🆒
|
||||
|
||||
[57]httpstatus prints all HTTP statuses. httpstatus 204 prints 204 No Content.
|
||||
As a web developer, I use this a few times a month, instead of looking it up
|
||||
online.
|
||||
|
||||
[58]alphabet just prints the English alphabet in upper and lowercase. I use
|
||||
this surprisingly often (probably about once a month). It literally just prints
|
||||
this:
|
||||
|
||||
abcdefghijklmnopqrstuvwxyz
|
||||
ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
|
||||
System management
|
||||
|
||||
[59]theme 0 changes my whole system to dark mode. theme 1 changes it to light
|
||||
mode. It doesn’t just change the OS theme—it also changes my Vim, Tmux, and
|
||||
terminal themes. I use this at least once a day.
|
||||
|
||||
[60]sleepybear puts my system to sleep, and works on macOS and Linux. I use
|
||||
this a few times a week.
|
||||
|
||||
[61]ds-destroy recursively deletes all .DS_Store files in a directory. I hate
|
||||
that macOS clutters directories with these files! I don’t use this often, but
|
||||
I’m glad I have it when I need it.
|
||||
|
||||
Grab bag
|
||||
|
||||
[62]catbin foo is basically cat "$(which foo)". Useful for seeing the source
|
||||
code of a file in your path (used it for writing up this post, for example!). I
|
||||
use this a few times a month.
|
||||
|
||||
[63]notify sends an OS notification. It’s used in several of my other scripts
|
||||
(see above). I also do something like this about once a month:
|
||||
|
||||
run_some_long_running_process ; notify 'all done'
|
||||
|
||||
[64]uuid prints a v4 UUID. I use this about once a month.
|
||||
|
||||
What about your scripts?
|
||||
|
||||
These are just scripts I use a lot. I hope some of them are useful to you!
|
||||
|
||||
If you liked this post, you might like [65]“Why ‘alias’ is my last resort for
|
||||
aliases” and [66]“A decade of dotfiles”.
|
||||
|
||||
Oh, and [67]contact me if you have any scripts you think I’d like.
|
||||
|
||||
[68][logo_white]
|
||||
|
||||
• [69]About me
|
||||
• [70]Contact
|
||||
• [71]Projects
|
||||
• [72]Guides
|
||||
• [73]Blog
|
||||
|
||||
• [74]RSS
|
||||
• [75]Newsletter
|
||||
• [76]Mastodon
|
||||
|
||||
Unless noted otherwise, content is licensed under the [77]Creative Commons
|
||||
Attribution-NonCommercial License and code under the [78]Unlicense. Logo by
|
||||
[79]Lulu Tang. Profile photo by [80]Ali Boschert-Downs.
|
||||
|
||||
|
||||
References:
|
||||
|
||||
[1] https://evanhahn.com/
|
||||
[2] https://evanhahn.com/a-decade-of-dotfiles/
|
||||
[3] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/copy
|
||||
[4] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pasta
|
||||
[5] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pastas
|
||||
[6] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/cpwd
|
||||
[7] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L38-L41
|
||||
[8] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L43-L51
|
||||
[9] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/trash
|
||||
[10] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/mksh
|
||||
[11] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/serveit
|
||||
[12] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getsong
|
||||
[13] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getpod
|
||||
[14] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getsubs
|
||||
[15] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/wifi
|
||||
[16] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/url
|
||||
[17] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/line
|
||||
[18] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/scratch
|
||||
[19] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/straightquote
|
||||
[20] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/markdownquote
|
||||
[21] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/length
|
||||
[22] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/jsonformat
|
||||
[23] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/uppered
|
||||
[24] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/lowered
|
||||
[25] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/nato
|
||||
[26] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/u+
|
||||
[27] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/snippets
|
||||
[28] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/iclj
|
||||
[29] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ijs
|
||||
[30] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/iphp
|
||||
[31] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ipy
|
||||
[32] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/isql
|
||||
[33] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/hoy
|
||||
[34] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/timer
|
||||
[35] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/rn
|
||||
[36] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ocr
|
||||
[37] https://evanhahn.com/mac-ocr-script/
|
||||
[38] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L53-L61
|
||||
[39] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/sfx
|
||||
[40] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tunes
|
||||
[41] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pix
|
||||
[42] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/radio
|
||||
[43] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/speak
|
||||
[44] https://evanhahn.com/use-text-to-speech-if-you-cant-proofread-aloud/
|
||||
[45] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/shrinkvid
|
||||
[46] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/removeexif
|
||||
[47] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tuivid
|
||||
[48] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/each
|
||||
[49] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/running
|
||||
[50] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/murder
|
||||
[51] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/waitfor
|
||||
[52] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/bb
|
||||
[53] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/prettypath
|
||||
[54] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tryna
|
||||
[55] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/trynafail
|
||||
[56] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/emoji
|
||||
[57] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/httpstatus
|
||||
[58] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/alphabet
|
||||
[59] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/theme
|
||||
[60] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/sleepybear
|
||||
[61] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ds-destroy
|
||||
[62] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/catbin
|
||||
[63] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/notify
|
||||
[64] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/uuid
|
||||
[65] https://evanhahn.com/why-alias-is-my-last-resort-for-aliases/
|
||||
[66] https://evanhahn.com/a-decade-of-dotfiles/
|
||||
[67] https://evanhahn.com/contact/
|
||||
[68] https://evanhahn.com/
|
||||
[69] https://evanhahn.com/
|
||||
[70] https://evanhahn.com/contact/
|
||||
[71] https://evanhahn.com/projects/
|
||||
[72] https://evanhahn.com/guides/
|
||||
[73] https://evanhahn.com/blog/
|
||||
[74] https://evanhahn.com/blog/index.xml
|
||||
[75] https://buttondown.com/evanhahn
|
||||
[76] https://bigshoulders.city/@EvanHahn
|
||||
[77] https://creativecommons.org/licenses/by-nc/4.0/
|
||||
[78] https://unlicense.org/
|
||||
[79] http://luluspice.com/
|
||||
[80] https://www.instagram.com/boschertdowns/
|
||||
130
static/archive/justin-searls-co-y5dsjo.txt
Normal file
130
static/archive/justin-searls-co-y5dsjo.txt
Normal file
@@ -0,0 +1,130 @@
|
||||
[1]
|
||||
justin․searls․co
|
||||
[2][ ]
|
||||
[3]Posts [4]Casts [5]Links [6]Shots [7]Takes [8]Tubes [9]Clips [10]Spots [11]
|
||||
Slops [12]Mails
|
||||
[13]About [14]Search [15] Subscribe
|
||||
[16]Posts [17]Casts [18]Links [19]Shots [20]Takes [21]Tubes [22]Clips [23]Spots
|
||||
[24]Slops [25]Mails
|
||||
[26]About [27]Search [28] Subscribe
|
||||
|
||||
• [29]Work
|
||||
• [30]GitHub
|
||||
• [31]YouTube
|
||||
• [32]LinkedIn
|
||||
• [33]Instagram
|
||||
• [34]Mastodon
|
||||
• [35]Twitter
|
||||
|
||||
Tuesday, Nov 4, 2025 [36]
|
||||
|
||||
Software is supply-constrained (for now)
|
||||
|
||||
Fantastic [37]write-up by Nowfal comparing AI's current moment to the
|
||||
Internet's dial-up era. This bit in particular points to a cleavage that far
|
||||
too few people understand:
|
||||
|
||||
Software presents an even more interesting question. How many apps do you
|
||||
need? What about software that generates applications on demand, that
|
||||
creates entire software ecosystems autonomously? Until now, handcrafted
|
||||
software was the constraint. Expensive software engineers and [DEL:their
|
||||
:DEL] our labor costs limited what companies could afford to build.
|
||||
Automation changes this equation by making those engineers far more
|
||||
productive. Both consumer and enterprise software markets suggest
|
||||
significant unmet demand because businesses have consistently left projects
|
||||
unbuilt. They couldn't justify the development costs or had to allocate
|
||||
limited resources to their top priority projects. I saw this firsthand at
|
||||
Amazon. Thousands of ideas went unfunded not because they lacked business
|
||||
value, but because of the lack of engineering resources to build them. If
|
||||
AI can produce software at a fraction of the cost, that unleashes enormous
|
||||
latent demand. The key question then is if and when that demand will
|
||||
saturate.
|
||||
|
||||
Two things are simultaneously true:
|
||||
|
||||
1. The creation of custom software has been supply-constrained throughout the
|
||||
entire history of computing. Nobody knows how many apps were never even
|
||||
imagined—much less developed—due to this constraint, but it's probably fair
|
||||
to say there's an unbelievably massive, decades-long backlog of unmet
|
||||
demand for custom software
|
||||
2. We aren't even six months into the [38]Shovelware era of coding agents.
|
||||
Exceedingly few developers have even tried these things; the tooling is so
|
||||
bad as to be counterproductive to the task; and yet experienced early
|
||||
adopters (like me) have concluded today's mediocre agents are already
|
||||
substantially better at writing software
|
||||
|
||||
It's long been my view that the appropriate response to the current moment is
|
||||
to ride this walrus and leverage coding agents to increase the scope of our
|
||||
ambitions. By the time software demand has been saturated and put us out of
|
||||
jobs, the supply of programmers will already have tapered off as the next
|
||||
generation sees the inflection point coming.
|
||||
|
||||
In the short term, the only programmers actually losing their jobs to "AI" are
|
||||
those who refuse to engage with the technology. Using coding agents effectively
|
||||
is a learned skill like any other—and if you don't keep your skills current,
|
||||
fewer people will want to hire you.
|
||||
|
||||
[39] wreflection.com
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Got a taste for hot, fresh takes?
|
||||
|
||||
Then you're in luck, because you'll pay $0 for my 2¢ when you [40]subscribe to
|
||||
my work, whether via [41]RSS or your favorite [42]social network.
|
||||
|
||||
I also have a monthly [43]newsletter where I write high-tempo,
|
||||
thought-provoking essays about life, in case that's more your speed:
|
||||
|
||||
[44][ ] [45][Sign up]
|
||||
And if you'd rather give your eyes a rest and your ears a workout, might I
|
||||
suggest my long-form solo podcast, [46]Breaking Change? Odds are, you haven't
|
||||
heard anything quite like it.
|
||||
|
||||
© 2025 Justin Searls. All rights reserved.
|
||||
|
||||
|
||||
References:
|
||||
|
||||
[1] https://justin.searls.co/
|
||||
[3] https://justin.searls.co/posts/
|
||||
[4] https://justin.searls.co/casts/
|
||||
[5] https://justin.searls.co/links/
|
||||
[6] https://justin.searls.co/shots/
|
||||
[7] https://justin.searls.co/takes/
|
||||
[8] https://justin.searls.co/tubes/
|
||||
[9] https://justin.searls.co/clips/
|
||||
[10] https://justin.searls.co/spots/
|
||||
[11] https://justin.searls.co/slops/
|
||||
[12] https://justin.searls.co/mails/
|
||||
[13] https://justin.searls.co/about/
|
||||
[14] https://justin.searls.co/search/
|
||||
[15] https://justin.searls.co/subscribe/
|
||||
[16] https://justin.searls.co/posts/
|
||||
[17] https://justin.searls.co/casts/
|
||||
[18] https://justin.searls.co/links/
|
||||
[19] https://justin.searls.co/shots/
|
||||
[20] https://justin.searls.co/takes/
|
||||
[21] https://justin.searls.co/tubes/
|
||||
[22] https://justin.searls.co/clips/
|
||||
[23] https://justin.searls.co/spots/
|
||||
[24] https://justin.searls.co/slops/
|
||||
[25] https://justin.searls.co/mails/
|
||||
[26] https://justin.searls.co/about/
|
||||
[27] https://justin.searls.co/search/
|
||||
[28] https://justin.searls.co/subscribe/
|
||||
[29] https://searls.co/
|
||||
[30] https://github.com/searls
|
||||
[31] https://youtube.com/@JustinSearls
|
||||
[32] https://linkedin.com/in/searls
|
||||
[33] https://instagram.com/searls
|
||||
[34] https://mastodon.social/@searls
|
||||
[35] https://twitter.com/searls
|
||||
[36] https://www.wreflection.com/p/ai-dial-up-era
|
||||
[37] https://www.wreflection.com/p/ai-dial-up-era
|
||||
[38] https://justin.searls.co/shovelware/
|
||||
[39] https://www.wreflection.com/p/ai-dial-up-era
|
||||
[40] https://justin.searls.co/subscribe/
|
||||
[41] https://justin.searls.co/rss/
|
||||
[42] https://justin.searls.co/posse/
|
||||
[43] https://justin.searls.co/newsletter
|
||||
[46] https://justin.searls.co/casts/breaking-change/
|
||||
85
static/archive/macwright-com-rbiipx.txt
Normal file
85
static/archive/macwright-com-rbiipx.txt
Normal file
@@ -0,0 +1,85 @@
|
||||
[1]Tom MacWright
|
||||
|
||||
2025@macwright.com
|
||||
|
||||
[2]Tom MacWright
|
||||
|
||||
• [3]Writing
|
||||
• [4]Reading
|
||||
• [5]Photos
|
||||
• [6]Projects
|
||||
• [7]Drawings
|
||||
• [8]Micro⇠
|
||||
• [9]About
|
||||
|
||||
What if people don't want to create things
|
||||
|
||||
2025-10-21
|
||||
|
||||
Almost my whole career distills down to ‘making creative tools’ of one sort or
|
||||
another: [10]visualizations, [11]maps, [12]code, [13]hardware. I try to live a
|
||||
creative life too - between music, photos, drawing, writing, and [14]sewing I
|
||||
have some output. Never enough, but it’s something.
|
||||
|
||||
When I look back on [15]TileMill in 2010, [16]Mapbox Studio, Observable, the
|
||||
whole arc: I can’t help but worry about the supply of creativity in society. In
|
||||
particular:
|
||||
|
||||
If we give everyone the tools to build their dreams, very few people will use
|
||||
them.
|
||||
|
||||
That’s it. Only tools that are both free, easy to learn, and ideally profitable
|
||||
really take off and become commonplace: TikTok has a lot of ‘creators’ because
|
||||
the learning curve is shallow and making videos is socially and economically
|
||||
beneficial.
|
||||
|
||||
But few people want to make maps. Few people even think about the fact that
|
||||
anyone makes maps. The same goes for so much in society: the tools for making
|
||||
[17]fonts are free and learnable, but to use them you need time and effort.
|
||||
Beautiful data visualizations are free to make, with lots of resources and
|
||||
opportunities, but the supply of people who really love and know [18]D3 is a
|
||||
lot lower than I expected it would be.
|
||||
|
||||
I worry about this when it comes to software, too. I love [19]home cooked apps
|
||||
and [20]malleable software but I have a gnawing feeling that I’m in a bubble
|
||||
when I think about them. Most people’s lives are split into the things that
|
||||
they affect & create, and the things that already exist and they want to tune
|
||||
out and automate, and our lives might be tilting more toward the latter than
|
||||
ever before. It’s so possible to live without understanding much of the built
|
||||
environment or learning to build anything.
|
||||
|
||||
It’s not a personal issue: surely this comes downstream from a lack of free
|
||||
time, a cutthroat economic system, and companies that intentionally lock down
|
||||
their products - operating systems that only run approved software, coffee
|
||||
machines that only accept [21]proprietary coffee pods.
|
||||
|
||||
But some of it is a personal inclination: the hesitance to share one’s art or
|
||||
writing or to tinker. It’s a shift of values from what you can make to [22]what
|
||||
you can own. It’s a bigger cultural thing that I could ever wrap my head
|
||||
around, but I do think about it a lot.
|
||||
|
||||
|
||||
References:
|
||||
|
||||
[1] https://macwright.com/
|
||||
[2] https://macwright.com/
|
||||
[3] https://macwright.com/writing
|
||||
[4] https://macwright.com/reading/
|
||||
[5] https://macwright.com/photos/
|
||||
[6] https://macwright.com/projects/
|
||||
[7] https://macwright.com/drawings/
|
||||
[8] https://macwright.com/micro/
|
||||
[9] https://macwright.com/about/
|
||||
[10] https://observablehq.com/
|
||||
[11] https://www.mapbox.com/
|
||||
[12] http://val.town/
|
||||
[13] https://config.com/
|
||||
[14] https://macwright.com/2025/09/27/porteur-bag-2
|
||||
[15] https://tilemill-project.github.io/tilemill/
|
||||
[16] https://www.mapbox.com/mapbox-studio
|
||||
[17] https://fontforge.org/en-US/
|
||||
[18] https://d3js.org/
|
||||
[19] https://www.robinsloan.com/notes/home-cooked-app/
|
||||
[20] https://www.inkandswitch.com/essay/malleable-software/
|
||||
[21] https://en.wikipedia.org/wiki/Keurig
|
||||
[22] https://www.theguardian.com/technology/ng-interactive/2025/oct/21/why-the-manosphere-clicked-for-young-men-a-visual-deep-dive
|
||||
288
static/archive/simonwillison-net-yekorg.txt
Normal file
288
static/archive/simonwillison-net-yekorg.txt
Normal file
@@ -0,0 +1,288 @@
|
||||
[1]Simon Willison’s Weblog
|
||||
|
||||
[2]Subscribe
|
||||
|
||||
Vibe engineering
|
||||
|
||||
7th October 2025
|
||||
|
||||
I feel like vibe coding is [3]pretty well established now as covering the fast,
|
||||
loose and irresponsible way of building software with AI—entirely
|
||||
prompt-driven, and with no attention paid to how the code actually works. This
|
||||
leaves us with a terminology gap: what should we call the other end of the
|
||||
spectrum, where seasoned professionals accelerate their work with LLMs while
|
||||
staying proudly and confidently accountable for the software they produce?
|
||||
|
||||
I propose we call this vibe engineering, with my tongue only partially in my
|
||||
cheek.
|
||||
|
||||
One of the lesser spoken truths of working productively with LLMs as a software
|
||||
engineer on non-toy-projects is that it’s difficult. There’s a lot of depth to
|
||||
understanding how to use the tools, there are plenty of traps to avoid, and the
|
||||
pace at which they can churn out working code raises the bar for what the human
|
||||
participant can and should be contributing.
|
||||
|
||||
The rise of coding agents—tools like [4]Claude Code (released February 2025),
|
||||
OpenAI’s [5]Codex CLI (April) and [6]Gemini CLI (June) that can iterate on
|
||||
code, actively testing and modifying it until it achieves a specified goal, has
|
||||
dramatically increased the usefulness of LLMs for real-world coding problems.
|
||||
|
||||
I’m increasingly hearing from experienced, credible software engineers who are
|
||||
running multiple copies of agents at once, tackling several problems in
|
||||
parallel and expanding the scope of what they can take on. I was skeptical of
|
||||
this at first but [7]I’ve started running multiple agents myself now and it’s
|
||||
surprisingly effective, if mentally exhausting!
|
||||
|
||||
This feels very different from classic vibe coding, where I outsource a simple,
|
||||
low-stakes task to an LLM and accept the result if it appears to work. Most of
|
||||
my [8]tools.simonwillison.net collection ([9]previously) were built like that.
|
||||
Iterating with coding agents to produce production-quality code that I’m
|
||||
confident I can maintain in the future feels like a different process entirely.
|
||||
|
||||
It’s also become clear to me that LLMs actively reward existing top tier
|
||||
software engineering practices:
|
||||
|
||||
• Automated testing. If your project has a robust, comprehensive and stable
|
||||
test suite agentic coding tools can fly with it. Without tests? Your agent
|
||||
might claim something works without having actually tested it at all, plus
|
||||
any new change could break an unrelated feature without you realizing it.
|
||||
Test-first development is particularly effective with agents that can
|
||||
iterate in a loop.
|
||||
• Planning in advance. Sitting down to hack something together goes much
|
||||
better if you start with a high level plan. Working with an agent makes
|
||||
this even more important—you can iterate on the plan first, then hand it
|
||||
off to the agent to write the code.
|
||||
• Comprehensive documentation. Just like human programmers, an LLM can only
|
||||
keep a subset of the codebase in its context at once. Being able to feed in
|
||||
relevant documentation lets it use APIs from other areas without reading
|
||||
the code first. Write good documentation first and the model may be able to
|
||||
build the matching implementation from that input alone.
|
||||
• Good version control habits. Being able to undo mistakes and understand
|
||||
when and how something was changed is even more important when a coding
|
||||
agent might have made the changes. LLMs are also fiercely competent at
|
||||
Git—they can navigate the history themselves to track down the origin of
|
||||
bugs, and they’re better than most developers at using [10]git bisect. Use
|
||||
that to your advantage.
|
||||
• Having effective automation in place. Continuous integration, automated
|
||||
formatting and linting, continuous deployment to a preview environment—all
|
||||
things that agentic coding tools can benefit from too. LLMs make writing
|
||||
quick automation scripts easier as well, which can help them then repeat
|
||||
tasks accurately and consistently next time.
|
||||
• A culture of code review. This one explains itself. If you’re fast and
|
||||
productive at code review you’re going to have a much better time working
|
||||
with LLMs than if you’d rather write code yourself than review the same
|
||||
thing written by someone (or something) else.
|
||||
• A very weird form of management. Getting good results out of a coding agent
|
||||
feels uncomfortably close to getting good results out of a human
|
||||
collaborator. You need to provide clear instructions, ensure they have the
|
||||
necessary context and provide actionable feedback on what they produce.
|
||||
It’s a lot easier than working with actual people because you don’t have to
|
||||
worry about offending or discouraging them—but any existing management
|
||||
experience you have will prove surprisingly useful.
|
||||
• Really good manual QA (quality assurance). Beyond automated tests, you need
|
||||
to be really good at manually testing software, including predicting and
|
||||
digging into edge-cases.
|
||||
• Strong research skills. There are dozens of ways to solve any given coding
|
||||
problem. Figuring out the best options and proving an approach has always
|
||||
been important, and remains a blocker on unleashing an agent to write the
|
||||
actual code.
|
||||
• The ability to ship to a preview environment. If an agent builds a feature,
|
||||
having a way to safely preview that feature (without deploying it straight
|
||||
to production) makes reviews much more productive and greatly reduces the
|
||||
risk of shipping something broken.
|
||||
• An instinct for what can be outsourced to AI and what you need to manually
|
||||
handle yourself. This is constantly evolving as the models and tools become
|
||||
more effective. A big part of working effectively with LLMs is maintaining
|
||||
a strong intuition for when they can best be applied.
|
||||
• An updated sense of estimation. Estimating how long a project will take has
|
||||
always been one of the hardest but most important parts of being a senior
|
||||
engineer, especially in organizations where budget and strategy decisions
|
||||
are made based on those estimates. AI-assisted coding makes this even
|
||||
harder—things that used to take a long time are much faster, but
|
||||
estimations now depend on new factors which we’re all still trying to
|
||||
figure out.
|
||||
|
||||
If you’re going to really exploit the capabilities of these new tools, you need
|
||||
to be operating at the top of your game. You’re not just responsible for
|
||||
writing the code—you’re researching approaches, deciding on high-level
|
||||
architecture, writing specifications, defining success criteria, [11]designing
|
||||
agentic loops, planning QA, managing a growing army of weird digital interns
|
||||
who will absolutely cheat if you give them a chance, and spending so much time
|
||||
on code review.
|
||||
|
||||
Almost all of these are characteristics of senior software engineers already!
|
||||
|
||||
AI tools amplify existing expertise. The more skills and experience you have as
|
||||
a software engineer the faster and better the results you can get from working
|
||||
with LLMs and coding agents.
|
||||
|
||||
“Vibe engineering”, really?
|
||||
|
||||
Is this a stupid name? Yeah, probably. “Vibes” as a concept in AI feels a
|
||||
little tired at this point. “Vibe coding” itself is used by a lot of developers
|
||||
in a dismissive way. I’m ready to reclaim vibes for something more
|
||||
constructive.
|
||||
|
||||
I’ve never really liked the artificial distinction between “coders” and
|
||||
“engineers”—that’s always smelled to me a bit like gatekeeping. But in this
|
||||
case a bit of gatekeeping is exactly what we need!
|
||||
|
||||
Vibe engineering establishes a clear distinction from vibe coding. It signals
|
||||
that this is a different, harder and more sophisticated way of working with AI
|
||||
tools to build production software.
|
||||
|
||||
I like that this is cheeky and likely to be controversial. This whole space is
|
||||
still absurd in all sorts of different ways. We shouldn’t take ourselves too
|
||||
seriously while we figure out the most productive ways to apply these new
|
||||
tools.
|
||||
|
||||
I’ve tried in the past to get terms like [12]AI-assisted programming to stick,
|
||||
with approximately zero success. May as well try rubbing some vibes on it and
|
||||
see what happens.
|
||||
|
||||
I also really like the clear mismatch between “vibes” and “engineering”. It
|
||||
makes the combined term self-contradictory in a way that I find mischievous and
|
||||
(hopefully) sticky.
|
||||
|
||||
Posted [13]7th October 2025 at 2:32 pm · Follow me on [14]Mastodon, [15]Bluesky
|
||||
, [16]Twitter or [17]subscribe to my newsletter
|
||||
|
||||
More recent articles
|
||||
|
||||
• [18]A new SQL-powered permissions system in Datasette 1.0a20 - 4th November
|
||||
2025
|
||||
• [19]New prompt injection papers: Agents Rule of Two and The Attacker Moves
|
||||
Second - 2nd November 2025
|
||||
• [20]Hacking the WiFi-enabled color screen GitHub Universe conference badge
|
||||
- 28th October 2025
|
||||
|
||||
This is Vibe engineering by Simon Willison, posted on [21]7th October 2025.
|
||||
|
||||
Part of series [22]How I use LLMs and ChatGPT
|
||||
|
||||
29. [23]Tips on prompting ChatGPT for UK technology secretary Peter Kyle - June
|
||||
3, 2025, 7:08 p.m.
|
||||
30. [24]Designing agentic loops - Sept. 30, 2025, 3:20 p.m.
|
||||
31. [25]Embracing the parallel coding agent lifestyle - Oct. 5, 2025, 12:06
|
||||
p.m.
|
||||
32. Vibe engineering - Oct. 7, 2025, 2:32 p.m.
|
||||
33. [26]Claude can write complete Datasette plugins now - Oct. 8, 2025, 11:43
|
||||
p.m.
|
||||
34. [27]Getting DeepSeek-OCR working on an NVIDIA Spark via brute force using
|
||||
Claude Code - Oct. 20, 2025, 5:21 p.m.
|
||||
35. [28]Video: Building a tool to copy-paste share terminal sessions using
|
||||
Claude Code for web - Oct. 23, 2025, 4:14 a.m.
|
||||
|
||||
[29] code-review 13 [30] definitions 35 [31] software-engineering 59 [32] ai
|
||||
1658 [33] generative-ai 1463 [34] llms 1430 [35] ai-assisted-programming 265
|
||||
[36] vibe-coding 52 [37] coding-agents 88 [38] parallel-agents 6
|
||||
|
||||
Next: [39]Claude can write complete Datasette plugins now
|
||||
|
||||
Previous: [40]OpenAI DevDay 2025 live blog
|
||||
|
||||
Monthly briefing
|
||||
|
||||
Sponsor me for $10/month and get a curated email digest of the month's most
|
||||
important LLM developments.
|
||||
|
||||
Pay me to send you less!
|
||||
|
||||
[41] Sponsor & subscribe
|
||||
|
||||
• [42]Colophon
|
||||
• ©
|
||||
• [43]2002
|
||||
• [44]2003
|
||||
• [45]2004
|
||||
• [46]2005
|
||||
• [47]2006
|
||||
• [48]2007
|
||||
• [49]2008
|
||||
• [50]2009
|
||||
• [51]2010
|
||||
• [52]2011
|
||||
• [53]2012
|
||||
• [54]2013
|
||||
• [55]2014
|
||||
• [56]2015
|
||||
• [57]2016
|
||||
• [58]2017
|
||||
• [59]2018
|
||||
• [60]2019
|
||||
• [61]2020
|
||||
• [62]2021
|
||||
• [63]2022
|
||||
• [64]2023
|
||||
• [65]2024
|
||||
• [66]2025
|
||||
|
||||
|
||||
References:
|
||||
|
||||
[1] https://simonwillison.net/
|
||||
[2] https://simonwillison.net/about/#subscribe
|
||||
[3] https://simonwillison.net/2025/Mar/19/vibe-coding/
|
||||
[4] https://www.claude.com/product/claude-code
|
||||
[5] https://github.com/openai/codex
|
||||
[6] https://github.com/google-gemini/gemini-cli
|
||||
[7] https://simonwillison.net/2025/Oct/5/parallel-coding-agents/
|
||||
[8] https://tools.simonwillison.net/
|
||||
[9] https://simonwillison.net/2025/Sep/4/highlighted-tools/
|
||||
[10] https://til.simonwillison.net/git/git-bisect
|
||||
[11] https://simonwillison.net/2025/Sep/30/designing-agentic-loops/
|
||||
[12] https://simonwillison.net/tags/ai-assisted-programming/
|
||||
[13] https://simonwillison.net/2025/Oct/7/
|
||||
[14] https://fedi.simonwillison.net/@simon
|
||||
[15] https://bsky.app/profile/simonwillison.net
|
||||
[16] https://twitter.com/simonw
|
||||
[17] https://simonwillison.net/about/#subscribe
|
||||
[18] https://simonwillison.net/2025/Nov/4/datasette-10a20/
|
||||
[19] https://simonwillison.net/2025/Nov/2/new-prompt-injection-papers/
|
||||
[20] https://simonwillison.net/2025/Oct/28/github-universe-badge/
|
||||
[21] https://simonwillison.net/2025/Oct/7/
|
||||
[22] https://simonwillison.net/series/using-llms/
|
||||
[23] https://simonwillison.net/2025/Jun/3/tips-for-peter-kyle/
|
||||
[24] https://simonwillison.net/2025/Sep/30/designing-agentic-loops/
|
||||
[25] https://simonwillison.net/2025/Oct/5/parallel-coding-agents/
|
||||
[26] https://simonwillison.net/2025/Oct/8/claude-datasette-plugins/
|
||||
[27] https://simonwillison.net/2025/Oct/20/deepseek-ocr-claude-code/
|
||||
[28] https://simonwillison.net/2025/Oct/23/claude-code-for-web-video/
|
||||
[29] https://simonwillison.net/tags/code-review/
|
||||
[30] https://simonwillison.net/tags/definitions/
|
||||
[31] https://simonwillison.net/tags/software-engineering/
|
||||
[32] https://simonwillison.net/tags/ai/
|
||||
[33] https://simonwillison.net/tags/generative-ai/
|
||||
[34] https://simonwillison.net/tags/llms/
|
||||
[35] https://simonwillison.net/tags/ai-assisted-programming/
|
||||
[36] https://simonwillison.net/tags/vibe-coding/
|
||||
[37] https://simonwillison.net/tags/coding-agents/
|
||||
[38] https://simonwillison.net/tags/parallel-agents/
|
||||
[39] https://simonwillison.net/2025/Oct/8/claude-datasette-plugins/
|
||||
[40] https://simonwillison.net/2025/Oct/6/openai-devday-live-blog/
|
||||
[41] https://github.com/sponsors/simonw/
|
||||
[42] https://simonwillison.net/about/#about-site
|
||||
[43] https://simonwillison.net/2002/
|
||||
[44] https://simonwillison.net/2003/
|
||||
[45] https://simonwillison.net/2004/
|
||||
[46] https://simonwillison.net/2005/
|
||||
[47] https://simonwillison.net/2006/
|
||||
[48] https://simonwillison.net/2007/
|
||||
[49] https://simonwillison.net/2008/
|
||||
[50] https://simonwillison.net/2009/
|
||||
[51] https://simonwillison.net/2010/
|
||||
[52] https://simonwillison.net/2011/
|
||||
[53] https://simonwillison.net/2012/
|
||||
[54] https://simonwillison.net/2013/
|
||||
[55] https://simonwillison.net/2014/
|
||||
[56] https://simonwillison.net/2015/
|
||||
[57] https://simonwillison.net/2016/
|
||||
[58] https://simonwillison.net/2017/
|
||||
[59] https://simonwillison.net/2018/
|
||||
[60] https://simonwillison.net/2019/
|
||||
[61] https://simonwillison.net/2020/
|
||||
[62] https://simonwillison.net/2021/
|
||||
[63] https://simonwillison.net/2022/
|
||||
[64] https://simonwillison.net/2023/
|
||||
[65] https://simonwillison.net/2024/
|
||||
[66] https://simonwillison.net/2025/
|
||||
394
static/archive/spf13-com-enwyvy.txt
Normal file
394
static/archive/spf13-com-enwyvy.txt
Normal file
@@ -0,0 +1,394 @@
|
||||
[1]spf13
|
||||
Menu
|
||||
|
||||
• [2]Home
|
||||
• [3]About
|
||||
• [4]Topics
|
||||
• [5]Presentations
|
||||
•
|
||||
|
||||
Search for Blog [6][ ]
|
||||
|
||||
Why Engineers Can't Be Rational About Programming Languages
|
||||
|
||||
[7]
|
||||
[8]Steve Francia 3 Nov 2025
|
||||
[9]Programming-Languages [10]Leadership [11]Engineering-Culture [12]Management
|
||||
[13]Economy
|
||||
✨
|
||||
|
||||
Series Overview
|
||||
|
||||
This is the first entry in a series on the true cost of a programming language.
|
||||
|
||||
The Leadership Blindspot: How Identity Drives Multi-Million Dollar Technical
|
||||
Debt
|
||||
|
||||
A programming language is the single most expensive choice a company makes, yet
|
||||
we treat it like a technical debate. After watching this mistake bankrupt
|
||||
dozens of companies and hurt hundreds more, I’ve learned the uncomfortable
|
||||
truth: these decisions are rarely about technology. They’re about identity,
|
||||
emotion, and ego, and they’re destroying your velocity and budget in ways you
|
||||
can’t see until it’s too late.
|
||||
|
||||
Early in my career, I worked at Takkle, a promising social network. A sudden
|
||||
departure vaulted me from lead engineer to VP of Engineering, leading a team of
|
||||
12. While we were delivering on all our goals, I was in my early 20s and lacked
|
||||
experience, a risk our board wanted to fix. They pressured our CEO to recruit a
|
||||
CTO with more experience. I looked forward to learning from him; he was a well
|
||||
known figure in the Perl community and arrived with a stack of O’Reilly “camel”
|
||||
books.
|
||||
|
||||
One of his first acts was to pronounce our language, PHP, the wrong choice. He
|
||||
decreed a switch to Perl. This decree happened after what felt to me like a
|
||||
sham analysis comparing PHP and Perl.
|
||||
|
||||
Our velocity collapsed. Our team had to not only learn a new language but
|
||||
rebuild from scratch, delaying our product by nine months. Our monthly burn
|
||||
rate jumped from $200K to $500K as we more than doubled our size to make up for
|
||||
the lost velocity while building the new Perl based system, which halved our
|
||||
runway.
|
||||
|
||||
Our CTO did deliver, at least on some of his promises. We built a beautiful
|
||||
system, one I was truly proud of. But it was too late. By the time we finally
|
||||
launched, the market opportunity had vanished. Facebook had now expanded beyond
|
||||
colleges, and we were at the end of our monitary runway. The increased spend
|
||||
had shortened our runway by half, and we didn’t have enough momentum with the
|
||||
new site to reach the milestones required to raise more money.
|
||||
|
||||
I’ve often wondered: What if we had just stuck with PHP? We had a fine system
|
||||
and real momentum. We would have launched much earlier at a fraction of the
|
||||
cost. PHP was good enough for Facebook; why not us?
|
||||
|
||||
But the question that haunted me was: Why did such an experienced leader make
|
||||
such an terrible mistake?
|
||||
|
||||
Promises Made
|
||||
|
||||
• Switching to Perl would unlock the architecture we needed
|
||||
• Rebuilding from scratch would accelerate hiring and quality
|
||||
|
||||
Reality Delivered
|
||||
|
||||
• Velocity collapsed as the team relearned and rebuilt everything
|
||||
• Burn rate jumped from $200K to $500K per month
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
The Pattern Repeats
|
||||
|
||||
As my career progressed I saw this same pattern over and over. As Languages
|
||||
Product Lead at Google, my group included C++, Java, Go, and Python. At
|
||||
MongoDB, I managed teams writing in 13 different languages. In both places I
|
||||
saw brilliant engineers arguing past each other, armed with conflicting data,
|
||||
all of it true, but none of it complete. At Google Cloud, I saw these same
|
||||
challenges across our customers.
|
||||
|
||||
Fast forward two decades from Takkle, and I had déjà vu. I watched as a VP of
|
||||
Engineering presented to leadership why his team needed to build their next
|
||||
system in Rust. The presentation eerily paralleled that Takkle experience. In
|
||||
that old presentation, nearly every reason the CTO gave for Perl was truer of
|
||||
PHP at the time. Now, every single reason given for choosing Rust in this
|
||||
presentation, Go was objectively better at. As an example: they cited “easy
|
||||
build and deploy” as a Rust advantage. It’s true that this is a strength of
|
||||
Rust, but Go’s nearly instant cross compilation and single static binary is
|
||||
even stronger than Rust in this specic critera with Rust’s very long build
|
||||
times.
|
||||
|
||||
It’s not that I think they should have chosen Go, Go would have been the wrong
|
||||
choice for their situation, and I believe Rust was the right choice. But what
|
||||
struck me was how broken their reasoning was. If they were making a logical
|
||||
argument, surely they would have considered Go and in doing so with their
|
||||
presented criteria they would have realized Go was a better option and, at the
|
||||
very least, refined their critera.
|
||||
|
||||
I pulled the VP aside after the meeting. “Walk me through how you evaluated
|
||||
other language candidates,” I said. His face went blank. “We… didn’t
|
||||
really look at any others,” he admitted. “Everyone’s talking about Rust.” There
|
||||
it was: a 50 million dollar decision made on hype, about to be green lit.
|
||||
|
||||
For me this was the moment of epiphany, finally an answer to the question for
|
||||
the beginning of my career. The presentation didn’t share an analysis, they
|
||||
hadn’t done one; it was a justification for a choice already made. This was a
|
||||
decision based purely on hype, emotion, and identity.
|
||||
|
||||
Every Technical Debate Is Really Two Conversations
|
||||
|
||||
In every language discussion, two conversations are happening simultaneously.
|
||||
|
||||
The Visible Conversation: “Rust has memory safety without garbage collection.”
|
||||
“Go has faster compile times and easier deployment.” “Python has the richest ML
|
||||
ecosystem.”
|
||||
|
||||
The Invisible Conversation: “I am a Rust programmer.” “I want to become a Rust
|
||||
programmer.” “I cannot imagine being someone who doesn’t choose Rust.”
|
||||
|
||||
If you just read that and thought “well, my last language choice was different,
|
||||
I was being rational,” your invisible conversation is running right now,
|
||||
defending itself while you read this sentence.
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
My CTO at Takkle was having the invisible conversation. Every point in his
|
||||
visible Perl analysis was technically true, but it felt like a sham because it
|
||||
was only there to cover the much deeper invisible conversation. He wasn’t
|
||||
evaluating languages. He was protecting an identity he’d spent a decade
|
||||
building. What our company paid $300K per month extra for wasn’t better
|
||||
architecture or faster hiring. We paid for the opportunity for him to be a Perl
|
||||
CTO instead of a PHP CTO. That was the real transaction. The rebuild was just
|
||||
the payment plan.
|
||||
|
||||
That VP’s Rust presentation listed “easy build and deploy” as an advantage,
|
||||
technically true, but Go is objectively better on that specific criterion. If
|
||||
they were truly having the visible conversation, they would have caught that.
|
||||
They would have at least considered Go in their analysis.
|
||||
|
||||
They hadn’t. Because they weren’t having that conversation at all. And they
|
||||
were about to spend $50 million on the invisible one.
|
||||
|
||||
The Neuroscience of Why You Can’t See Your Own Bias
|
||||
|
||||
In one of the most [14]fascinating studies done in the past 20 years,
|
||||
researchers set out to understand why people cling to beliefs even when
|
||||
confronted with overwhelming contradictory evidence. What [15]they discovered
|
||||
fundamentally changed our understanding of human decision making.
|
||||
|
||||
The researchers recruited participants and first identified which beliefs were
|
||||
central to each person’s identity—their core political views, their fundamental
|
||||
values, the beliefs that defined who they were. Then, while participants lay in
|
||||
an fMRI scanner, the researchers presented them with carefully constructed
|
||||
challenges to these identity based beliefs, alongside challenges to beliefs the
|
||||
participants held but weren’t central to their sense of self.
|
||||
|
||||
The brain scans revealed something remarkable: these two types of challenges
|
||||
activated completely different neural pathways.
|
||||
|
||||
When a peripheral belief was challenged, something the person believed but
|
||||
wasn’t core to their identity, the brain’s reasoning centers activated
|
||||
normally. Participants could consider the evidence, weigh the arguments, and
|
||||
sometimes even change their minds.
|
||||
|
||||
But when an identity based belief was challenged, the brain responded as if
|
||||
under physical attack. The amygdala, your threat detection system, the same
|
||||
system that fires when you encounter a predator or a physical danger, activates
|
||||
immediately. The insular cortex, which processes emotional pain and disgust,
|
||||
lit up with activity. Most tellingly, the brain’s Default Mode Network, the
|
||||
system that maintains your sense of self and personal narrative, went into
|
||||
defensive mode, working to protect the existing identity rather than evaluate
|
||||
the new information.
|
||||
|
||||
In other words, your brain wasn’t weighing evidence. It was defending itself
|
||||
from an existential threat.
|
||||
|
||||
The researchers’ conclusion was stark: “To consider an alternative view, you
|
||||
have to imagine an alternative version of yourself.”
|
||||
|
||||
Your brain can’t objectively evaluate challenges to identity based beliefs
|
||||
because doing so requires temporarily dismantling the neural architecture that
|
||||
defines who you are. It’s not a matter of being more rational or trying harder.
|
||||
The mechanism that would allow you to see the bias clearly is the same
|
||||
mechanism the bias has compromised.
|
||||
|
||||
Think about what this means in practice. Every time an engineer evaluates a
|
||||
language that isn’t “theirs,” their brain is literally working against them.
|
||||
They’re not just analyzing technical trade offs, they’re contemplating a
|
||||
version of themselves that doesn’t exist yet, that feels threatening to the
|
||||
version that does. The Python developer reads case studies about Go’s
|
||||
performance and their amygdala quietly marks each one as a threat to be
|
||||
neutralized. The Rust advocate looks at identical problems and their Default
|
||||
Mode Network constructs narratives about why “only” Rust can solve them.
|
||||
|
||||
We’re not lying. We genuinely believe our reasoning is sound. That’s what makes
|
||||
identity based thinking so expensive, and so invisible.
|
||||
|
||||
We’ve Built Our Industry Around the Wrong Conversation
|
||||
|
||||
We call ourselves Pythonistas, Gophers, Rustaceans, we wear these labels like
|
||||
badges, sometimes we even wear literal badges (t-shirts, stickers, etc).
|
||||
There’s a reason so many of our surnames come from people’s crafts: Potter,
|
||||
Smith, Brewer. What we do becomes who we are. What looks like decorative labels
|
||||
are really decision making frameworks that operate beneath conscious thought.
|
||||
|
||||
We’ve built our entire industry around the visible conversation. We train
|
||||
engineers to debate technical merits. We create decision frameworks based on
|
||||
feature matrices. We think if we just gather enough benchmarks and case
|
||||
studies, we’ll make the right choice.
|
||||
|
||||
But the invisible conversation is much stronger. It’s why my CTO chose Perl.
|
||||
It’s why that VP chose Rust. And it’s operating in your next language decision
|
||||
right now, invisible and unexamined.
|
||||
|
||||
The moment you hire a Rust developer to evaluate languages, you’ve already
|
||||
chosen Rust. You’ve just added a $2 million feasibility study to make the
|
||||
predetermined decision feel rational.
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
The Real Cost
|
||||
|
||||
The question isn’t whether this bias exists, the science is conclusive. The
|
||||
real question is: can you afford to let it make your decisions?
|
||||
|
||||
Because the invisible conversation has a price tag. Industry research suggests
|
||||
that technology stack decisions account for 40-60% of total development costs
|
||||
over a product’s lifecycle. [16]Research by Stripe found that developers spend
|
||||
42% of their time on technical debt. When you let identity drive that decision
|
||||
you’re mortgaging your velocity, your budget, and your runway to pay for
|
||||
someone’s sense of self.
|
||||
|
||||
The visible conversation is about technology. The invisible conversation is
|
||||
about identity. And the invisible conversation always wins.
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
A New Framework: Language as Economic Decision
|
||||
|
||||
So how do we win, when the invisible conversation is constantly working against
|
||||
us? Change the conversation entirely.
|
||||
|
||||
Instead of asking “which language is best?” we need to ask “what is this
|
||||
language going to cost us?” Not just in salaries, but in velocity, in technical
|
||||
debt, in hiring difficulty, in operational complexity, in every dimension that
|
||||
actually determines whether you survive.
|
||||
|
||||
Reframe it from a technical debate to an economic one. And unlike identity,
|
||||
economics can be measured, compared, and decided without anyone’s ego being
|
||||
threatened.
|
||||
|
||||
Choosing a programming language is the single most expensive economic decision
|
||||
your company will make. It will define your culture, constrain your budget,
|
||||
determine your hiring pipeline, set your operational costs, and ultimately
|
||||
dictate whether you can move fast enough to win your market.
|
||||
|
||||
We need a framework that makes the invisible costs visible. One that lets us
|
||||
have the economic conversation instead of the identity conversation. One that
|
||||
works whether you’re choosing your first language or evaluating a migration.
|
||||
|
||||
Our industry has never really had that framework… Until now.
|
||||
|
||||
Up Next
|
||||
|
||||
In my next post, I’ll introduce the 9 Factors of a Language’s True Cost: a
|
||||
comprehensive framework for evaluating language decisions based on economics,
|
||||
not identity. You’ll learn how to quantify the hidden costs, predict long term
|
||||
impact, and make defensible decisions that your team can align behind,
|
||||
regardless of their language preferences.
|
||||
On this page
|
||||
|
||||
On this page
|
||||
|
||||
• [18]The Leadership Blindspot: How Identity Drives Multi-Million Dollar
|
||||
Technical Debt
|
||||
• [19]The Pattern Repeats
|
||||
• [20]Every Technical Debate Is Really Two Conversations
|
||||
• [21]The Neuroscience of Why You Can’t See Your Own Bias
|
||||
• [22]We’ve Built Our Industry Around the Wrong Conversation
|
||||
• [23]The Real Cost
|
||||
• [24]A New Framework: Language as Economic Decision
|
||||
|
||||
• [25]
|
||||
• [26]
|
||||
• [27]
|
||||
• [28]
|
||||
|
||||
You may also like
|
||||
|
||||
[29]See all Programming-Languages
|
||||
12 Sep 2025 [30]
|
||||
|
||||
[31]How Benjamin Franklin Invented Machine Learning in 1720
|
||||
|
||||
Benjamin Franklin discovered gradient descent 250 years before we had the
|
||||
mathematics to describe it.
|
||||
|
||||
28 Apr 2011 [32]
|
||||
|
||||
[33]My Favorite Rands Posts
|
||||
|
||||
If you don’t know Rands (real name Michael Lopp), you should. His blog is full
|
||||
of excellent …
|
||||
|
||||
22 Mar 2010 [34]
|
||||
|
||||
[35]Finding the Right People
|
||||
|
||||
Since I began at Open Sky a few weeks ago I have been tasked with building out
|
||||
a great team. …
|
||||
|
||||
Steve Francia
|
||||
|
||||
For 3 decades, I’ve helped transform breakthrough ideas into trusted platforms
|
||||
now used by more than 50% of the world’s developers. I’ve scaled this impact
|
||||
through leadership at [36]Google, [37]MongoDB, [38]Docker, and [39]Two Sigma as
|
||||
Managing Director, VP, and Product Leader shaping the tools that power modern
|
||||
software development.
|
||||
|
||||
My approach is simple: listen deeply, build elegantly, and maintain a healthy
|
||||
disregard for the impossible.
|
||||
|
||||
This philosophy guided me through architecting [40]MongoDB’s user experience
|
||||
that sparked mass adoption, scaling [41]Go from 400K to 4.5 million developers
|
||||
at [42]Google, pioneering [43]container standards at [44]Docker, and directing
|
||||
AI platform innovation at [45]Two Sigma.
|
||||
|
||||
While technical problems are exciting to solve, I’ve learned that it’s the
|
||||
human stack: the teams, cultures, and communities we build that truly
|
||||
determines lasting impact. Here, I share lessons on building products and teams
|
||||
that not only work, but endure and inspire.
|
||||
|
||||
• [46]
|
||||
• [47]
|
||||
• [48]
|
||||
|
||||
2025 © [49]spf13. All Right Reserved. Published with [50]Hugo.
|
||||
|
||||
References:
|
||||
|
||||
[1] https://spf13.com/
|
||||
[2] https://spf13.com/
|
||||
[3] https://spf13.com/about
|
||||
[4] https://spf13.com/topics
|
||||
[5] https://spf13.com/presentation
|
||||
[7] https://spf13.com/about/
|
||||
[8] https://spf13.com/about/
|
||||
[9] https://spf13.com/tags/programming-languages/
|
||||
[10] https://spf13.com/tags/leadership/
|
||||
[11] https://spf13.com/tags/engineering-culture/
|
||||
[12] https://spf13.com/tags/management/
|
||||
[13] https://spf13.com/tags/economy/
|
||||
[14] https://dornsife.usc.edu/news/stories/which-brain-networks-respond-when-someone-sticks-to-a-belief/
|
||||
[15] https://www.nature.com/articles/srep39589
|
||||
[16] https://stripe.com/reports/developer-coefficient-2018
|
||||
[18] https://spf13.com/p/the-hidden-conversation/#the-leadership-blindspot-how-identity-drives-multi-million-dollar-technical-debt
|
||||
[19] https://spf13.com/p/the-hidden-conversation/#the-pattern-repeats
|
||||
[20] https://spf13.com/p/the-hidden-conversation/#every-technical-debate-is-really-two-conversations
|
||||
[21] https://spf13.com/p/the-hidden-conversation/#the-neuroscience-of-why-you-cant-see-your-own-bias
|
||||
[22] https://spf13.com/p/the-hidden-conversation/#weve-built-our-industry-around-the-wrong-conversation
|
||||
[23] https://spf13.com/p/the-hidden-conversation/#the-real-cost
|
||||
[24] https://spf13.com/p/the-hidden-conversation/#a-new-framework-language-as-economic-decision
|
||||
[25] https://twitter.com/intent/tweet?text=Why%20Engineers%20Can%27t%20Be%20Rational%20About%20Programming%20Languages&url=https%3a%2f%2fspf13.com%2fp%2fthe-hidden-conversation%2f
|
||||
[26] https://www.facebook.com/sharer/sharer.php?u=https%3a%2f%2fspf13.com%2fp%2fthe-hidden-conversation%2f
|
||||
[27] http://pinterest.com/pin/create/button/?url=https%3a%2f%2fspf13.com%2fp%2fthe-hidden-conversation%2f&media=https%3a%2f%2fspf13.com%2f&description=Why%20Engineers%20Can%27t%20Be%20Rational%20About%20Programming%20Languages
|
||||
[28] https://www.linkedin.com/shareArticle?mini=true&url=https%3a%2f%2fspf13.com%2fp%2fthe-hidden-conversation%2f&title=Why%20Engineers%20Can%27t%20Be%20Rational%20About%20Programming%20Languages&summary=The%20neuroscience%20of%20why%20we%20make%20million%20dollar%20decisions%20based%20on%20identity%2c%20not%20data.&source=Why%20Engineers%20Can%27t%20Be%20Rational%20About%20Programming%20Languages
|
||||
[29] https://spf13.com/tags/programming-languages/
|
||||
[30] https://spf13.com/p/how-benjamin-franklin-invented-machine-learning-in-1720/
|
||||
[31] https://spf13.com/p/how-benjamin-franklin-invented-machine-learning-in-1720/
|
||||
[32] https://spf13.com/post/my-favorite-rands-posts/
|
||||
[33] https://spf13.com/post/my-favorite-rands-posts/
|
||||
[34] https://spf13.com/post/finding-the-right-people/
|
||||
[35] https://spf13.com/post/finding-the-right-people/
|
||||
[36] https://google.com/
|
||||
[37] https://mongodb.com/
|
||||
[38] https://docker.com/
|
||||
[39] https://www.twosigma.com/
|
||||
[40] https://mongodb.com/
|
||||
[41] https://go.dev/
|
||||
[42] https://google.com/
|
||||
[43] https://www.opencontainers.org/
|
||||
[44] https://docker.com/
|
||||
[45] https://www.twosigma.com/
|
||||
[46] https://twitter.com/spf13
|
||||
[47] https://github.com/spf13
|
||||
[48] https://www.linkedin.com/in/stevefrancia/
|
||||
[49] https://spf13.com/
|
||||
[50] https://gohugo.io/
|
||||
614
static/archive/steipete-me-ayczze.txt
Normal file
614
static/archive/steipete-me-ayczze.txt
Normal file
@@ -0,0 +1,614 @@
|
||||
[1] Skip to content
|
||||
[2] Peter Steinberger
|
||||
|
||||
• [4] Posts
|
||||
• [5] About
|
||||
• [6] Search
|
||||
•
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Just Talk To It - the no-bs Way of Agentic Engineering
|
||||
|
||||
Published: 14 Oct, 2025
|
||||
• 23 min read
|
||||
| [8]Edit on GitHub
|
||||
[curve-ange]
|
||||
|
||||
I’ve been more quiet here lately as I’m knee-deep working on my latest project.
|
||||
Agentic engineering has become so good that it now writes pretty much 100% of
|
||||
my code. And yet I see so many folks trying to solve issues and generating
|
||||
these elaborated charades instead of getting sh*t done.
|
||||
|
||||
This post partly is inspired by the conversations I had at last night’s [9]
|
||||
Claude Code Anonymous in London and partly since [10]it’s been an AI year since
|
||||
my last workflow update. Time for a check-in.
|
||||
|
||||
All of the basic ideas still apply, so I won’t mention simple things like
|
||||
context management again. Read my [11]Optimal AI Workflow post for a primer.
|
||||
|
||||
Context & Tech-Stack
|
||||
|
||||
I work by myself, current project is a ~300k LOC TypeScript React app, a Chrome
|
||||
extension, a cli, a client app in Tauri and a mobile app in Expo. I host on
|
||||
vercel, a PR delivers a new version of my website in ~2 minutes to test.
|
||||
Everything else (apps etc) is not automated.
|
||||
|
||||
Harness & General Approach
|
||||
|
||||
I’ve completely moved to codex cli as daily driver. I run between 3-8 in
|
||||
parallel in a 3x3 terminal grid, most of them [12]in the same folder, some
|
||||
experiments go in separate folders. I experimented with worktrees, PRs but
|
||||
always revert back to this setup as it gets stuff done the fastest.
|
||||
|
||||
My agents do git [13]atomic commits themselves. In order to maintain a mostly
|
||||
clean commit history, I iterated a lot on [14]my agent file. This makes git ops
|
||||
sharper so each agent commits exactly the files it edited.
|
||||
|
||||
Yes, with claude you could do hooks and codex doesn’t support them yet, but
|
||||
models are incredibly clever and [15]no hook will stop them if they are
|
||||
determined.
|
||||
|
||||
I was being ridiculed in the past and called a [16]slop-generator, good to see
|
||||
that running parallel agents [17]slowly gets mainstream.
|
||||
|
||||
Model Picker
|
||||
|
||||
I build pretty much everything with gpt-5-codex on mid settings. It’s a great
|
||||
compromise of smart & speed, and dials thinking up/down automatically. I found
|
||||
over-thinking these settings to not yield meaningful results, and it’s nice not
|
||||
having to think about ultrathink.
|
||||
|
||||
Blast Radius 💥
|
||||
|
||||
Whenever I work, I think about the “blast radius”. I didn’t come up with that
|
||||
term, I do love it tho. When I think of a change I have a pretty good feeling
|
||||
about how long it’ll take and how many files it will touch. I can throw many
|
||||
small bombs at my codebase or a one “Fat Man” and a few small ones. If you
|
||||
throw multiple large bombs, it’ll be impossible to do isolated commits, much
|
||||
harder to reset if sth goes wrong.
|
||||
|
||||
This is also a good indicator while I watch my agents. If something takes
|
||||
longer than I anticipated, I just hit escape and ask “what’s the status” to get
|
||||
a status update and then either help the model to find the right direction,
|
||||
abort or continue. Don’t be afraid of stopping models mid-way, file changes are
|
||||
atomic and they are really good at picking up where they stopped.
|
||||
|
||||
When I am unsure about the impact, I use “give me a few options before making
|
||||
changes” to gauge it.
|
||||
|
||||
Why not worktrees?
|
||||
|
||||
I run one dev server, as I evolve my project I click through it and test
|
||||
multiple changes at once. Having a tree/branch per change would make this
|
||||
significantly slower, spawning multiple dev servers would quickly get annoying.
|
||||
I also have limitations for Twitter OAuth, so I can only register some domains
|
||||
for callbacks.
|
||||
|
||||
What about Claude Code?
|
||||
|
||||
I used to love Claude Code, these days I can’t stand it anymore ([18]even tho
|
||||
codex is a fan). It’s language, the [19]absolutely right’s, the 100% production
|
||||
ready messages while tests fail - I just can’t anymore. Codex is more like the
|
||||
introverted engineer that chugs along and just gets stuff done. It reads much
|
||||
more files before starting work so even small prompts usually do exactly what I
|
||||
want.
|
||||
|
||||
There’s broad consensus in my timeline that [20]codex is the way [21]to go.
|
||||
|
||||
Other benefits of codex
|
||||
|
||||
• ~230k usable context vs claude’s 156k. Yes, there’s Sonnet 1Mio if you get
|
||||
lucky or pay API pricing, but realistically Claude gets very silly long
|
||||
before it depletes that context so it’s not realistically something you can
|
||||
use.
|
||||
• More efficient token use. Idk what OpenAI does different, but my context
|
||||
fills up far slower than with Claude Code. I used to see Compacting… all
|
||||
the time when using claude, I very rarely manage to exceed the context in
|
||||
codex.
|
||||
• Message Queuing. Codex allows to [22]queue messages. Claude had this
|
||||
feature, but a few months ago they changed it so your messages “steer” the
|
||||
model. If I want to steer codex, I just press escape and enter to send the
|
||||
new message. Having the option for both is just far better. I often queue
|
||||
related feature tasks and it just reliably works them off.
|
||||
• Speed OpenAI rewrote codex in Rust, and it shows. It’s incredibly fast.
|
||||
With Claude Code I often have multi-second freezes and it’s process blows
|
||||
up to gigabytes of memory. And then there’s the terminal flickering,
|
||||
especially when using Ghostty. Codex has none of that. It feels incredibly
|
||||
lightweight and fast.
|
||||
• Language. [23]This really makes a difference to my mental health. I’ve been
|
||||
screaming at claude so many times. I rarely get angry with codex. Even if
|
||||
codex would be a worse model I’d use it for that fact alone. If you use
|
||||
both for a few weeks you will understand.
|
||||
• [24]No random markdown files everywhere. [25]IYKYK.
|
||||
|
||||
Why not $harness
|
||||
|
||||
IMO there’s simply not much space between the end user and the model company. I
|
||||
get by far the best deal using a subscription. I currently have 4 OpenAI subs
|
||||
and 1 Anthropic sub, so my overall costs are around 1k/month for basically
|
||||
unlimited tokens. If I’d use API calls, that’d cost my around 10x more. Don’t
|
||||
nail me on this math, I used some token counting tools like ccusage and it’s
|
||||
all somewhat imprecise, but even if it’s just 5x it’s a damn good deal.
|
||||
|
||||
I like that we have tools like amp or Factory, I just don’t see them surviving
|
||||
long-term. Both codex and claude code are getting better with every release,
|
||||
and they all converge to the same ideas and feature set. Some might have a
|
||||
temporary edge with better todo lists, steering or slight dx features, but I
|
||||
don’t see them significantly out-competing the big AI companies.
|
||||
|
||||
amp moved away from GPT-5 as driver and now calls it their [26]“oracle”.
|
||||
Meanwhile I use codex and basically constantly work with the smarter model, the
|
||||
oracle. [27]Yes, there are benchmarks, but given the skewed usage numbers, I
|
||||
don’t trust them. codex gets me far better results than amp. I have to give
|
||||
them kudos tho for session sharing, they push some interesting ideas ahead.
|
||||
|
||||
Factory, unconvinced. Their videos are a bit cringe, I do hear good things in
|
||||
my timeline about it tho, even if images aren’t supported (yet) and they have
|
||||
the [28]signature flicker.
|
||||
|
||||
Cursor… it’s tab completion model is industry leading, if you still write code
|
||||
yourself. I use VS Code mostly, I do like them pushing things like browser
|
||||
automation and plan mode tho. I did experiment with GPT-5-Pro but [29]Cursor
|
||||
still has the same bugs that annoyed me back in May. I hear that’s being worked
|
||||
on tho, so it stays in my dock.
|
||||
|
||||
Others like Auggie were a blip on my timeline and nobody ever mentioned them
|
||||
again. In the end they all wrap either GPT-5 and/or Sonnet and are replaceable.
|
||||
RAG might been helpful for Sonnet, but GPT-5 is so good at searching at you
|
||||
don’t need a separate vector index for your code.
|
||||
|
||||
The most promising candidates are opencode and crush, esp. in combination with
|
||||
open models. You can totally use your OpenAI or Anthropic sub with them as well
|
||||
([30]thanks to clever hax), but it’s questionable if that is allowed, and
|
||||
what’s the point of using a less capable harness for the model optimized for
|
||||
codex or Claude Code.
|
||||
|
||||
What about $openmodel
|
||||
|
||||
I keep an eye on China’s open models, and it’s impressive how quickly they
|
||||
catch up. GLM 4.6 and Kimi K2.1 are strong contenders that slowly reach Sonnet
|
||||
3.7 quality, I don’t recommend them as [31]daily driver tho.
|
||||
|
||||
The benchmarks only tell half the story. IMO agentic engineering moved from
|
||||
“this is crap” to “this is good” around May with the release of Sonnet 4.0, and
|
||||
we hit an even bigger leap from good to “this is amazing” with gpt-5-codex.
|
||||
|
||||
Plan Mode & Approach
|
||||
|
||||
What benchmarks miss is the strategy that the model+harness pursue when they
|
||||
get a prompt. codex is far FAR more careful and reads much more files in your
|
||||
repo before deciding what to do. [32]It pushes back harder when you make a
|
||||
silly request. Claude/other agents are much more eager and just try something.
|
||||
This can be mitigated with plan mode and rigorous structure docs, to me that
|
||||
feels like working around a broken system.
|
||||
|
||||
I rarely use big plan files now with codex. codex doesn’t even have a dedicated
|
||||
plan mode - however it’s so much better at adhering to the prompt that I can
|
||||
just write “let’s discuss” or “give me options” and it will diligently wait
|
||||
until I approve it. No harness charade needed. Just talk to it.
|
||||
|
||||
But Claude Code now has [33]Plugins
|
||||
|
||||
Do you hear that noise in the distance? It’s me sigh-ing. What a big pile of
|
||||
bs. This one really left me disappointed in Anthropic’s focus. They try to
|
||||
patch over inefficiencies in the model. Yes, maintaining good documents for
|
||||
specific tasks is a good idea. I keep a big list of useful docs in a docs
|
||||
folder as markdown.
|
||||
|
||||
But but Subagents !!!1!
|
||||
|
||||
But something has to be said about this whole dance with subagents. Back in May
|
||||
this was called subtasks, and mostly a way to spin out tasks into a separate
|
||||
context when the model doesn’t need the full text - mainly a way to parallelize
|
||||
or to reduce context waste for e.g. noisy build scripts. Later they rebranded
|
||||
and improved this to subagents, so you spin of a task with some instructions,
|
||||
nicely packaged.
|
||||
|
||||
The use case is the same. What others do with subagents, I usually do with
|
||||
separate windows. If I wanna research sth I might do that in a separate
|
||||
terminal pane and paste it to another one. This gives me complete control and
|
||||
visibility over the context I engineer, unlike subagents who make it harder to
|
||||
view and steer or control what is sent back.
|
||||
|
||||
And we have to talk about the subagent Anthropic recommends on their blog. Just
|
||||
look at this [34]“AI Engineer” agent. It’s an amalgamation of slop, mentioning
|
||||
GPT-4o and o1 for integration, and overall just seems like an autogenerated
|
||||
soup of words that tries to make sense. There’s no meat in there that would
|
||||
make your agent a better “AI engineer”.
|
||||
|
||||
What does that even mean? If you want to get better output, telling your model
|
||||
“You are an AI engineer specializing in production-grade LLM applications” will
|
||||
not change that. Giving it documentation, examples and do/don’t helps. I bet
|
||||
that you’d get better result if you ask your agent to “google AI agent building
|
||||
best practices” and let it load some websites than this crap. You could even
|
||||
make the argument that this slop is [35]context poison.
|
||||
|
||||
How I write prompts
|
||||
|
||||
Back when using claude, I used to write (ofc not, [36]I speak) very extensive
|
||||
prompts, since this model “gets me” the more context I supply. While this is
|
||||
true with any model, I noticed that my prompts became significantly shorter
|
||||
with codex. Often it’s just 1-2 sentences + [37]an image. The model is
|
||||
incredibly good at reading the codebase and just gets me. I even sometimes go
|
||||
back to typing since codex requires so much less context to understand.
|
||||
|
||||
Adding images is an amazing trick to provide more context, the model is really
|
||||
good at finding exactly what you show, it finds strings and matches it and
|
||||
directly arrives at the place you mention. I’d say at least 50% of my prompts
|
||||
contain a screenshot. I rarely annotate that, that works even better but is
|
||||
slower. A screenshot takes 2 seconds to drag into the terminal.
|
||||
|
||||
[38]Wispr Flow with semantic correction is still king.
|
||||
|
||||
Web-Based Agents
|
||||
|
||||
Lately I experimented again with web agents: Devin, Cursor and Codex. Google’s
|
||||
Jules looks nice but was really annoying to set up and Gemini 2.5 just isn’t a
|
||||
good model anymore. Things might change soon once we get [39]Gemini 3 Pro. The
|
||||
only one that stuck is codex web. It also is annoying to setup and broken, the
|
||||
terminal currently [40]doesn’t load correctly, but I had an older version of my
|
||||
environment and made it work, with the price of slower wramp-up times.
|
||||
|
||||
I use codex web as my short-term issue tracker. Whenever I’m on the go and have
|
||||
an idea, I do a one-liner via the iOS app and later review this on my Mac.
|
||||
Sure, I could do way more with my phone and even review/merge this, but I
|
||||
choose not to. My work is already addictive enough as-is, so when I’m out or
|
||||
seeing friends, I don’t wanna be pulled in even more. Heck, I say this as
|
||||
someone [41]who spent almost two months building a tool to make it easier to
|
||||
code on your phone.
|
||||
|
||||
Codex web didn’t even count towards your usage limits, but [42]these days sadly
|
||||
are numbered.
|
||||
|
||||
The Agentic Journey
|
||||
|
||||
Let’s talk about tools. [43]Conductor, [44]Terragon, [45]Sculptor and the 1000
|
||||
other ones. Some are hobby projects, some are drowning in VC money. I tried so
|
||||
many of them. None stick. IMO they work around current inefficiencies and
|
||||
promote a workflow that just isn’t optimal. Plus, most of them hide the
|
||||
terminal and don’t show everything the model shows.
|
||||
|
||||
Most are thin wrappers around Anthropic’s SDK + work tree management. There’s
|
||||
no moat. And I question if you even want easier access to coding agents on your
|
||||
phone. The little use case these did for me, codex web fully covers.
|
||||
|
||||
I do see this pattern tho that almost every engineer goes through a phase of
|
||||
building their own tools, mostly because it’s fun and because it’s so much
|
||||
easier now. And what else to build than tools that (we think) will make it
|
||||
simpler to build more tools?
|
||||
|
||||
But Claude Code can Background Tasks!
|
||||
|
||||
True. codex currently lacks a few bells and whistles that claude has. The most
|
||||
painful omission is background task management. While it should have a timeout,
|
||||
I did see it get stuck quite a few times with cli tasks that don’t end, like
|
||||
spinning up a dev server or tests that deadlock.
|
||||
|
||||
This was one of the reasons I reverted back to claude, but since that model is
|
||||
just so silly in other ways, I now use [46]tmux. It’s an old tool to run CLIs
|
||||
in persistent sessions in the background and there’s plenty world knowledge in
|
||||
the model, so all you need to do is “run via tmux”. No custom agent md charade
|
||||
needed.
|
||||
|
||||
What about MCPs
|
||||
|
||||
Other people wrote plenty about MCPs. IMO most are something for the marketing
|
||||
department to make a checkbox and be proud. Almost all MCPs really should be
|
||||
clis. I say that as someone [47]who wrote 5 MCPs myself.
|
||||
|
||||
I can just refer to a cli by name. I don’t need any explanation in my agents
|
||||
file. The agent will try $randomcrap on the first call, the cli will present
|
||||
the help menu, context now has full info how this works and from now on we
|
||||
good. I don’t have to pay a price for any tools, unlike MCPs which are a
|
||||
constant cost and garbage in my context. Use GitHub’s MCP and see 23k tokens
|
||||
gone. Heck, they did make it better because it was almost 50.000 tokens when it
|
||||
first launched. Or use the gh cli which has basically the same feature set,
|
||||
models already know how to use it, and pay zero context tax.
|
||||
|
||||
I did open source some of my cli tools, like [48]bslog and [49]inngest.
|
||||
|
||||
I do use [50]chrome-devtools-mcp these days [51]to close the loop. it replaced
|
||||
Playwright as my to-go MCP for web debugging. I don’t need it lots but when I
|
||||
do, it’s quite useful to close the loop. I designed my website so that I can
|
||||
create api keys that allow my model to query any endpoint via curl, which is
|
||||
faster and more token-efficient in almost all use cases, so even that MCP isn’t
|
||||
something I need daily.
|
||||
|
||||
But the code is slop!
|
||||
|
||||
I spend about [52]20% of my time on refactoring. Ofc all of that is done by
|
||||
agents, I don’t waste my time doing that manually. Refactor days are great when
|
||||
I need less focus or I’m tired, since I can make great progress without the
|
||||
need of too much focus or clear thinking.
|
||||
|
||||
Typical refactor work is using jscpd for code duplication, [53]knip for dead
|
||||
code, running eslint’s react-compiler and deprecation plugins, checking if we
|
||||
introduced api routes that can be consolidated, maintaining my docs, breaking
|
||||
apart files that grew too large, adding tests and code comments for tricky
|
||||
parts, updating dependencies, [54]tool upgrades, file restructuring, finding
|
||||
and rewriting slow tests, mentioning modern react patterns and rewriting code
|
||||
(e.g. [55]you might not need useEffect). There’s always something to do.
|
||||
|
||||
You could make the argument that this could be done on each commit, I do find
|
||||
these phases of iterating fast and then maintaining and improving the codebase
|
||||
- basically paying back some technical debt, to be far more productive, and
|
||||
overall far more fun.
|
||||
|
||||
Do you do spec-driven development?
|
||||
|
||||
[56]I used to back in June. Designing a big spec, then let the model build it,
|
||||
ideally for hours. IMO that’s the old way of thinking about building software.
|
||||
|
||||
My current approach is usually that I start a discussion with codex, I paste in
|
||||
some websites, some ideas, ask it to read code, and we flesh out a new feature
|
||||
together. If it’s something tricky, I ask it to write everything into a spec,
|
||||
give that to GPT-5-Pro for review (via chatgpt.com) to see if it has better
|
||||
ideas (surprisingly often, this greatly improves my plan!) and then paste back
|
||||
what I think is useful into the main context to update the file.
|
||||
|
||||
By now I have a good feeling which tasks take how much context, and codex’s
|
||||
context space is quite good, so often I’ll just start building. Some people are
|
||||
religious and always use a new context with the plan - IMO that was useful for
|
||||
Sonnet, but GPT-5 is far better at dealing with larger contexts, and doing that
|
||||
would easily add 10 minutes to everything as the model has to slowly fetch all
|
||||
files needed to build the feature again.
|
||||
|
||||
The far more fun approach is when I do UI-based work. I often start with sth
|
||||
simple and woefully under-spec my requests, and watch the model build and see
|
||||
the browser update in real time. Then I queue in additional changes and iterate
|
||||
on the feature. Often I don’t fully know how something should look like, and
|
||||
that way I can play with the idea and iterate and see it slowly come to life. I
|
||||
often saw codex build something interesting I didn’t even think of. I don’t
|
||||
reset, I simply iterate and morph the chaos into the shape that feels right.
|
||||
|
||||
Often I get ideas for related interactions and iterate on other parts as well
|
||||
while I build it, that work I do in a different agent. Usually I work on one
|
||||
main feature and some smaller, tangentially related tasks.
|
||||
|
||||
As I’m writing this, I build a new Twitter data importer in my Chrome
|
||||
extension, and for that I reshape the graphql importer. Since I’m a bit unsure
|
||||
if that is the right approach, that one is in a separate folder so I can look
|
||||
at the PR and see if that approach makes sense. The main repo does refactoring,
|
||||
so I can focus on writing this article.
|
||||
|
||||
Show me your slash commands!
|
||||
|
||||
I only have a few, and I use them rarely:
|
||||
|
||||
• /commit (custom text to explain that multiple agents work in the same
|
||||
folder and to only commit your changes, so I get clean comments and gpt
|
||||
doesn’t freak out about other changes and tries to revert things if linter
|
||||
fails)
|
||||
• /automerge (process one PR at a time, react to bot comments, reply, get CI
|
||||
green and squash when green)
|
||||
• /massageprs (same as automerge but without the squashing so I can
|
||||
parallelize the process if I have a lot of PRs)
|
||||
• /review (built-in, only sometimes since I have review bots on GH, but can
|
||||
be useful)
|
||||
|
||||
And even with these, usually I just type “commit”, unless I know that there’s
|
||||
far too many dirty files and the agent might mess up without some guidance. No
|
||||
need for charade/context waste when I’m confident that this is enough. Again,
|
||||
you develop intuition for these. I have yet to see other commands that really
|
||||
are useful.
|
||||
|
||||
What other tricks do you have?
|
||||
|
||||
Instead of trying to formulate the perfect prompt to motivate the agent to
|
||||
continue on a long-running task, there’s lazy workarounds. If you do a bigger
|
||||
refactor, codex often stops with a mid-work reply. [57]Queue up continue
|
||||
messages if you wanna go away and just see it done. If codex is done and gets
|
||||
more messages, [58]it happily ignores them.
|
||||
|
||||
Ask the model to write tests after each feature/fix is done. Use the same
|
||||
context. This will lead to far better tests, and likely uncover a bug in your
|
||||
implementation. If it’s purely a UI tweak, tests likely make less sense, but
|
||||
for anything else, do it. AI generally is bad at writing good tests, it’s still
|
||||
helpful tho, and let’s be honest - are you writing tests for every fix you
|
||||
make?
|
||||
|
||||
Ask the model to preserve your intent and “add code comments on tricky parts”
|
||||
helps both you and future model runs.
|
||||
|
||||
When things get hard, prompting and adding some trigger words like “take your
|
||||
time” “comprehensive” “read all code that could be related” “create possible
|
||||
hypothesis” makes codex solve even the trickiest problems.
|
||||
|
||||
How does your Agents/Claude file look like?
|
||||
|
||||
I have an Agents.md file with a symlink to claude.md, since Anthropic decided
|
||||
not to standardize. I recognize that this is difficult and sub-optimal, since
|
||||
[59]GPT-5 prefers quite different prompting than Claude. Stop here and read
|
||||
their prompting guide if you haven’t yet.
|
||||
|
||||
While Claude reacts well to [60]🚨 SCREAMING ALL-CAPS 🚨 commands that threaten
|
||||
it that it will imply ultimate failure and 100 kittens will die if it runs
|
||||
command X, that freaks out GPT-5. (Rightfully so). So drop all of that and just
|
||||
use words like a human. That also means that these files can’t optimally be
|
||||
shared. Which isn’t a problem to me since I mostly use codex, and accept that
|
||||
the instructions might be too weak for the rare instances where claude gets to
|
||||
play.
|
||||
|
||||
My Agent file is currently ~800 lines long and feels like a collection of
|
||||
organizational scar tissue. I didn’t write it, codex did, and anytime sth
|
||||
happens I ask it to make a concise note in there. I should clean this up at
|
||||
some point, but despite it being large it works incredibly well, and gpt really
|
||||
mostly honors entries there. At least it does far far more often than Claude
|
||||
ever did. (Sonnet 4.5 got better there, to give them some credit)
|
||||
|
||||
Next to git instruction it contains an explanation about my product, common
|
||||
naming and API patterns I prefer, notes about React Compiler - often it’s
|
||||
things that are newer than world knowledge because my tech stack is quite
|
||||
bleeding edge. I expect that I can again reduce things in there with model
|
||||
updates. For example, Sonnet 4.0 really needed guidance to understand Tailwind
|
||||
4, Sonnet 4.5 and GPT-5 are newer and know about that version so I was able to
|
||||
delete all that fluff.
|
||||
|
||||
Significant blocks are about which React patterns I prefer, database migration
|
||||
management, testing, [61]using and writing ast-grep rules. (If you don’t know
|
||||
or don’t use ast-grep as codebase linter, stop here and ask your model to set
|
||||
this up as a git hook to block commits)
|
||||
|
||||
I also experimented and started using [62]a text-based “design system” for how
|
||||
things should look, the verdict is still out on that one.
|
||||
|
||||
So GPT-5-Codex is perfect?
|
||||
|
||||
Absolutely not. Sometimes it refactors for half an hour and then [63]panics and
|
||||
reverts everything, and you need to re-run and soothen it like a child to tell
|
||||
it that it has enough time. Sometimes it forgets that it can do [64]bash
|
||||
commands and it requires some encouragement. Sometimes it replies [65]in
|
||||
russian or korean. [66]Sometimes the monster slips and sends raw thinking to
|
||||
bash. But overall these are quite rare and it’s just so insanely good in almost
|
||||
everything else that I can look past these flaws. Humans aren’t perfect either.
|
||||
|
||||
My biggest annoyance with codex is that it “loses” lines, so scrolling up
|
||||
quickly makes parts of the text disappear. I really hope this is on top of
|
||||
OpenAI’s bug roster, as it’s the main reason I sometimes have to slow down, so
|
||||
messages don’t disappear.
|
||||
|
||||
Conclusion
|
||||
|
||||
Don’t waste your time on stuff like RAG, subagents, [67]Agents 2.0 or other
|
||||
things that are mostly just charade. Just talk to it. Play with it. Develop
|
||||
intuition. The more you work with agents, the better your results will be.
|
||||
|
||||
[68]Simon Willison’s article makes an excellent point - many of the skills
|
||||
needed to manage agents are similar to what you need when [69]managing
|
||||
engineers - almost all of these are characteristics of senior software
|
||||
engineers.
|
||||
|
||||
And yes, [70]writing good software is still hard. Just because I don’t write
|
||||
the code anymore doesn’t mean I don’t think hard about architecture, system
|
||||
design, dependencies, features or how to delight users. Using AI simply means
|
||||
that expectations what to ship went up.
|
||||
|
||||
PS: This post is 100% organic and hand-written. I love AI, I also recognize
|
||||
that some things are just better done the [71]old-fashioned way. Keep the
|
||||
typos, keep my voice. [72]🚄✌️
|
||||
|
||||
PPS: Credit for the header graphic goes to [73]Thorsten Ball.
|
||||
|
||||
New posts, shipping stories, and nerdy links straight to your inbox.
|
||||
|
||||
[75][ ] [76][ ] Subscribe
|
||||
2× per month, pure signal, zero fluff.
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
| [78]Edit on GitHub
|
||||
|
||||
• [79] ai
|
||||
• [80] claude
|
||||
• [81] engineering
|
||||
• [82] productivity
|
||||
|
||||
Share this post on:
|
||||
[83]Share this post on X [84] Share this post on BlueSky [85]Share this post on
|
||||
LinkedIn [86]Share this post via WhatsApp [87]Share this post on Facebook [88]
|
||||
Share this post via Telegram [89]Share this post on Pinterest [90]Share this
|
||||
post via email
|
||||
Back to Top
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
[92]
|
||||
Next Post
|
||||
Claude Code Anonymous
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
[93] Peter Steinberger on Github [94]Peter Steinberger on X [95] Peter
|
||||
Steinberger on BlueSky [96]Peter Steinberger on LinkedIn [97]Send an email to
|
||||
Peter Steinberger
|
||||
[98] Steal this post ➜ CC BY 4.0 · Code MIT
|
||||
|
||||
References:
|
||||
|
||||
[1] https://steipete.me/posts/just-talk-to-it#main-content
|
||||
[2] https://steipete.me/
|
||||
[4] https://steipete.me/posts
|
||||
[5] https://steipete.me/about
|
||||
[6] https://steipete.me/search
|
||||
[8] https://github.com/steipete/steipete.me/edit/main/src/content/blog/just-talk-to-it.md
|
||||
[9] https://x.com/christianklotz/status/1977866496001867925
|
||||
[10] https://x.com/pmddomingos/status/1976399060052607469
|
||||
[11] https://steipete.me/posts/2025/optimal-ai-development-workflow
|
||||
[12] https://x.com/steipete/status/1977771686176174352
|
||||
[13] https://x.com/steipete/status/1977498385172050258
|
||||
[14] https://gist.github.com/steipete/d3b9db3fa8eb1d1a692b7656217d8655
|
||||
[15] https://x.com/steipete/status/1977119589860601950
|
||||
[16] https://x.com/weberwongwong/status/1975749583079694398
|
||||
[17] https://x.com/steipete/status/1976353767705457005
|
||||
[18] https://x.com/steipete/status/1977072732136521836
|
||||
[19] https://x.com/vtahowe/status/1976709116425871772
|
||||
[20] https://x.com/s_streichsbier/status/1974334735829905648
|
||||
[21] https://x.com/kimmonismus/status/1976404152541680038
|
||||
[22] https://x.com/steipete/status/1978099041884897517
|
||||
[23] https://x.com/steipete/status/1975297275242160395
|
||||
[24] https://x.com/steipete/status/1977466373363437914
|
||||
[25] https://x.com/deepfates/status/1975604489634914326
|
||||
[26] https://ampcode.com/news/gpt-5-oracle
|
||||
[27] https://x.com/btibor91/status/1976299256383250780
|
||||
[28] https://x.com/badlogicgames/status/1977103325192667323
|
||||
[29] https://x.com/steipete/status/1976226900516209035
|
||||
[30] https://x.com/steipete/status/1977286197375647870
|
||||
[31] https://x.com/imfeat7/status/1977246145278583258
|
||||
[32] https://x.com/thsottiaux/status/1975565380388299112
|
||||
[33] https://www.anthropic.com/news/claude-code-plugins
|
||||
[34] https://github.com/wshobson/agents/blob/main/plugins/llm-application-dev/agents/ai-engineer.md
|
||||
[35] https://x.com/IanIsSoAwesome/status/1976662563699245358
|
||||
[36] https://x.com/steipete/status/1978104202820812905
|
||||
[37] https://x.com/steipete/status/1977175451408990379
|
||||
[38] https://wisprflow.ai/
|
||||
[39] https://x.com/cannn064/status/1973415142302830878
|
||||
[40] https://x.com/steipete/status/1974798735055192524
|
||||
[41] https://steipete.me/posts/2025/vibetunnel-first-anniversary
|
||||
[42] https://x.com/steipete/status/1976292221390553236
|
||||
[43] https://conductor.build/
|
||||
[44] https://www.terragonlabs.com/
|
||||
[45] https://x.com/steipete/status/1973132707707113691
|
||||
[46] https://x.com/steipete/status/1977745596380279006
|
||||
[47] https://github.com/steipete/claude-code-mcp
|
||||
[48] https://github.com/steipete/bslog
|
||||
[49] https://github.com/steipete/inngest
|
||||
[50] https://developer.chrome.com/blog/chrome-devtools-mcp
|
||||
[51] https://x.com/steipete/status/1977762275302789197
|
||||
[52] https://x.com/steipete/status/1976985959242907656
|
||||
[53] https://knip.dev/
|
||||
[54] https://x.com/steipete/status/1977472427354632326
|
||||
[55] https://react.dev/learn/you-might-not-need-an-effect
|
||||
[56] https://steipete.me/posts/2025/the-future-of-vibe-coding
|
||||
[57] https://x.com/steipete/status/1978099041884897517
|
||||
[58] https://x.com/steipete/status/1978111714685063640
|
||||
[59] https://cookbook.openai.com/examples/gpt-5/gpt-5_prompting_guide
|
||||
[60] https://x.com/Altimor/status/1975752110164578576
|
||||
[61] https://x.com/steipete/status/1963411717192651154
|
||||
[62] https://x.com/steipete/status/1973838406099874130
|
||||
[63] https://x.com/steipete/status/1973834765737603103
|
||||
[64] https://x.com/steipete/status/1977695411436392588
|
||||
[65] https://x.com/steipete/status/1976207732534300940
|
||||
[66] https://x.com/steipete/status/1974108054984798729
|
||||
[67] https://x.com/steipete/status/1977660298367766766
|
||||
[68] https://simonwillison.net/2025/Oct/7/vibe-engineering/
|
||||
[69] https://x.com/lukasz_app/status/1974424549635826120
|
||||
[70] https://x.com/svpino/status/1977396812999688371
|
||||
[71] https://x.com/Alphafox78/status/1975679120898965947
|
||||
[72] https://x.com/rohanpaul_ai/status/1977005259567595959
|
||||
[73] https://x.com/thorstenball/status/1976224756669309195
|
||||
[78] https://github.com/steipete/steipete.me/edit/main/src/content/blog/just-talk-to-it.md
|
||||
[79] https://steipete.me/tags/ai/
|
||||
[80] https://steipete.me/tags/claude/
|
||||
[81] https://steipete.me/tags/engineering/
|
||||
[82] https://steipete.me/tags/productivity/
|
||||
[83] https://x.com/intent/post?url=https://steipete.me/posts/just-talk-to-it
|
||||
[84] https://bsky.app/intent/compose?text=https://steipete.me/posts/just-talk-to-it
|
||||
[85] https://www.linkedin.com/sharing/share-offsite/?url=https://steipete.me/posts/just-talk-to-it
|
||||
[86] https://wa.me/?text=https://steipete.me/posts/just-talk-to-it
|
||||
[87] https://www.facebook.com/sharer.php?u=https://steipete.me/posts/just-talk-to-it
|
||||
[88] https://t.me/share/url?url=https://steipete.me/posts/just-talk-to-it
|
||||
[89] https://pinterest.com/pin/create/button/?url=https://steipete.me/posts/just-talk-to-it
|
||||
[90] mailto:?subject=See%20this%20post&body=https://steipete.me/posts/just-talk-to-it
|
||||
[92] https://steipete.me/posts/2025/claude-code-anonymous
|
||||
[93] https://github.com/steipete
|
||||
[94] https://x.com/steipete
|
||||
[95] https://bsky.app/profile/steipete.me
|
||||
[96] https://www.linkedin.com/in/steipete/
|
||||
[97] mailto:peter@steipete.me
|
||||
[98] https://github.com/steipete/steipete.me
|
||||
Reference in New Issue
Block a user