¿La generación de código aumenta la calidad del código?


12

Argumentando para la generación de código, estoy buscando algunos ejemplos de formas en que aumenta la calidad del código. Para aclarar lo que quiero decir con generación de código, solo puedo hablar sobre un proyecto mío:

Utilizamos archivos XML para describir las relaciones entre entidades en nuestro esquema de base de datos, por lo que nos ayudan a generar nuestro marco ORM y formularios HTML que se pueden usar para agregar, eliminar y modificar entidades.

En mi opinión, aumenta la calidad del código porque se reduce el error humano. Si algo se implementa incorrectamente, se rompe en el modelo, lo cual es bueno porque el error puede aparecer antes, ya que también se rompe más código generado.

Como me pidieron la definición de la calidad del código , déjenme aclarar esto, lo que quise decir es la calidad del software .

Calidad del software : no es un atributo sino muchos, por ejemplo, eficiencia, modificabilidad, legibilidad, corrección, robustez, comprensibilidad, usabilidad, portabilidad, etc., que se afectan entre sí.


3
¿Cuál es su definición de calidad de código?
NoPuerto

@EmmadKareem Agregué una breve definición de la misma en la pregunta original.
platzhirsch

1
Creo que la generación automática de código ayudará a aumentar la consistencia y uniformidad en su código. En algunos casos, eso aumenta la calidad, pero no creo que sea un problema general.
joshin4colours

Respuestas:


38

Los generadores de código no pueden generar un código mejor que la persona que escribió el generador.

Mi experiencia con los generadores de código es que están bien siempre y cuando nunca tenga que editar el código generado . Si puedes aferrarte a esa regla, entonces estás listo para comenzar. Esto significa que puede volver a generar de manera confiable esa parte del sistema con confianza y velocidad, agregando automáticamente más funciones si es necesario. Supongo que eso podría contar para la calidad.

Una vez escuché un argumento para los generadores de código de que un solo programador puede producir tantas y tantas líneas de código por día y con los generadores de código, ¡podrían producir miles de líneas! Obviamente, esa no es la razón por la que estamos usando generadores.


66
+ la sección en cursiva mil veces. Los generadores de código deberían funcionar como su compilador o el mecanismo de plantilla de C ++: nunca debería tener que editar manualmente su salida. La única vez que debería leer la salida es si sospecha que hay un error.
anon

1
Es una pena que no pueda votar más ...
Fabricio Araujo

@anon: Los Homans generalmente no deberían editar la salida de generadores de código o compiladores, pero a veces puede ser perfectamente razonable tener un proceso de compilación que implica ejecutar una pieza de código generado por máquina a través de un programa que le aplica alguna modificación. También hay ocasiones en las que puede ser necesario que un humano edite manualmente la salida de un proceso de compilación si es necesario parchear el código desplegado mientras se cambia un número mínimo de bytes, pero cuando el código se modifica a mano de tal manera, uno debería también archivar todos los archivos del proceso de construcción (no sólo la fuente!) y ...
supercat

... también actualice el código fuente para que coincida con la semántica del código de objeto editado a mano.
supercat

20

Yo diría lo contrario : suponiendo que esté escribiendo aplicaciones interesantes, la generación de código disminuye la calidad del código. La naturaleza de la generación de código recompensa marcos muy cortadores de cookies, exagerados y demasiado especificados que se vuelven muy difíciles de manejar sin depender continuamente de la herramienta de generación de código para generar continuamente grupos de código más grandes, más complejos y más feos. Si bien puede ser una buena herramienta, realmente no debería ser la herramienta principal en el cuadro.


3
De acuerdo, la basura que sale de algunos ORM (basura desde el punto de vista de alguien que sabe cómo escribir código de base de datos con buen rendimiento) es un buen ejemplo. A menudo funciona lo suficiente como para que alguien que no sabe lo que está haciendo piense que funciona. Y los nuevos programadores no obtienen la habilidad para hacer las cosas más difíciles que deben hacerse fuera del generador porque no entienden los conceptos básicos.
HLGEM

