Cómo hacer un programa libre de errores (o con la menor cantidad de errores posibles)

StackOverflow https://stackoverflow.com/questions/115528

  •  02-07-2019
  •  | 
  •  

Pregunta

Bien, sé que es una pregunta estúpida, así que déjame aclararla.

Mi jefe piensa que "a estas alturas, con tu nivel de conocimiento, nunca más deberías tener errores en tu software".Si bien puede ser correcto, dado el conjunto correcto de herramientas y con un método adecuado, nunca me lo permiten, tal vez porque no sé qué responderle exactamente (soy el único desarrollador aquí, así que no No tengo a nadie a quien recurrir cuando sucede).

Ésta es mi pregunta :¿Qué herramientas y métodos utiliza para tener la menor cantidad posible de errores en su software?


Línea de fondo :un código sin ningún error es imposible.Sin embargo, esto es lo que se puede hacer:

Pruebas

Herramientas

Prácticas, gestión, medio ambiente.

Verificación formal

(a menudo olvidado pero posible.Una pequeña fracción de programadores realmente lo usa)

¿Fue útil?

Solución

Algunas ideas:

  1. Practique la redacción de pruebas unitarias.Esto me ha salvado la vida (no literalmente) varias veces.
  2. Usar control de fuente
  3. Utilice una herramienta de cobertura de código; por ejemplo, en Java uso Emma o Cobertura
  4. Utilice una herramienta de creación de integración continua como Cruise Control
  5. Utilice afirmaciones para comprobar sus suposiciones.El Programador Pragmático (libro) profundiza en esto con más detalle.De hecho, es un libro que altamente recomiendo leer.
  6. Pruebas de funcionalidad: por ejemplo, en Java podrías investigar jCaracterística

Me gustaría reforzar lo que otras personas han dicho acerca de escribir código sin errores: es imposible.Sin embargo, el uso de algunas o todas las técnicas anteriores debería al menos ayudar a reducir los errores.

Obviamente, y quizás incluso lo más importante, deberías tener a alguien que pruebe tu software (es decir,no solo pruebas automatizadas) antes de implementarlo/enviarlo.

Otros consejos

En primer lugar: ¡El software libre de errores es un mito!

En segundo lugar, las herramientas en sí dependen de muchas cosas, pero si desea mantener las cosas lo más generales posible:

  • un buen editor
  • Un buen sistema de control de versiones.
  • Etapas de desarrollo adecuadas (diseño funcional, diseño técnico, etc.)
  • Un equipo de pruebas adecuado
  • Un equipo de pruebas inadecuado (básicamente el lechero, la señora de la limpieza y el conductor del autobús que trajiste...personas que no tienen idea de lo que están haciendo en lo que respecta a computadoras e interfaces)
  • Una forma de indicar que quieres sin distracciones lo que
  • El momento de poder resolver los problemas cuando te quedas atascado en ellos

cosmo0, lo siento, pero siento lástima por ti.

Para mí, que tu jefe piense que debes escribir código libre de errores es lo mismo que tú pienses que debes tener un salario infinito.Agregar la palabra "casi" a "libre de errores" no cambia el significado en absoluto.

Hay un código libre de errores.El código que tiene 0 funcionalidades está libre de errores.Pero es inútil.

Escribir programas de computadora es muy similar a jugar al ajedrez.A Tigran Petrosian, un campeón mundial de ajedrez conocido por sus fuertes habilidades defensivas, un periodista no muy educado le preguntó una vez por qué a veces comete errores.La respuesta fue sorprendentemente simple:"Porque jugar al ajedrez no es fácil.Intenta jugar tú mismo y verás".

Por supuesto, recomendaría utilizar este ejemplo como justificación sólo si su jefe es una persona inteligente y lo hará bien.De lo contrario, sería mejor buscar otro trabajo.

Realmente necesitas meterle en la cabeza a tu jefe que es prácticamente imposible escribir software de cualquier complejidad sin errores.

Tan pronto como aceptes que escribir código sin errores es una tarea imposible, podrás empezar a centrarte en lo que es realmente importante: haciendo que todos tus errores sean fácilmente detectables

