A widely used technique to write re-usable programs