The course is focused on expressing software at all levels of development by adequate models. From the initial specification to implementation, each software model can be perceived as a specification, and the software development process can be perceived as refinement or concretization of the specification. A special attention is paid to use cases and UML, but the course also presents formal approaches to software modeling.