¿Cómo se programa de manera efectiva cuando toma mucho tiempo simplemente probar su código?

16

Mi flujo de trabajo siempre ha sido escribir un paso lógico y luego ejecutar el programa e inspeccionar la salida. Este proceso me ha servido increíblemente bien para las tareas en la universidad. Sin embargo, a medida que hago más desarrollo, a menudo hay momentos en que simplemente compilar y ejecutar su código lleva de 1 a 2 minutos. Los ejemplos incluyen cargar un programa a un microcontrolador, requerir interacción con un servidor externo e incapaz de implementar la automatización debido a autenticación, arquitectura de software o complejidad.

Este tipo de tareas son muy inadecuadas para la forma en que normalmente programo, y tengo dificultades para codificar de manera efectiva. Por lo general, cometo muchos errores de sintaxis y errores de lógica, la mayoría de los cuales puedo detectar fácilmente mediante pruebas. Sin embargo, con un tiempo de espera tan largo, este método lleva demasiado tiempo.

Anne Nonimus
fuente
¿Estás usando un IDE?
Woot4Moo
3
Su problema raíz no es no poder codificar de manera efectiva, son pruebas que tardan demasiado en ejecutarse. Estás haciendo la pregunta equivocada.
Rein Henrichs
Use un lenguaje que tenga un REPL.
Robert Harvey
¿Tiene colegas a los que pueda preguntar y aprender?
user985366

Respuestas:

25

En primer lugar, cualquier tipo de depuración interactiva es excelente. Desea eso en su kit de herramientas, porque si aún no, algún día realmente se beneficiará de tenerlo. (Los detalles varían según el idioma, la plataforma y el IDE).

requiere interacción con un servidor externo y no puede implementar la automatización debido a la autenticación, la arquitectura del software o la complejidad.

Buscaría algunos marcos para usar objetos simulados . Esto le permite rodear el componente que se está probando con un ecosistema falso de otros componentes, para que sus pruebas estén más específicamente dirigidas y pueda evitar probar todo como una unidad completa.

Además, los objetos simulados se pueden programar con aserciones, por lo que puede verificar que el componente que se está probando realmente hizo una determinada llamada.

Darien
fuente
12

Trabajaría duro para reducir el tiempo de prueba. Trabajé en un par de empresas desarrollando código incrustado, y las pruebas fueron dolorosas, requirieron viajes a la sala de servidores y FTP manuales, reinicios y múltiples comandos para el hardware de prueba. Luego me uní a un grupo realmente bueno, donde simplemente podía escribir 'hacer prueba' en mi escritorio y obtener resultados en menos de un minuto. En ese minuto:

  • Mi código fue integrado en una nueva imagen del kernel para hardware embebido.
  • El servidor DHCP se actualizó para apuntar al nuevo núcleo.
  • El tablero de prueba se reinició.
  • La placa de prueba recuperó el núcleo de mi estación de trabajo a través de un montaje NFS.
  • La placa de prueba se reinició en el nuevo núcleo.
  • Se ejecutaron las pruebas unitarias.
  • La salida de prueba de la unidad se devolvió a mi estación de trabajo.

Tomó algún tiempo hacer que todo esto funcionara, pero el esfuerzo para automatizar todos estos pasos se recuperó cien veces a medida que el personal de desarrollo creció.

Kevin Cline
fuente
2
+1. No hay problema que no pueda resolverse con una cantidad suficiente de script de shell.
Tom Anderson
1
No me quedaré en equipos que no se preocupan por mejorar la velocidad.
Kevin Cline
@Tom Excepto demasiadas capas de abst ab, scripts de shell;)
Darien
No, simplemente escribes un script de shell que envuelve el otro script de shell. Luego está ese script de shell. CRÉEME.
Tom Anderson
3
+1: Mejorar la velocidad de edición -> compilar -> cargar -> ejecutar -> depurar -> editar es lo mejor que puede hacer para acelerar la producción de código. Cuando trabajé en Tymshare, tuvimos un tipo que afirmó (correctamente) que su código se ejecutó correctamente en el primer intento el 87% del tiempo. Yo, por otro lado, codifiqué como si tuviera una sobredosis de mono con cafeína a la 1 a.m. (que era). Cometí un montón de errores tipográficos, etc., pero no me preocupé porque sabía que el compilador los detectaría. Al final del día, probablemente era de 3 a 5 veces más productivo que él.
Peter Rowell
8

Las pruebas automatizadas no reemplazan la revisión y la comprensión.

Puede ser que esté utilizando las pruebas como una muleta. Si está haciendo esto, impedirá su aprendizaje. No estoy abogando por que no pruebes. En cambio, le recomendaría que antes de ejecutar su prueba revise lo que escribió. Comprenda lo que escribió, asegúrese de que tenga sentido y de que la sintaxis se vea correcta.

dietbuddha
fuente
5

Usted ya dio la respuesta: I usually make a lot of syntax errors and logic errors

Entonces, trabajando duro para mejorar eso, debería poder reducir el tiempo de prueba. Los errores de sintaxis deben ser los primeros que debe reducir. ¿Nunca tuvo una prueba de programación con papel y lápiz en su estudio?

Tuve lo mismo cuando cambié de PHP a Java. Tuve que aprender a depurar en lugar de simplemente imprimir algunas variables y presionar F5 en el navegador ...

