Tratar con un desarrollador continuamente ignorando casos extremos en su trabajo

25

Tengo un problema interesante, bastante común, supongo, con uno de los desarrolladores de mi equipo. El tipo es un gran desarrollador, trabaja rápido y productivo, produce un código de bastante buena calidad y todo. Buen ingeniero. Pero hay un problema con él: muy a menudo no aborda los casos límite en su código.

Hablamos con él muchas veces y lo está intentando, pero supongo que simplemente no piensa de esta manera. Entonces, lo que termina sucediendo es que el control de calidad encontraría muchos problemas con su código y lo devolvería al desarrollo una y otra vez, lo que finalmente resultaría en plazos incumplidos y todos los miembros del equipo estaban descontentos.

No sé qué hacer con él y cómo ayudarlo a superar este problema. ¿Quizás alguien con más experiencia podría aconsejar?

Alex N.
fuente
11
Pídale a alguien que cubra su código con pruebas unitarias.
Trabajo
8
La persona mejor calificada para probar el código es su autor.
16
@Developer Art: completamente en desacuerdo. La peor persona para hacer una prueba de código es la persona que desarrolló ese código. Todos tienen puntos ciegos, pero la persona que realiza la creación tiene el punto ciego más grande en referencia a su código.
James P. Wright
2
@Developer Art: creo que escribir pruebas automatizadas es en realidad un papel bastante común. Por lo general, es algo que haces durante un año o dos si no estás listo para el horario estelar en la compañía en la que estás. Es una especie de período purgatorio.
Morgan Herlocker
19
Usted lo describe como un "gran desarrollador", "productivo", un "buen ingeniero" y que produce "código de buena calidad". Pero el control de calidad sigue encontrando problemas con su trabajo. ¿Realmente usaría esos términos para describir a alguien que regularmente y consistentemente inyecta defectos en su código? Me pregunto si hay más en esta historia, ya que la descripción del individuo como profesional y el trabajo que están haciendo no coinciden en absoluto.
Thomas Owens

Respuestas:

29

Requerirle que escriba pruebas unitarias automatizadas para su código. Escribir pruebas unitarias obliga a uno a pensar en los casos extremos.

Algunos detalles:

  1. Para asegurarse de que no se sienta singular, esto debe instituirse para todo su equipo. Solicite a todos que escriban pruebas unitarias automatizadas para el nuevo código o código que modifiquen.
  2. Exija que los nombres de las pruebas unitarias sean descriptivos del caso que están probando.
  3. Cubra las pruebas unitarias automatizadas en la revisión del código a un alto nivel. Haga que los revisores busquen casos de prueba perdidos (es decir, aquellos casos extremos que él siempre pierde). Después de una cierta cantidad de comentarios de su equipo sobre casos límite perdidos, probablemente aprenderá a considerarlos antes de la revisión.
  4. Haga cumplir esta regla para todo el equipo: si QA encuentra un error, el desarrollador responsable debe la prueba automatizada que confirma la falla y luego prueba que la ha solucionado. (antes de que hagan cualquier otro trabajo)
Matthew Rodatus
fuente
Amén, aún mejor, requiere que todos escriban primero su código de prueba. El uso de un marco BDD generalmente disminuye el dolor de esto
George Mauer
@George Buena idea. TDD ayudaría aún más aquí.
Matthew Rodatus
3
Las pruebas unitarias no se tratan de encontrar errores - blog.stevensanderson.com/2009/08/24/…
Dainius
1
@Dainius estoy de acuerdo. Las pruebas unitarias facilitan que un desarrollador piense en los casos extremos, lo que puede evitar (pero no identificar) errores.
Matthew Rodatus el
After some amount of feedback from his team about missed edge cases, he will probably learn to consider thoseLos desarrolladores que tienen malas prácticas a menudo argumentan la irrelevancia del esfuerzo adicional requerido para las buenas prácticas (porque no ven el beneficio de hacerlo). Si bien el desarrollador puede aceptar cuando agrega casos extremos adicionales, eso no significa que piense que es relevante o si los va a agregar él mismo.
Flater
23

Dale una lista de verificación, por ejemplo

  • entradas nulas
  • entradas en extremo extremo de rango
  • entradas en el extremo de rango extremadamente pequeño
  • combinaciones
  • entradas que violan invariantes supuestos (por ejemplo, si x = y)

La gente de QA puede ayudar a diseñar la lista de verificación

Entregue la lista de verificación a todos los desarrolladores, no solo a este.

