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 repository • WebAssembly version • Binder version
Note the WebAssembly version does not have a shell, and time.sleep
doesn’t
work (the web is async).
Topics:
Week 1: Intro
- Introductions and motivation
- Unix setup and tools
- Version control overview
- Version control quick intro
- Programming basics
- Programming/style general practices
- Code cleanup example
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
- Shared object files
- CFFI
- Mix and match with Numba and more
- CPython
- Exercise
- More binding situations
- Binding detailed example: Minuit2
- Step 1: Get source
- Step 2: Plan interface
- Usage
- Done
Bonus: Exotic topics
Taught by Henry Schreiner (Princeton University) in Fall, 2022 and Fall, 2023.