Software design strategies for numerical software