¿Cómo evitar que un empleado tenga a la empresa como rehén?
Trabajo en un equipo que escribe software para facilitar una de las unidades de negocio clave de la empresa. Me uní al equipo hace unos meses y descubrí que hay una gran rotación en mi equipo debido a una persona. Esta persona (llamémosle Sr. A) lleva 7 años en la empresa, es muy difícil trabajar con él y toma repetidamente malas decisiones a propósito para mantener el producto de software inestable, difícil de mantener y de solucionar problemas. De esta manera, cuando hay un problema, sólo él puede arreglarlo.
Dejó la empresa hace unos años porque la empresa no le permitía trabajar desde casa, pero tan pronto como se fue, la empresa tuvo que volver a contratarlo (y permitirle trabajar al 100% desde casa) porque el software tenía problemas y nadie sabía cómo arreglarlo.
Mi gerente lo sabe, pero dice que no hay nada que pueda hacer con el Sr. A.
¿Qué puedo hacer para arreglar esta situación? Quiero hacer el software moderno, mantenible y estable.
Para tu información, el software monitoriza los eventos, los procesa y luego toma las acciones apropiadas. El Sr. A ha:
- Mantenido a propósito lejos de los marcos modernos de desarrollo de software;
- Escrito la lógica central del negocio en lenguajes que no pueden ser probados;
- Reestructurado los componentes del software en 30 módulos para añadir complejidad y problemas de certificación de versiones, y;
- Diseñado de una manera no escalable, asegurando que no hay capacidades HA (alta disponibilidad).
Actualización:
En cuanto al código no comprobable, la lógica de negocio se está moviendo de Java a scripts de gran calidad incrustados en XML. Las pruebas unitarias del código Java han sido descartadas.
En cuanto a la modularidad/complejidad, a cada módulo se le ha dado su propio repositorio git y tiene su propio versionado. Ahora sólo el Sr. A sabe qué versiones son compatibles entre sí. No puede lanzar la versión 2.0 del producto y desplegar todos los módulos 2.0. Tiene que liberar el módulo A 2.0, que funcionará con el módulo B 1.0-2.0 y el módulo C 1.0-1.5. Para mí, eso es un mal diseño, todo debería ser versionado bajo un solo repo como Spring framework (Spring 5.0 significa Spring-Core-5.0, Spring-Context-5.0, Spring-Web-5.0, Spring-Security-5.0, etc.)
El gerente dice que no puede hacer nada al respecto porque el Sr. A fue despedido al principio, pero luego, cuando surgieron problemas, tuvo que ser llamado de nuevo para arreglarlo. Así que el producto no puede ser mantenido sin él.
Veo esto como mi problema ya que no quiero abandonar al gerente ya que ha sido muy amable conmigo. Y mi primer instinto es resolver un problema, no abandonarlo, aunque puedo ver como abandonar esto sería realmente fácil, y parte de mí está tentado de hacerlo.
Otros han dejado el equipo por él, porque en el almuerzo es de lo que todos se quejan. Cada vez que hay una reunión con el Sr. A, la gente sale de ella moviendo la cabeza (durante horas).
2ª Actualización:
HA es la abreviatura de Alta Disponibilidad. En la Arquitectura de Software esto significa desarrollar su software de manera que pueda ser alojado/desplegado en el entorno de producción de forma redundante, de modo que si una instancia del mismo se cae, la otra instancia(s) puede tomar la carga resultando en cero tiempo de inactividad. El usuario final ni siquiera sabría que algo ha salido mal.
Regarding: Esto parece una base de código grande normal. No creo que esto se deba a la gran base de código ya que el producto no es tan rico en funcionalidad. Es un sistema backend que cruje los datos. Otras compañías tienen productos similares para satisfacer sus necesidades de negocio, son capaces de hacer esto usando modernas opciones HA/Scalable, así que no entiendo por qué este equipo necesita hacerlo en Java 6 sin HA/Scalability.
3ª Actualización:
Respecto a: “¿Las últimas versiones de todos los módulos funcionan juntos?”: No necesariamente. Ha estado retrocediendo ciertos módulos en prod si hay un error identificado, pero retroceder ha introducido más errores ya que ciertas versiones de módulos no son compatibles. Todo esto podría evitarse si todos los módulos fueran versionados y liberados juntos porque entonces todo el producto sería probado y en conjunto garantizaría cierta funcionalidad. En otras compañías/proyectos donde he trabajado, así es como han podido desarrollar y desplegar proyectos mucho más complejos con facilidad.
@pipe: No estoy recién salido de la escuela. He trabajado en varias compañías y en grandes proyectos durante los últimos 10 años y todo lo que veo que el Sr. A propone va en contra de las convenciones y el sentido común. Los 30 módulos (en repositorios separados) era como había establecido originalmente el árbol fuente. Un desarrollador inteligente que estuvo en el equipo durante 1 año, vio los problemas de compatibilidad y presionó para combinar todo en un repositorio, haciendo un proyecto multimodular maven. Ese desarrollador se cansó de la naturaleza del Sr. A, así que encontró un trabajo en una de las 5 principales empresas de TI. No nombraré la compañía para mantener esto en el anonimato, pero por las 5 principales compañías de IT me refiero a Microsoft, Google, Apple, Facebook y Amazon. Así que esto El promotor no era tonto ni incompetente. Tenía 8 años de experiencia. El Sr. A revirtió ese cambio a la forma en que estaba, 30 módulos en repositorios separados. Así que estos 30 módulos no fueron añadidos para manejar la complejidad de una gran base de código. Se pusieron en marcha para asegurar que hay problemas de compatibilidad en prod. Complejidad innecesaria.
Más sobre “¿Por qué es este tu problema?”: Cuando hablo con desarrolladores que trabajan en (o tienen amigos que trabajan en) Microsoft, Google, Amazon, Facebook, Apple; me dicen que a menudo encuentras gente con la que es difícil trabajar. Veo esta situación como un desafío que enfrentaré repetidamente donde sea que trabaje, sin importar cuán impresionante sea la compañía. Por lo tanto, necesito saber cómo manejar esto adecuadamente para continuar creciendo en mi campo.
Meta (para mantener esta pregunta en el tema):
Estoy haciendo esta pregunta para saber cuál es la mejor manera de manejar situaciones como la descrita anteriormente para cumplir con las metas descritas a continuación. Creo que los compañeros difíciles son imposibles de evitar, así que basándonos en la experiencia de los demás tal vez todos podamos aprender algo.
Mejorar la estabilidad del producto minimizando el código de los espaguetis y la complejidad innecesaria, según la petición de la dirección.
Hacerlo HA según la petición de la dirección.
Usar los marcos modernos y las especificaciones del lenguaje (Java 6 vs Java 8) para que los nuevos desarrolladores sean fáciles de encontrar en el mercado y puedan ser productivos más rápidamente.
Eliminar la dependencia de una sola persona.