Iterative Software Development: from Theory to Practice