Las pruebas unitarias son una excelente manera de hacerlo, y hay muchos pequeños trucos que aprenderás con el tiempo y que te ayudarán a evitarlos, aunque en realidad eso solo viene con la experiencia y saber qué tipo de errores. es probable que haga.

Un ejemplo citado con frecuencia (y probablemente ahora irrelevante) es invertir el orden de las comparaciones, por ejemplo:

"bar" == foo

en vez de

foo == "bar"

para que no termines haciendo una tarea (foo = "bar") cuando quiere realizar una comparación (foo == "bar").Si invierte el orden, entonces aparecerá el caso de error ("bar" = foo) es un error de sintaxis fácilmente detectable, en lugar de un error lógico mucho más difícil de encontrar.Pero eso sólo es útil si ese es el tipo de error que cometes regularmente.

¿Puede su jefe darle especificaciones completas y sin errores que no cambien desde el momento en que las completa hasta el momento en que usted termina el software?Cuando digo completo, no me refiero sólo a una lista de funciones.¿Qué tal todas las interacciones entre todas las funciones, todas las expectativas de comportamiento para cada posible entrada del usuario, cada posible condición del entorno (por ejemplo, sistema operativo, archivos presentes, otras aplicaciones en ejecución, acceso a recursos compartidos, tamaño de fuente, combinaciones de colores, teclado? diseños), qué procesos tienen prioridad sobre otros, sincronización al milisegundo, etc.

Desarrollo basado en pruebas Es un buen comienzo, pero no es suficiente.Las buenas prácticas, la revisión del código de pares y la programación, un alto nivel de atención y la colaboración de un buen tester pueden mejorar el control de errores de manera efectiva.

Pero creo que el "software libre de errores" pertenece a la ciencia ficción...

Quizás su jefe no esté familiarizado con el error humano.Dicho esto, el uso de prácticas como pruebas unitarias, integración continua y análisis de código estático puede mejorar la calidad del código y reducir ciertos tipos de errores.

El software libre de errores es un mito.A modo de comparación, cuando su jefe dice que no debería tener errores en su software ahora, es como decirle a un matemático que ya debería haber descubierto el valor decimal preciso de π, o haber encontrado todos los números primos.El software libre de errores es un objetivo al que uno se acerca, no un objetivo que se logra.

Esto no quiere decir que no seamos culpables de los errores en nuestro software, o que los desarrolladores expertos no tendrán una menor incidencia de errores.Pero su jefe debe tener expectativas realistas sobre sus habilidades.No existen conductores perfectos, ni administradores perfectos, ni programadores perfectos.

TL;DR ¡use verificación formal o cualquier tipo de verificación estática!

En realidad, existe una manera de estar 99,999% libre de errores.Pero necesitas cambiar completamente tu enfoque de la programación.¡Deshazte completamente de todas tus pruebas!En su lugar, utilice la verificación formal.Primero debe familiarizarse con la correspondencia Curry-Howard y el cálculo lambda.Luego aprenda los tipos dependientes:

O algún inspector formal:

Hay proyectos que realmente están "libres de errores".Echa un vistazo a:

Si su jefe quiere que tenga un código libre de errores, dígale que la verificación formal es la única forma de lograrlo, pero el costo de crear software verificado es que pasa meses agregando todas las funciones triviales.Pero no es imposible.Simplemente no es práctico para el 99% del software.

No creo que sea posible estar libre de errores a menos que la aplicación sea muy pequeña.

Creo que puedes y debes intentar limitar la cantidad de errores en tu software mediante pruebas rigurosas.

Creo que "a estas alturas, con tu nivel de conocimiento, ya no deberías tener errores en tu software" no es posible.

Pero puede usar un TDD (Test Driven Developent) en su proyecto, para minimizar errores en las versiones de lanzamiento.Pero ésta no es una solución total.Algunos errores son muy complicados y pueden deberse a la actualización de un componente de terceros o cualquier otra cosa.

