Узко мыслите, коллега! Говорите работает? А вы уверены?
Сравнительно большую программу просто невозможно протестировать во
всех вариантах использования. И тогда в программу начинают
добавляться механизмы обнаружения что что-то идет не так, механизмы
"выруливания" когда что-то пошло не так, и т.д. В итоге на байт
полезного кода добавляется десять байт кода контроля и компенсации
ошибок. Я так думаю. А еще "потребность в софте" она не константа. Одну и ту же задачу можно решить разными методами. Например, простой перебор или поиск методом половинного деления. Простой перебор требует много ресурсов, что бы успевать за отведенное время, но прост в реализации. Метод половинного деления гораздо быстрее, но сложнее проверить что ваша реализация не содержит ошибок. Т.е. требуется написать тесты, проверяющие что оно работает как надо, либо переживать "а вдруг там ошибка?" В итоге, минимальное железо требует бОльших усилий от программиста, а программисты пока еще дороже железа.