Honestly, I don’t think we have metaphors or figurative language that really captures how biological systems work.
That said, I think the most faithful description is something like a dynamical system with incredibly structured and robust emergent behavior. This means that the underlying rules of biology are simple, just physics, but life/biology maintains very complex states. So there’s this bug difference between how much information it takes to describe a biological system’s state and how much information it takes to describe the underlying rules. Like to describe myself, I would have to know the state of quadrillions of proteins and molecules across about 30 trillion cells, down to atomic precision. To describe how that state changes, I only need to know a few physics equations.
For most software the situation is more or less reversed. To describe a program, there’s a few state variables, and a ton of rules describing how the program manipulates those variables.
The consequence of this for biology is that there’s no true abstraction between the spatial or time scales. Like, a few atoms in the wrong place can often lead to effects across the whole organism. Think genetic mutations leading to cancer: a single DNA base change drastically changes the whole organism. But, the arrow can also point the other way. Large scale changes like deciding to smoke or take chemotherapy causes molecular changes that then filter up to whole organism changes.
Like I said, it’s hard to describe because some of these properties are also true for human engineered systems so it’s tempting to use our existing engineering abstractions to describe life. But, they’re woefully insufficient for capturing some of the most important characteristics of life. My opinion on the matter is that we just don’t have good ways of deciding how life works because we don’t really understand it; there are fundamental laws at work that we haven’t captured mathematically or even conceptually.