¿El propósito detrás del código es 'idiomático' para reducir la sobrecarga cognitiva?

22

Estoy tratando de explicarle a alguien que la forma en que ha escrito el código hace que sea difícil de entender, y si lo refactoriza, entonces es más fácil de leer. Este estilo de código al que conduzco se llama comúnmente código 'idiomático'.

Pero la frase código idiomático trae consigo un bagaje de corrección moral , que no es un gran motivador para que las personas cambien su estilo de codificación. Una forma más positiva de decir esto es el código que sigue el estilo común , pero para un pensador crítico que aparece como un razonamiento mental de rebaño.

La forma en que se me ocurrió explicar esta idea de una manera que motiva a las personas a cambiar su código es:

  • escribir el código de tal manera que reduzca la sobrecarga cognitiva del lector (por ejemplo, no recuerdo si este es el primer tipo de vector, o el quinto tipo de vector)
  • código que facilita la comprensión de la intención (por ejemplo, ¿para qué es este vector?)

(Por otro lado, soy consciente de que el libro The Joy of Clojure, antes de su primera publicación, tenía el borrador del título Idiomatic Clojure. Por lo tanto, parecería una razón para hacer que el código sea 'idiomático', para 'traer alegría' al lector )

Mi pregunta es: ¿el propósito detrás del código es 'idiomático' para reducir la sobrecarga cognitiva?

ojo de halcón
fuente
Mi comentario típico, con respecto al código de lectura, es que escribes código para al menos dos compiladores: las otras personas, incluido tú mismo, que tienen que leer el código más tarde. Y el proceso que ejecuta a través de Ant, Make o un IDE. El primero es más importante.

Respuestas:

19

Primero, no estoy seguro de que haya algún tipo de "corrección moral" en el término "idiomático". La definición simple del diccionario es simplemente

peculiar o característico de un idioma o dialecto particular: francés idiomático.

Sí, el código idiomático generalmente reduce la sobrecarga cognitiva, particularmente en las definiciones de interfaz donde las bibliotecas estándar y las bibliotecas de terceros que necesita el proyecto son (prácticamente) idiomáticas.

Sin embargo, como punto de venta, me enfocaría en lo que la reducción de la sobrecarga cognitiva hace por usted. Hace que sea más fácil para los programadores detectar errores porque no están tratando de desentrañar el código escrito en un estilo único para descubrir dónde está sutilmente uno o si maneja mal un caso extremo. Facilita la revisión del código de otras personas, lo que hace que sea más probable que el equipo realice revisiones reales que identifiquen problemas reales en lugar de discutir sobre la sintaxis.

Más allá de reducir la sobrecarga cognitiva, el código idiomático es generalmente un código más eficiente. La mayoría de las expresiones idiomáticas en un idioma en particular evolucionan porque el lenguaje está diseñado para abordar los problemas de una manera particular. Los compiladores o intérpretes que está utilizando enfocarán sus optimizaciones en código idiomático. Si usa un lenguaje donde la recursión es la forma idiomática de estructurar un código, por ejemplo, puede estar seguro de que su compilador implementa la recursividad de cola. Si usa un lenguaje donde la recursión no es idiomática, es mucho menos probable. Es poco probable que la recursividad de cola no se pueda implementar en todas partes, pero la mayoría de los escritores de compiladores no se centrarán en cosas que no suceden comúnmente.

