Abstract programming