unidad conjunta (o algún otro programa de prueba unitaria) es útil cuando tiene requisitos claros para probar y para prevenir regresiones.Cuando las pruebas se automatizan y se ejecutan con frecuencia, puede estar seguro de que sus cambios no dañarán otras partes del sistema.También es útil al diseñar clases complicadas porque puedes planificar todos (bueno, muchos) casos extremos que deseas probar y probarlos todos juntos.

Los puntos clave son

  • Pruebas automatizadas
  • Ejecute pruebas con frecuencia
  • Asegúrese de que los casos de prueba cubran los requisitos conocidos
  • cree casos de prueba cuando encuentre errores;Estas pruebas fallan hasta que se soluciona el error.

Simpatizo tanto contigo como con tu jefe.Creo que es notable que, hoy en día, hacer que el software sea "perfecto" sea tan costoso que nadie querría pagar por ello.Al final, los clientes aceptan el nivel de errores que hace que el software sea asequible.

Contribuiré con una simple pieza de "método".Es la idea de un hito de cero defectos.Es muy común en proyectos de software hablar de hitos que representan puntos significativos en el cronograma del proyecto.En la mayoría de los casos que he visto, las personas dicen que alcanzaron un hito en el momento en que terminaron de escribir el código para las funciones de ese hito.En realidad, por supuesto, esto no da idea del progreso hacia la finalización.

El hito de cero defectos no pretende tener cero defectos.Más bien, significa que no declaras que has alcanzado un hito hasta que hayas realizado algunas pruebas y tengas un cierto nivel de confianza en que sabes cuales son todos tus errores.Puedes optar por arreglar algunos antes de declarar el hito, o puede que no, pero al menos sabes cuáles son.Usted determina cuántas pruebas realizar y qué errores son aceptables, pero esas cosas se acuerdan de antemano.

Este tipo de hito es una medida mucho mejor de hasta qué punto se ha avanzado hacia la finalización, pero es sorprendente cuán rara vez se ven proyectos gestionados de esta manera.Lo recomiendo.

¿Qué tipo de defectos tienes en tu software?

¿Errores fuera de límites?¿Leer variables no inicializadas?¿Desreferenciar punteros no válidos?Estos pueden detectarse mediante una herramienta de análisis estático.

¿Comprensión incompleta de los requisitos?Aquí ayuda el desarrollo impulsado por pruebas y una cultura de revisión.

¿Problemas de diseño?Una vez más, las reseñas son de gran ayuda.

¿Utiliza código desactualizado?Eso requiere control de versiones.

Y:Mantenga un registro de defectos para saber qué tipo de defectos comete.

He tenido éxito con el patrón "publicar temprano, publicar con frecuencia" en el que se seleccionan menos funciones a la vez y se prueban exhaustivamente antes de incluirlas en una versión.Las características que no cumplen con los criterios de calidad no se incluyen en la iteración.

Obviamente, esto no funciona solo y es necesario tener buenas prácticas de desarrollo como las mencionadas por Phil, Manrico, Twan y otros...

Todo lo anterior con respecto a las mejores prácticas, buen proceso de desarrollo + TTD, PERO use también...Pruebas mutacionales: ¡una herramienta genial para medir la calidad de las pruebas unitarias! http://nester.sourceforge.net/

Buena suerte.

/Ievgenii

Es estúpido desde cero y no se limita a la programación.Sólo algunos contraejemplos.La mayoría de nosotros tenemos su licencia de conducir desde hace años, por lo que nunca más deberían verse involucrados en un accidente.¿Qué tan real es eso?

Otro ejemplo, nunca debería suceder que los tornillos se rompieran en condiciones "normales", pero aún así lo hacen.Puede que estén sobrecargados, que empiecen a oxidarse o que alguien piense que es buena idea utilizar una calidad peor.Y adivinen lo que no ven, pueden decir con alta probabilidad que una carga de tornillos está bien, pero no pueden probarlos exhaustivamente.Puede haber puntos débiles en él, diablos, podría ser que contenga aire que apenas se puede ver sin tomar una radiografía.Y así continúa una y otra vez, si esa actitud fuera un poco sensata, viviríamos en un mundo totalmente diferente...

¡Examen de la unidad!No es una solución mágica, pero ahorra mucho tiempo de depuración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top