¿Cómo puedo evitar errores críticos en un nuevo entorno de código?

He sido desarrollador durante más de 3 años y he ganado confianza en mis habilidades de programación dentro de mi equipo. Recientemente, mi equipo ha sido empleado en una empresa propiedad de nuestros capitalistas de riesgo en la que nos hemos integrado y en la que ahora trabajamos.

No tengo experiencia con Java y, aunque sé codificar en C#, etc. y estoy familiarizado con las API, recientemente creé un gran problema al registrar mi código en nuestro repositorio fuente.

Me arrojaron al fondo y me pidieron que hiciera cambios en una API existente (mi equipo está al tanto de mi exposición y habilidades). Después de comprender los cambios y verificar el entorno de la solución en busca de referencias a la API en sí, realicé los cambios, los probé con pruebas unitarias y Postman para la respuesta, etc.

Todo parecía estar bien. Sin embargo, mi conocimiento de la solución en general y otras cosas no es tan bueno como el de otros desarrolladores de back-end en este proyecto; Soy el único desarrollador full-stack, haciendo tanto el front-end como el back-end. El problema era que se hace referencia a la API en un archivo de flujo de trabajo BPMN que no apareció cuando busqué las referencias o el nombre de la API como texto en el IDE.

Esto causó un problema de 4 días con entre 2 y 4 desarrolladores de back-end que investigaban por qué fallaba la compilación en un momento dado durante la jornada laboral. Si bien reconozco mi error y acepto plenamente la responsabilidad de crear un problema tan grande, ahora me siento muy decepcionado conmigo mismo y más dudo que deba continuar desarrollando el back-end con tan poco conocimiento de Java y la estructura de la solución. . Tampoco puedo evitar sentirme culpable por perder tanto tiempo y dinero en lo que fue un error y me llevó mucho tiempo encontrarlo.

Si bien me gustaría poder pasar tiempo y sentarme con algunos desarrolladores de back-end para analizarlo y comprenderlo por completo, simplemente no tienen tiempo en este momento. ¿Qué más puedo hacer para ayudar a asegurarme de no cometer o es mucho menos probable que cometa errores, y mucho menos errores tan costosos, en el futuro?

Debo agregar que uno de los desarrolladores de back-end también revisó mi código de cambio, y estoy seguro de que me preguntó si se hace referencia a la API en algún otro lugar. Como mi búsqueda y verificación no mostraron nada en el IDE, ya que no verifica los archivos BPMN, respondí que no.

¿Qué más y qué más debo hacer para minimizar el riesgo de cometer errores similares en el futuro?

Notas adicionales en respuesta a los comentarios y respuestas:

Revisiones de código: Siempre me sentaré con el desarrollador y hablaré y entenderé el código con ellos, explicándolo a medida que avanzamos.

Hacemos scrums diarios. Mencioné esto cuando estaba trabajando en ello, pero no surgieron preocupaciones, aunque estoy seguro de que lo discutiremos en el scrum de mañana o en la próxima retrospectiva.

