"Duplication is cheaper than the wrong abstraction" makes sense coming from the Rails community. Between the meta-programming, lack of static types, large amount of unit tests, etc. Rails has a tendency to lock a project into an abstraction choice & is very expensive to change. The pain is particularly intense during major version Rails upgrades. From my experience, the Rails framework got in the way & bogged down project velocity. It was difficult to move away up to ~2010 as many of the jobs were locked into Rails. There were many frustrated Rails programmers around that time. When node.js, Go, & other languages/platforms came out, there were finally full stack libraries that did not lock in abstractions as heavily as Rails. Nowdays, I use astro.js, solid.js, & target isomorphic libraries. The flexibility of Javascript with the static types of Typescript make changing abstractions significantly easier. The Javascript ecosystem spent far too long focusing on SPAs when the isomorphic MPA was low hanging fruit.