Software engineering principles applied to research software