Debo aclarar que el problema fue que la compilación estaba fallando y entiendo que probablemente debería incorporar todos los cambios en mi rama y compilar y hacer una prueba final antes de comprometerme, esto no lo hice.

Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat .
Cosas como esta deben documentarse con la fuente exactamente para este propósito. No siempre lo son. ¿Leíste la documentación que con razón se podía esperar?
Esto suena como el olor del código, java como C # es un lenguaje fuertemente tipado. Si los mecanismos empleados para la verificación de tipos no se activan en las pruebas, es posible que tenga un problema más profundo donde las interfaces no se utilizan correctamente.
Esta es precisamente la razón por la que existen las revisiones de código. Supongo que usa el control de fuente; ¿Por qué fue tan difícil para los desarrolladores revisar la última docena de confirmaciones para detectar el problema?
Esta es también la razón por la que debe haber un conjunto de pruebas sólido, un servidor de CI y control de calidad en un entorno de prueba antes de lanzar el código. Parece que su empresa carece de estos componentes, lo que permite que se publiquen errores que podrían detectarse fácilmente.
Sugeriría que no debe tener ningún contacto con el desarrollador que realiza la revisión del código. Deben obtener las especificaciones que le dieron y tener su código del repositorio. Si tienen preguntas sobre algo, déjales que le pregunten a otro desarrollador, no a ti. Cuando lo explique, puede hacer que pasen por alto un error que habrían detectado.
@ J.ChrisCompton estaría de acuerdo con esto. Sin embargo, en mi empresa en este momento no se nos brindan especificaciones de extremo a extremo y tal vez esto sea algo personal, pero a menudo encuentro que las personas simplemente hojean una revisión de código más si no está allí para pedirles que miren ciertas áreas a medida que avanza. . Tal vez esto no sea correcto y estoy de acuerdo en que deberían incitarme más.
"un problema de 4 días con entre 2 y 4 desarrolladores de back-end" - Entonces, ¿se necesitaron de 8 a 16 días de desarrollador de back-end para localizar el error? Entonces el problema no es tan 'trivial de ver y evitar' como algunos pretenden. Si saben 'sus' cosas, pueden localizar el error rápidamente. Si les lleva un par de días, no tienes la culpa de no saber de antemano qué se vinculaba con qué en el nuevo entorno. A menos que el problema esté claramente documentado. Pero entonces, ¿por qué les tomaría días arreglarlo?
@ Im-Harrison Sí, entiendo que probablemente tengas un control limitado. (1) El problema de "hojear" puede ser menor si tanto el codificador como el revisor de código son llamados a cada reunión cuando algo sale mal. Nadie debería saber quién de ustedes lo codificó (aunque generalmente lo sabrán). (2) Incluso si no tiene especificaciones completas, debería tener algo. Si es verbal, escriba un correo electrónico y envíelo a la persona que le proporciona las especificaciones; entonces tiene algo para el revisor de código (y también puede ahorrarle algo de angustia :) No se lo explique a un revisor de código a menos que sea necesario. (por política o regla no escrita).

Respuestas (8)

Con varios desarrolladores que realizan cambios en la misma base de código (y no siempre están actualizados entre sí), estas cosas sucederán. Yo mismo soy un desarrollador; no es nada para obsesionarse, nos pasará a todos al menos una vez. Sin embargo, hay un par de cosas que puede hacer para reducir el riesgo de que vuelva a suceder.

Por el contexto, parece que probaste todo localmente y funcionó bien. Fue solo más tarde que algo salió mal. Esto sugiere que su propia base de código estaba un poco desactualizada y/o que alguien más tenía un código desactualizado cuando realizó sus propios cambios. Lo mejor que puede hacer, justo antes de confirmar su código, es extraer cualquier cambio reciente de su repositorio (o como lo llame) para que pueda estar seguro de que sus cambios funcionan con el código más actualizado. Si pasa todas sus pruebas, entonces puede comprometerse con la conciencia tranquila.

También sugeriría hablar un poco más con sus colegas. Si está realizando cambios en un sistema crítico, menciónelo. Incluso si se trata de una solicitud simple como "Estoy a punto de cambiar esta parte importante, ¿tienes tiempo para revisar el código?" . De esta manera, su equipo no pasará días buscando el problema, si lo hay, y puede estar tranquilo sabiendo que usted Y sus colegas confían en los cambios. Algunos equipos de desarrollo hacen stand-ups diarios donde expresan en qué están trabajando; ayuda al equipo a ser más consciente de en qué está trabajando y si existe el riesgo de que sus cambios entren en conflicto con los de otra persona.

Aprenderás haciendo. Si está bien versado en lenguajes como C #, ¡podría aprender Java más rápido de lo que piensa!

