So, you might ask "Why are you building X when Y exists". The answer is usually something to the effect of "I can't interface with Y". Programming languages themselves are one of these obstacle. So is linking to system libraries. (e.g. many C and C++ code bases) C-FFI sometimes makes this easier though.
I value low-friction interfaces in software, and I think this is usually not done well.
Another example: I think this is why I dislike Async rust so much. It places a barrier within the language.
Some concrete anecdotes from the past few days: Why am I writing SPME algorithms, asking an LLM to implement a linear constraint solver, etc? Those and many more algorithms that have existed and been heavily used for decades? No/shitty rust libs, and the C/C++ libs have no good way I can interface with, aren't documented well, license concerns etc. I.e., I could try to re-use, but instead re-write because it's, surprisingly, the lower-friction option.
People lament re-inventing wheels, but often miss that the off-the-shelf wheels each have their own bolt patterns, brake interfaces, and dimensions. And sometimes they look solid, but have subtle defects.
Software is just one of the ways for users to achieve their desired outcome (eg: keeping track of business expenses / flow etc) , excel can do it, but some other software might make it easier than excel, with better UI etc.
If you want to succeed in making software, study the users workflow rigorously. "Users don't love software, users tolerate software to achieve the outcome they want"
We still don't have a Memex. We got close once.
We also don't have capability based operating systems in daily use.
There's a ton of software we still don't have, and need.
[1] https://www.theatlantic.com/magazine/archive/1945/07/as-we-m...
[2] https://worrydream.com/refs/Bush%20-%20As%20We%20May%20Think...
Most of what passes for "software" these days is basically some niche hardcoded workflow that falls to pieces if you try to do anything even the slightest bit different.