Lecture 1:

By the end of this lecture, students should be able to: - Create project boards using GitHub and link tasks to issues - Create GitHub milestones to group related issues - Set-up master branch protection on a GitHub repository - Use branching and pull requests to propose changes to the master branch - Compare and contrast the Git and GitHub flow development workflows

Lecture 2:

By the end of this lecture, students should be able to: - Explain the circumstances in which one should consider creating a package for their code - Name the key files and directories in both R & Python pacakges and describe the function of each - Given a function and a unit test written in R, use devtools and usethis to create a small and simple R package - Given a function and a unit test written in Python, use a Cookiecutter template and poetry to create a small and simple Python package

Lecture 3:

By the end of this lecture, students should be able to: - Perform a code review that uses inline comments and suggested code fixes - Define the following 3 types of testing: - unit testing - integration testing - regression testing - Employ a workflow that optimizes accurate code. - Write unit tests for complex objects (e.g., data frames, models, plots) - Use pytest and testhat to run a project’s entire test suite - Explain how pytest and testthat find the test functions when they are asked to run a project’s entire test suite

Lecture 4:

By the end of this lecture, students should be able to: - Define code, test and branch coverage. Explain why high coverage in each of these metrics is desired - Calculate code coverage in R and Python - Manage package dependencies in R and Python packages - Create a reprex to get help - Use traceback, options(error = recover), and browser to debug R code - Use traceback.print_last, pdb.postmortem and breakpoint to debug Python code

Lecture 5:

By the end of this lecture, students should be able to: - Define continuous integration testing - Explain why continuous integration testing is superior to manually running tests - Define the following key concepts that underlie GitHub Actions: - Actions - Workflow - Event - Runner - Job - Step - Store and use GitHub Actions credentials safely via GitHub Secrets - Use matrix GitHub Actions workflows to reduce workflow redundancy - Use GitHub Actions to set-up automated running of tests by pytest upon push to the master branch - Use GitHub Actions to set-up automated running of tests by testthat upon push to the master branch

Lecture 6:

By the end of this lecture, students should be able to: - Define continuous deployment - Explain why continuous deployment is superior to manually deploying software - Explain semantic versioning, and define what constitutes patch, minor, major and breaking changes - Use GitHub Actions to set-up automated deployment of Python packages upon push to the master branch - Generate well formatted function and package-level documentation for R using Roxygen and pkgdown - Generate well formatted function and package-level documentation for Python packages using Sphinx & Read the Docs - Publish Python packages to test PyPI - Publish R packages to GitHub, document how to install them via devtools::install_github

Lecture 7:

By the end of this lecture, students should be able to: - Explain the advantage of using of packages that have undergone peer review - List the rOpenSci and PyOpenSci organizations aims and goals - Describe the peer review process used by the rOpenSci and PyOpenSci organizations - Describe the requirements for publishing packages on CRAN and PyPI - Explain the philosophical difference between how CRAN and PyPI gatekeep pacakges, and how this impacts the packages that are found on each repository/index

Lecture 8:

By the end of this lecture, students should be able to: - Explain who owns the copyright of code they write in a give situation, and why - Choose an appropriate license for software (i.e., packages or analysis code) - Choose an appropriate license for your non-software materials