Design Patterns and Emergent Architecture

This course is intended for software engineers and software architects and fits an agile process that they may have deployed in their organization.

The proposed training program focuses on the application of design patterns from the Gang of Four to satisfy non-functional requirements and to obtain a software architecture that can withstand software evolution in an emergent manner. The basic idea that permeates the course is that non-functional improvements are made by transforming and refactoring a software application using patterns. An important aspect is the shaping of component interfaces in a way that makes integration easier by guaranteeing backwards compatibility with existing client code. 

The program offers a healthy mix of theory and exercises. In the exercises the participants must select a pattern to improve an existing design on a particular non-functional aspect. Typical such aspects are scalability, reuse, extensibility and portability. The last half day of the course addresses various architectural patterns from Buschmann et al. and shows how these architectures can be realized using the GoF design patterns by making stepwise transformations. For additional info, click here.

This training is available for open enrollment as well as for in-company sessions. For in-company sessions, the Design Patterns training can be adapted to your situation and special needs.

Emergent Object-Oriented Design in the Age of AI

Creating software that is maintainable, extensible, and meets user needs is a challenge for many development teams. This course provides practical techniques to analyze a domain and design object-oriented software using a structured approach.

The course begins with an introduction of object-oriented programming. One of the main strengths of object orientation is that code is decomposed into objects, enabling developers to use objects from the problem domain – their responsibilities, behaviors, and interactions – as the starting point for design.

The key to dealing with the complexities of software development is separating analysis – understanding what the application should do – from design – determining how it should work. This is reflected in the structure of the course; the first part focuses on analysis, while the second part addresses design. In real-world projects, these activities are applied in rapid, iterative cycles to build software incrementally.

Analysis focuses on describing the domain without worrying about technical details. It is difficult to automate, as it typically involves close interaction between domain experts and the development team. The outcome of the analysis serves as the foundation for the design phase, where non-functional requirements are incorporated through iterative model transformations. Mastering design skills is more important than ever, particularly with the rise of AI-assisted development that boosts coding productivity.

This training is available for open enrollment as well as for in-company sessions. For in-company sessions, this OOAD training can be adapted to your situation and special needs.

Multicore Programming in C++

Well-performing multithreaded code is still a mystery to many. This 3-day course teaches participants how to benefit from the power of modern multicore processors by understanding the ins-and-outs of parallelism, the parallel programming paradigms, applying parallel patterns and avoiding common pitfalls.

This training is available for open enrollment as well as for in-company sessions. For in-company sessions, the Multicore programming in C++ training can be adapted to your situation and special needs.

Good Software Architecture

This course teaches you to bridge customer needs, technological constraints, and the development process. The architecture task is all about main decisions that define the creation and working of a system, and how it fits into its environment. Architecture decisions determine the structure and style of the system, and the main guidelines for its realization.

This training stands out because you will:

  • get a clear grip on what a good architecture means in your context
  • apply insights directly to your own case with personal coaching
  • strengthen your reasoning on quality attributes
  • integrate business value, technical constraints, and development process
  • use the Architecture Reasoning Model (ARM) as a unifying framework
  • learn from Robert Deckers, EngD, PhD — with consistently high participant satisfaction

This course focuses on the definition of an architecture that is well-engineered, fits its context, and communicable. You will learn how architecture puts technical design in the context of the customer needs and other stakeholder concerns, and in the context of the development process. You are asked to bring your own case which will be addressed during the training. Also, the homework assignment for the period in between the two modules will focus on your case as well.

This training is available for open enrollment as well as for in-company sessions. For in-company sessions, the Good software architecture training can be adapted to your situation and special needs.

Software Engineering for Non-Software Engineers

In the High Tech Industry a lot of projects have a multidisciplinary character. People from different disciplines have to work together closely to create optimal solutions, making 1 + 1 = 3.

Multidisciplinary teamwork means understanding “just enough” about what the other is doing, what kind of world colleagues or others are living in. Especially for engineers designing real tangible stuff it is not easy to understand how the abstract software world looks like. But at the same time, the amount of software in complex systems is growing rapidly.

The workshop focusses on machine control: situations where software controls the behaviour of the machine and makes the system alive. So it includes topics like embedded and real-time software and error handling. But also several general software topics are covered, e.g. the difference between programming and software engineering, software deployment and the software life cycle.