Fue causado por una referencia de tipo de cadena a la API en este "archivo de flujo de trabajo BPMN", por lo que nada estaba desactualizado y los cambios recientes no habrían ayudado.
@DavidConrad, tiene razón al 100%, pero esto no se trata tanto del pasado ni de por qué sucedió, ya que soy consciente y entiendo cómo llegó a ese punto. Esta respuesta sugiere lo que creo que tiene el mejor consejo en este caso: usar más su voz e involucrar a otros. Si hubiera hablado más fuerte y expresado más de lo que estaba haciendo a otros desarrolladores, sería más probable que alguien hubiera señalado que se usaba en los flujos de trabajo de BPMN.
Ah, el viejo, "funciona en mi máquina". :PAG

Esta situación ocurre de vez en cuando: haces algo que tiene efectos colaterales imprevistos en otra cosa que no conocías antes.

El hecho de que no lo despidieran de inmediato o lo pusieran en un PIP significa que la empresa reconoce que ocurren errores, se solucionan y la vida continúa en consecuencia.

¿Qué puedes hacer al respecto? Conozca esta consecuencia y vea si hay algo más relacionado que debería haber tenido en cuenta o cualquier otro equipo al que debería haber preguntado sobre los efectos colaterales de cambiar una API.

Todo es parte de la acumulación de experiencia y no debería desanimarte a seguir adelante.

La forma de evitar este problema también le brinda la oportunidad de contribuir significativamente a su nueva empresa: la raíz de este problema son las pruebas inadecuadas, no usted (a menos que haya sido negligente de una manera que no aparece en su publicación).

En todos los entornos de desarrollo, debería ser posible averiguar si el cambio que ha realizado va a causar una falla importante antes de registrarse, así como averiguar si el código va a romper la compilación. Si bien definitivamente es vergonzoso ser el que encuentra un todo tan enorme en el proceso de la empresa, ahora puede ser un líder al tratar de establecer dicho proceso en su nueva empresa.

Puede proponer que el equipo comience a escribir pruebas unitarias y comience a configurar un entorno de integración continua que reconstruiría el proyecto y ejecutaría las pruebas unitarias cada vez que se registre el código, y donde las pruebas se puedan ejecutar individualmente antes del registro. Las pruebas unitarias requerirán el compromiso del equipo, pero se puede configurar un entorno de CI básico con bastante rapidez a partir de proyectos de código abierto, siempre que pueda dedicarle una máquina virtual o un servidor.

Editar: las revisiones de código son otra buena práctica de programación que puede minimizar este tipo de errores, y también es bastante fácil de poner en marcha.

TL; DR aproveche esta vergonzosa oportunidad para modernizar los procesos de desarrollo de su empresa. Saldrás oliendo a rosas.

El OP también puede aprovechar esta oportunidad para introducir la revisión por pares como un SOP, en lugar de tener que solicitarla específicamente cada vez. La revisión por pares puede ayudarlo a aprender a codificar, mientras lee lo que hacen otros, así como también a obtener buenos comentarios de otros desarrolladores sobre su propio código. Tendría que argumentar que no todas las fallas importantes pueden detectarse antes de registrarse. Los servidores pueden tener algunas configuraciones diferentes que pueden romper una compilación que funciona localmente. El simple hecho de tener NuGet configurado de manera diferente puede causar ese tipo de problema.

El problema surge cuando se hace referencia a la API en un archivo de flujo de trabajo BPMN que no se mostró cuando busqué las referencias o el nombre de la API como texto en el IDE.

¿Qué hizo la retrospectiva de los equipos con respecto a este incidente? ¿Qué procedimientos del departamento podrían implementarse para que esto no se repita? ¿Qué cree el equipo que es necesario cuando se incorporan nuevos desarrolladores? ¿Y qué nuevos procedimientos de incorporación se van a desarrollar?

PD Ser proactivo en lo anterior es una gran manera de aprender y liderar.

