# SD Overview Software Development Software engineering is often neglected in computational science. However, it bears the potential to increase productivity by providing scaffolding for collaborative programming, reducing the coding errors and increasing the manageability of software. ## Learning objectives * Explain agile software engineering methods and practices relevant in high-performance computing. * Apply software engineering methods and best practices when developing parallel applications. * Write modular, reusable code by applying software design principles like loose coupling and information hiding. * Apply design patterns for HPC. * Configure and use integrated development environments (IDEs) to seamlessly perform the typical development cycle with the steps edit, build (compile and link), and test. * Use sophisticated debuggers for parallel programs. * Recognize where (parallel) programming idioms are violated and refactor the code to comply with a specific programming idiom. * Define and establish coding standards and conventions in a project. * Apply version and configuration management to the development of (parallel) programs in order to track and control changes in the sources and to establish and maintain consistency of the program or software system throughout its life. * Configure an environment for continuous integration with basic processing steps like compiling and automated testing. * Apply unit testing in a specific programming language using an appropriate unit testing framework. * Appropriately document the entire software system. ## Subskills