¿La simplicidad siempre mejora la legibilidad?
Yo diría, tal vez con un poco de controversia, absolutamente no .
Podrías entregarme una clase con 200 funciones miembro en su interfaz pública, y puede ser la interfaz pública más legible por humanos que existe. Puede ser una alegría leer de forma casual dicho código y su documentación. Sin embargo, no lo llamaría "simple", porque a pesar de la legibilidad, tendría que preocuparme por la forma en que todas estas funciones interactúan entre sí y, potencialmente, estar atento a los casos extremos difíciles derivados del mal uso.
Preferiría una clase con 20 funciones miembro que no fueran tan fáciles de leer a 200, porque la "legibilidad" no es la máxima prioridad para mí en términos de prevenir errores humanos y mejorar la facilidad de mantenimiento del código (la facilidad con la que podemos cambiarlo, es decir).
Sin embargo, todo esto dependerá de nuestra definición personal de "simplicidad". "Legibilidad" normalmente no varía que violentamente entre nosotros, a menos que alguien ha adquirido tanta experiencia y fluidez que consideran expresiones regulares que ser muy "legible", por ejemplo, olvidar el resto de los mortales.
Sencillez
Hubo un tiempo, hace mucho tiempo, en el que pensaba que "simplicidad" significaba "lo más fácil de leer posible". Entonces escribiría código C con muchas funciones convenientes, tratando de mejorar la sintaxis y hacer las cosas lo más fáciles de leer y escribir posible.
Como resultado, diseñé bibliotecas muy grandes, ricas y de alto nivel, tratando de modelar una función para cada pensamiento humano natural: ayudantes sobre ayudantes sobre ayudantes, todo para dar forma al código del cliente a una sintaxis más legible. El código que escribí en ese momento puede haber sido el más "legible", pero también fue el más "imposible de mantener" y "complejo".
Ceceo
Sin embargo, tuve una breve pasión con LISP a mediados de los 90 (recién llegado). Cambió toda mi idea de "simplicidad".
LISP no es el lenguaje más legible. Esperemos que nadie piense que extraer CDR y CAR mientras se invoca una función recursiva con una gran cantidad de paréntesis anidados es muy "legible".
Sin embargo, después de luchar para que mi cerebro se envolviera en la sintaxis extraña del lenguaje y las formas totalmente recursivas de hacer las cosas, cambió permanentemente mi idea de simplicidad.
Lo que encontré con el código que escribí en LISP es que ya no estaba cometiendo errores sutiles, a pesar de que el truco de pensar de esa manera me hizo cometer errores más evidentes (pero son fáciles de detectar y corregir). No entendía mal lo que estaba haciendo una función y me perdía un efecto secundario sutil e inesperado. En general, me estaba resultando más fácil hacer cambios y escribir programas correctos.
Después de LISP, la simplicidad para mí se convirtió en minimalismo, simetría, flexibilidad, menos efectos secundarios, menos funciones pero más flexibles que se combinan en una infinita variedad de formas.
Llegué a apreciar la mentalidad de que el código más confiable de todos es el código que no existe. Si bien es solo una métrica cruda, tiendo a ver el potencial de falta de confiabilidad del código en función de su cantidad. La búsqueda de la máxima comodidad sintáctica y legibilidad tiende a aumentar esa cantidad en un factor importante.
Minimalismo
Con la mentalidad de LISP incrustada en mí, llegué a preferir API minimalistas. Prefiero una biblioteca con menos funciones, pero más confiables y flexibles, que sean menos convenientes y potencialmente más difíciles de leer que una que ofrezca una gran cantidad de ayudantes "convenientes" y que pueda hacer que el código sea fácil de "leer" pero potencialmente tropezar Más problemas con la falta de fiabilidad y las sorpresas que resultan de la mala interpretación de una de estas miles de funciones.
La seguridad
Otra cosa sobre LISP era la seguridad. Promovió efectos secundarios mínimos y funciones puras, y fue allí donde ya no me veía cometiendo errores sutiles, a pesar de que la dificultad de leer y escribir en el idioma aumentó los errores más evidentes que pude detectar 10 segundos después.
Las funciones puras y los estados inmutables se volvieron preferibles para mí cada vez que podía pagarlo, incluso si la sintaxis de:
sword = sharpen(sword)
... es un poco menos directo y distante del pensamiento humano que:
sharpen(sword)
Legibilidad VS. Sencillez
Una vez más, LISP no es el lenguaje más "legible". Puede empaquetar mucha lógica en una pequeña sección de código (posiblemente más de un pensamiento humano por línea). Tiendo a preferir idealmente un pensamiento humano por línea para "legibilidad", pero no necesariamente para "simplicidad".
Con este tipo de definición de "simple", a veces "simple" en realidad podría competir con "legible". Esto está considerando las cosas más desde el punto de vista del diseño de la interfaz.
Una interfaz simple significa que necesita aprender muchas menos cosas para usarlo, y potencialmente tiene una mayor confiabilidad y menos problemas como resultado de su minimalismo. Una documentación completa sobre el tema podría encajar en un folleto en lugar de un volumen masivo de libros. Sin embargo, puede requerir un poco más de trabajo duro y generar un código menos legible.
"Simple" para mí mejora nuestra capacidad de comprender la funcionalidad de nuestro sistema a un nivel amplio. "Legible" para mí mejora nuestra capacidad de conectar cada pequeña línea de código con el lenguaje natural y el pensamiento, y podría acelerar nuestra comprensión de lo que hace una línea de código, especialmente si no hablamos el idioma con fluidez.
Regex es un ejemplo de lo que considero "extremadamente simple". Es "demasiado simple e ilegible" para mi gusto personal. Hay un acto de equilibrio para mí entre estos extremos, pero regex tiene esa calidad de simplicidad similar a LISP como la defino: minimalismo, simetría, flexibilidad increíble, confiabilidad, etc. El problema para mí con regex es que es tan simple que se ha vuelto tan ilegible hasta el punto en que no creo que pueda hablarlo con fluidez (mi cerebro simplemente no funciona de esa manera y envidio a las personas que pueden escribir código regex con fluidez).
De todos modos, esa es mi definición de "simplicidad", y es completamente independiente de la "legibilidad" y, a veces, incluso puede interferir con la otra, lo que lleva a un acto de equilibrio entre una biblioteca más "sintácticamente conveniente" y legible pero más grande o una "sintácticamente". inconveniente ", menos legible, pero más pequeña biblioteca. Siempre he encontrado la verdadera "conveniencia de comprender" y las verdaderas prioridades de "mantenibilidad" para alinearse con esta última, con la fuerte preferencia hacia el minimalismo incluso a un costo de legibilidad y sintaxis humana más natural (pero no hasta el punto de la expresión regular) . YMMV.