UV, making Python a solved problem
Around 15 years ago Go was launched to help get people to stop using Python. 10 years ago, it was all anyone would talk about. You couldn’t get anyone to shut up about Go. It was going to save the world and cook me breakfast. We ignored the error handling, the lack of list comprenhension, finally they added generics, on and on. We let the excuses for the language pile up for years. Why? Easy. It’s the deployment. One file. You can’t get easier than that. Although Python had Pex early on, it was only recently where it could be used batteries included with an interpreter. Pex solved a lot, but there was still the necessary step to build everything into a single binary, and unlike Go, the build process wasn’t batteries included.
UV, at this point I hope needs no introduction. It solves every build related problem in a way that was only possible after learning from the mistakes of every other effort (and there were a lot). Development environments are a snap to setup and duplicate, but ‘uv run’ took it to a whole nother level. Python recently added the ability to inline dependencies, and combine with uv’s runner, it’s the ultimate high ground in shipping arbitray code and making it work for people with no configuration. Pip, for all it’s flaws, can package and host code in plain git repositories, and uv can run code directly out of pastebin, or github gists. This is more than a neat parlor trick, this lowers the entry barrier to practically nothing. Python now finally has fought back against Go’s original reason for being funded and developed. It killed it’s original purpose. I can’t overstate how huge of shift this is. For all intents and purposes, Go is no longer in the running for 90% of new projects.
I’m working with Go right now, it’s the same problem it’s always been. Building from cloned repos, error handling, obnoxious terseness. All for what? The particular project I’m involved with does not benefit from it’s speed advantage. Most don’t, and people are no longer picking Go for speed with Rust and Zig being available. Go will always be a good middleground, with excellent tooling, and projects that previously switched to Go like Kubernetes or… Kubernetes, are not likely to change at this point. That’s not good enough for newer projects though.
From now on, I’ll stop being a contrarian and reach for Python first thing. It’s the only universal language that matters, like English. Hating it is futile. Dataclasses help me hide most of the ugliness I hate about it, and I can live with the rest, much easier than the terse, blunt, stupid of Go. Go is more popular than ever, sure, but UV is going to beat it into the ground. Betting against Python is not a mistake I will make again.