¿Con qué frecuencia ejecuta y prueba su código mientras programa? [cerrado]

16

Especialmente cuando escribo código nuevo desde cero en C, me encuentro escribiendo código durante horas, incluso días, sin ejecutar el compilador para otra cosa que no sea una comprobación de sintaxis ocasional.

Tiendo a escribir fragmentos de código más grandes con cuidado y realizar pruebas exhaustivas solo cuando estoy convencido de que el código hace lo que se supone que debe hacer al analizar el flujo en mi cabeza. No me malinterpreten: no escribiría 1000 líneas sin probar en absoluto (eso sería apostar), pero escribiría una subrutina completa y la probaría (y arreglaría si fuera necesario) después de que creo que he terminado.

Por otro lado, he visto en su mayoría novatos que ejecutan y prueban su código después de cada línea que ingresan en el editor y creo que los depuradores pueden ser un sustituto del cuidado y la cordura. Considero que esto es una gran distracción una vez que has aprendido la sintaxis del lenguaje.

¿Cuál crees que es el equilibrio correcto entre los dos enfoques? Por supuesto, el primero requiere más experiencia, pero ¿afecta la productividad de manera positiva o negativa? ¿El segundo te ayuda a detectar errores a un nivel más fino?

Blagovest Buyukliev
fuente
3
¿Le lleva horas o días escribir una subrutina completa?
1
@Thorbjorn La subrutina tiene aproximadamente 999 líneas y está ofuscada: #define h for(int c=y-3; y; c++/(randomTypeIDefinedEarlier)s*(float)4*(lol)sin((helloWorld)mysub(2,1,++a,*(r+z))); goto xkcd)y esa es solo una línea.
Mateen Ulhaq
1
Los compiladores a veces pueden tardar mucho tiempo en compilar un programa. Por eso no es una buena práctica compilar todo el tiempo. después de cada función es una buena práctica. Recompilo después de agregar una nueva funcionalidad o algún código difícil. Solo lo uso como un verificador de sintaxis. no hay sustituto para revisar su código cuidadosamente y evitar errores ocultos y comportamientos casuales.
Ross

Respuestas:

6

REALMENTE depende del aspecto del proyecto en el que estés trabajando.

  • Cuando hago algo con OpenGL (que funciona como una máquina de estado), constantemente compilo y ejecuto para asegurarme de que no arruiné nada accidentalmente. Establecer un valor sin recordar restablecerlo al final de una función puede hacer que la aplicación muestre solo una pantalla en negro.

  • Para el desarrollo a gran escala "bajo el capó", trato de obtener tantas pruebas como sea posible de antemano. Como las pruebas pueden decirme más fácilmente qué se rompió, puedo pasar un tiempo sin tener que esperar la compilación típicamente larga.

  • Para el diseño UX, utilizo algún tipo de diseñador visual, que siempre se ve de la forma en que se ejecutará (o cerca de él). Esencialmente, siempre está compilando el código de diseño.

sharoz
fuente
63

Personalmente, debo trabajar en pequeños fragmentos porque no soy lo suficientemente inteligente como para guardar horas de codificación en mi caché L1 biológico. Debido a mis capacidades limitadas, escribo métodos pequeños y cohesivos y diseño objetos para tener un acoplamiento muy flojo. Las herramientas y los lenguajes más potentes facilitan la codificación por más tiempo sin compilar, pero todavía hay un límite para mí.

Mi preferencia es escribir una pequeña pieza, verificar que funcione como esperaba. Entonces, en teoría, soy libre de olvidar los detalles de esa pieza y tratarla como una caja negra tanto como sea posible.

