¿Cuál considera que es la causa principal de los defectos de software (y cómo minimizarlos) [cerrado]

14

Defino defecto como:

"algo dentro del diseño o código de la aplicación que impide que funcione según los requisitos".

Estoy buscando ideas sobre las causas de los defectos, por ejemplo, el factor humano, la falta de pruebas, la falta de creación de prototipos y posibles ideas para mitigarlos.

Chris Buckett
fuente
55
Reemplazaría "requisitos" por "necesidades del usuario" o "comportamiento esperado", ya que incluso los requisitos pueden estar equivocados.
Mouviciel
¿Que los requisitos están mal? (y el código correcto?)

Respuestas:

13

La causa principal de los defectos del software es la interpretación.

La interpretación del cliente de una característica difiere de la interpretación del diseñador.

La interpretación del diseñador difiere de la interpretación del programador.

La mayoría de las metodologías han inventado formas de contrarrestar este efecto. Pero al final, solo somos humanos y no somos perfectos. Además, a menudo hay una presión de tiempo y la mayoría de la magia de la metodología a menudo se omite bajo presión.

Las pruebas solo pueden detectar los problemas temprano. Pero incluso los probadores son humanos, y es imposible probar el 100%. Si quieres liberar antes de que termine el universo.

Toon Krijthe
fuente
Si solo pudiera hacer funcionar ese maldito módulo de lector de mente, todo estaría bien.
HLGEM
@Gamecat: y empeora aún más cuando trabajas con personas de todo el mundo. No solo hay una barrera del idioma (a menudo al menos uno de los participantes no es tan competente en inglés) sino que también hay diferencias culturales.
Matthieu M.
2
Te perdiste uno: "la interpretación del programador difiere de la interpretación del compilador" ...;)
Alex Feinman
@ Alex: Sé lo que hará el compilador con el código que escribo. Ese conocimiento no fue realmente fácil de adquirir, pero lo hice. Ahora, tenemos mi interpretación del código que no escribí, a diferencia de los datos del compilador y del tiempo de ejecución.
David Thornley
@David, a menos que haya escrito y mantenido el compilador, su conocimiento de lo que están haciendo las entrañas es una abstracción de lo que realmente está sucediendo, y eso es probablemente lo mejor, ya que le permite gastar espacio cerebral en la aplicación real.
Alex Feinman
8

Considero que la causa principal de los defectos de software son los programadores.

No digo eso solo para ser divertido, sino porque uno de los grandes problemas que he observado en mi trabajo es la falta de recopilación de requisitos, junto con una comprensión deficiente del dominio del problema, que causa defectos importantes y problemas de usabilidad en el proyecto.

Parte de eso proviene de no estar dispuesto a aprender / comprender la terminología del usuario final, lo que causa malentendidos.

Parte de eso proviene de hablar de tecnología demasiado temprano en el proceso para las personas que no tienen idea de lo que estás hablando o por qué es importante.

El mejor ejemplo de eso fue cuando escuché a uno de los programadores tratando de averiguar cuánto tiempo iban a estar las preguntas / respuestas en caracteres ... Sabía que estaba tratando de averiguar qué tamaño de campo usar en la base de datos, pero el el departamento que solicitó esto no era el más confuso por qué eso importaba, o que los espacios contaban. Para nosotros eso parece obvio, pero para ellos fue una verdadera revelación.

AnonJr
fuente
8

La causa principal de los defectos es el mal manejo. ;)

En serio, un desarrollador que trabaje en buenas condiciones, no se le pida que trabaje demasiado, que reduzca la calidad, que tenga las herramientas adecuadas, condiciones de trabajo silenciosas, etc. producirá menos errores que alguien que trabaja bajo presión.

Además, la administración que contrata desarrolladores malos también ayuda a aumentar el número de errores.

Una mala gestión .

(descargo de responsabilidad: se supone que debo contratar y administrar desarrolladores)


fuente
No creo que ese sea el problema principal, la mayoría de los desarrolladores trabajan en condiciones tranquilas. Estoy de acuerdo con AnonJr y Gamecat: la incapacidad de comprender completamente el dominio del problema, solo las iteraciones rápidas y las pruebas pueden ayudar.
radekg
1
¿Cómo es que la mayoría de los desarrolladores trabajan en condiciones tranquilas? En una docena de compañías que visité durante el año pasado, ninguna fue silenciosa.
¡La buena administración puede llevarte lejos, la mala administración puede llevarte a ningún lado!
Chris
+1 sobre condiciones de trabajo silenciosas. Cada compañía en la que he trabajado ha sido una granja de cubículos Dilbertesque donde puedes escuchar constantemente a personas a 4 pies de ti cortando sus uñas, masticando su comida y atendiendo llamadas telefónicas.
Bobby Tables
5

No veo ninguna causa principal, pero una causa que no se ha mencionado es el acoplamiento involuntario con otro código . Escribir código que tenga efectos secundarios invisibles, rompa las capas de abstracción, haga suposiciones sobre los datos (las variables no lo harán, las constantes no lo son, y ninguna entrada de un usuario es segura), guarda cosas que no tiene que preocupar a sí mismo con, y así sucesivamente.

La mayoría de las prácticas de desarrollo que estudio se reducen a la reducción N, porque la complejidad de un programa es al menos O(N^2)y posiblemente O(k^N). La definición Nse deja como un ejercicio para el lector, pero estoy pensando en cosas como la complejidad ciclomática aquí. La lógica y los datos encapsulados tienen el efecto de reducir N compartimentando el problema.

