The Architecture of Scientific Software