Sì, dovresti codificare le interfacce anziché le implementazioni conosciute, e sì, dovresti prima costruire interfacce piuttosto che farle emergere dal tuo codice.
Le ragioni di entrambe le raccomandazioni sono in gran parte le stesse: la programmazione per computer riguarda in gran parte i fattori umani. Molti trovano questo sorprendente, ma considerano: ci sono un numero quasi infinito di modi diversi per risolvere lo stesso problema informatico che funziona ugualmente bene. Quasi tutti sono assolutamente impossibili da dare un senso a chiunque non li abbia scritti (o di fatto all'autore poco tempo dopo).
Ne consegue che una buona ingegneria del software è in gran parte su come ottenere l'effetto desiderato (calcolo corretto con efficienza ragionevole) in un modo che consenta di utilizzare il codice sorgente in seguito. Le interfacce e le API sono una parte cruciale di tale disciplina: consentono di pensare a un problema a un livello di descrizione alla volta. Questo è molto più facile che pensare alle regole di coerenza aziendale e sulle implementazioni delle liste collegate contemporaneamente, e quindi imporre forzatamente tale separazione delle preoccupazioni è migliore che consentire al programmatore del client usare il tuo codice come preferisce.
Questo è difficile da credere per molti programmatori di cowboy, che sono convinti di comprendere tutto ciò che scrivono, sono molto migliori dei pensatori medi e possono gestire tutta la complessità che dà problemi ai programmatori "minori". Non essere consapevoli dei propri limiti cognitivi è un fenomeno estremamente comune - ecco perché le migliori pratiche nell'organizzazione del codice sono così estremamente importanti (e così spesso ignorate).
Per ripetere, le interfacce e le barriere API sono in gran parte buone , anche quando collabori solo con te stesso. Per quanto riguarda le librerie esterne, se portano con sé un'API ben ponderata, non vedo alcun problema nell'usarlo poiché è fin quando non si prevede di dover sostituire quella libreria con un'altra. Altrimenti, un wrapper o un layer anti-corruzione può essere un'ottima idea.