Good Enough Software Engineering for Bioinformaticians
Department of Biotechnology and Biomedicine
This PhD-level course provides a language-independent foundation in software design, equipping students with the skills to structure code and data effectively for research-driven tool development. By focusing on core principles such as problem decomposition, data organization, usability, and testing, students learn to approach software challenges methodically, regardless of the programming language used. The course includes in a hands-on project, allowing participants to apply these concepts to real-world tasks in their own research.
Learning objectives:
A student who has met the objectives of the course will be able to:
- Problem Decomposition Students will be able to break down complex tasks into manageable sub-problems and identify hidden complexity in seemingly simple challenges.
- User-Centric Communication Students will learn to design outputs that are accessible and usable for diverse audiences, considering factors like domain knowledge, disabilities, and downstream tool compatibility.
- Data Structure Design Students will be able to organise and store data effectively by selecting appropriate structures that reflect real-world relationships and support robust access.
- Software Design Principles Students will gain awareness of key software design components such as requirements analysis, input validation, and testing strategies, and apply them to small-scale tools.
- Testing and Validation Students will be able to construct meaningful tests for software components, including unit and regression tests, and understand the role of automated testing pipelines.
- Programming by Contract and Invariance Students will understand foundational concepts like invariance and programming by contract, and apply them to ensure software reliability and maintainability.
- Computational Complexity Awareness Students will be able to recognize computationally expensive implementations, identify common performance bottlenecks, and apply profiling techniques to optimise code.
- Project Planning and Implementation Students will be able to outline and partially implement a software project using the methodologies learned, demonstrating their ability to apply design principles to real-world research tasks.
Contents:
This course offers a practical, language-independent introduction to software design, tailored for PhD students who want to build robust, maintainable tools to support their research. Unlike traditional programming courses that focus on syntax and language-specific features, this course emphasises the underlying principles of software design that apply across all programming languages. Whether you're working in Python, R, Java, or any other language, the skills developed here will help you structure your code and data more effectively. The course is ideal for students who have basic programming experience but want to deepen their understanding of how to approach software development tasks methodically and thoughtfully. By focusing on design rather than implementation, students will learn how to think like software architects—making their future coding efforts more efficient, scalable, and user-friendly. # Course Structure: The course is divided into four core modules, each taught over one day: ## Problem Decomposition Learn how to break down complex tasks into manageable components. Exercises will challenge students to model everyday activities (e.g., grocery shopping) as structured problems, revealing hidden complexity and encouraging systematic thinking. ## Communication and Usability of Results Explore how to present data and results effectively to diverse audiences. Topics include designing outputs for human readability, machine parsing, and accessibility. Students will practice creating interfaces that prioritise clarity and usability. ## Data Structures Understand how to organise and store data in ways that support efficient access and manipulation. Through relatable exercises (e.g., modelling the contents of a kitchen or a backpack), students will learn how to design data structures that reflect real-world relationships. ## Software Design Dive into the principles of good software design, including requirements analysis, input validation, testing strategies, and basic concepts like programming by contract and invariance. Students will work with pseudo-code to identify flaws and design robust solutions. ## Final Project: Following the teaching component, students will collaborate in a half-day session to define the requirements for a final project. Over the next five days, they will apply course concepts to outline and partially implement a software tool relevant to their own research. The course concludes with a half-day of project presentations, where students share their design decisions and reflect on the development process.