  Symbolic mathematical computing systems have served as a canary in the coal
mine of software systems for more than sixty years. They have introduced or
have been early adopters of programming language ideas such ideas as dynamic
memory management, arbitrary precision arithmetic and dependent types. These
systems have the feature of being highly complex while at the same time
operating in a domain where results are well-defined and clearly verifiable.
These software systems span multiple layers of abstraction with concerns
ranging from instruction scheduling and cache pressure up to algorithmic
complexity of constructions in algebraic geometry. All of the major symbolic
mathematical computing systems include low-level code for arithmetic, memory
management and other primitives, a compiler or interpreter for a bespoke
programming language, a library of high level mathematical algorithms, and some
form of user interface. Each of these parts invokes multiple deep issues.
  We present some lessons learned from this environment and free flowing
opinions on topics including:
  * Portability of software across architectures and decades;
  * Infrastructure to embrace and infrastructure to avoid;
  * Choosing base abstractions upon which to build;
  * How to get the most out of a small code base;
  * How developments in compilers both to optimise and to validate code have
always been and remain of critical importance, with plenty of remaining
challenges;
  * The way in which individuals including in particular Alan Mycroft who has
been able to span from hand-crafting Z80 machine code up to the most abstruse
high level code analysis techniques are needed, and
  * Why it is important to teach full-stack thinking to the next generation.
