news
Programming Leftovers
-
Xe's Blog ☛ Humanity's last programming language
What if markdown was executable? You get markdownlang.
-
Artyom Bologov ☛ Package-Inferred Systems are Dangerous
Package-inferred systems are an ASDF (Common Lisp build system) extension. This extension results from a popular style of Common Lisp programming: spawning one package per file and controlling its imports per file/package. While I don’t necessarily like this style, I have to acknowledge its benefits: [...]
-
Andy Bell ☛ It’s about to get a lot easier for your JavaScript to clean up after itself
According to the grand unified theory of Muppet types, there are two types of JavaScript developer: Chaos Muppets and Order Muppets.
-
Rob Knight ☛ Forgejo Support for EchoFeed
I've just merged in support for Forgejo to EchoFeed. Forgejo is a "self-hosted lightweight software forge" aka "We have GitHub at home"[1]. Adam is running an instance as part of omg.lol.
-
Ian Duncan ☛ What Functional Programmers Get Wrong About Systems
Static types, algebraic data types, making illegal states unrepresentable: the functional programming tradition has developed extraordinary tools for reasoning about programs. I have spent over a decade writing Haskell professionally, and I believe in all of it.
But the very effectiveness of these tools creates a particular susceptibility. We sometimes mistake reasoning about programs for reasoning about systems. These are not the same activity, and the instincts that make you good at one do not automatically transfer to the other.
-
Den Odell ☛ Fast by Default
After 25 years building sites for global brands, I kept seeing the same pattern appear. A team ships new features, users quietly begin to struggle, and only later do the bug reports start trickling in. Someone finally checks the metrics, panic spreads, and feature development is put on hold so the team can patch problems already affecting thousands of people. The fixes help for a while, but a month later another slowdown appears and the cycle begins again. The team spends much of its time firefighting instead of building.
I call this repeating sequence of ship, complain, panic, patch the Performance Decay Cycle. Sadly, it’s the default state for many teams and it drains morale fast.
There has to be a better way.
-
[Old] Paul Boyd ☛ Introduction to rewriting Git history | pboyd.io
But, while small commits are great, it’s not very helpful to look back in the history and find hundreds of 2-line commits with monosyllabic commit messages where some portion turn out to be an unreleased development dead-end. Yes, merge commits do wonders for grouping these commits into logical chunks, but I think spending a few minutes to clean up the history before you merge makes for a history that is much easier to understand later.
Rewriting Git’s history is not hard, but it’s not obvious either. If a reviewer says, “can you squash these commits?” it isn’t clear to the uninitiated that this means git rebase -i. So this post introduces the commands you need to produce a clean commit history that will be pleasant to use later. For the examples, I assume you’re working on a feature branch that will be merged into a branch called main.
-
James Randall ☛ I Started Programming When I Was 7. I'm 50 Now, and the Thing I Loved Has Changed
Here’s the part that makes me laugh, darkly.
I saw someone on LinkedIn recently — early twenties, a few years into their career — lamenting that with AI they “didn’t really know what was going on anymore.” And I thought: mate, you were already so far up the abstraction chain you didn’t even realise you were teetering on top of a wobbly Jenga tower.
They’re writing TypeScript that compiles to JavaScript that runs in a V8 engine written in C++ that’s making system calls to an OS kernel that’s scheduling threads across cores they’ve never thought about, hitting RAM through a memory controller with caching layers they couldn’t diagram, all while npm pulls in 400 packages they’ve never read a line of.
But sure. AI is the moment they lost track of what’s happening.
The abstraction ship sailed decades ago. We just didn’t notice because each layer arrived gradually enough that we could pretend we still understood the whole stack. AI is just the layer that made the pretence impossible to maintain.
-
Nicholas Tietz-Sokolsky ☛ Using an engineering notebook
One of my core software engineering practices is writing, by hand, in a physical notebook[1]. It's one of the most important things I do to remain productive and effective. Maybe the single most important. And it's a practice that I see very few others using!
-
Perl / Raku
-
[Old] PerlMonks ☛ DBI recipes
Programming with the DBI becomes a matter of habit. You may choose to code directly with the DBI rather than using on of the many wrappers available on CPAN because of efficiency concerns, or because you are dealing with legacy code, or simply because you want to have a grip at the core of things. Whichever reason for using the DBI directly, the time comes when you have to face one of the simple problems listed here. If you were looking for answers, this is the place to go. If you found the answer on your own, let's compare notes. Either way, enjoy the reading.
-
-
R / R-Script
-
Rlang ☛ Introducing flownet: Efficient Transport Modeling in R
I am excited to introduce a new R package called flownet providing high-performance tools for transport modeling—network processing, route enumeration, and traffic assignment in R. As of now, the package implements the Path-Sized Logit (PSL) model (Ben-Akiva and Bierlaire, 1999)—a powerful and well-established method for stochastic traffic assignment accounting for route overlap—alongside a novel route enumeration algorithm and a highly efficient All-or-Nothing assignment solution. Furthermore, it provides powerful utility functions for (multimodal) network processing, including recursive graph consolidation/contraction, and/or simplification. These features, combined with an accessible representation of graphs and (sparse) origin-destination (OD) matrices using data frames and a parsimonious API, make it a compelling toolbox for both transport analytics and graph manipulation.
-
-
Shell/Bash/Zsh/Ksh
-
University of Toronto ☛ Moving to make many of my SSH logins not report things on login
Many years ago I modified my shell environment on our servers so that it wouldn't report the currently logged in users, show the motd, or tell me my last login. But I kept the 'uptime' line: [...]
-
-
Java/Golang
-
Andrew Nesbitt ☛ Lockfiles Killed Vendoring
Whilst I was implementing a vendor command in git-pkgs, I noticed that not many package manager clients have native vendoring commands. Go has go mod vendor, Cargo has cargo vendor, and Bundler has bundle cache. That’s most of the first-class support I could find, which surprised me for something that used to be the dominant way to manage dependencies. So I went looking for what happened.
-
Paul Boyd ☛ Redefining Go Functions
I once wrote a Perl subroutine that would memoize the subroutine that called it. That much was useful, but then it inserted a copy of itself into the caller, so that its callers would be memoized too. A well-placed call to aggressively_memoize could back-propagate to the whole codebase, spreading functional purity like a virus. The resulting program would get faster as it used more memory and became increasingly static.
That was possible because Perl, like many interpreted languages, allows functions to be rewritten at runtime: [...]
-
-
Rust
-
Niko Matsakis: Dada: moves and mutation
Let’s continue with working through Dada. In my previous post, I introduced some string manipulation. Let’s start talking about permissions. This is where Dada will start to resemble Rust a bit more.
-