Допустим, программисту нужно реализовать... скажем, приготовление чая.
За вполне разумное время он создает устройство, способное разливать 242 миллилитра зеленого жасминового чая в коричневые керамические чашки.
Реализовав методом копипастнига устройство, разливающее 238 миллилитров черного чая с сахаром в стеклянные чашки, и устройство, разливающее 304 миллилитра черного чая с клубникой в гжельские, программист понимает, что нужно генерализовать решение. Он пишет спецификацию и устремляется в бой.
Через полгода напряженной работы выясняется, что из восьми реализаций (необходимого для дальнейшего прогресса) модуля, превращающего воду в вино, пять так и остались на уровне спецификаций, два выдают подкрашенную воду, а один вроде как работал, но код найти не удается, а автор уже больше тысячи лет не отвечает на почту, проект встает, программист в отчаянии опускает руки и пытается копипастингом приспособить свое устройство под изготовление куриного бульона из кубиков.
Это я к чему? Да просто так, к тому, что излишнаяя генерализация ничем не лучше излишней специализации. Меру надо знать в проектировании...