¿Puedo preguntar por qué la gente siempre sugiere mejoras en el nivel de procedimiento o en el nivel de gestión? Es muy dudoso que un tipo nuevo entre y diga: "¡Cambia todo esto para que mis cosas funcionen!" ¿Cuándo todo el mundo ha estado funcionando "bien" hasta ese punto? Romper algo, luego no saber por qué se rompió, tomar casi una semana de horas de trabajo y luego, al final, decir que su proceso apesta y que debe mejorarse no es una excelente manera de comenzar su carrera allí.
Porque si la pregunta es "¿Qué tipo de prueba automatizada podemos agregar al proceso de lanzamiento que identifique este tipo de problema la próxima vez que se realicen cambios", debería terminar con un proceso mejor que no requiera que alguien verifique manualmente cada cambio
A menudo, los veteranos ignoran los problemas de nivel de gestión y de procedimiento a medida que se acostumbran a trabajar con ellos. Se olvidan de que las cosas no tienen por qué ser así, así que para ellos las cosas funcionan "bien". Se necesita un nuevo par de ojos para ver las deficiencias. Dicho esto, estoy de acuerdo en que el chico nuevo no debería hacer demandas, pero hay una gran diferencia entre decir "¡Cambia todo esto para que mis cosas funcionen!" y "¿Cómo es que hacemos las cosas de esta manera en lugar de de esa manera?"
@Dan Su escenario puede reformularse: "... luego, al final, diga que su proceso apesta y debe mejorarse" para evitar problemas como este en el futuro. Como alguien que ha hecho precisamente eso, un poco de determinación obstinada dio como resultado cambios en el proceso que facilitaron la vida de todos. Convencí a mis compañeros de trabajo con alrededor de 3 meses en la empresa como desarrollador junior al hacerlo y luego mostrar los resultados . Si no están haciendo retrospectivas/autopsias, ese es un lugar fácil para promulgar un cambio positivo que definitivamente beneficiará al equipo.
Si ocurre un problema, ya sea por incompetencia o error de proceso; está claro que el OP no es incompetente pero cometió un error que se puede evitar a través de algún mecanismo. Es posible que a la empresa no le guste escucharlo de un "forastero", sin embargo, este es un problema que los procesos adecuados eliminarían. Idealmente, la gerencia del equipo debería poder identificar esto y aplicar nuevos procesos; si el novato está iniciando este proceso de pensamiento, entonces sus preocupaciones son más importantes. Creo que el consejo de 'proactividad' es válido, aunque reconozco que si el OP es la acción, algo más grande está mal.
@Dan Porque su proceso está claramente roto. No hay pruebas de que el archivo de flujo de trabajo BPMN coincida con la API, y ciertamente debería haberlas.
@Dan para evitar que vuelva a suceder la próxima vez que se agregue un nuevo desarrollador al equipo.

¿Dónde se almacenaron los archivos BPMN que no estaban visibles cuando buscaba otros consumidores de API?

Parece que el problema era que no sabías o no tenías acceso a todos los consumidores de la API.

Si no forman parte de su conjunto de trabajo de desarrollo estándar y, por alguna razón, no se pueden agregar a él, cualquier API que se consuma en ese momento debe documentarse como tal en los comentarios de encabezado de llamada de método equivalentes. Dependiendo de qué tan formal sea su proceso de revisión, verificar explícitamente que no se vean afectados podría ser un cambio de proceso válido.

El problema de no saber acerca de todo lo que está fuera del código base en el que está trabajando y que debe verificarse debe ser planteado en su próxima reunión/retrospectiva si sus compañeros de trabajo no lo saben. Algo así debería haberse cubierto como parte de su incorporación al proyecto.

