Profesionalismo: protegiendo la calidad del código

TL; DR: Preguntas debajo del texto

Soy desarrollador de software en el centro de I+D. Debido a mi antigüedad, a menudo me piden que revise los cambios críticos de tiempo/alcance en nuestro código base. Debido al estado agitado del proyecto, no es raro que me pidan que revise el código de otros el día o incluso horas antes de una entrega importante.

A menudo reviso las solicitudes de extracción de un contratista, Joe. A Joe se le paga por cada característica que completa en lugar de una tarifa por hora. Tengo la impresión de que Joe trata de realizar tantas funciones como sea posible, a menudo escatimando en documentación/calidad del código en el proceso. En el pasado, he tenido que hacer horas extras para solucionar los problemas con el código de Joe, porque una vez que se aprueba y se paga, él no se siente y nadie lo hace responsable de la corrección de errores. Nuestro equipo ha señalado que la situación no es ideal, pero la decisión gerencial actual es que esto no cambiará.

Con frecuencia solicitaría cambios en el código de Joe porque no cumple con nuestras pautas. Joe solía acercarse a mí con una historia sobre cómo no le pagarían si su código no se aceptaba a tiempo. Durante un tiempo, aceptaba problemas menores con la condición de que Joe los arreglara más tarde, pero eso nunca sucedió. Eventualmente, dejé de aceptar envíos incompletos y le pedí a Joe que escalara el problema si no está satisfecho con mi veredicto.

En general, el código de Joe tendría los siguientes problemas, en orden ascendente de gravedad:

  1. Falta de documentación/formato contra nuestras pautas
  2. falta de pruebas
  3. Arquitectura incompatible con lo que intentábamos conseguir en el futuro
  4. Problemas de desempeño
  5. De plano no funciona

Dado que las características de Joe a menudo se prometían al cliente en esa semana en particular y no habría tiempo para que Joe las corrigiera, eventualmente otras personas comenzaron a acercarse a mí para aceptar el código de Joe, desde el propietario del producto, pasando por la gestión de proyectos, mi jefe, hasta el jefe de mi jefe.

En las discusiones, mi gestión de proyectos/mis superiores generalmente me piden que encuentre una manera de aceptar el código de Joe de todos modos. En general, dejaría pasar 1 y 2 en este punto, pero me negaría a aceptar algo más serio, citando mi responsabilidad por la calidad del código y la deuda técnica como ingeniero. Para decirlo sin rodeos, aceptar un código como este nos costaría más tiempo de lo que vale.

En algunas situaciones, mis superiores solicitaron aceptar el código de todos modos, incluso si los problemas eran graves, citando características prometidas al cliente y la próxima entrega. En este punto suelo responder diciendo:

  • Cualquiera, incluidos los empleados no técnicos, puede anular mi decisión y fusionar el código.
  • Si son mis superiores directos, pueden enviarme un correo electrónico ordenándome que lo acepte y lo haré.

No hago esto necesariamente como una táctica de CYA, sino que creo que las personas piensan dos veces sobre las decisiones que están tomando si las ponen por escrito. Hasta la fecha, nadie ha decidido hacer nada de lo anterior, incluso si he recibido algunas burlas como resultado.

Sin embargo, algunos compañeros de trabajo me han dicho en privado que no llegaría muy lejos con esta actitud, por lo que me pregunto:

  • Como ingeniero, la calidad del código es mi responsabilidad. ¿Hasta qué punto debo luchar por ello?
  • ¿Es apropiado que pida a mis superiores que pongan sus decisiones por escrito?
  • Si la calidad del código se ve afectada debido a problemas organizativos (la forma en que se compensa a un contratista), ¿es apropiado que yo sea "un juez" o plantee el problema a mis superiores o al departamento de recursos humanos?
