Another thing I learnt from my math degree that I find helps a lot when programming and software engineering more generally is *defining your terms*.

So many communication issues on teams occur when people are using the same words to mean different things.

lookup "ubiquitous language" it's a phrase from domain driven design

Thanks, I hadn't seen that term before.

Just to be clear, I wasn't claiming that "communicating clearly" is a new idea in software engineering, I'm mainly commenting on how effective embracing it can be.

When doing math, pretty much every term is "load-bearing" in that arguments will make use of specific aspects of a concept and how it relates to other concepts.

If you look at most graduate-level math textbooks or papers, they typically start with a whole bunch of numbered definitions that reference each other, followed by some simple lemmas or propositions that establish simple relationships between them before diving into more complex theorems and proofs.

The best software projects I've seen follow a roughly similar pattern: there are several "core" functions or libraries with a streamlined API, good docs, and solid testing; on top of that there are more complex processes that treat these as black-boxes and can rely on their behavior being well-defined and consistent.

Probably the common thread between math and programming is both lean heavily on abstraction as a core principle.