Alex Feinman
fuente
4

La incapacidad para pensar en todo.

JeffO
fuente
4

Estar incompleto

Wonko el cuerdo
fuente
4

Brecha de comunicación. En la recogida de requisitos. En horario. En documento de diseño. En especificación funcional. En código (brecha entre lo que el programador quiere y lo que le dice al compilador).

Etiqueta social. Es socialmente inaceptable llamar a alguien incapaz.

aufather
fuente
3

Apresurarse en las cosas sin comprenderlas completamente Comenzar a escribir código sin comprender completamente los requisitos funcionales o la arquitectura técnica.

La programación debe ser casi automática, simplemente escribiendo lo que es evidente y ya ha sido resuelto en la mente. En la práctica, veo muchos errores en el código para tratar de entender exactamente qué se supone que debe hacer el código. He sido culpable de esto muchas veces.

Joeri Sebrechts
fuente
Cuatro meses después de un nuevo trabajo, todavía estoy solo un pequeño porcentaje en "entender completamente" algo. No voy a apresurarme; Lo que usted dice es cierto. Sin embargo, apesta ser improductivo durante tanto tiempo.
DarenW
Me llevó uno o dos años alcanzar la velocidad máxima en el sistema en el que trabajo (sistema de 2 millones de líneas). Incluso entonces hay grandes segmentos que simplemente no conozco.
Joeri Sebrechts
2

Errare humanum est

Mouviciel
fuente
2

Schedule Pressure es, sin duda, una fuente sólida.

Los desarrolladores apresurados no se toman el tiempo para especificar completamente los requisitos, o entender completamente la intención detrás de los requisitos, o investigar completamente las alternativas para encontrar la mejor solución, o pensar completamente en todos los casos extremos e interacciones de los cambios que están haciendo, o desarrollar un conjunto completo de casos de prueba, o realizar completamente todas las pruebas unitarias, o realizar una prueba de integración completa, o considerar completamente las dependencias de la plataforma, o probar completamente el instalador, o documentar completamente lo que han hecho para que el próximo desarrollador pueda entender ....

AShelly
fuente
2

Otra cosa que debe mencionarse es no tener una prueba externa. Cuando el desarrollador escribe las pruebas y las ejecuta, solo prueba su interpretación, no el requisito real. Si bien las pruebas unitarias escritas por los desarrolladores son útiles para detectar algunos errores, la mayoría de los errores habrán pasado estas pruebas pero no serán lo que el usuario quiere o necesita. Cualquier software que no haya sido probado por alguien que no sea el desarrollador no se prueba (y no me refiero solo a ejecutar las pruebas del desarrollador).

HLGEM
fuente
2

Es porque la ingeniería de software es intrínsecamente compleja. El ensayo "No Silver Bullet" discute esto.

Irónicamente, muchas de las otras respuestas aquí tocan temas que son "accidentalmente complejos", en el lenguaje de ese ensayo, mientras que en realidad la mayor parte de lo que hacen los desarrolladores de software es "esencialmente complejo", por lo que es solo la naturaleza de lo que crea el software es difícil, el software tendrá errores y nuestro trabajo es lidiar con eso.

Peter Eisentraut
fuente
1

La incapacidad de comprender el software como una red de máquinas de estado, los principios subyacentes a su funcionamiento (estados, su determinación y transiciones) y las interacciones de las máquinas de estado.

Huperniketes
fuente
1

Escribir código que falla en silencio versus código que informa todos los errores.

bjornl
fuente
1

La falta de verificación de las cosas que "no pueden suceder" o que es poco probable que sucedan es importante. A veces lo perfecto es enemigo de lo bueno. Si no vale la pena una jerarquía de excepciones bien pensada, un manejo rápido y sucio siempre es mejor que nada. Soy un enormefanático de fallar rápidamente, de afirmaciones y de dejar afirmaciones que tienen un impacto insignificante en el rendimiento en las versiones de lanzamiento. Incluso en scripts rápidos y sucios únicos donde controlo todos los datos de entrada, pongo un manejo de errores rápido / sucio, generalmente solo con una función que es equivalente a afirmar pero permanece activa todo el tiempo. Mi regla general es que, si no es probable que ocurra o si cree que no puede suceder, no es necesario que falle correctamente con un mensaje de error fácil de usar, pero al menos debería fallar rápidamente con un mensaje de error que le da al programador algunas pistas sobre lo que salió mal.

Editar: Una táctica útil relacionada es usar afirmaciones como una herramienta de depuración importante y dejarlas allí después de que termine la sesión de depuración. A partir de ese momento, su base de código tendrá algunas comprobaciones de sanidad incorporadas que dificultarán que los errores relacionados vuelvan a ocurrir. Esto es especialmente útil para el código que es difícil de probar.

dsimcha
fuente
1

La causa principal de los defectos del software es escribir código.

Escriba menos código y tendrá menos errores ;-)

nlawalker
fuente
0

En un nivel, gestión. Pero no es solo el PHB. Es la gestión del código en sí, lo que puede o no ser un reflejo de la gestión corporativa.

Los participantes en todo el "ciclo de vida" deben invertir completamente en calidad y hacer un producto que simplemente no muera . El software en sí tiene la promesa de nunca romperse, dada la fiabilidad de abstracción adecuada. Es solo una cuestión de si los constructores de software están interesados ​​en tener esa operación perfecta.

Paul Nathan
fuente