Generic programming is largely an activity of "lifting" of specific computer code to a more widely useful level, while maintaining high standards of efficiency and other required properties. This process is aided by conceptual classification of software components according to rigorously specified requirements --- so much so that generic programming is sometimes characterized as "programming with concepts." The C++ Standard Template Library, STL, was the first generic software library to achieve widespread use. In this talk we look primarily at the STL's concept taxonomies, especially those for fundamental data-processing algorithms, containers, and iterators. We also call attention to new generic programming concepts found in other major generic libraries developed in the decade since the STL was first published, such as the Boost Graph Library. The talk concludes with a brief overview of current research on proof-based approaches to software design that can take advantage of semantic concept requirements expressed as formal axioms.