1
Ooh, +1 o -1 ... por un lado, la generación de código es muy útil para eliminar código aburrido y repetitivo donde tienes una definición que simplemente se expande en código, pero tienes razón en que se usa en exceso en todo tipo de Complejidad 'que ahorra tiempo' que termina siendo un antipatrón en sí mismo.
gbjbaanb

13

Creo que la generación y la calidad de código automatizadas son algo ortogonales y no necesariamente se correlacionan.

La generación de código es simplemente una forma de resolver una tarea técnica específica. Si resulta en una mayor calidad del código depende mucho de lo que esté haciendo.

Su situación es un buen ejemplo de generación de código que resulta en una mayor calidad del código a través de la detección temprana de posibles errores.

Puedo darle otro ejemplo cuando la generación automática de código disminuye la calidad del código. Está fuera de todo poderoso ASP.NET WebForms. Realiza la generación de código automatizada al traducir una jerarquía de controles de UI en marcado HTML, que es todo menos estable, predecible y manejable.

Para llegar a la conclusión, la generación automática de código puede ayudar a aumentar la calidad del código cuando se usa correctamente.


11

La generación de código no afecta la calidad del código , per se, tanto como la consistencia del código .

El código generado será consistente entre instancias de generación. Si el generador está diseñado para emitir código de buena calidad, entonces el código generado será de una calidad consistentemente buena. Sin embargo, si el generador de código emite un código de mala calidad, obtendrás un código constantemente malo.

La generación de código también se puede usar para construir código más rápido . Sin embargo, más rápido no significa mejor ... Simplemente podría significar que obtienes tu código de mala calidad mucho más rápido.


6

La generación de código es buena si:

  • se supone que el código generado no se debe editar
  • el generador de código le brinda suficiente flexibilidad para hacer lo que necesita hacer
  • El idioma de entrada al generador de código es mejor (es decir, SECO) que lo que de lo contrario tendría que escribir
  • el generador de código crea un buen código confiable del que no tiene que preocuparse, incluso si es prolijo

Cuando este es el caso, el código cuya calidad debe tener en cuenta es el código que se ingresa al generador.

Una medida simple de la calidad es, para los cambios típicos en los requisitos, cuánto tiene que hacer la edición manual. Cuanto menos, mejor.


y que el código generado se vuelve a asignar de forma transparente al original, por lo que no tiene que depurar el código generado.

@ Thorbjørn: estoy de acuerdo. En una aplicación que he tenido que mantener, se genera Fortran. La necesidad de poder depurarlo se perdió a lo largo de los años, y yo soy el único lo suficientemente estúpido como para estar presente para atender las llamadas de servicio :)
Mike Dunlavey

No estoy de acuerdo con que el generador de código sea flexible. Tiene que estar dirigido: haga una cosa bien, no muchas cosas. Debe tomar una entrada pequeña y bien definida y escribir un fragmento de código para usted. Cuando comienza a ser el programa, se dirige al fracaso.
gbjbaanb

@gbjbaanb: estoy de acuerdo. Por eso dije suficiente flexibilidad . Para mí, el problema no es el generador de código en sí, sino el lenguaje específico del dominio que sirve como entrada. Si ese DSL es demasiado flexible, el usuario tiene que buscar opciones. Si no es lo suficientemente específico, el usuario debe evitar sus limitaciones. Puedo dar ejemplos de estos.
Mike Dunlavey

4

Aumento de la calidad del código debido a DRY (no se repita).

Las reglas de generación de código se escriben una vez; no están codificados para cada instancia de código generado, y por lo tanto reducen el potencial de error humano al copiar / pegar el contenido con ligeras modificaciones.


