Software has become one of the key enablers of modern society. In almost all activities that we do as human beings software plays a role, whether this is using social media, buying goods, monitoring our sports activities, or in the production of goods.
The high-tech industry, in particular, is facing several trends. First of all, the amount of software is growing rapidly. Secondly, the quality of software is decreasing. Third, contemporary societal expectations of software systems go beyond the traditional aspects of reliability and efficiency, and include such aspects as sustainability, fairness and transparency. These trends result in new research challenges. How to develop more high-quality software in less time? How to guarantee the quality of the software? How to deal with the huge amount of existing software? How should software development address challenges of diversity and inclusion of software development teams? The answers to these questions are not straightforward. Common themes in answering these questions are related to digital twins, software architecture, software verification, software evolution and social software engineering. Methodologically, our research is diverse and ranges from proving theorems to building systems, and from analysing data available from large scale archives of software development to conducting surveys and interviews.
Digital twins in high-tech industry offer computational counterparts to increasingly software- and model-driven complex cyber-physical systems. Such digital twins serve as versatile and dynamic tools for system design exploration early on; for analysis, prediction and optimisation during the lifetime of a constructed system; and for what-if analysis going beyond a single system and point in time. In essence, digital twins offer great potential for efficient system development and enhanced understanding across systems’ complete lifespan, and across product variants. Of particular interest to us are the construction of digital twins using model-driven engineering principles, including management of the plethora of models and variants in play in and for digital twins.
Software architecture captures the high-level organisation of a system and represents this through multiple complementary views (including structure and behaviour). The design of the architecture determines many of the quality properties of a system, such as cost, performance, reliability and maintainability. Some of the key questions in architecting are: i) to balance the many quality objectives, and ii) to ensure that the architecture and implementation are kept consistent with each other while the system evolves.
Software verification and correctness-by-construction address the functional correctness of software. Techniques such as model checking and program verification can be applied to prove correctness of both models and (generated) code, but also of model transformations. Particular attention is paid to the usability of those techniques, both regarding their performance and their required expert-level. High-performance, easy to use techniques are most suitable to be adopted in MDSE workflows. To this end, research is being done to automate the verification process as much as possible, and to accelerate the involved computations (model checking, SAT solving) by means of multithreading and the use of graphics processors. In correctness-by-construction, research is being done to scale the approach, in particular to families of related programs.
Software evolution encompasses the entire life cycle of a software system, from inception to phase out. As a research domain, software evolution aims at obtaining insights in how and why software evolves as well as at translating those insights into techniques for assessing system evolvability and facilitating evolution. As software systems tend to depend on other systems, software evolution rarely occurs in isolation: these dependencies can force evolution or impede it.
Software engineering is an activity carried out by humans. Therefore, in addition to technical aspects, such as inter-system dependencies and system architecture, in our research we also consider social (e.g., team diversity, mentoring, emotion in developer communication) and socio-technical aspects (e.g., social debt and technical debt). This area of software engineering is known as social software engineering; the goal of social software engineering is to understand how software developers work and how their ways of working influence the software systems they create, as well as to design interventions helping developers.