"Thus everybody has certain rules according to which he acts in dealing with his tailor. These rules are, we will grant, soundly based on genuine experience ;and by acting on them a man will deal fairly with his tailor and helps his tailor to deal fairly by him. But so far as he acts according to these rules, he is dealing with his tailor only in his capacity as a tailor, not as John Robinson, aged sixty, with a weak heart and a consumptive daughter, a passion for gardening and an overdraft at the bank. The rules for dealing with tailors no doubt enable you to cope with the tailor in John Robinson, but they prevent you from getting to grips with whatever else there may be in him. Of course, if you know that he has a weak heart, you will manage your dealings with him by modifying the rules for tailor-situations in the light of the rules for situations involving people with weak hearts. But at this rate the modifications soon become so complicated that the rules are no longer of any practical use to you. You have got beyond the stage at which rules can guide action, and you go back to improvising, as best you can, a method of handling the situation in which you find yourself."
--
From the autobiography of R.G. Collingwood. His writings often have the theme of trying to understand particular instances of a thing on its own terms, only generalising into abstractions when seeing some quality in crowds of individual instances. I've rarely regretted that same approach when it comes to abstraction in code/software, but have regretted premature abstraction many times.