---
# System prepended metadata

title: Optional exercises based on preference

---

# Optional exercises to create your own plan
We provide you with a starter list of developments you could do to create your own project plan based on your priorities and needs. As important as developing some of these exercises, it is important to decide which are best suitable to work on now, and which you want to leave for later, or don't apply to your particular case.

:::info
Feel free to also reach out to the instructors if you are not sure which one to chose.
:::

:::success
**Tip** tailor the techniques and tools provided to your own needs and discuss this openly. Projects have different scopes and not all software development techniques applied in the industry make sense in the context of research code.

This [read](https://scicomp.aalto.fi/scicomp/zen-of-scicomp/) is very useful to wrap your head around "research code" and its differences with "production code".

:::

### Advanced software project management
- [Extended exercises for software planning](https://hackmd.io/RON18P0sTSOGlkiBp2VbYw)
- Advanced branching for collaborative development:
    - Task centered branching: https://www.atlassian.com/agile/software-development/branching
    - Git flow based onf features: https://nvie.com/posts/a-successful-git-branching-model/
:::success
For many research projects task centered branching is a great start. For mature projects that develop features and have a "product roadmap" git flow probably is a better choice.
:::
- Releasing versions. We use github as an example, but it is available in git based services like gitlab, bitbucket, gitea, etc. In **[this blogpost](https://medium.com/agoda-engineering/automating-versioning-and-releases-using-semantic-release-6ed355ede742)** semantic versioning and releasing are discussed including automation possibilities using branching conventions. 

### Extensive code documentation exercises
- Full code documentation list of exercises: https://coderefinery.github.io/documentation/
 
### Reproducibility challenges
- Ask someone to reproduce your code and use it based on the documentation you have provided. Preferably a colleague or someone that works relatively close to you, but doesn't know the details of your project.
- Apply for a "codecheck" https://codecheck.org.uk/

### Modular code and refactoring exercises
Main lesson: https://coderefinery.github.io/modular-type-along/
- Implement unit tests.
- Automate them using github actions.
- Creating a documentation website using sphinx
- Making your code reproducible
    - Creating your first jupyter notebook: https://coderefinery.github.io/jupyter/first-notebook/
- Turn your jupyter notebook into scripts.
    - https://mljar.com/blog/convert-jupyter-notebook-python/
- Turn your scripts into modules and a package:
    - Creating a package with conda: (Carlos: RSE tutorial on how to publish software in conda forge: https://hackmd.io/@conda-us-rse-2023/tutorial)
    - Creating a package with pip: https://realpython.com/pypi-publish-python-package/

## Automation
- Setup automated testing with github actions, or other tools.
    - Use this lesson as a guide: https://coderefinery.github.io/testing/
- Create an automated workflow with Snakemake: https://coderefinery.github.io/reproducible-research/workflow-management/#example-workflow-tool-snakemake
    - If Snakemake doesnt apply to your usecase, let us know. You can open an issue on the subject, share it in our teams channel and/or book a consultation on the subject. 

## Any suggestions on other topics?
Please add here what other exercises we havent listed could be useful.