Nothing teaches you about security, rate limiting, or state management like a real person trying to break your app. A project with a live user base shows that you've moved past the "learning" stage and into "delivering value."
You nailed it. "Learning" is controlled and safe, but "delivering value" is messy and unpredictable. That’s where the real engineering happens—when someone uses your app in a way you never intended and you have to fix it on the fly.