Learning Goals

In this course you will learn about systems in which communication is an important part of functionality. We will study technologies to build these systems, how communication protocols can be used in combination with components and program code.

You will also learn how to describe these types of systems. We will create system models with various notations, at various levels of detail and with different degree of rigor. This includes formal modeling in terms of state machines, but also simple and effective sketches of the system on a whiteboard. As part of this, you will learn how to think in states and transitions, and how to describe complex interactions efficiently.

Part of system development is also the coordination of a team of developers and the management of resources. You will therefore learn about development processes and directly experience the dynamics in a team.

This means there are three layers of things to learn in this course: Technologies, how to specify them, and how to organize a development project and team. Maybe we could have a separate course on each of them — there would be more than enough to learn for any of these. But in this course, it is especially the combination of these three layers. If you are working as an engineer in any realistic project, elements from all of these three layers matter, are interconnected with each other and lead to a complex problem. Just being good ad one of these levels is not sufficient.

The following are the learning goals in this course. I think they are well-aligned with what a future employer will expect from you. All goals should be useful in many situations and roles within technology.


Learning Goal


1. Classify different types of requirements, and explain the main activities during requirements development. Recite potential problems during requirements engineering.

Learn to ask the right questions. You have an idea about what can go wrong, you anticipate customer concerns, even if they don't know themselves.

2. Recognize modeling elements in UML, properly explain their semantics, and correctly map them to program code. This comprises use case, sequence, state machine and deployment diagrams, among others.

UML defines many standard modeling diagrams. The actual syntax does not matter too much, but we need precision to detect flaws and achieve consistency. Once you have understood the basic diagram types, you can easily learn others (like for example BPEL).

3. Understand and describe the main features of application protocols (like HTTP and MQTT), and select and apply them efficiently and correctly to a system architecture.

Communication is what keeps system components together and makes them form a whole. Often, different system components are realized by different stakeholders. Fragile communication between system components is therefore a major concern.

4. List and explain the main elements in a development method as for instance Scrum, and reason about their applicability in a given development context.

Agile methods of some form are now used for many projects. Learn about the key concepts in agile methods.


Learning Goal


5. Capture user requirements and synthesize relevant use cases at a proper level of detail.

This is an underestimated skill. The resulting use cases are often written in text and don't look spectacular. But formulating bad use cases is the earliest phase in a project where things can go wrong.

6. Write project deliverables that describe system requirements, properties and solutions.

Producing the right documents, emphasizing relevant questions, reasonable precision level. Can uncover project problems early or even before they arise. Again, learn to ask the right questions.

7. Plan and coordinate the development of larger software products within a team of developers.

To coordinate a project, you need to know a lot about the architecture of a system, but also the process how to build it and potential pitfalls.

8. Think in terms of states and transitions, and handle complex concurrent behavior correctly.

It is a valuable skill as an engineer to handle concurrent behavior correctly, independent of technical domain or employed tools.

9. Model different aspects of a system efficiently, especially with regard to an appropriate level of detail and the consistency between different views.

Modeling is a universal engineering tool in all disciplines and at all stages of system development.

10. Apply agile development methods and reflect about their usage within the context of a project.

Selecting and reflecting over development methods: How much should you plan ahead? Should you use an agile method? Read an article on development methods, and understanding it based on own experience.

11. Make proper design choices for the system architecture and document them accordingly.

Learn how to reason about different alternatives together with others. This can happen at a whiteboard or through a document. No matter how, good visualizations are helpful in this task.

General Competence

Learning Goal


12. Organize and facilitate meetings in which use cases and user requirements are solicited, discussed and evaluated.

In engineering, we often focus about building the system ''right''. Building the right system is equally important.

13. Managing the work of several developers.

The technical challenges are only one aspect that make system development difficult. Co-workers and other resources also need to be handled and planned.

14. Facilitate team discussions and brainstorming sessions.

How can you organize collaboration with your colleagues so that work is done efficiently in a good working environment.

15. Provide feedback to the work of others that is critical, constructive and relevant.

Everybody likes to receive constructive feedback — providing it needs to be learned.

16. Reflect over own work done individually and in a team.

Reflection is the basis for improving and adjusting development processes. It also helps to create good learning and working conditions.