I have, and my teams write abstraction layers around both internal & external systems for testing, integration, and sanity.
It limits the scope & necessity of domain knowledge to be scattered about everywhere. The core logic is easy to reason about and there’s no tight coupling.
For example, if I’m calling libcurl directly in C++, I’ll create a generic adapter. Auto completion isn’t adequate for that library anyway, unless you can remember the docs.
If it’s some unwieldy “does everything” internally developed monolith by a team from hell, the same applies. Encapsulated composition.
It limits the scope & necessity of domain knowledge to be scattered about everywhere. The core logic is easy to reason about and there’s no tight coupling.
For example, if I’m calling libcurl directly in C++, I’ll create a generic adapter. Auto completion isn’t adequate for that library anyway, unless you can remember the docs.
If it’s some unwieldy “does everything” internally developed monolith by a team from hell, the same applies. Encapsulated composition.