User interfaces (UI) pervade our daily lives. To do office tasks, to pilot an airliner, to write programs, UIs are the tangible vectors that enable users to interact with software systems. The development of UIs involves multiple roles. Designers and ergonomists are in charge of the design and evaluation of UIs from a strict human factor viewpoint. They use concepts and theories established by the Human-Computer Interaction (HCI) community. Software engineers develop, validate, maintain UIs using software engineering techniques. UI engineering is an interdisciplinary field that cross-cuts these two roles and their underlying domains, HCI and software engineering. This thesis details the contributions I develop during the last decade in the filed of UI engineering. I develop this thesis through two research axes.In the first axis I detail new UI engineering concepts. These concepts follow the same leitmotiv: engineering UIs is a specific problem that requires specific abstractions. These abstractions thus go beyond the classical object-oriented abstractions provided by the current programming languages to provide abstractions that focus on UI concerns. In the second axis I focus on domain-specific languages (DSL). DSLs are specific user interfaces that stand between domain experts and their engineering problems. As for any UI, engineering DSLs must make use of HCI concepts at different levels.I then propose three research perspectives that highlight the importance of working on UI engineering to support the increasingly interactivity of software systems.