We adopt the view that CS1 labs are not programming assignments, and that they should not be used for grading students or assessing their level of understanding. Instead, we think of them as teaching instruments that complement lectures by teaching the same material but in an exploratory fashion. But for labs to play this pedagogical role, certain conditions must be met in terms of how they are written and the complexity they expose. In this paper we present guidelines for designing the labs and for the Java packages that must accompany them, with special emphasis on software engineering. Our own experience with implementing these guidelines, together with a few samples, is included.