Steven A. Lowe
fuente
1
Un buen punto es que todos los desarrolladores deben usar la lista de verificación, ya que seleccionar a un desarrollador puede causar malos sentimientos. Y podría ayudar a mejorar la calidad del código de cada uno.
FrustratedWithFormsDesigner
Buena idea, aunque tengo curiosidad sobre cómo se podría ver eso desde la perspectiva de los desarrolladores. En realidad, nunca me encontré con esta práctica en mi carrera como desarrollador, por lo que es un poco difícil medir la reacción. ¿Alguna idea allí?
Alex N.
@Alex: las listas de verificación son una práctica de rutina para algunos desarrolladores y un insulto horrible para otros. Intentalo y ve que sucede. Si renuncia, la calidad de su código mejorará ;-)
Steven A. Lowe
44
¿Sus desarrolladores no usarán listas de verificación? Si una lista de verificación pudiera salvar vidas, ¿las usarían? Muchos médicos no lo hacen, y los pacientes sufren. Lea esto: newyorker.com/reporting/2007/12/10/071210fa_fact_gawande
Barry Brown
1
@ Barry, no dije que no lo harían. Las listas de verificación en este caso suenan, en mi humilde opinión, como un remedio para los síntomas de un problema, no para el problema en sí. El problema es la disciplina y la diligencia en este caso. Cuando el problema es la complejidad de un sistema que requiere mantenimiento de emergencia con un alto grado de responsabilidad y estrés involucrado, que resulta en un nivel degradado de atención al detalle, entonces sí, listas de verificación (pilotos, médicos, etc.) Pero eso es más de un debate filosófico, supongo, fuera del alcance de esta pregunta.
Alex N.
17

Buen ingeniero.

Bueno.

Pero hay un problema con él: muy a menudo no aborda los casos límite en su código.

Es una calidad que los buenos ingenieros no comparten.


Observar casos extremos es una característica que está presente o no en las personas. No tiene nada que ver con ser ingeniero o programador. El desarrollo de esta característica está influenciado por los antecedentes culturales, el entorno de vida, los eventos de la infancia y las experiencias de la vida. Entonces la actitud simplemente se aplica a cualquier trabajo que un individuo esté haciendo.

Lo que necesitas es averiguar si tu chico es de ese tipo que no ha desarrollado este cierto sentido (quizás todavía). También es muy probable que simplemente no le importe por alguna razón u otra. Debe analizar toda la situación, si es feliz en su trabajo. Si no, entonces quizás deberías hacer algo para ayudarlo primero.

Si está bien con el trabajo pero aún no ha experimentado el peligro de casos extremos, entonces puede comenzar a educarlo. Si se lo toma en serio, podría cambiar su forma con el tiempo. Aunque soy escéptico con respecto a esto, aún podrías intentarlo.

Sin embargo, si resulta ser ese tipo de persona que no es buena en los casos límite, entonces es posible que no le quede más que sacarlo del equipo. Esta característica es esencial para la programación práctica. Lamentablemente, sin ella, incluso una gran persona no produciría un buen trabajo.


fuente
66
+1 Esta es una habilidad que algunas personas tienen y otras tienen que aprender para ser un buen programador. Sin embargo, me gustaría señalar que hay dos tipos de casos límite: casos límite de requisitos comerciales ("Si ordenamos 27 entrenadores izquierdos y 28 entrenadores correctos, ese orden probablemente sea incorrecto") que deben abordarse en los requisitos del proyecto y codificación de casos extremos (que trata con entradas no válidas, iterando constantemente a través de listas cuando un hashset sería más sensato en cuanto a velocidad cuando el conjunto se hace más grande que x, etc.) que son más de lo que debe aprender.
Ed James
Gracias por tu perspicacia. Realmente lo aprecio. Aquí tienes toda la razón en todos los frentes, aunque tengo curiosidad, si él es una gran persona pero simplemente le falta algo que hace que los grandes ingenieros sean geniales, ¿cómo puedo ponerlo a hacer otro trabajo y mantenerlo en la organización, tal vez mudarse a otro equipo o algo así ... Aunque supongo que solo yo puedo responder esa pregunta :)
Alex N.
Lo he estado pensando pero no estoy seguro. Otro rol para ser aceptable para ese tipo de persona no debería requerir atención a los detalles y no hay muchos de ellos en una compañía de software.
El mundo no es tan blanco y negro como implica tu primera oración. Creo que existen desarrolladores que pueden identificar algunos casos extremos pero no todos.
Mike Partridge
5

¿Podría hacer revisiones de código o revisiones de diseño anteriormente en el proceso?

PSU_Kardi
fuente
4

Enséñele a programar primero la prueba. Par con él. Usted escribirá los casos de prueba y él escribirá el código para pasar las pruebas.

Kevin Cline
fuente
3

¿Podría involucrar a QA lo suficientemente temprano en el desarrollo de características para ayudarlo a proporcionar una lista de casos límite cerca del comienzo para cubrir? Si bien algunos pueden ver esto como que no esperan que el desarrollador cubra todo, esta puede ser una forma de evitar esto si tiende a pasar por alto esos casos límite que un probador podría detectar inicialmente.

