Software Engineers will recognize the "tree of life" as a "source code tree" where the "source code" is the genetic heriditary material (e.g., genes). The common concept of "tree" as a branched acyclic graph is the relevent concept.
(Albeit, horizontal gene exchange confuses this.)
Every single organism (alive or extinct) has an ancestral path back to the ancestral replicator. The (mostly useful, aka adaptive at a certain time and place) accumulation of copying errors along that path constitutes an individual's (and species') evolutionary history. In a software tree, the modifications are typically deliberate and intentional, instead of random and filtered by the environment as seen in natural (or artificial) selection.
The point is, to a software engineer used to trees full of branches, revisions, dead-ends and improvements, the "tree of life" is not so much an abstract metaphor as an instance of useful code being maintained and improved.