Our society depends more and more on well understood and precisely described protocols. For example for
- handling financial transactions,
- negotiating and agreeing upon contracts,
- handling tax forms automatically,
- holding computerized auctions.
We have reached the state where these actions cannot be performed without extensive support from information processing systems. The size of such systems has grown to enormous complexity. Such systems should of course function correctly (are the rules implemented in agreement with current legal rulings), but also in the construction one has to
- plan for the adaptability of such systems to changing requirements (laws change),
- predict the time and effort it takes to construct such systems (tax forms are to be handed in by the first of April),
- define the way such systems interact with other information processing systems (coupling tax forms with other financial programs).
The sheer size of such systems is such that they can no longer be constructed "from scratch"; we are forced to use existing software infrastructures (middle-ware), ready made components and software libraries in the construction process. Furthermore, we have to produce new code more efficiently by
- transforming similar, already existing components,
- designing special purpose languages and generating software by compilation,
- employing better programming techniques in general.
Besides the problems associated with the construction of new software, the fact that we have millions of lines of existing code (legacy software) is increasingly becoming a problem on its own. This software is often not well documented, no longer well understood and ill structured. Nevertheless a lot of the business logic of a company may be embedded inside a legacy system, and thus the product cannot simply be discarded. The increasing knowledge in the area of (global) program analysis can be used to recover those design decisions that are no longer explicitly visible, and program transformation techniques can be used to recycle such legacy code.
The Software Technology (ST) program studies all techniques that may be employed in the production of actual software. We do so by starting from sound theoretical foundations, with a strong focus on real applicability. It includes programming methodology, programming formalisms (languages), programming tools, software architectures, component based programming, specification formalisms and verification techniques (correctness proofs, theorem proving).
The Master Program is internationally oriented: the program is open to foreign students, and courses are taught in English. Students have the opportunity to follow courses and do projects at foreign universities and institutes. There are two streams in the program: a research-oriented track for students with a desire to obtain a PhD position or a research position in a company, and an industry-oriented track for students who are interested in jobs as software designer in industry. The program results in a degree Master of Science in Computer Science. The program is offered by the Center for Software Technology, of the Institute of Information and Computing Sciences at Utrecht University.