@Downvoters, háganme saber cómo puedo mejorar la pregunta
Buena pregunta, pero un poco demasiado amplia para este formato de sitio.
Cíñete a tus principios. Los detractores no entienden que la razón de los estándares de código no es que las otras formas sean incorrectas (de hecho, la forma elegida puede ser bastante arbitraria), sino más bien porque la inconsistencia es muy costosa, ya que conduce a cambios sin sentido que se entremezclan con cambios significativos que lo hacen extraordinariamente difícil hacer un seguimiento de lo que realmente está sucediendo en un proyecto de múltiples desarrolladores. Si esta persona no puede aprender a enviar código que cumpla con los estándares documentados , no puede permanecer en el equipo, punto; debe trabajar en otro lugar en un equipo de uno.
Dar pautas claras sobre lo que se espera; si es posible, proporcione herramientas automatizadas. No todos estarán de acuerdo, pero cuando está claro lo que se espera, las personas pueden trabajar de manera eficiente (si ponen los ojos en blanco mientras lo hacen) y producir un código que es fácil de seguir y analizar para lo que es importante. Por el contrario, si trata de ser "amable" simplemente pidiéndole a la gente que sea "razonable", obtendrá tantas ideas divergentes de lo que es "razonable" como gente tenga en el proyecto. Diga claramente lo que necesita, sea consistente al respecto, y aquellos capaces aprenderán rápidamente a producirlo. No te puedes permitir los otros.
Usted y solo usted es responsable de la deuda técnica. Joe, aunque también debería estar preocupado por esto, no lo está. Esto lo coloca en una posición incómoda en la que está tratando de hacer su trabajo, y se lo ve simplemente como una resistencia o un pedante. Mi consejo sería que busques tranquilamente otro trabajo a tu discreción. Esto no va a ir bien en el futuro a largo plazo.
Puede que esté diciendo lo obvio aquí, pero esto parece ser mucho más un problema de contrato (Joe está esencialmente incentivado para hacer un trabajo de mala calidad) que un problema de control de calidad o código.
" Me piden que revise el código de otros el día o incluso horas antes de una entrega importante. " Entonces, ¿cómo se puede probar a fondo ese código antes de la entrega?

Respuestas (7)

Agregar una respuesta porque las otras respuestas bailan a su alrededor, pero en realidad nunca llaman específicamente en la frase más breve posible:

Necesitas una "definición de hecho"

Las definiciones generalmente aceptadas de hecho incluyen no sólo el código de trabajo , sino también las pruebas de unidades de trabajo y la documentación . Hasta que se completen esas cosas, la tarea no se realiza y el código no puede ni debe publicarse.

Si bien a menudo encontrará el concepto bajo el paraguas Agile/Scrum, ese marco de trabajo no es necesario para implementar esta idea.

https://www.scruminc.com/definition-of-done/

https://www.agilealliance.org/glossary/definition-of-done/

Sí, creo que esta es la mejor respuesta, sería bueno tener en cuenta en la respuesta: la fuente del problema podría no ser el resultado, pero la solicitud / especificaciones dadas a este contratista no fueron lo suficientemente claras de antemano. tal vez solicite no solo procesar el resultado de Joe, sino también hacer las solicitudes a Joe para que pueda definir las especificaciones de antemano.
Estoy de acuerdo con esto: a Joe se le paga por "funciones completadas". Alguien debe ser muy claro sobre lo que cuenta como "completado". Si todo lo que eso significa es "Le disparé y verifiqué algo", entonces, bueno, aquí estamos. Pero si "Completado" significa "hecho según un cierto estándar", entonces nuestro OP tiene un caso legítimo para impulsar los problemas que enumeran.

Como yo lo veo, no es la política la que tiene la culpa, es la persona que trata de abusar de la política.

Como ingeniero, la calidad del código es mi responsabilidad. ¿Hasta qué punto debo luchar por ello?

Siempre que usted sea responsable de algo, debe seguirlo hasta que pueda demostrar que cualquier desviación no es causada por "usted" . Dado el contexto que mencionaste, parece que estás luchando por la causa correcta. No se trata solo de las "directrices de codificación", el objetivo es tener un código que realmente se ejecute y produzca el resultado esperado.

¿Es apropiado que pida a mis superiores que pongan sus decisiones por escrito?

En este caso, mucho que sí. Ha dado una crítica negativa, y si alguien le pide que renuncie a los bloqueadores y permita que ese código encuentre su lugar en el código de producción, asegúrese de que se pueda rastrear hasta la "pregunta", en un momento posterior.

Si la calidad del código se ve afectada debido a problemas organizativos (la forma en que se compensa a un contratista), ¿es apropiado que yo sea "un juez" o plantee el problema a mis superiores o al departamento de recursos humanos?

No diría que es el RR.HH. quien lo puede manejar, esto debe ser informado a sus superiores y gerentes técnicos que puedan entender el impacto.

Ya ha probado algunas de las cosas adecuadas para probar en este escenario, sin embargo, hay una cosa más que sugeriría:

