  There are countless reasons cited in scientific studies to explain the
difficulties in programming learning. The reasons range from the subject's
complexity, the ineffective teaching and study methods, to psychological
aspects such as demotivation. Still, learning programming often boils down to
practice on exercise solving. Hence, it is essential to understand that the
nature of a programming exercise is an important factor for the success and
consistent learning.
  This paper explores different approaches on the creation of a programming
exercise, starting with realizing how it is currently formalized, presented and
evaluated. From there, authors suggest variations that seek to broaden the way
an exercise is solved and, with this diversity, increase student engagement and
learning outcome. The several types of exercises presented can use gamification
techniques fostering student motivation. To contextualize the student with his
peers, we finish presenting metrics that can be obtained by existing automatic
assessment tools.
