My experience with both object oriented programming and design patterns mirrors yours, and probably nearly every one of our colleagues who started in the 1970's. Along those same lines, I was once asked to fix a program that had been written by a brand new graduate, so new that the ink wasn't dry on his Computer Science diploma. It was modularized, as was the fashion of the day, in the extreme. If even a single statement appeared in two or more places in the program, it was implemented as a function. After studying it for a few hours, I scrapped the entire program, and rewrote it from scratch. With a total expenditure of about two days, I had a completely rewritten, tested replacement for the program. While it was modular, it wasn't slavishly so; there were places here and there where the same statement appeared in two or more places. So what? In the grand scheme of things, that might have made toe object code a hundred bytes bigger, which didn't matter, even then, when we measured programs' memory consumption in kilobytes.
David A. Gray Delivering Solutions for the Ages, One Problem at a Time Interpreting the Fundamental Principle of Tabular Reporting