Well, both of course.
I get tired of the argument that "you ain't gonna need it".
It's important that we always refactor our code. Even if we never touch it again, the process itself is the most important part.
The skills we pick up as we refactor our code makes us more efficient at spotting opportunities to refactor and at quicker at implementing the changes.
Once you start refactoring everything you start to notice the consistencies in your codebase then you can decide whether or not it's worth abstracting them away.
Sure sometimes you can take an abstraction too far but you'll never know whether it's worth it or not without a lot of practice and experience.
The only way to get that is to refactor everything all the time.
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.