La otra idea que tendría aquí es cómo ve este problema. ¿Está realmente molesto y molesto consigo mismo por este patrón o simplemente lo ve como algo normal y no es algo de lo que deba preocuparse para resolver? De acuerdo, esto requiere una gran confianza y lograr que sea abierto en su perspectiva, pero creo que hay un cierto grado de empatía aquí que puede ayudar si puede ver las cosas desde su perspectiva.

JB King
fuente
3

Hay un número infinito de casos de borde, cubriéndolos todos es inviable. ¿Qué pasa si alguien lo hace #define TRUE FALSE? Agrega casos extremos, ¿los revisarás también?

Además, no consideraría la prueba de tontos de cada función de una clase privada o función interna.

El enfoque que elijo para el código que debe ser muy sólido y estable es:

if(conditions_met)
{
DoStuff();
}
else
{
CrashAppAndDumpMemory();
}

De esta forma, obtienes volcados sólidos de aplicaciones en el control de calidad, y cuando llegas a un lanzamiento, la aplicación es sólida y segura.

Evitar errores es malo. Bien, puede guardar una función si el identificador de archivo es nulo y devuelve nulo, pero en la mayoría de los casos, hay un error de diseño en alguna parte, y el bloqueo de la aplicación es una mejor manera de obligarlo a encontrar la causa. La mayoría de los casos extremos enmascaran el error al ocultar un problema, por ejemplo, el botón dejó de funcionar. Crash te dice que algunas suposiciones sobre el producto son incorrectas, y debes revisar la lógica que causó el crash.

Descifrador
fuente
#define TRUE FALSE no es un caso marginal, es un delito de despido.
gnasher729
1

Si se trata de un caso límite, ¿es necesario considerarlo? Si los casos límite son importantes, entonces los casos límite deben ser alimentados a los requisitos / características / historia del usuario.

Si los casos de borde se han considerado como parte de una pieza de trabajo y se requiere que los dispositivos se coloquen en su lugar, entonces deberían ser parte del elemento de trabajo y, por definición, el elemento de trabajo no está completo hasta que el mecanismo para manejar el caso de borde esté en su lugar.

Esto le da a usted como líder del equipo algo para verificar después de que el trabajo se haya completado durante la discusión posterior al trabajo y le da al desarrollador algo para verificar mientras completa el trabajo.

Bronumski
fuente
Siempre hay casos extremos. Si alguien afirma que nunca se encontrarán los casos límite, esos no son los casos correctos.
Barry Brown
1
@Barry Brown Estoy de acuerdo en que siempre hay casos límite, pero hay una diferencia entre los casos límite importantes que las partes interesadas consideran importantes, lo que podemos llamar escenarios y casos extremos que un desarrollador considera importantes. Si una parte interesada cree que algo es importante, entonces debe discutirse en la sesión de planificación e incluirse como un Escenario en una historia de usuario y no debe dejarse que el desarrollador piense, debería ser un requisito adecuado contra la tarea. Lleva mucho tiempo y no es necesario, pero las comprobaciones nulas de los parámetros de cada método no público.
Bronumski
1

La captura de casos extremos es la razón por la cual existe el control de calidad. Los programadores tienen la responsabilidad de impulsar el trabajo de manera oportuna. Pasar todo su tiempo buscando casos extremos es muy ineficiente. Si tiene un ciclo iterativo razonablemente rápido, entonces esto no debería ser ningún problema. Los casos de borde son casi infinitos en número. Si se tratara de un problema con los casos "Core", estaría un poco preocupado. Así como los desarrolladores son expertos en desarrollo, un probador debe ser un experto en pruebas. Cuando un probador encuentra un problema, lo devuelve al desarrollo. El desarrollador soluciona el problema. Problema resuelto. El tiempo para que un desarrollador rastree cada caso límite es mucho más largo que el ciclo de prueba iterativo. También tenga en cuenta que cuando estoy hablando de pruebas, no me refiero a las pruebas de unidad de caja blanca, sino estrictamente a las pruebas de caja negra.

Morgan Herlocker
fuente
1
Esta realmente no es la respuesta correcta. Ser recompensado por generar trabajos de calidad media es una mala práctica El equipo de desarrollo en su conjunto debe ser responsable del trabajo de alta calidad.
David
El desarrollador decente no tiene que buscar casos extremos. Algunos códigos están escritos para que no tengan casos extremos, en otros casos los casos extremos son obvios. El código que no maneja casos extremos es un código incompleto.
gnasher729
0

Ese es uno de los casos en los que creo que el desarrollo impulsado por pruebas viene a rescatar porque ayuda a pensar en términos de casos extremos y cualquier cosa que pueda romper el código.

Billal Begueradj
fuente