Software engineering for enabling scientific software development
Scientific software is code written by scientists for the purpose of doing research. While the results of this software development have been widely published, there has been relatively little publication of the development of this software. There have been even fewer publications that look at the software engineering aspects of scientific software development and fewer still that have suggested software engineering techniques that will help scientists develop the software that is relied on for much of our modern knowledge. The software engineers who have studied the development processes of scientific software developers agree that scientists would be able to produce better software if they had the knowledge and familiarity to use specific software engineering practices. The primary focus of this dissertation is to provide that knowledge to scientific software developers in order to better enable them to produce quality software as efficiently as possible. In order to achieve this focus, this dissertation has three aspects. First, this dissertation provides a literature review of the claims that have been made in the software engineering and scientific software literature culminating in a list of claims about software engineering practices. Scientific software developers can use this list to find practices they are unaware of that should prove useful to their development. Additionally, software engineers can use the list to help determine what practices need support for the scientists to be able to take advantage of them. Second, this dissertation provides a series of surveys that capture the current state of software engineering knowledge in the scientific software development community. The results of these surveys show that scientific software developers are unfamiliar with many of the practices that could help them address their most challenging issues. Third, this dissertation provides examples that show, with support from software engineers, scientific software developers can take advantage of practices that have proven useful in traditional software engineering and increase the quality of their work without requiring an overwhelming amount of extra work.