A lot of people suspected that most programs were absurdly redundant and for a very long time. The real issue is that the languages do not really allow for producing code that can be easily shared. Some of the functional languages do, but mostly in ways that are completely irrelevant and useless in practice for such a goal.
Programmers writing their fiftieth mostly identical CRUD handler may not have noticed but a lot of other people did.