Software is a core mechanism to run businesses, governments, production machines, social networks, communication devices, mobile devices, home entertainment, medicine and many more domains. It comprises an enormous amount of mankind’s knowledge in virtually all application areas, which is why its preservation and evolution is one of the great challenges of our time. Some software is still simple to develop, but increasingly often software is the key complexity driver of the whole product or service – and the complexity still increases with the advent of multicores, accelerators, cloud-based systems, and with the volume of data, the growing requirements for user comfort, and the requirements to safely and securely control physical devices. That is why ICT has a major topic in software.
Software development is becoming more and more diverse, exhibiting varying complexity drivers, specific norms apply, development methods, tooling and the legacy situation are quite domain specific. While software was formerly embedded into machines, it now connects swarms of devices together and controls them. Cyber-Physical Systems (CPS) become a major driving force as cheap sensors allow software to understand their context and take over increasingly complex duties. Software is the driving force behind often highly complex numerical simulations in computational science, engineering, and finance. Energy-efficient implementations of mathematical models as software as well as their automatic generation and transformation based on well-defined semantic rules are crucial ingredients of a sustainable growth in software complexity.
Key questions in software are: How to develop software in time, in a cost-effective manner, correctly, with the necessary reliability, and according to laws, norms and regulations? How to design software such that it becomes reusable and its investments sustainable? How to deal with variants of software, their quality, architectural stability while their requirements change? How to ensure its security and the safety of the machines it controls? How to model software requirements, designs, constraints, properties and how to analyze these models and synthesize programs? How to exploit in full and in a timely manner the potential of the available computational resources? How to co-develop software and co-develop fitting hardware? How to maintain and evolve software or a complex software ecosystem in order to continuously improve its quality? What kinds of software engineering approaches are needed to address the specific constraints of particular application domains?