WarrenFe
fuente
2
Todos cometemos errores estúpidos de vez en cuando, solo ocurren menos con el tiempo y la experiencia.
maple_shaft
@maple_shaft es cierto, pero cuando dice make a lot ofque parece que debería invertir su energía para mejorarlo
WarrenFaith
3
Hice una buena cantidad de codificación en papel y en pizarras blancas. El problema es el mismo: el código se ve bien en la primera inspección, pero después de ejecutarlo, notas tus errores.
Anne Nonimus
notar errores en el código y escribir código con una sintaxis incorrecta es una gran diferencia. El primero le puede pasar a todos, el segundo sugiere un nivel de principiante. No conozco tus antecedentes, pero incluso como principiante deberías minimizar los problemas de sintaxis. ¿Cuál es su IDE e idioma? Debería admitir comprobaciones de sintaxis.
WarrenFaith
@ Anne Nonimus: ¿Te refieres a errores lógicos? Su IDE debería detectar los errores de sintaxis (idealmente, si está trabajando con código generado dinámicamente, esos errores de sintaxis no se detectarán en el momento de la compilación).
FrustratedWithFormsDesigner
4

Necesita una buena unidad o plataforma de prueba funcional que pueda ejecutar las pruebas automáticamente, preferiblemente en segundo plano. Esto requerirá el uso de simulacros como se indicó anteriormente y dependiendo del idioma que esté utilizando algún tipo de inyección de dependencia.

Al hacer que sus objetos sean lo más independientes posible y luego usar métodos de inyección para agregar restricciones externas, no es difícil crear una plataforma de prueba para su código.

Bill Leeper
fuente
2

La verdadera diversión viene cuando simplemente no puedes probar tu código excepto si lo usas con ira. Esto sucede bastante con los sistemas de negociación, ya que los simuladores de intercambio disponibles a menudo son pobres, inexistentes o ni siquiera cumplen con lo que dicen los proveedores del software de intercambio. Esto es parte del rico tapiz de la vida, me temo. Mi enfoque es asegurarme de que al menos mi lado de la transacción esté bien escrito y bien documentado, para que pueda cambiarse fácilmente rápidamente.

Neil Butterworth
fuente
3
Los ingenieros de software de "intercambio" y "comercio" son una raza única. Mi amigo tuvo una serie de crisis mentales trabajando para una de esas compañías. Nunca escuché cosas buenas de ese nicho de la industria del software.
maple_shaft
@ Maple Bueno, ya no lo hago más. Pero único? No, cualquiera puede escribir código malo, y la mayoría del código comercial es muy, muy malo. Sin embargo, nos guste o no, es la base de nuestra sociedad.
Neil Butterworth
Sí, escuché lo mismo sobre el código de telecomunicaciones y cuántos millones de líneas había en el software de control del interruptor. Luego me uní a una empresa de telecomunicaciones y me di cuenta de que si hubieran empleado a algunos programadores, miles de líneas habrían sido suficientes.
Kevin Cline
2

Examen de la unidad; Simuladores / aplicaciones simuladas.

Esto tomará tiempo, por supuesto, y es posible que deba recopilar y masajear datos de muestra para crear maquetas apropiadas, pero al final dará sus frutos: se ahorrará todo el tiempo y los problemas que encuentre al intentar realizar pruebas contra sistemas.

Utilizadas correctamente, estas herramientas asegurarán que antes de acercarse a sistemas externos, esté 99.9% seguro de que si su código falla, es algo en el sistema externo / cambio de entorno lo que lo causó, no un error en su propio código.

Trabajé profesionalmente durante bastante tiempo como lo hiciste en la escuela, y en muchos casos fue muy efectivo. Eventualmente trabajé con algunas personas que me obligaron a abandonar esa metodología y usar pruebas unitarias y maquetas en su lugar.

Ahora, no comienzo ningún proyecto sin pensar primero en la implementación de las fases de prueba: pruebas unitarias, maquetas, simuladores, datos de muestra, etc.

Vector
fuente
1

Usualmente cometo muchos errores de sintaxis y errores lógicos

Tal vez usar un Linter puede ayudarte un poco aquí.

Estaba en una situación similar con mi empleador anterior. Nuestra base de código era realmente enorme y para hacer los cambios que tenía que codificar, compilar y luego reemplazar los .classarchivos en un servidor de desarrollo y luego reiniciar el servidor de desarrollo con el script de reinicio. Y para mi consternación, llevará aproximadamente media hora volver a poner en marcha el servidor de desarrollo.

Más tarde descubrí que la depuración remota del servidor de desarrollo también era posible.

Esto es lo que hice para optimizar mi proceso.

  • Primera ronda inicial de depuración remota, esto me permitió ver el flujo de código exacto y los valores / estados exactos de las variables.

  • Planeando cómo y qué cambios haré.

  • Hacer cambios y luego comparar las diferencias

  • Errores de almacenamiento en caché utilizando linter o compilando.

  • Dando el hotfix reemplazando los .classarchivos y reiniciando.

A veces también incluiría una gran cantidad de declaraciones de registro para verificar nuevamente el flujo del código y verificar la verificación de valores / estados. Esto me ayudó mucho.

También usar un IDE con una buena complicación automática puede ser de gran ayuda para reducir los errores tipográficos.

Espero que esto ayude.

Alaf Azam
fuente