What is this programme about?
The size of information processing systems has grown enormously in complexity, and therefore so is the challenge of their construction. In the Software Technology Master program we study techniques addressing this challenge. Furthermore software should be easily adapted to changing
requirements. We look at techniques for producing software efficiently, producing correct software, and producing more efficient software. We achieve our goals by generating product from components, by transforming existing components, and by designing and implementing programming languages and environments.
We have a strong interest in programming languages in general, and more specifically in the active research area of modern functional programming languages. This includes design, description, and implementation of languages and their use in a large variety of application areas, such as web-based systems, games, and programming environments.
The core of the program is centered around programming methodology, programming language design and implementation. Furthermore we teach a coherent collection of courses on advanced programming methodologies, software architectures, specification
techniques, program analyses and verification techniques and software engineering. Most of these courses have
a direct link to research performed at Utrecht University.
A view to our campus in the summer. NOTE: discuss with photographer if he can come up with a better photo.
We welcome prospective students with a BSc in Computing Science and the Dutch HIO degree.
We also welcome applicants from different backgrounds; we believe that they enrich our collective experience. However, we assume that students come with a:
- basic knowledge of logic and the ability to perform formal reasoning
- reasonable experience with a few programming languages
- basic knowledge of modern software structures
- basic knowledge of the inner workings of computer systems, networks and operating systems
- basic knowledge of algorithms and data structures
- the ability to communicate facts and findings verbally and in writing, also using information and communication technology and audio-visual means
We kindly request you to explain in your application letter, besides why you are motivated to do the program, why you think you fulfill the above requirements.
Some examples of career paths of our graduates:
- Software engineer or architect, or tool builder, e.g. at Philips, Microsoft, or one of the many startup companies in the Utrecht/Eindhoven area
- Software consultant or project manager, e.g. at one of the larger Dutch software houses such as CapGemini, Cibit, Ordina, Logica/CMG
- Developer at one of the large international financial firms such as Credit Suisse or Jane Street Capital
- Developer at companies exclusively based on Haskell programming such as Galois
- Researcher (e.g. as PhD student) at Utrecht University, or other universities or labs, e.g. Chalmers, Philips Research, CWI, IBM, Microsoft.
- Some graduates choose to setup their own companies.
P4 (omschrijving van het studieprogramma (vakken, theses) (evt. foto))
The Master program's in Software Technology takes two years of study, with a total size of 120 ECTS (European Credit Transfer System), consisting of 10 courses and a final thesis project. Each academic year is structured into four periods. In each period a student usually takes two courses of 7.5 ECTS each. The courses are divided into the following categories:
| Mandatory courses
|| Software Engineering, Compiler Construction
| Advanced courses
|| choose 4
|| choose 1
| Free Choice
|| choose 3
- Advanced courses: Generic Programming, Advanced Functional Programming, Automatic Program Analysis, Software Specification, Software Architecture, Program Verification, Database Architecture.
- A seminar takes the form of small study groups in which a subject is studied in depth. Seminar subjects are usually closely linked to the research conducted in our Software Technology group. Examples of seminars: Advanced Compiler Construction, Dependently Typed Programming, Software Technology for Teaching and Learning.
You finally have the flexibility to choose three courses to shape the pogramme to your academic interest. You can further specialize in Software Technology, by taking more Software Technology Advanced courses, but you can also take up to two courses from the broad range of selections provided by other Master programmes in Computing Science at Utrecht University. It is also possible to do an Experimentation Project, where you will work within our research team to conduct an experiment, or to implement our latest research ideas.
For students from HBO and other countries we offer an introductory course on Functional Programming, Languages and Compilers to help them gaining the pre-requisite fundamentals for the programme.
Our Teaching Approach
As soon as you start the programme our Student Advisor will help you to get you started. A mentor will be assigned to you, to help you plan your study and provide you with advices throughout the study.
In our classes students are given room to take initiatives, and are challenged to pose problems, propose solutions, and perform both theoretical and practical experiments. A student does assignments, writes papers, and presents his or her results. The active acquisition of knowledge and experience is central to this Master's programme, for individual students as well as for groups. In addition to classical exams, they are also given in the form of projects, or writing reports. Finally we organise a weekly colloquium in which any area of interest can be presented, either by staff or by students.
Our lecturers are also easily approachable for discussing your progress and your ideas.
Our on-campus library.
Utrecht University provides modern computer labs, that are easily accessible to you. The campus is equipped with fast Internet access, and a wireless network. You will have free digital access to almost all scientific journals and conference proceeding in Computing Science, including those from ACM, IEEE, and Springer's LNCS. This means that you have access to the world's state of the art of the science, literally at your fingertips.
Your final thesis project is probably the most exciting part of your study. You will plan and conduct your own research. We will help you by providing supervision. A thesis project involves carrying out a scientific study of a relevant Software Technology topic. You can do this internally within our own research domains, or at an external organization (an IT company, or another research institution). You will conclude the project by writing a thesis, which is defended in the colloquium.
Examples of thesis projects:
- Code Generation from a Domain Specific Language : Designing and Implementing Complex Program Transformations
- A domain-specific language for generating RIA (Rich Internet Applications)
- Soft typing and analyses on PHP programs
- Design and Implementation of a UML/OCL Compiler
- Dynamic Updating for the Java Virtual Machine using Load-time Structural Reflection
- Automated Norm Extraction from Legal Texts
- A Survey of Legacy Migration
- Dependently Typed Grammar Transformations
- THEMIS: Framework for Automated Testing of Graphical User Interfaces
- Improving Automated Feedback, Building a Generic Rule-Feedback Generator
- Plug-and-Play Attribute Grammars
Our staff and students cooperate with many organisations, with which we share knowledge and mutual benefits from thesis projects, PhD
projects, fundamental and applied research, conferences, guest lectures and workshops. These include:
- University of Minho
- University of Gothenburg
- Universidad Politécnica de Valencia
- Software Improvement Group
P5 (omschrijving van vakken (evt. foto))
Courses examples (alphabetical)
NOTE: discuss with the photographer; he need to make a photo of real ST students.
Advanced Functional Programming
Functional programming has become increasingly influential. The approach is highly abstract and powerful at the same time. In this course we study advanced functional programming techniques, patterns, libraries and tools, e.g. its type system and its more exotic aspects and extensions, abstraction capturing structures, and techniques to embed custom domain specific languages inside a functional language.
Automatic Program Analysis
Every professional compiler performs an analysis of the source code of the program, to attempt to make the generated code more efficient, or to validate some aspects of the source code. Instances of this problem are type inferencing, data flow analysis (dead-code analysis) and control flow analysis. In this course we study many aspects of program analysis, control flow analysis, data flow analysis, type and effect systems and abstract interpretation. All of these are static techniques. Finally, we shall also discuss in detail how to handle feedback to the programmer in case a validating analysis fails.
In this course we study the workings of compilers and interpreters. We do so by considering some of the language constructs that typically appear in modern imperative and functional programming languages, and by looking at what kind of analyses these constructs require in order to be compiled or interpreted. We delve into formalisms, tools, and programming techniques that are particularly well-suited for crafting compilers and interpreters, but that are often also useful and relevant for other, more general forms of software construction.
In this course we study methods to generically formulate and solve problems for arbitrary data types, DTDs, or models. Such a solution is a generic program, e.g. a generic web shop program: given the structure of the product you want to sell, you want to generate web forms, and database transactions based on this structure. By specialising to a given type we get a normal, type-specific program. Many design patterns are also instances of generic programs. However, in contrast to design patterns, the focus of this course is on types, which gives many possibilities for constructing correct and abstract code, based on sound theories.
In this course we study techniques to verify software or models of software, as well as various techniques for automated software testing. Verification is stronger than testing in that it fully proves the correctness of a program. We will study various model checking techniques; these are fully automatic verification techniques, but are limited in its scope. To complement these, we will also study higher order theorem proving, which is a very expressive verification technique, but at the expense of less automation.
A software architecture describes the global structure of a software system, its components/parts and relationship between those parts, the way these components cooperate, etc.. Choosing an architecture is important; making a wrong choice often entails a great deal of effort is later needed to repair it to make an effective system. In this course we study architecture designs and aspects like flexibility, adaptability and maintainability.
P6 Omschrijving van de Graduate School (GSNS en Communicatie)
- Foto // C&V // Wouter?
- Testimonial student met foto // C&V
P7 Omschrijving en concrete opsomming met banen alumni (evt. foto)
- Testimonial alumnus met foto // C&V// Bijvoorbeeld Alexey die nu bij Vectorfabrics werkt.
P8 Praktische info // template
- application deadlines
- entrance requirement