Creo que uno de los problemas es que los IDE para lenguajes como Java (supongo que C# es similar, pero no tengo experiencia personal) pueden generar una falsa sensación de seguridad. Han incorporado funciones para encontrar usuarios de clases, métodos, campos, etc. que evitan los falsos positivos que se encuentran en una búsqueda de texto simple, pero esos métodos solo son confiables si todo el código está incluido en el proyecto IDE Y las llamadas se realizan directamente. desde el código Java en lugar de a través de la reflexión.

Tienes que cambiar tu mentalidad.

No cometiste un "error crítico". Trabajó lo mejor que pudo; estabas abierto a trabajar en un entorno desconocido; fuiste transparente sobre tus conocimientos y todo lo demás, antes y después; trabajaste junto con los otros chicos para solucionar el problema, presumiblemente no hiciste una rabieta en la oficina. Después de la debacle, vienes aquí y tratas de mejorar aún más.

En resumen: me chuparía los dedos por tener más empleados como tú.

Para responder tu pregunta:

  1. Usted personalmente no puede evitar tales cosas, en general. El error técnico estaba completamente fuera de tu alcance. Si quisiera estar 100% seguro, se detendría. No puede verificar partes de un sistema de las que no sabe nada.
  2. Los sistemas (incluidas las computadoras y los humanos) tampoco se pueden construir para evitar tales cosas, tan pronto como se vuelvan lo suficientemente complejos.
  3. Una forma de abordar esto es el enfoque DevOps/Agile de invitar al fracaso y fallar fuerte y rápido. Esto es de lo que se trata todo el CI y especialmente el CD. Se implementa con tanta frecuencia y rapidez que fallará muy a menudo; y cada vez que solucione el motivo particular con la máxima prioridad (utilizando las técnicas habituales: pruebas automáticas y manuales, reversión sin dolor de pequeñas confirmaciones, implementaciones azul-verde con cambio de reversión de chasquido de dedo, etc.). Esto lógicamente da como resultado que todo el proceso sea más robusto muy rápidamente. Lo ideal es que hagas eso desde el día 0. ¿Fácil? No. ¿Se puede mejorar pieza por pieza? Sí.

Independientemente de lo que usted o cualquiera haga para minimizar los errores, los errores ocurrirán .

Hay, por supuesto, "mejores prácticas" técnicas que ayudarán y sí, están todos los tópicos sobre aprender de los propios errores. Pero tienes todo eso, parece. Sin embargo, ¿todavía te sientes lo suficientemente mal por el incidente como para tomarte el tiempo de escribirlo en Workplace.stackexchange.com?

Creo que hay algo tangible que puedes hacer que te ayudará a ti y a los demás a sentirse mejor con todo este asunto.

Lo mejor que puede hacer es tomar nota de la amabilidad y generosidad que se le mostró y expresar algo de gratitud por ello .

En lugar de disculparse aún más profusamente y hacer promesas de "nunca más" que pronto se olvidarán, tómese el tiempo para AGRADECER personalmente a las personas que ayudaron a resolver el problema y a las que le causaron molestias. Si es apropiado lleva una caja de donas (por ejemplo) a la oficina y complementa a tus compañeros de trabajo.

Y luego, la próxima vez que algo suceda y alguien más cometa un error, sé amable con ellos, ayúdalos y devuélvele la amabilidad que te dieron a ti . Eso es. Serás un mejor equipo gracias a cosas como esa.

Haga que sus compromisos sean lo más pequeños posible, y si puede compilar desde el servidor de compilación después de cada impulso. (Si no se compila con frecuencia, ¡es posible que desee compilar antes de su impulso también!)

Esto no te ayudará a no cometer errores, pero los hará mucho menos críticos. Si sabe qué compromiso/grupo de compromisos causó que la compilación se rompiera, es trivial revertirlo mientras trabaja en el problema, y ​​si los compromisos son lo más pequeños posible, entonces es más fácil localizar la fuente del problema.

Si está utilizando git, incluso hay un comando para ayudar con esto: git-bisect , que le permitirá realizar una búsqueda binaria a través de un grupo de confirmaciones para encontrar la que causa el problema.