Generic programming is widely practiced in the C++ community as a means of providing efficient, reusable libraries. This style of programming is characterized by the use of templates to define data structures and algorithms in terms of template parameters that can be replaced by user-supplied types and values later. Today, C++ templates are unconstrained, meaning that any type or value could potentially be substituted for a template parameter. This is clearly not the case, since for example, taking the arithmetic mean of a sequence of strings is almost certainly meaningless. The Concepts Lite Technical Specification extends the C++ programming language with features that support the specification and checking of constraints on template arguments. This talk focuses on principles of generic programming using concepts.