No señale a la persona culpable, más bien señale la parte problemática del código y también intente documentar los problemas que puede prever si ese código llega a la versión final. Además, señale un par de instancias, en las que permitió algunos de los casos menores que permitió en el pasado, esperando que se solucionen en el futuro, pero nunca se hizo.

Parece que el proceso de gestión de proyectos es problemático. A veces, es mejor tener una función parcialmente completa en lugar de no estar disponible, pero hay un lado positivo. El punto aquí es que la perspectiva de seguimiento necesita mejorar. Solo entregar el código (o emitir una solicitud de extracción) no debe ser la medida para la entrega, es responsabilidad del propietario asegurarse de que el código se revise y fusione con el código de producción (final).

En resumen:

  • Asegúrese de que los comentarios de revisión no solo mencionen el problema en el código, sino también el efecto secundario adverso que tendrá si se permite fusionarlo. Cite las reglas/directrices en base a las cuales está haciendo esos comentarios, de modo que sea evidente que no está siendo "quisquilloso", sino que está planteando inquietudes válidas según las pautas bien establecidas.
  • Trate de establecer una fecha límite para la entrega que esté muy por delante de la hora de entrega real, de modo que quede suficiente tiempo para cualquier cambio/arreglo necesario.
  • Solicite que los informes de prueba principales se asocien con la solicitud de extracción; de esa manera, tendrá más pruebas para establecer sus puntos.

Finalmente:

Sin embargo, algunos compañeros de trabajo me han dicho en privado que no llegaría muy lejos con esta actitud,

Bueno, eso no es una muy buena señal. Permitir un código incorrecto no solo es malo para la calidad, también es una indicación de que aquellos que abogan por la concesión no respetan el tiempo y el esfuerzo dedicados al proceso de revisión y, a su vez, no respetan el trabajo realizado por uno o más empleados Si esto continúa, es mejor que encuentre una organización que valore los esfuerzos de sus empleados.

Al final, esto es culpa de la política , específicamente, la política a la que generalmente se renuncia para esta persona. Siempre que la política sea renunciar a la política, no hay una política ni una expectativa mutuamente entendida, razón por la cual el autor de la pregunta y esta persona terminan repitiendo los mismos desacuerdos sobre cada presentación.

Intente que los criterios de aceptación sean objetivos.

Como ingeniero, la calidad del código es mi responsabilidad. ¿Hasta qué punto debo luchar por ello?

Sí, la calidad del código es su responsabilidad, pero eso no significa que deba asegurarse de que la calidad del código sea del más alto nivel. Su trabajo es asegurarse de que la calidad del código esté en un nivel adecuado. El código de alta calidad puede evitar errores y mejorar la capacidad de mantenimiento en el futuro, pero generalmente tiene un costo (dinero o tiempo), por lo que no siempre es lo que se necesita, especialmente cuando no está escribiendo software para marcapasos o aviones.

Escribes que trabajas en I+D y en ese campo es muy común escribir prototipos que se tirarán en el 90% de los casos.

Encontrar el compromiso correcto entre la calidad del código y la velocidad y el costo es difícil y, si no se hace de forma centralizada, puede variar fácilmente entre diferentes desarrolladores.

Si usted es el que siempre dice no a las nuevas características que necesita la empresa, se le percibirá principalmente como un alborotador. Tal vez dentro de 4 años, alguien se dará cuenta de que siempre has tenido razón al presionar por la calidad, pero podría ser que ya te hayan dejado ir para entonces.

La forma de evitarlo es tener criterios objetivos para la calidad del código que estén respaldados por las partes interesadas del negocio.

Sin documentación

¿Está documentado el resto del código o solo falta el código de Joe? ¿Cuál es el impacto de no tener documentación?

formato contra nuestras directrices

Este debería ser un caso claro, tiene pautas (supongo que están sancionadas por la empresa o el departamento) que se aplican a todos. A veces, sin embargo, las pautas están desactualizadas y nadie las sigue. Si otras personas mayores los siguen, debe estar seguro de insistir en ellos.

falta de pruebas

No existe una regla global de que el código deba tener tipos específicos de pruebas o tener pruebas en absoluto. El hecho de que generalmente sea una buena idea para ellos no significa que sea una práctica que aplique en su empresa.

Arquitectura incompatible con lo que intentábamos conseguir en el futuro Cuestiones de rendimiento.