A menos que tenga que editar el código generado, que no está SECO en absoluto ... Tuve que hacerlo recientemente, no es nada agradable . Si tuviera que editar manualmente una base de código autogenerada nuevamente, ¡cobraré tres veces!
Fabricio Araujo

1
No debería tener que editar ese código; edite el código que hizo la generación misma y aumente con reglas adicionales si es necesario. La edición del código generado debería ser el último recurso.
earlSin nombre

1
Me gustaría tener esa opción ... no lo hice.
Fabricio Araujo

2

Supongo que te refieres a generadores de código patentados manejados para un uso interno específico, ya que de lo contrario cualquier cosa que no sea código de máquina es un generador de código. Pero aquí tienes:

ingrese la descripción de la imagen aquí

Creo que es muy discutible que el gráfico de nodo en Blueprints sea más fácil de mantener y mucho menos propenso a errores que el código GLSL / HLSL que genera (y de lo contrario hubiera sido necesario escribirlo a mano).

También es mucho más productivo crear nuevos sombreadores, ya que obtienes una retroalimentación visual en tiempo real de cómo se ve el resultado final a medida que cambias el gráfico. Definitivamente preferiría mantener miles de sombreadores representados con gráficos nodales de esta manera en lugar de código GLSL / HLSL, y en realidad estoy más familiarizado con escribir GLSL / HLSL que con Blueprints. Creo que en realidad es prácticamente imposible causar como un error importante, además de algún error visual menor que probablemente atraparías de inmediato porque el "lenguaje visual" impone restricciones sensibles con un estilo funcional puro que no te permite, por ejemplo, estrellar un sombreador, al menos AFAIK (ciertamente no soy un experto en Blueprints).

Ya ni siquiera hay un "código" para mantener. Simplemente coloca nodos dentro de un gráfico y dibuja enlaces entre ellos y, voila, genera un código de sombreador para usted. Quien mantiene estas cosas y dice: " Sabes, mi vida sería mucho más fácil y tendría mucho más tiempo libre si solo estuviera escrito en código GLSL en lugar de usar Blueprints " . Probablemente nunca.

Dicho esto, me he encontrado con mi parte de generadores de código patentados que hicieron la vida más difícil, haciéndome aprender este estúpido metalenguaje que tiene beneficios muy limitados, si los hay, sobre escribir código en el lenguaje del código que generó. Para mí, una señal reveladora de generación de código que es una mierda es algo que hace poco más que reducir una pequeña cantidad de repetitivo y en realidad no reduce, por ejemplo, la posibilidad de errores. Sabes que es especialmente malo si en realidad introduce nuevas formas de causar errores que el idioma original no tenía. Pero hay casos para la generación de código, como el anterior, en los que el aumento de la productividad es tan masivo, lo que hace que las cosas meticulosas que cuestan un tiempo enorme ahora cuestan centavos, que nadie lo usará y luego mirará hacia atrás.

Para mí, hay un argumento más legítimo para el desarrollo patentado de Blueprints entre el equipo de Epic que muchos lenguajes de programación superfluos creados para el público en general que apenas aportan nada nuevo a la mesa.


1

Yo diría que en su caso podría aumentar un poco la calidad, pero reduce mucho el tiempo de desarrollo. A veces, el código generado es escamoso, incómodo o simplemente malo. En esos casos, el código generado puede disminuir la calidad y agregar más tiempo de prueba / fijación / prueba de regresión al proyecto. Y algunas tareas son demasiado complejas para ser fácilmente generadas: el generador se convierte en un sistema completamente separado (posiblemente más grande y más complejo que el proyecto principal) en sí mismo.

Los generadores de códigos están bien, ¡pero ten cuidado con ellos!


1

Solía ​​trabajar en una tienda que dependía mucho de la generación de código. En mi opinión, el código para el proyecto era muy uniforme. Y en ese sentido, la calidad estaba bien.

