using existing software to make new programs
using existing software artifacts to construct a new software system
study of how computers can improve their performance without explicit commands programmed by humans by training algorithms to learn from previous data and examples