A discussion is presented on parameterized programming, a powerful technique for the construction, maintenance, and reuse of software in which modules may be parameterized over very general interfaces that describe what properties of an environment are required for the module to work correctly. Ease of construction, maintenance, and reuse of software are all enhanced by the flexibility of the parameterization mechanism provided. The basics of OBJ2, a language designed to support parameterized programming using algebraic specification techniques, are presented. OBJ2 provides facilities for user-definable abstract data types, parameterized abstract objects, and interactive programming. It is a functional programming language based on equational logic, rather than on general first-order logic; because equations can be interpreted directly as rewrite rules, it is easy to see their computational significance as well as their logical significance. Some simple examples of parameterized programming in OBJ2 are provided.