Comment by scorpioxy
1 day ago
Interesting point of view and I think feedback is good. Although I agree with the overall sentiment of the article, I disagree with the intensity of the criticism.
Having a command runner within your project will mask a lot of the issues the author mentioned. And although, in my experience, having a command runner for mid-sized projects and up is useful for many things, masking the UX issues means there's a problem.
I got on the uv bandwagon relatively recently as most of my work is maintaining older python projects so I've been using it for new builds. Although the speed part is welcome, I couldn't see what the big deal is and mostly keep on using it because it is a popular tool(there are benefits to that in my line of work) and not necessarily because it can do something that couldn't be done before though with a couple of other tools. Whether it is beneficial or detrimental to having all of that functionality within one tool, to me, is a matter of opinion.
The problem to me is that I've seen this cycle many times before. New tool shows up claiming it is far superior to everything else with speed being a major factor and everyone else is doing it wrong. Even though the new tool does a fraction of what the old "bad" tool is doing. With adoption comes increased functionality and demands and the new tool starts morphing into the old tool with the same claimed downsides. The UX issues to me are a symptom of that process.
I still think uv is a fine tool. I've used poetry before and sometimes plain old pip. They're all fine with each tool catering to different use cases, in my opinion. Sometimes you have to add pyenv, sometimes you don't. Sometimes you add direnv, sometimes you don't and so on. And I've cursed at everyone of them at times. However, the fanboyism is very strong with uv which makes me wonder why.
For me, and I suspect many others, the big deal is that it makes env management simply disappear. Before uv I used conda+poetry for years, and there was always the need to activate the env before doing anything (I used autoenv and ended up with .env files containing "conda activate <env_name>" in every project), and various other small pains that I actually became accustomed to over the years, but then I'd always be surprised when someone said X didn't work when it was fine for me. The uv came and I felt a great relief that I didn't know I was missing, and suddenly there were also no more surprises.
uv has a lot of great features, but the dependency resolution is why I'm a fanboy. It can resolve trees that pip gives up on, and it does it 20x faster than poetry (100x faster than pip) - saves me half an hour on some big projects. All the python resolution and environment management and stuff is just gravy.
Yeah, this is when it really matters that they wrote it in a CPU-performant language. There have been times I pointed uv at a random pip-managed GitHub project to rescue it because the author forgot to specify some versions and entire deps in requirements.txt. It even took uv a bit of chugging to find an overlap. Also wow, those packages had a lot of pointless breaking changes.
I don't do Python all that often, but I got sold on uv when a year or so ago I wanted to try to fix a small bug in a relatively niche Python open source I was trying to use, and it used a packaging tool I hadn't even heard of before (pdm). I was able to run `uv tool run pdm <whatever other arguments I needed>` without having to know anything about how pdm worked or worry about how to properly install yet another python tool and figure out whether I needed to be concerned about whether it might try to use system (or user local) versions of packages I had installed or get pointed at a magic hidden directory that I had to create first. When I realized I might never have to care about that ever again for any Python tool, I was hooked.
1 reply →
Rust isn't the main reason it's fast. The main reason is willingness to break backwards compatibility. https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html
3 replies →
I've only seen pip give up twice and both times were due to bugs that were actively being worked on and the project dependencies were quite old. Perhaps that's why I am less impressed. Don't get me wrong, working faster without any downside is great. But I don't change dependencies all that often for it to matter if it does it in 5 seconds or 30.