Jim Duey surveys several abstraction techniques that can help in writing reusable code in Clojure.
Planning reusability is hard, designing for unforeseen reuse might be even harder. In this QCon London 2008 talk, Steve Vinoski presents some of the barriers to reuse found in typical distributed systems development approaches, and discusses how REST not only helps overcome some of these barriers, but also leads to potentially significantly increased chances for achieving serendipitous reuse.
In this talk, Markus Völter illustrates how model-driven and aspect oriented software development help addressing the challenge of managing variability in product line engineering. Both the problem space and the solution space are described by models, using a model-to-model transformation to map problem space variability to solution space variability.