Summary and Schedule
This course aims to teach a core set of established, intermediate-level software development skills and best practices for working as part of a team in a research environment using Python as an example programming language (see detailed learning objectives below). The core set of skills we teach is not a comprehensive set of all-encompassing skills, but a selective set of tried-and-tested collaborative development skills that forms a firm foundation for continuing on your learning journey.
A typical learner for this course may be someone who is working in a research environment, needing to write some code, has gained basic software development skills either by self-learning or attending, e.g., a novice Software Carpentry Python course. They have been applying those skills in their domain of work by writing code for some time, e.g. half a year or more. However, their software development-related projects are now becoming larger and are involving more researchers and other stakeholders (e.g. users), for example:
- Software is becoming more complex and more collaborative development effort is needed to keep the software running
- Software is going further than just the small group developing and/or using the code - there are more users and an increasing need to add new features
- ‘Technical debt’ is increasing with demands to add new functionality while ensuring previous development efforts remain functional and maintainable
They now need intermediate software engineering skills to help them design more robust software code that goes beyond a few thrown-together proof-of-concept scripts, taking into consideration the lifecycle of software, writing software for stakeholders, team ethic and applying a process to understanding, designing, building, releasing, and maintaining software.
Target Audience
This course is for you if:
- You have been writing software for a while, which may be used by people other than yourself, but it is currently undocumented or unstructured
- You want to learn:
- more intermediate software engineering techniques and tools
- how to collaborate with others to develop software
- how to prepare software for others to use
- You are currently comfortable with:
- basic Python programming (though this may not be the main language you use) and applying it to your work on a regular basis
- basic version control using Git
- command line interface (shell)
This course is not for you if:
- You have not yet started writing software (in which case have a look at the Software Carpentry course or some other Python course for novices first)
- You have learned the basics of writing software but have not applied that knowledge yet (or are unsure how to apply it) to your work. In this case, we suggest you revisit the course after you have been programming for at least 6 months
- You are well familiar with the learning objectives of the course and those of individual episodes
- The software you write is fully documented and well architected
Prerequisites
Before joining this training, participants should meet the following criteria. (You can use this short quiz to test your prerequisite knowledge.)
Git
- You are familiar with the concept of version control
- You have experience configuring Git for the first time and creating a local repository
- You have experience using Git to create and clone a repository and add/commit changes to it and to push to/pull from a remote repository
- Optionally, you have experience comparing various versions of tracked files or ignoring specific files
Setup Instructions | Download files required for the lesson | |
Duration: 00h 00m | 1. Setting the Scene |
What are we teaching in this course? What motivated the selection of topics covered in the course? |
Duration: 00h 15m | 2. Section 1: Setting Up Environment For Collaborative Code Development | What tools are needed to collaborate on code development effectively? |
Duration: 00h 25m | 3. 1.1 Introduction to Our Software Project |
What is the design architecture of our example software project? Why is splitting code into smaller functional units (modules) good when designing software? |
Duration: 00h 55m | 4. 1.2 Virtual Environments For Software Development |
What are virtual environments in software development and why you should
use them? How can we manage Python virtual environments and external (third-party) libraries? |
Duration: 01h 25m | 5. 1.3 Integrated Software Development Environments |
What are Integrated Development Environments (IDEs)? What are the advantages of using IDEs for software development? |
Duration: 02h 00m | 6. 1.4 Software Development Using Git and GitHub |
What are Git branches and why are they useful for code
development? What are some best practices when developing software collaboratively using Git? |
Duration: 02h 35m | 7. 1.5 Python Code Style Conventions |
Why should you follow software code style conventions? Who is setting code style conventions? What code style conventions exist for Python? |
Duration: 03h 15m | 8. 1.6 Verifying Code Style Using Linters |
What tools can help with maintaining a consistent code style? How can we automate code style checking? |
Duration: 03h 35m | 9. 1.7 Optional Exercises for Section 1 | How can I further finetune my coding environment? |
Duration: 04h 20m | 10. Section 2: Ensuring Correctness of Software at Scale | What should we do to ensure our code is correct? |
Duration: 04h 25m | 11. 2.1 Automatically Testing Software |
Does the code we develop work the way it should do? Can we (and others) verify these assertions for themselves? To what extent are we confident of the accuracy of results that are generated by code and appear in publications? |
Duration: 05h 10m | 12. 2.2 Scaling Up Unit Testing |
How can we make it easier to write lots of tests? How can we know how much of our code is being tested? |
Duration: 05h 25m | 13. 2.3 Continuous Integration for Automated Testing |
How can I automate the testing of my repository’s code in a way that
scales well? What can I do to make testing across multiple platforms easier? |
Duration: 06h 10m | 14. 2.4 Diagnosing Issues and Improving Robustness |
Once we know our program has errors, how can we locate them in the
code? How can we make our programs more resilient to failure? |
Duration: 06h 55m | 15. 2.5 Optional Exercises for Section 2 | What is a desirable way to measure and use test coverage? |
Duration: 07h 40m | 16. Section 3: Software Development as a Process | How can we design and write ‘good’ software that meets its goals and requirements? |
Duration: 07h 50m | 17. 3.1 Software Requirements |
Where do we start when beginning a new software project? How can we capture and organise what is required for software to function as intended? |
Duration: 08h 30m | 18. 3.2 Software Architecture and Design |
Why should we invest time in software design? What should we consider when designing software? What is software architecture? |
Duration: 09h 20m | 19. 3.3 Code Decoupling & Abstractions |
What is decoupled code? What are commonly used code abstractions? When is it useful to use classes to structure code? How can we make sure the components of our software are reusable? |
Duration: 10h 35m | 20. 3.4 Code Refactoring |
How do you refactor existing code without breaking it? What are benefits of using pure functions in code? |
Duration: 11h 25m | 21. 3.5 Software Architecture Revisited | How do we handle code contributions that do not fit within our existing architecture? |
Duration: 12h 10m | 22. Section 4: Collaborative Software Development for Reuse | What practices help us develop software collaboratively that will make it easier for us and others to further develop and reuse it? |
Duration: 12h 15m | 23. 4.1 Developing Software In a Team: Code Review |
How do we develop software in a team? What is code review and how it can improve the quality of code? |
Duration: 13h 15m | 24. 4.2 Preparing Software for Reuse and Release |
What can we do to make our programs reusable by others? How should we document and license our code? |
Duration: 14h 05m | 25. 4.3 Packaging Code for Release and Distribution |
How do we prepare our code for sharing as a Python package? How do we release our project for other people to install and reuse? |
Duration: 14h 25m | 26. Section 5: Managing and Improving Software Over Its Lifetime |
How do we manage the process of developing and improving our
software? How do we ensure we reuse other people’s code while maintaining the sustainability of our own software? |
Duration: 14h 30m | 27. 5.1 Managing a Collaborative Software Project |
How can we keep track of identified issues and the list of tasks the
team has to do? How can we communicate within a team on code-related issues and share responsibilities? How can we plan, prioritise and manage tasks for future development? |
Duration: 15h 05m | 28. 5.2 Assessing Software for Suitability and Improvement |
What makes good code actually good? What should we look for when selecting software to reuse? |
Duration: 15h 50m | 29. 5.3 Software Improvement Through Feedback |
How should we handle feedback on our software? How, and to what extent, should we provide support to our users? |
Duration: 17h 00m | 30. Wrap-up |
Looking back at what was covered and how different pieces fit
together Where are some advanced topics and further reading available? |
Duration: 17h 15m | Finish |
The actual schedule may vary slightly depending on the topics and exercises chosen by the instructor.
Setup
You will need the following software and accounts setup to be able to follow the course:
- Command line tool (such as Bash, Zsh or Git Bash)
- Git version control program
- GitHub account
- Python 3 distribution
- PyCharm integrated development environment (IDE)
Please follow the installation instructions to install the above tools and set up for the course.