[The course is held in English language]

The evolution of computing resulted in not only a skyrocketing number of computing devices (approximated to be reach around 30 billion in 2020), but also in the diversity of these devices. With ubiquity came specialisation, thus, in order to address different needs, devices come with different processing, storage, sensing, and networking capabilities, energy requirements, they support different interaction modalities, etc.

In this course, in contrast to general purpose programming, we concentrate on software development for specific platforms, such as mobile, embedded, low-power, networked, and others. We particularly concentrate on the constraints and mechanisms that characterise a particular platform, as well as on the programming APIs available at the platform. Since many of the platforms are already covered by other courses in the curriculum, in this class we pay a particular attention to mobile and embedded computing. A large part of this course covers programming in Android, the most popular mobile computing platform. We thoroughly cover a number of aspects of Android programming, including user interface development, networking, sensing, background processing, and distributed (client-server) application development. We also address aspects related to machine learning on resource-constrained devices and energy-efficient context inference.

The course involves a significant practical programming component. Weekly labs are mandatory and focus on different mobile and embedded programming concepts. A key part of the course is a semester-long Android project managed via four Scrum programming sprints. The course also includes the final exam.