A good way to evaluate one axis of quality of an abstraction is to inline every function call, and see how much duplicate work you can either deduplicate or turn into a loop (rather than several independent function calls). This also restructures the code such that you can consider work as batches of identically shaped work, rather than either (a) being in shallow callstack code and dealing with a list of abstract, opaque function calls, or (b) being in deep callstack code and not understanding the context you're being called within.
À l'époque je bossais dans un gros cabinet de conseil, on m'a confié un stagiaire (blanc), je descends avec lui à la cantine, la serveuse une daronne guinéenne le vouvoie et me tutoie.