Sin embargo, cuando ya no se te permite escribir código personalizado porque todo tiene que pasar por el generador, creo que pierdes algo de la ventaja de ser un programador.

Así que creo que este es un tema de espada de doble filo con seguridad. Sí, los generadores son geniales porque reducen los errores y aumentan los estándares de código, sin embargo, también hacen que "algunos" de los programadores sean tontos, porque dependen de los generadores en lugar de tener que ensuciarse las manos.

Solo mis 2 centavos.


3
Los programadores de lenguaje ensamblador solían decir esto sobre los compiladores. Así que no estoy seguro de que este sea un gran argumento. Ser forzado a ensuciarse las manos puede ser una buena experiencia de aprendizaje, pero una vez que haya aprendido, debe usar la herramienta más productiva disponible.
MarkJ

@ MarkJ: A veces, el ensamblaje puede ser mejor que un lenguaje compilado para lograr uniformidad. Por ejemplo, en algunos sistemas embebidos es útil poder codificar el equivalente x=someValue ^ 0xFF ^ 0xFF ^ 0xFF ^ 0xFF;y codificarlo con cuatro instrucciones literales XOR. Si el medio de almacenamiento de código solo puede escribir bytes en blanco (0xFF), la construcción anterior permitirá cuatro cambios arbitrarios en el valor. Incluso si uno reescribiera la expresión como x=someValue; x = x ^ 0xFF ^ 0xFF ^ 0xFF ^ 0xFF;y el compilador evaluó todos los xors en tiempo de ejecución, aún podría usar un "complemento todos los bits" ...
supercat

... instrucción en lugar de un xor-inmediato.
supercat

1

Además de la respuesta de Martin, agregaría que la generación de código SQL es muy buena cuando trabaja registro por registro (seleccione * de tab1 donde tab1.pkcolumn =: parámetro, actualice tab1 set [cualquier número de columnas] donde tab1.pkcolumn =: parámetro, etc.). Y su ORM brillará en ese escenario, porque el SQL que debe generarse es realmente repetitivo.

Mis principales preocupaciones son las metaconsultas: consultas sobre las propiedades del objeto que el ORM traduce a SQL utilizando cualquier algoritmo. Metaconsultas muy similares pueden generar SQL completamente diferente, y no tienen garantía de que este SQL generado sea performatico.

Un lenguaje de metaconsulta que se traduce a otro lenguaje (SQL) que se traduce en un plan de consulta para ejecutar efectivamente la recopilación de datos. Y el resultado generado debe ser objetos, por lo que el ORM debe instanciar los objetos afectados, de modo que pueda desencadenar otra lluvia de consultas para llenar los atributos de los objetos no traídos por la propia metaconsulta ...


0

Estoy totalmente de acuerdo con aquellos que dicen que la generación de código está bien siempre y cuando nunca tenga que editar (preferiblemente, nunca tenga que mirar) el código generado.

Si podemos aceptar que el código generado es aproximadamente el mismo número de líneas que el escrito a mano, y si podemos decir que está libre de errores, entonces el número de líneas que podrían contener errores ha disminuido. Ergo, la calidad del código debería haber aumentado.


Anexo: por supuesto, otros factores, como el tiempo de ejecución, pueden desempeñar un papel.

Personalmente, he escrito bastantes generadores de código, pero nunca como un enfoque inicial.

Siempre ha sido cuando noté un patrón repetitivo en el código existente, por lo que mi generador toma algo de código existente al agregar código nuevo, pero similar, y parametriza algunas partes variables del mismo.

Hasta ese punto, mi código generado es casi idéntico al código escrito a mano existente (excepto que tiende a presentarse mejor visualmente y es más uniforme, lo que creo que ayuda a la legibilidad, si es que alguna vez hay que mirarlo).

Por cierto, abogo por insertar comentarios de apertura / cierre que indiquen que se generó el código, incluidos los detalles de la herramienta y su mantenedor.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.