Semester: winter 2022/23
Lectures: Mondays 12:20, S7 (Tomáš Petříček)
Page in SIS: NPRG075
Grading: Credit

The goal of this course is to show students how to design better programming languages, developer tools, development frameworks and libraries. The course covers rigorous methods for programming language and library design, ranging from formal methods based on logic and programming language theory, to human-computer interaction methods based on qualitative and quantitative user studies.


Slides will appear here throughout the semester. The online version uses Reveal.js and has a fancy two-directional structure. Use up/down and left/right arrows to navigate through this (or Esc to zoom out).

  1. Programming language design - Introduction (PDF) - 10 October, 2022
    For the next week: Read Notes on Notebooks by Jeremy Singer
  2. Learning from architecture and design (PDF) - 17 October, 2022
    For the next week: Read Sections 2 and 5 of Varv: Reprogrammable Interactive Sofware
  3. Human-centric language design (PDF) - 24 October, 2022
    For the next week: Read about Observables in the RxJS Primer
  4. Formal models of programming (PDF) - 31 October, 2022
    For the next week: Read about Understanding null safety in Dart
  5. Mathematics and engineering of types (PDF) - 7 November, 2022
    For the week after the next: Read about Information-rich programming in F#
  6. Getting everything wrong without doing anything right! or The perils of large-scale analysis of GitHub data - 14 November, 2022
    Guest lecture by Jan Vitek
  7. Unexpected perspectives on types (PDF) - 21 November, 2022
    For the next week: Read (a part of) When Technology Became Language
  8. History and philosophy of programming (PDF) - 28 November, 2022
    For the next week: Read chapter “15 REM VARIATIONS IN BASIC” of 10 PRINT CHR$(205.5+RND(1)); : GOTO 10
  9. Close look at past and today’s programs (PDF) - 5 December, 2022
    For the week after the next: Read Spreadsheets are Code (SciHub)
  10. Assignment & How to do programming language research (PDF) - 12 December, 2022
    For useful writing tips: Read How to write a great research paper by Simon Peyton-Jones
  11. Heuristic evaluation of programming systems (PDF) - 19 December, 2022
    Optional if you are interested: Read Analysis of Block-based languages (SciHub)
  12. Making programming easier and learnable (PDF) - 2 January, 2023 (online)

Credit / zápočet

To get credit (zápočet) for the course, you will need to complete a small independent project (or a small group project). The project is to use one of the methodologies discussed in the lectures to study or design (an aspect of) a programming language, system, tool or a library.

The topic is flexible, but please talk to me first to agree on the topic. This could involve a formal model, usability analysis, design concept, study of a historical system, or anything else we agree on. You will need to produce a brief report (about 5 pages) about your project.

To discuss topic, please talk to me after the lecture or drop me an email to meet!


I’m happy to review the final version of your project anytime before the end of the summer semester (31 June 2023), but I ask you to talk to me to agree on the project topic by the end of the winter semester and to start working on the project earlier, so that I can give you feedback on the project direction in time. As part of the feedback, I will give you a concrete list of what should appear in the final version.

Course outline

  1. Introduction to programming research methods: What can we say about programming?
  2. Historical look at programming systems: Recovering lost programming ideas
  3. Design perspective on programming: Inventing new interactive programming approaches
  4. Evaluating programming system design: Case studies, user studies and empirical evaluation
  5. Mathematical perspective on programming: Formal models of programming languages
  6. Proofs about programming languages: Types and properties of functional languages