dss539
fuente
12
Voto a favor de "... no lo suficientemente inteligente ..." Me he sentido así durante bastante tiempo.
leed25d
44
¿Qué pasa con tu caché L2?
Mateen Ulhaq
Iba a votar esto, pero la puntuación está en 42 ...
Wayne Werner
Los modelos más nuevos tienen cachés L1 mucho más grandes. ¿Cuándo compraste el tuyo? Es posible que desee buscar una actualización de hardware.
Peter Ajtai
Bueno, no es tanto la edad del modelo como el hecho de que era la línea del "presupuesto". :(
dss539
17

Me gusta escribir mi prueba antes de escribir mi código de implementación. Me gusta esto por tres razones:

  1. Escribir mi código de prueba de antemano me ayuda a pensar cómo se debe usar mi código. Me ayuda a pensar en casos extremos que no pensé cuando estaba diseñando originalmente mi programa.
  2. Sé que terminé de escribir el código de implementación cuando pasan todos mis casos de prueba.
  3. Tener el hábito de escribir pruebas antes del código también tiene el efecto adicional de poder probar que su código no ha agregado ningún error nuevo (suponiendo que haya escrito buenos casos de prueba).
David Weiser
fuente
2
"Sé que terminé de escribir el código de implementación cuando pasan todos mis casos de prueba". - ¿Cómo determina si escribió todos los casos de prueba necesarios?
dss539
1
Esa es una gran pregunta. En mi opinión, nunca puede estar completamente seguro de que su código funciona correctamente a menos que tenga una prueba formal que lo indique. Veo las pruebas unitarias como evidencia de que su código tiende a hacer lo que usted quiere que haga. Pero, a medida que crecen las características que agrega, la cantidad de casos de prueba que escribirá probablemente también crecerá. En caso de duda, pídale a otra persona que mire sus casos de prueba y pídales casos en los que no haya pensado.
David Weiser
44
@David: ¿cómo demuestra formalmente que su prueba formal no tiene errores? ¿Cómo demuestra formalmente que los requisitos que percibe usted coinciden con los requisitos reales? Puede probar formalmente que una descripción coincide con otra, pero es perfectamente posible que ambas descripciones sean incorrectas de la misma manera, especialmente si ambas descripciones fueron escritas por la misma persona. Escribir cosas en notación matemática no hace que las personas sean infalibles. Grandes cantidades de "pruebas" matemáticas han demostrado (después de largos períodos de verificación muy detallada) estar equivocadas.
Steve314
1
@ Steve314: AFAIK, cuando demuestra formalmente la corrección de un algoritmo, especifica exactamente y de manera concisa cuál es la corrección esperada. Sin embargo, usted plantea un buen punto, que la definición de "corrección" puede no ser realmente correcta.
David Weiser
1
@ dss539, que proviene de los casos de uso que el programa intenta implementar.
4

Me encuentro escribiendo código durante horas, incluso días, sin ejecutar el compilador para otra cosa que no sea una comprobación de sintaxis ocasional.

Horas a días: es una señal clara de que pierde la capacidad de descomponer su código en fragmentos más pequeños que se pueden verificar y probar por sí mismos. Definitivamente deberías trabajar en eso.

Tiendo a escribir fragmentos de código más grandes con cuidado y realizar pruebas exhaustivas solo cuando estoy convencido de que el código hace lo que se supone que debe hacer al analizar el flujo en mi cabeza.

En lugar de escribir fragmentos de código más grandes, y por lo tanto complicados, que necesitan horas para analizarse en su cabeza, debe intentar crear bloques de construcción más pequeños y no tan grandes. Esto se llama construir abstracciones , y esa es la esencia de una buena programación, definitivamente no es una señal de ser un novato.

Una programación excelente es como un excelente juego de Billard: un buen jugador no juega golpes duros. En cambio, juega de una manera en la que después de cada golpe las bolas se detienen en una posición donde el siguiente golpe es fácil nuevamente. Y un programador no es bueno porque puede escribir código complicado, es bueno porque puede evitar escribir código complicado.

Doc Brown
fuente
3

Recopilo y pruebo si se cumple una de las siguientes condiciones:

  • La última compilación fue hace 15 minutos.
  • La última compilación fue hace 25 líneas.
  • Se ha implementado una nueva función / subrutina
  • Cambio mayor
  • Nueva función (o un error disfrazado de función)
  • Corrección de errores (se eliminó una "característica")
  • Estoy aburrido
Mateen Ulhaq
fuente
1

La frecuencia con la que ejecuto y pruebo el código depende del idioma con el que estoy trabajando en ese momento. Si estoy codificando un procedimiento almacenado, generalmente esperaré hasta que todo esté allí.

Por otro lado, si estoy codificando en Lisp, probaré cada función después de escribirla.

Si estoy codificando en Haskell, normalmente haré una compilación después de cada función para detectar cualquier tipo de error y ejecutaré el código después de que todo esté hecho.

Larry Coleman
fuente
1

Escribo el código suficiente para que la prueba llegue a verde. Eso significa que ejecuto la prueba cada pocos minutos. Ese es mi estilo C ++. Sin embargo, en Ruby utilizo la prueba automática, así que cada vez que presiono guardar, recibo comentarios de las pruebas a través de una buena ventana emergente. Ni siquiera dejo de escribir código, simplemente sucede en segundo plano.

Nazgob
fuente
1

Tres veces por hora, lo necesite o no.

Hacemos primero la programación de prueba y confirmamos solo el código de trabajo para el VCS. El smolderbot va y revisa el repositorio cada 20 minutos y ejecuta el conjunto de pruebas. Cualquier falla se envía inmediatamente a todo el equipo de programación para su reparación inmediata.

Andy Lester
fuente
1

Para mí no se trata de cuánto escribo. Puedo escribir miles de líneas de código simple sin tener que probarlo. Pero cuando escribo código más difícil, tiendo a probar cada función individualmente después de haber escrito un conjunto coherente de ellas.

Sin embargo, a veces, ver su código en ejecución es un gran impulso de motivación, cuando no ha ejecutado nada en un tiempo, es bueno verlo funcionar.

dan_waterworth
fuente
0

Para mí; -
Línea de tiempo corta (no hay mucho tiempo para pensar) - escribir código, compilar, probar. depuración Tiempo
suficiente - mientras (hecho) {escribir código pequeño, compilar}, probar, depurar

Manoj R
fuente
Me parece que el primero lleva más tiempo que el segundo: tiene más que depurar que si tiene un bucle de prueba / escritura muy pequeño.
Frank Shearar
Tal vez. Pero una breve línea de tiempo significa que el culo está en llamas, y el gerente necesita un informe que diga que alguna tarea está hecha al 100%.
Manoj R
0

Pruebo para cada concepto de codificación. Algunas veces esta es una función o clase y otras no es más que una declaración if. Una vez que el concepto funcione, pase al siguiente.

Dave
fuente
0

Intento escribir pruebas antes del código. Ejecuto mis pruebas al menos dos veces antes de una confirmación. Luego se ejecuta nuevamente con el servidor de integración continua.

dietbuddha
fuente