Justin Cave
fuente
1
Su respuesta, bastante razonable, inspira esta reacción: ¿Francés idiomático, de París, Montreal, Costa de Marfil? El código no es tan diferente. No hay idioma sin comunidad. Si suena como de Montreal, puede esperar causar una pequeña 'sobrecarga cognitiva' en París. Probablemente el mundo siempre estará dividido entre aquellos que piensan que hay una sola forma correcta (¿Python?) Y aquellos que dicen Vive la différence! (Javascript?) Ahora, si queremos escribir un lenguaje Javascript que los compiladores encuentren más eficiente, ¡todos escribiremos como un minificador / uglifier!
joshp
Afortunadamente, cuando salió V8, los diseñadores decidieron que ya no jugarían al juego de microbenchmarks artificiales y crearon puntos de referencia que simulan código idiomático del mundo real, bien diseñado y bien diseñado, y los otros proveedores ahora hicieron lo mismo. Esto dio como resultado una inversión de roles en el juego de rendimiento: antes era tarea del programador escribir su código de rendimiento para que los escritores del compilador tuvieran un trabajo fácil, ahora es el trabajo de los escritores del compilador diseñar sus compiladores para el rendimiento, para que el programador tenga un trabajo fácil, como debe ser.
Jörg W Mittag el
Bonito arenque rojo, pero los idiomas hablados comparten un límite geográfico, los idiomas de computadora no. Entonces tu punto es un poco discutible. Sin mencionar la comparación de Python vs JavaScript con dialectos parisinos vs Montreal. (No estoy seguro de quién se ofendería más, ¿los programadores de Python o los habitantes de Montreal?; D).
Marco
10

No estoy seguro de dónde sacas la idea de que los modismos tienen connotaciones morales. Los modismos son solo una forma de expresar las cosas. Son patrones a una escala mayor que las palabras o frases individuales.

Si te dijera que hay que aullar con los lobos, no sabrías a qué me refiero, a pesar de que es un idioma alemán muy conocido. Si, OTOH, te dije, cuando estés en Roma, haz lo que hacen los romanos, sabrías de inmediato de lo que estoy hablando, porque utilicé el idioma inglés apropiado.

Los lenguajes de computadora no son diferentes.

En realidad, un nombre alternativo para "modismo" en el mundo de la programación es "patrón de implementación". Esto relaciona la idea con la idea de patrones, que proviene del arquitecto (ladrillo y mortero, no bits y bytes) Christopher Alexander. La mayoría de los programadores conocen Patrones de diseño, algunos saben sobre Patrones de arquitectura, que son patrones en una escala mayor que los Patrones de diseño. Los modismos son patrones en una escala más pequeña que los patrones de diseño.

Jörg W Mittag
fuente
5

La mayoría de los idiomas se prestan intencionalmente a un estilo particular. El código escrito en ese estilo es lo que es idiomático. Si mira más allá del hecho circunstancial de que su elección del entorno de tiempo de ejecución reduce su elección de idiomas disponibles, debe elegir idiomas porque el problema en cuestión es fácil de expresar en los idiomas particulares de un idioma.

Sin embargo, la mayoría de la gente no entiende eso. Por ejemplo, muchos programadores de Java se esfuerzan por mantener el mismo estilo cuando tienen que escribir JavaScript (podrían haber escrito Java y haberlo compilado de forma cruzada, eso sí) y tienen éxito hasta cierto punto, escribir código que es idiomático de Java en JavaScript. pero siempre tendrán la sensación de luchar contra JavaScript. Falta ciertas características o resulta difícil emularlas.

El código idiomático es bueno. Es difícil para el extraño, pero pueden aprender. En última instancia, el código debe mantenerse durante años, por lo que si puede encontrar un lenguaje dentro de los idiomas en los que el programa subyacente se pueda expresar de manera simple, eso es lo que debe hacer.

Permítanme aclarar que definitivamente existe el uso excesivo de expresiones idiomáticas (o las características subyacentes del lenguaje). Si usa plantillas de C ++ para ejecutar partes significativas de la lógica de la aplicación en tiempo de compilación, o si su programa Lisp completo es una llamada a alguna macro que se despliega a lo real de maneras prácticamente impredecibles, si su solución Java de un problema simple se infla las proporciones de FizzBuzzEnterpriseEdition ... lo estás haciendo mal.

La gente dice que el código debe ser fácil de leer. Eso es solo la mitad de la verdad. Debe ser fácil de entender, lo que requiere que sea fácil de razonar también. Eso requiere un uso adecuado de las abstracciones. Como con la mayoría de las cosas, se trata de lograr el equilibrio correcto.

back2dos
fuente
Desearía poder dar otro +1 solo para ese enlace FizzBuzzEnterpriseEdition ... :-D
cmaster