debugging - tratamiento - La depuración es un mal olor: ¿cómo persuadirlos?
olor en los pies remedios caseros (13)
He estado trabajando en un proyecto que ya no se puede describir como ''pequeño'' (más de 40 meses), con un equipo que ya no se puede definir como ''pequeño'' (~ 30 personas). Hemos estado usando prácticas de Agile / Scrum (1) todo el tiempo, y una dosis saludable de TDD.
No estoy seguro si recogí esto de Agile o TDD, más probablemente una combinación de los dos, pero ahora estoy claramente en el grupo de personas que consideran la depuración como un mal olor. Al "depurar" no me refiero al concepto más abstracto de averiguar qué podría estar mal con el sistema, sino a la actividad específica de ejecutar el sistema en modo Depuración, pasando por el código para descubrir detalles que de otro modo serían inescrutables.
Como estoy bastante convencido, esta pregunta no se trata de si la depuración es un mal olor o no. Más bien, me gustaría saber cómo puedo persuadir a mis compañeros de equipo sobre esto.
Las personas que creen que el modo de depuración es el modo "estándar" tienden a escribir código que solo se puede entender depurando a través de él, lo que genera una gran cantidad de tiempo perdido ya que cada vez que trabajas un elemento encima del código desarrollado por otra persona, primero pasa una cantidad considerable de tiempo depurándolo (y, dado que no hay errores involucrados ... el término es cada vez más ridículo) - y luego ocurren los silos. Así que me gustaría convencer a algunos de mis compañeros de equipo de que evitar el modo de depuración es una buena cosa (2). Sin embargo, dado que están acostumbrados a vivir en modo Depuración, no parecen ver el problema; para ellos, pasar las horas depurando el código de otra persona incluso antes de comenzar a hacer algo relacionado con su nuevo artículo es la norma; ellos no ven nada mal con eso. Además, a medida que pasan el tiempo ''averiguando'' sabrán que el desarrollador que trabajó en esa área estará disponible y el elemento se les pasará (lo que lleva a otro silo).
¡Ayúdame a idear un plan para alejarlos del lado oscuro!
Gracias por adelantado.
(1) También se conoce como SCRUM (mayúsculas). Dejando a un lado los argumentos de la capitalización, creo que se debe usar un asterisco después del término, ya que, como era de esperar, nuestra organización ''modificó'' el proceso de Agile y Scrum para adaptarse a las necesidades percibidas de todas las partes interesadas. Por lo tanto, honestamente, no voy a pretender que esto ha sido 100% de acuerdo con la teoría, pero eso va más allá de mi pregunta.
(2) Sí, siempre habrá momentos en los que tengamos que entrar en modo de depuración, no estoy tratando de evitarlo por completo, solo ... tratando de minimizar el número de veces que tenemos que sumergirnos en él.
Como estoy bastante convencido, esta pregunta no se trata de si la depuración es un mal olor o no.
Bueno, su iglesia local podría ser el lugar más apropiado para su pregunta en ese momento.
Aparte de eso, convéncelos por argumentos. Sin embargo, es posible que desee reconsiderar su postura fundamentalista, porque esto es todo lo contrario de persuasivo. Una cosa que quizás desee hacer es dejar caer el término "depuración" en toda la discusión y reemplazarlo "recorriendo el código" o los "me gusta", enfatizando que se opone a la práctica de conjeturas / parches no incuestionable de sondear que condena en lugar de reflexión informada sobre el código.
(Todavía estoy en desacuerdo con usted, pero eso es además del punto ya que no quería una discusión).
Aquí hay algo mal, pero es difícil ubicarlo. Quizás el verdadero problema es que el código tiene otros olores que dificultan su comprensión. Estoy de acuerdo con que con TDD uno debería usar el depurador menos en vez de más, ya que desarrollará el código en pequeños incrementos. Pero, si no puede ver el código y entenderlo, tal vez sea porque el diseño está demasiado acoplado: se requieren demasiadas clases interrelacionadas para que las cosas funcionen.
Si el código realmente necesita ser tan complejo que la observación no sea suficiente, entonces tal vez necesite invertir en algunos buenos comentarios, explicando lo que está sucediendo, aunque preferiría ver las cosas refactorizadas hasta el punto en que los comentarios no sean necesarios. Mi sospecha es que el depurador puede ser un síntoma más que el problema.
Sé que para mí, pasar del desarrollo tradicional basado en código al desarrollo de prueba primero ha reducido el tiempo dedicado a la depuración ... y no es algo que extrañe. Normalmente, solo incluiré el depurador cuando no sea obvio por qué el código que acabo de escribir para aprobar una prueba no lo hizo.
Creo que el verdadero problema aquí es
Las personas que creen que el modo de depuración es el modo "estándar" tienden a escribir código que se puede entender solo al recorrerlo
Esto, si es cierto, debería ser evidentemente erróneo y no debería haber necesidad de discutirlo. Si no es evidente, es porque no ven cómo se podría mejorar el código mal escrito. Muéstreles, haga revisiones de códigos donde muestre cómo se puede refactorizar ese código de una manera que sea clara sin pasar por él.
El paso por el código disminuirá automáticamente una vez que se haya escrito un código mejor , simplemente no funciona al revés . La gente todavía escribirá un código incorrecto y si evitan pasar a través de él, eso solo conducirá a más tiempo perdido (maldición, desearía poder pasar por este lío de espagueti), no a un código mejor.
Creo que una mejor redacción de esta pregunta sería "¿No es TDD un olor a código?" TDD parece conducir a un menor tiempo dedicado al depurador debido a más tiempo dedicado a escribir / reprobar / aprobar las pruebas. Sin TDD, es más probable que pases tiempo en el depurador para diagnosticar errores.
Al menos en Visual Studio, usar el depurador no es tan doloroso, por lo que el desafío para usted sería explicarle a sus compañeros de equipo cómo TDD haría que su desarrollo fuera más agradable, productivo y exitoso. Simplemente evitar el depurador probablemente no sea motivo suficiente para que un equipo cambie su metodología de desarrollo.
Esto va a sonar como el argumento que dijiste que no querías tener, pero creo que si quieres convencer a tus compañeros de equipo, vas a tener que hacer un caso más fuerte. No entiendo tu objeción. Frecuentemente paso por el código que trato de entender con el depurador. Es una excelente manera de ver lo que está pasando. No ha establecido su afirmación de que las personas que usan el depurador de esta manera tienden a escribir código que de otra manera es difícil de entender. La única manera convincente de hacerlo sería a través de algún tipo de estudio de caso / control que tratara de medir y comparar la legibilidad del código escrito por personas con diferentes enfoques para el depurador. Y ni siquiera ha contado una historia plausible que explique por qué cree que utilizar una herramienta para comprender la ejecución del código tiende a generar una construcción de código más descuidada. Para mí es un non sequitur completo.
Si desea persuadir a sus compañeros de trabajo de que sus prácticas de programación son mejores, primero demuestre por su productividad que usted es más efectivo de lo que es, al menos para algunas tareas. Entonces te creerán cuando expliques cómo te las arreglaste tanto.
También a veces es más fácil enfocarse en algo concreto. ¿Tus compañeros de trabajo incluso hablan en términos de "código de olor"? Quizás podría centrarse en detalles como "Cuando el módulo ABC falla, lleva tiempo depurarlo, es mucho más rápido usar la técnica XYZ. Aquí, déjenme demostrar". Luego, puedes mencionar tu principio básico, que es sí, el depurador es una herramienta útil, pero generalmente hay otros más útiles.
Antes de hacer un plan, debe decidir qué tan importante es para usted este cambio. Aunque estoy de acuerdo en que la depuración es un olor, también es una práctica muy aceptada y arraigada para los desarrolladores, por lo que convencerlos de que deben dejar de hacerlo no será fácil ni rápido, y por buenas razones. ¿Cuánta energía quieres poner en este tema?
En segundo lugar, ¿por qué quieres persuadirlos en primer lugar? Si su motivación es ayudarlos, ¿es realmente su problema de máxima prioridad? Cuando ayuda a las personas de maneras en que quieren que se las ayude, el cambio se vuelve fácil .
Una vez que haya decidido que desea continuar con su iniciativa de cambio, debe tener en cuenta que diferentes personas están convencidas por diferentes cosas. Algunas personas ya estarán convencidas de probar algo nuevo y emocionante. Algunos estarán convencidos por los números (métricas). Algunos se enteraron mientras comían su tipo de galleta favorita (¡en serio!), Algunos al escuchar de su gurú favorito. Algunos al leer sobre esto en una revista. Algunos al ver que "todos los demás lo están haciendo también". Etc. pp.
Hay una entrevista perspicaz con Linda Rising sobre este tema en InfoQ: http://www.infoq.com/interviews/Linda-Rising-Fearless-Change . Ella puede decirlo mucho mejor que yo. El libro es bastante bueno también.
Hagas lo que hagas, no presiones demasiado, pero tampoco te rindas. El cambio puede ocurrir, especialmente si toma la resistencia como recurso , y algunas veces sucede en momentos inesperados, por lo que siempre debe tener una sensación de asombro .
Estoy de acuerdo con los anteriores que expresaron la relativa irrelevancia de este "problema del depurador".
OMI, los 2 objetivos más importantes de un desarrollador son:
1) Hacer que el software haga lo que se supone que debe hacer.
2) Escriba el código para que un desarrollador de mantenimiento 2 años después disfrute de la experiencia de cambiar funciones nuevas o existentes.
Justo en el roadwarrior. la depuración no es el problema, es un código poco comentado o documentado y una mala arquitectura. Trabajo en un equipo más pequeño, pero cuando surge un error, paso por el código. con frecuencia es un trabajo muy pequeño porque la aplicación está bien planeada y los documentos en el código son claros.
Dicho esto, vayamos a mi punto. Quiere que el equipo no depure ... comente, comente comentario. Nada supera el impulso de depurar más rápido. Claro que aún lo harán, pero es más probable que pisen un código bien documentado.
Ah, y aunque debería ser evidente, lo haré de todos modos. no tiene errores en tu código :)
@FOR: También tienes un segundo problema, aquí está:
lamentablemente, no parece que los desarrolladores estén interesados en ser más productivos (de todos modos reciben el mismo pago)
¿Cómo pretenden hacer que quieran ser más productivos cuando no hay nada (visible) que puedan obtener?
Diseñar software mediante la depuración es una buena práctica .
La cantidad de entornos que soportan esta forma de desarrollo es muy pequeña: la más conocida es Smalltalk. En Smalltalk, puede escribir una prueba que describa su protocolo de objetos sin los métodos que se implementan. La ejecución de esta prueba desencadenará el depurador, y puede agregar el método a la clase correcta en el depurador, y puede seguir avanzando por el código hasta que se implemente toda la funcionalidad y la prueba sea verde.
Esto necesita un compilador para estar disponible en tiempo de ejecución e invocaciones de primera clase. Ofrece un ciclo de retroalimentación muy breve, y es una de las razones principales de la productividad de Smalltalks
Un "plan" para convencerlos de la ventaja de otro enfoque es establecer métricas relacionadas con el número de veces que depura la misma función para diferentes errores.
Al analizar la tendencia de esa métrica, puede convencerlos de que las pruebas de no regresión son más útiles para perder tiempo escribiendo, y las ayudará a depurar de manera más eficiente.
De esta forma, no escribe completamente el hábito de "depuración", pero los convence de establecer un conjunto sólido de pruebas, lo que les permite centrarse en la sesión de depuración realmente útil, si es necesario.
Si considera esta línea de acción (métricas), debe saber que su implementación involucra a toda la jerarquía (parte interesada, gerente de proyecto, arquitecto, desarrolladores). Todos deben estar implicados en esas métricas para poder actuar sobre ellas.
En cuanto a los desarrolladores, podrías intentar sugerir:
- algunas formas nuevas de cerrar un caso de error (ciérrelo solo con el escenario de prueba reproducido para reproducir ese error, lo que significa que necesitan una prueba independiente para, si es necesario, iniciar su sesión de depuración)
- una relación clara entre esas métricas y su evaluación por la administración (sería una mala práctica depurar una y otra vez la misma función)
- una mayor participación en decisiones arquitectónicas : a veces, conocer algunas características funcionales o de aplicación en lugar de solo clases y códigos puede incitar a un desarrollador a pensar más en términos de prueba de caja negra en lugar de caja blanca (que puede conducir más fácilmente a la sesión de depuración)
- una participación en el proceso de "arquitectura operativa" (donde necesita implementar su aplicación y realizar una prueba de integración completa de adelante a atrás). Una vez más, una imagen más grande de todo el sistema puede ayudar a un desarrollador a interesarse más en las características que en las "líneas de código".
Esta es una publicación cruzada, porque la primera vez fue más de un lado en la respuesta de otra persona a una pregunta diferente . Para esta pregunta, es una respuesta directa.
La depuración degrada el código de calidad del código que producimos porque nos permite salirse con un nivel más bajo de preparación y menos disciplina mental. Aprendí esto de un experimento controlado accidental a principios de 2000, que ahora relato:
Realicé un contrato como un codificador Delphi, y la primera tarea asignada fue escribir un motor de plantillas conceptualmente similar a un motor de informes, usando Java, un lenguaje con el que no estaba familiarizado.
Curiosamente, el empleador estaba muy contento de pagarme tarifas de contrato para pasar meses aprendiendo un nuevo idioma, pero no pagaba libros o depuradores. Me dijeron que descargue el compilador y aprenda usando recursos en línea (los rastros de Java eran bastante buenos).
La regla de oro de las artes y las ciencias es que quienquiera que tenga el oro hace las reglas, así que procedí según las instrucciones. Conseguí las macros de mi editor preparadas para poder ejecutar el compilador de Java en el búfer de edición actual con una sola pulsación de tecla, encontré definiciones de sintaxis para mi editor y usé expresiones regulares para analizar la salida del compilador y colocar el cursor en la ubicación informada de errores de compilación. Cuando se asentó el polvo, tenía un pequeño IDE con todo menos un depurador.
Para rastrear mi código, utilicé la buena técnica anticuada de insertar escrituras en la consola que registraba la posición en el código y el estado de las variables que deseaba inspeccionar. Era crudo, requería mucho tiempo, tenía que extraerse una vez que el código funcionaba y a veces tenía efectos secundarios confusos (por ejemplo, forzar la inicialización antes de lo que podría haber ocurrido, dando como resultado un código que solo funciona mientras el seguimiento está presente). )
Bajo estas condiciones, mis métodos de clase se hicieron más cortos y se definieron cada vez más, hasta que, por lo general, hicieron exactamente una operación muy bien definida. También tendían a ser diseñados específicamente para pruebas fáciles, con resultados simples y completamente deterministas para poder probarlos de forma independiente.
Lo largo y lo corto es que cuando la depuración es más dolorosa que el diseño, el camino de menor resistencia es un mejor diseño.
Lo que convirtió esta observación en una certeza fue el éxito del proyecto. De repente, había presupuesto y yo tenía un IDE "adecuado" con un depurador integrado. En el transcurso de las siguientes dos semanas noté una reversión a los hábitos anteriores, con el código "boceto" hecho funcionar mediante refinamiento iterativo en el depurador.
Después de haber notado esto recreé algunos trabajos anteriores usando un depurador en lugar de un diseño cuidadoso. Curiosamente, quitar el depurador desaceleró el desarrollo solo ligeramente, y el código final fue mucho mejor calidad, especialmente desde el punto de vista del mantenimiento.
No me malinterpreten: hay un lugar para los depuradores. Personalmente, creo que ese lugar está en manos del líder del equipo, para ser sacado en momentos de extrema necesidad para descubrir un misterio, y luego retirado nuevamente antes de que la gente pierda su disciplina.
La gente no querrá pedirlo porque eso sería una admisión de debilidad frente a sus compañeros, y el hecho de explicar la necesidad y el contexto circundante bien puede inducir a los colegas a entender el problema, o incluso mejores diseños gratuitos. el problema.
Entonces, FOR, no solo estoy de acuerdo con su posición, tengo datos reales de un experimento controlado para respaldarlo. Sin embargo, es una muestra bastante pequeña. Se requieren pruebas más elaboradas antes de que mis conclusiones sean compatibles.
¿Por qué no tomas lo que he dicho a tu equipo y sugieres pruebas? Tienes más datos que ellos (te acabo de dar) y para tener una base creíble para estar en desacuerdo contigo, básicamente tienen que probar la idea, y la única manera de hacerlo es dar una oportunidad a tu idea.
Sin embargo, debe estar listo para que se desmorone, porque todo se basa en la suposición de que los desarrolladores tienen el talento y la experiencia para enfrentar el desafío de un diseño más sólido en ausencia de una depuración paso a paso.
La depuración paso a paso se creó para facilitar la depuración. El efecto directo de bajar el listón es que las personas con menos talento pueden participar; si construyes una herramienta que incluso los jackasses pueden usar, obtendrás jackasses usándola, muchos de ellos, si la actividad recientemente accesible está bien remunerada.
Esto provoca un éxodo de personas con talento porque generalmente usan ese talento para hacer cosas raras y preciosas a fin de estar bien remunerados sin trabajar demasiado, y el mercado no quiere pagar la excelencia porque no puede distinguir el talento lo suficientemente bien como para saber cuando pagar por esto está justificado
Otro pensamiento: el trabajo más reciente con problemas en los servidores de producción, donde era imposible instalar un depurador, ha demostrado la importancia de tener una base de código para la cual el mantenimiento no depende de la disponibilidad de un depurador. El código que crece en ausencia de depuradores es mucho menos complicado. Elija no usarlos cuando pueda cambiar de opinión, y luego, cuando no pueda cambiar de opinión, no será tan horrible.