Aims:

In this course, you will move beyond programming, to learn how to construct reliable, readable, efficient research software in a collaborative environment. The emphasis is on practical techniques, tips, and technologies to effectively build and maintain complex code. We will use the Python programming language to deliver this content, and you will learn Python programming in this course, developing from simple scripts for analysing research data to efficient numerical computation.

Learning outcomes:

On successful completion of the module, a student will be able to:

Apply the workflow of software version control using git when working solo or collaboratively and describe the advantages of using to find when bugs were first introduced to a code base.
	Manage various aspects of the software development process using project management tools (e.g., GitHub) – such as creating software issues, provide code reviews, set up continuous integration tasks, assign collaborators to tasks.
	Implement functions, classes, scripts, and libraries to load, analyse and visualise research data.
	Explain and design different types of test cases and implement these tests using a test framework (e.g., pytest).
	Design and implement an installable software package based on a set of requirements and following best practices.
	Understand and communicate the value of documentation and use appropriate tools to create documentation.
	Organise, plan and conduct the steps needed to refactor code systematically, employing object-oriented design principles.
	Critically evaluate the pros and cons of different software design and development methodologies (e.g., agile versus waterfall).
	Evaluate and understand performance measurements of programs.
Content:

Version control tools and collaborative workflow.
	Research data in Python.
	Software testing (unit-tests, negative tests, mocking) and debugging.
	Management and development of software projects (licensing, style, documentation, development methodologies and organisation).
	Construction, design and refactoring of software following object-oriented principles.
	Software optimisation and profiling.
Requisites:

To select the module as an optional or elective, a student: (1) must be registered on a programme on which it is formally available; (2) must be familiar with common programming concepts in any language (for example, students should be able to create variables, distinguish between different data types, implement control flows blocks, etc); and (3) should have an understanding of running programs from the command line.