Good intentions: Forcing code into libraries to cleanly separate layers.
Reality: Making libraries circularly-dependent because layers are difficult.
At least with the default macOS linker, resolving symbols in static libraries is not order-dependent. gnu-ld on linux brings the pain of forcing libraries to be strictly ordered so they cannot depend on symbols in previous libraries.
@shac I don't know if this ever got fixed but the last time I played with Linux, it also had the fun behavior that the linker only records symbols and libraries, but not which symbols are supposed to come from which libraries
@shac it always makes me so happy when I'm reversing something and I manage to separate out a layer that's entirely self-contained.

@shac

I think a decent common meta-arch for layers is like:

1. UIs (CLIs, TUIs, GUIs or APIs)
on top of
2. OO (as light as net win)
on top of
3. procedural/imperative
and/or ideally
on top of
4. FP

I've got a personal arch pattern I've evolved towards and reused over the years. like crafting rules I follow when planning a lib vs exe vs RESTful HTTP etc. how to divvy it up. getting layers right is important for testing too