When a person decides they want to start building furniture for a living, they may keep their day job, start buying materials and crafting them into furniture, then selling the pieces as they complete them in order to buy more materials, tools, and workshop space. Each piece they build increases their skill. They get better at making truer cuts. Faster at working. They lay their workshop out more efficiently. They test out techniques that help the furniture last. They learn what are characteristics of good woods.
There are endless things they get better at. If someone has made and sold 500 pieces of furniture, they are no doubt skilled at that point. Each one of those pieces was a learning experience.
Contrast this with software. A programmer could be writing his first piece of software. He could sell it to 500 people and each copy is the same with no learning coming along with each additional copy or sale. He’s not in the same boat as his counterpart making furniture. Each sale doesn’t necessarily allow or push him to get better. Software scales so easily that companies do it before they are skilled. Imagine a furniture company scaling to 1000 pieces a week when they aren’t highly skilled at making 1 yet. At scale, in addition to the normal worries about quality, they need to train others, manage a large workshop and its supplies, worry about distribution, order fulfillment, customer satisfaction, etc. It couldn’t be done, it would quickly collapse.
Software survives this if it’s in a space with little competition because scaling to more customers is nearly free.
Now you know why most software isn’t as great as it could be.
P.S. You may like other posts I’ve written at noneofthisisright.com