Una Narrow Interface se refiere a un contrato de programación (API, interfaz de un módulo, servicio o componente) que está diseñada para ser lo más pequeña y concisa posible, exponiendo solo las operaciones esenciales y los datos necesarios para su propósito. Su objetivo principal es reducir la complejidad, minimizar las dependencias entre componentes y facilitar la evolución del sistema. Al tener menos puntos de interacción y menos detalles de implementación expuestos, se mejora la encapsulación y se reduce la probabilidad de introducir errores o efectos secundarios no deseados.

Este principio se observa en diversas áreas de la ingeniería de software. Por ejemplo, en microservicios, una API REST bien diseñada para un servicio específico que solo expone los endpoints estrictamente necesarios para su dominio es una Narrow Interface. En sistemas operativos, las llamadas al sistema (syscalls) son Narrow Interfaces que exponen funcionalidades del kernel de manera controlada y mínima. Las interfaces de los drivers de hardware también suelen ser Narrow Interfaces para interactuar con dispositivos específicos. Otro ejemplo son las interfaces de los 'message brokers' como Kafka o RabbitMQ, que ofrecen un conjunto limitado de operaciones (publicar, suscribir, consumir) para interactuar con los mensajes, ocultando la complejidad interna de la distribución y persistencia.

Para un arquitecto, la elección de diseñar Narrow Interfaces es crucial. Fomenta la modularidad, la cohesión y la baja acoplamiento, lo que facilita el mantenimiento, la escalabilidad y la resiliencia del sistema. Sin embargo, el trade-off radica en el esfuerzo inicial de diseño para identificar el conjunto verdaderamente mínimo de funcionalidades, evitando la tentación de exponer detalles internos. Una interfaz demasiado estrecha podría requerir múltiples llamadas para lograr una operación compleja, impactando el rendimiento. Una interfaz demasiado amplia (Wide Interface) aumenta la superficie de ataque, la complejidad para los consumidores y dificulta los cambios internos. El arquitecto debe equilibrar la simplicidad y la expresividad, buscando el punto óptimo que permita la evolución del sistema sin comprometer su estabilidad y rendimiento.