Why is it that mathematical results are useful for centuries, yet computer programs suffer tumultuous changes of technology? Can one write programs that will be useful in fifty years? Extreme efforts to preserve ``dusty deck'' programs have confused the roles and responsibilities of four participants: the end user, application programmer, system software designer, and hardware engineer. Users feel they must know hardware details like word size and megahertz rate -- yet are oblivious to error in the output. Application programmers try to guess compiler behavior, often obtaining high performance only by trickery. With new hardware, that old guess is often wrong. The result is ``high-performance code'' that is slower than the original code. The hardware engineer tries to maintain compatibility through many generations, sacrificing performance and hardware affordability to meet presumed needs of the other three participants. We propose that the respective roles and responsibilities be clearly delineated via a three-stage contract between the four participants. The result is a new interaction paradigm that should allow programs to share the longevity of mathematical results and absorb technical advances gracefully.