  Modern day system developers have some serious problems to contend with. The
systems they develop are becoming increasingly complex as customers demand
richer functionality delivered in ever shorter timescales. They have to manage
a huge diversity of implementation technologies, design techniques and
development processes: everything from scripting languages to web-services to
the latest 'silver bullet' design abstraction. To add to that, nothing stays
still: today's 'must have' technology rapidly becomes tomorrow's legacy problem
that must be managed along with everything else. How can these problems be
dealt with? In this book we propose that there is a common foundation to their
resolution: languages. Languages are the primary way in which system developers
communicate, design and implement systems. Languages provide abstractions that
can encapsulate complexity, embrace the diversity of technologies and design
abstractions, and unite modern and legacy systems.
