It took me years to teach co-workers and management that if we write it once, we test it once. Quality Assurance was always the bottleneck to releasing new sftware. We had so much spaghetti code that had to be tested that it impacted our release date by months, not weeks, every single time.
The key to success in changing the culture at my (former) company was to implement a suite of software tesing tools. Once the testers realized they could build (write) a set of tests and run it against the code over and over to their hearts' content, I had an army on my side. They began asking for reusable code so they could reuse the test harnesses they had already built.
I prototyped examples for the application developers and encouraged them to expand upon the ideas. Even the "quick and dirty" programmers began to catch on. I added extensive comments to my prototypes always making an effort to explain why more than what. "The user documentation explains what it does," I would tell them. "Use your comments to tell the next programmer what you were thinking and why you decided to write it this way."
The time it took to test and release software updates that included the reusable code decreased exponentially. Management was so impressed by the "time factor" that they began allowing us to rewrite sections of the spaghetti code with each new update/release. And what programmer doesn't relish the idea of rewriting some piece of crap instead of fixing it over and over?
Convincing the software testers of the benefits of reusable code was where I started. It was a huge success in my particular experience because they had always been the bottleneck. Removing that obstacle enabled more software releases in less time, which made management and customers ecstatic.