Software Engineering for Scientific Computing training module

The goal of this course is to teach basic tools and principles of writing good code, in the context of scientific computing. Specific topics include an overview of relevant compiled and interpreted languages, build tools and source managers, design patterns, design of interfaces, debugging and testing, profiling and improving performance, portability, and an introduction to parallel computing in both shared memory and distributed memory environments. The focus is on writing code that is easy to maintain and share with others. You will develop these skills through a series of programming assignments and a group project.

Source repositoryWebAssembly versionBinder version

Note the WebAssembly version does not have a shell, and time.sleep doesn’t work (the web is async).


Week 1: Intro

Week 2: Version Control

Week 3: Testing

Week 4: Continuous Integration

Week 5: Packaging and Quality Control

Week 6: Object Oriented design

Week 7: Design Patterns

Week 8: Static Typing

Week 9: Intro to Compilation

Week 10: Profiling

Week 11: Parallel Computing

Week 12: Mixing Languages

Bonus: Exotic topics

Taught by Henry Schreiner (Princeton University) in Fall, 2022 and Fall, 2023.