Este me parece el más difícil, ya que es muy difícil juzgar si la arquitectura del código es buena o mala. Pero puede tener dos criterios objetivos: a.) ¿Se cumplen los requisitos no funcionales? (Solo si ha definido requisitos no funcionales de antemano) b.) ¿Encaja el código en la arquitectura general del sistema (Solo si ha documentado la arquitectura del sistema)

De plano no funciona

Esto es obvio, nadie debería criticarlo por un código que no funciona. A menos que se exceda y requiera un código perfecto, donde un buen código sería suficiente.

Tuve que hacer horas extras para solucionar los problemas con el código de Joe, porque una vez que se aprueba y se paga, él no se siente y nadie lo hace responsable de la corrección de errores.

Este es el problema. Podría presentar el mejor argumento del mundo sobre la calidad del código, pero si su pago se basa en las funciones, eso es precisamente lo que hará. Después de todo, ¿por qué perdería el tiempo arreglando un código ya aceptado cuando no le pagan por ello?

Recuerdo una época en la historia en la que LOC (Líneas de código) era la forma principal en que te ascendían o te pagaban. Estarías escribiendo todo el día por cosas simples. Es muy difícil agregar funciones o incluso seguirlas.

Joe solía acercarse a mí con una historia sobre cómo no le pagarían si su código no se aceptaba a tiempo.

Incluso te dijo que no lo arreglaría porque no le pagan por ello.

El primer argumento es averiguar cómo arreglar los términos de este contrato. En última instancia, depende de su negocio, pero sus 3 argumentos principales son:

  1. Estás perdiendo el tiempo "arreglando" lo que rompió. ¿Te pagan para arreglar sus errores o te pagan por otras cosas? Me gustaría aclarar eso.
  2. Pagar por función está arruinado. Puede explicar esto junto con el #1.
  3. Si el número 1 es su contratación principal, entonces debe considerar encontrar un nuevo trabajo. Si no están dispuestos a arreglar los términos, entonces debes ir de todos modos.
Sí, todos están tratando de inventar todo tipo de burocracia y reglas, pero eso nunca funcionará. La calidad de su código nunca será más importante para este tipo que su resultado final. Alguien necesita arreglar este obvio incentivo perverso.

Ya has respondido tu propia pregunta:

A Joe se le paga por cada característica que completa en lugar de una tarifa por hora. Tengo la impresión de que Joe trata de realizar tantas funciones como sea posible, a menudo escatimando en documentación/calidad del código en el proceso.

Cambie a Joe a un contrato por hora y vea qué sucede. Si es bueno, su calidad mejorará, a menos que juegue con el sistema alargando las cosas, así que imponga plazos razonables.

Si su calidad no mejora, reemplácelo.

Creo que haces tu trabajo con honor, aunque sea bastante estresante. Como ingeniero de calidad, no debe permitir que pase un trabajo de muy baja calidad.

Tal como lo veo ahora, hay algunas alternativas, ninguna de ellas perfecta.

  1. Convence a tus jefes de que asuman la responsabilidad por escrito (el correo electrónico debería estar bien). Cuantos más jefes, mejor.
    • un correo electrónico por incidente;
    • un correo electrónico para gobernarlos a todos; esto prácticamente cancela las actividades de calidad en el proyecto;
  2. Abandona tus actividades como ingeniero de calidad, o al menos el trabajo de aceptar/rechazar el trabajo de los demás. Parece que ya tienes suficiente trabajo;
  3. Convencer a la gerencia para que sea Joe quien acepte/rechace el trabajo del equipo. Pase lo que pase, Joe responderá, incluido su propio trabajo.
  4. (en el peor de los casos) Piense en una empresa diferente que cumpla con sus expectativas y comience la "transición" allí.

Si considera que tanto los jefes como sus colegas tienen una mala mentalidad sobre la necesidad de calidad del trabajo, la opción 4 parece ser su mejor amiga.

¿podría proporcionar una razón para su voto negativo?

Sí, estás siendo irrazonable. Siempre que no sea de vida o muerte, debe pasar el código porque a la gerencia solo le importa el dinero, y la deuda técnica no es algo que puedan entender. He escrito un código de mierda porque me han dado plazos que no me dan suficiente tiempo para hacer un buen trabajo y, como contratista, no me pagan por hacer horas extra. Si pudiera establecer la fecha límite, entonces sería diferente.

Un poco de mala suerte con los votos negativos. Debes darte cuenta de que hay muchos idealistas en Stack Exchange que no entienden los matices.