¿Cómo lidiar con un compañero de trabajo senior que escribió su propio lenguaje de programación? [cerrado]

Estoy en un equipo con un desarrollador senior que ha estado en la empresa durante mucho tiempo (quizás 15 años) y trabaja exclusivamente en la arquitectura de back-end de nuestro producto de 25 años. Recientemente, como parte de un esfuerzo de modernización, nuestro equipo se encargó de actualizar el producto para que las aplicaciones web puedan comunicarse con el producto mediante JSON. Para resolver este problema, este desarrollador creó una capa de traducción personalizada que transformó los mensajes de los clientes web a través de HTTP (JSON) en mensajes que el producto puede hablar y viceversa.

Al principio, esta capa era bastante simple: simplemente traducía los mensajes entre los clientes web y el producto. Sin embargo, con el tiempo, esta capa se ha vuelto cada vez más compleja; esta capa ahora puede transformar mensajes, ejecutar validación de mensajes, realizar consultas de bases de datos, realizar solicitudes de red a sistemas de terceros, recorrer datos, ejecutar condicionales complejos y más. Ha crecido hasta el punto de que creo que es correcto llamarlo un lenguaje de programación completo.

Somos el punto donde toda la nueva lógica empresarial se escribe en esta capa de traducción. Siento que esta es una Mala Idea™ por varias razones:

  • Hay muy poca documentación sobre cómo escribir código en esta capa de traducción.
  • Como resultado del n.º 1, ahora hay una curva de aprendizaje muy pronunciada para cualquiera que se una al equipo.
  • El desarrollo de una nueva lógica empresarial casi siempre requiere la asistencia de este desarrollador.
    • De hecho, en cada sprint le asignamos tareas de "soporte de API" en nuestro tablero de scrum que están dedicadas a ayudar a otros miembros del equipo a resolver problemas mientras se desarrollan en la capa de traducción.
  • La experiencia de desarrollo es pobre, ya que todas nuestras herramientas de desarrollo deben ser escritas por este desarrollador.

Quizás la parte más irritante es que también tenemos un servidor Node frente a esta capa de traducción. Sin embargo, este desarrollador (y nuestro arquitecto, que está un poco desconectado de nuestro equipo) desaconseja escribir lógica empresarial en esta capa principalmente por coherencia: no le gusta la idea de tener lógica empresarial en dos lugares.

¿Cómo puedo convencer a este desarrollador (y al resto de mi equipo, que son bastante pasivos con este tipo de problemas) de que es una mala idea? ¿Cómo combato el argumento inevitable de que escribir la lógica de negocios en Node sería inconsistente con los patrones que ya hemos establecido?

¿O es posible que esté siendo arrogante al suponer que el enfoque de este desarrollador es incorrecto? Tiene más años de experiencia en desarrollo en su haber y mucho conocimiento institucional.

Algunos antecedentes: tengo alrededor de 5 años de experiencia, 2 de los cuales han sido en esta empresa. Me inclino más hacia el desarrollo front-end si tengo la opción. La capa de traducción mencionada anteriormente se ha desarrollado durante aproximadamente 2 años, pero aún no se ha implementado en producción. Consulte los comentarios para conocer algunos detalles técnicos adicionales sobre esta capa de traducción.

Parece una persona inteligente, no tan segura de sus habilidades de documentación y soporte. Ha cimentado su importancia y su papel en todo, debes nadar bien contra la corriente...
Estoy confundido en cuanto a su descripción como lenguaje de programación. Esto suena más como un marco.
@GlenPierce hay poca diferencia entre un lenguaje de programación pequeño y un marco grande.
Esta es la plataforma interna clásica: en.wikipedia.org/wiki/Inner-platform_effect . Si el arquitecto no puede/no quiere detener esto, entonces está resuelto. Vive con eso o sigue adelante. Lucharlo no tiene sentido.
@WesleyLong que supone que el "arquitecto" tendría el poder de obligar al desarrollador principal a abandonar su propio lenguaje construido. De lo contrario, depende de cualquiera que esté por encima de ese superior en el lado de la administración, suponiendo que pueda darles los argumentos correctos. Por ejemplo, traducir en números lo que significa una "curva de aprendizaje muy empinada" debido a esa pieza y lo que espera que sea sin ella podría ayudar.
¿En qué idioma está realmente integrado este "lenguaje interno"/marco? ¿Hay alguna opción para pasar, paso a paso, del uso de las bibliotecas creadas por sus compañeros de trabajo a algo más estándar de la industria?
No es un lenguaje de programación a menos que tenga un compilador o intérprete. Suena como un programa que tal vez está haciendo más alcance del que debería.
El término que esperaría aplicar aquí sería "lenguaje específico de dominio", y son una forma bastante bien entendida de abordar dominios complejos (que parece que podría ser esto): en.wikipedia.org/wiki/Domain- specific_language También tienen desventajas bastante bien entendidas (que se analizan en el enlace de wikipedia). A menudo, los sistemas son más complejos de lo que parecen a primera vista, y es muy posible que este DSL sea una gran herramienta para administrar eso. Lo que podría no compensar los problemas, pero dudaría en aceptar la afirmación de que es necesariamente algo malo.
@autophage parece que creció orgánicamente de algo simple, un mediador, a un DSL, y eso, en mi humilde opinión, siempre es una señal de alerta de que probablemente no haya sido diseñado para dar cuenta de los problemas de DSL, etc. El hecho de que esto ya es 2 años sin estar en producción es nuevamente otra bandera roja. Si estoy adquiriendo experiencia escribiendo lo que luego podría poner en mi CV como "diseño y creación de DSL", entonces está bien, pero si solo estoy adquiriendo experiencia en "Escribí cosas en el lenguaje personalizado de los empleadores", entonces eso es algo que estaría ejecutando lejos de rápido.
También puede ser un lenguaje específico de dominio , que, si se implementa con habilidad (que es muy difícil), puede facilitar mucho la vida de los clientes.
"dado que todas nuestras herramientas de desarrollo deben ser escritas por este desarrollador" - ¿Por qué? porque la gente no lo entiende lo suficiente como para contribuir, o no se les permite contribuir?
Puede llamarlo macros, definitivamente no es un lenguaje de programación. Estás exagerando tu problema.
Para agregar algunos detalles sobre la capa de traducción: la capa está escrita en RAML . La capa implementa una serie de "plugins" a los que se accede a través de RAML Annotations . En un archivo RAML, cada punto final puede definir una serie de "pasos" que definen cómo se comporta el punto final (es decir, validar el objeto, realizar una consulta a la base de datos, transformar el resultado, etc.). El desarrollador ha escrito un analizador personalizado que consume estos archivos RAML para su ejecución. TL; DR: Toda la lógica comercial se implementa exclusivamente en archivos RAML.
Mejor enlace para anotaciones RAML: raml.org/blogs/annunciando-raml-10-ga#annotations

Respuestas (5)

Vamos a darle a su pregunta un poco de contexto.

Su empresa tiene:

  • Un producto de 25 años.
  • Un desarrollador back-end sénior con considerable conocimiento institucional
  • Suposición: varios desarrolladores intermedios/junior
  • Un deseo de modernizar el medio ambiente.
  • Una capa de traducción

Lista no exhaustiva de requisitos de la capa de traducción:

  • Transformación de mensajes
  • Validación de mensajes
  • Conectividad de base de datos
  • Integración de red con sistemas de terceros
  • Manejo de datos
  • Ejecución condicional compleja

Por lo tanto, esta capa de traducción se puede llamar en su lugar middleware de integración . Maneja la lógica comercial no relacionada con el producto subyacente de 25 años, con (espero) diferentes flujos y paradigmas.

Hay varios aspectos que yo llamaría Bad Ideas™, pero la existencia de un middleware de integración no es uno de ellos. Lo peor, en mi humilde opinión, es la falta de documentación : puede originarse en el hecho de que solo tiene un desarrollador con suficiente experiencia para visualizar todo el proceso. Debe documentar el proceso para que, si lo atropella un autobús, el desarrollo no se detenga en seco. También disminuirá la necesidad del equipo de desarrollo de tareas de soporte de API.

Acerca del servidor Node: me veo obligado a estar de acuerdo, al menos inicialmente, con su arquitecto. Dividir la lógica de negocios en diferentes plataformas/lenguajes sin una fuerte razón arquitectónica puede llamarse Bad Idea™. Dos bases de código para mantener, dos conjuntos de requisitos para nuevos puestos de trabajo. Es posible que se hayan aplicado aquí los principios de KISS para reducir costos.

No digo que no se deba tomar esta decisión, pero se deben tener en cuenta todos los costos (reentrenamiento, mapeo de procesos, validación de flujo, etc.), y su arquitecto probablemente los conozca. El lenguaje utilizado para codificar el producto heredado puede suspenderse, por ejemplo, forzando una migración completa a una plataforma diferente, y se podría elegir una implementación completa de NodeJS como Plan A.

Aún así, creo que el deseo de mejorar la situación actual es admirable y valioso, y en lugar de pelear una batalla cuesta arriba, sugeriría un plan diferente.

El hecho de que el desarrollador senior esté liderando el esfuerzo de middleware sugiere que no es adverso al cambio y que es un profesional capaz. Comparta su punto de vista con él y escuche sus comentarios. Él puede apreciar el hecho, ofrecer su propio punto de vista (lo que le ayudará a comprender la lógica del estado actual) y considerar su deseo de modernizar la solución teniendo en cuenta todo el conocimiento institucional, y llegar a la conclusión de que la idea no es sin mérito. La empresa confía en sus capacidades, y una sugerencia de modernización de su parte puede tener un peso considerable.

+1. La mejor solución a esto parece ser documentar la mierda de lo que existe.
+1 para la documentación. Independientemente de la solución que utilice para cumplir con sus requisitos, aún tendrá algún tipo de API o marco para que sus desarrolladores aprendan.
Dado que la falta de documentación es el gran culpable aquí, y el OP tiene una experiencia razonable, tal vez puedan acercarse al desarrollador senior y pedirle que escriba la documentación para el middleware con el desarrollador senior como mentor. Incluso la documentación escrita solo para las piezas que usa tal como las usa, tiene mérito.
@LoganPickup Estoy de acuerdo. La documentación no necesita ser escrita por el desarrollador original. Diablos, la mayoría de los desarrolladores que conozco (incluido yo mismo) no son realmente buenos para escribirlo de todos modos. Siempre es útil contar con la ayuda de otra persona; por lo menos, puede ofrecer información sobre lo que es importante documentar.
+1 Otro voto para la documentación. Además, documentar procesos como este obliga al desarrollador a aprender cómo comunicar el proceso a otra persona que no está en su nivel. Por lo general, esto revela mucho sobre la mantenibilidad inherente a la implementación, qué tan intuitivos son los procesos y las implementaciones, etc. Esto sería genial para revisar la arquitectura y cómo mejorarla.
Parece que el marco es monolítico, entregando una variedad de cosas diferentes que podrían ser manejadas por módulos separados. Creo que separar la lógica comercial de la validación de mensajes sería una tarea que valdría la pena. También me sorprende la cantidad de llamadas de documentación. El mejor código se documenta a sí mismo. Y si de verdad te tomas en serio alejarte de esta monstruosidad, o refactorizarla, documentar todo solo va a ralentizar las cosas. (Pero dejar comentarios con bits confusos podría ser útil).

Divulgación completa: he sido el tipo senior del que te quejas, en el pasado. He sido, no por elección sino por necesidad, el principal arquitecto y desarrollador de un marco sorprendentemente similar al que estás describiendo.

Déjame decirte que estuve al tanto de todos los problemas técnicos y organizativos durante todo el tiempo . Fue un proceso incremental; nunca hubo ese único punto en el tiempo en el que uno podría haber tomado una sola decisión para detener esto. Casi todos los pasos parecían ser una buena idea en ese momento.

Hay un modo de pensar y algunos otros aspectos (p. ej., la presión del tiempo, la presión percibida , la cultura del equipo, etc.) que llevan a soluciones como esta. No te dice nada sobre la inteligencia, el carácter o cualquier agenda oculta de tu desarrollador.

Acabé con el lío con estas medidas, que literalmente tomaron años:

  • Elija un lenguaje de programación completamente nuevo y un marco web más un ecosistema de módulos para reemplazar los lenguajes antiguos y nuestro marco personalizado que teníamos hasta ese momento.
  • Evaluar y aprender todo al respecto en mi tiempo libre.
  • Implemente un pequeño proyecto de cliente totalmente pagado como prueba de concepto con esa tecnología, asegurándose de usar solo enfoques que sean realmente estándar, formas generalmente aceptadas en ese ecosistema, para asegurarse de que las personas nuevas (que tienen conocimiento previo del idioma) , pero no nuestro dominio) tienen un buen comienzo.
  • Encuentre formas de ejecutar la nueva solución aparte de la antigua, sin volver a caer en la trampa del middleware (es decir, acoplada libremente a través de microservicios o indirectamente a través del navegador del cliente).
  • Lenta y laboriosamente convenza al equipo muy conservador de que es una buena idea [tm] no hacer nuevos proyectos/características con el antiguo marco, sino dar el paso hacia el nuevo. Esto fue muy agotador emocionalmente.
  • Reorientar mi propio rol en la empresa, eventualmente dejar ese equipo y construir uno nuevo con un ángulo diferente, para cortar todos los lazos con el pasado (técnico) (parte del problema era que yo era un solucionador de problemas en ese antiguo equipo, y tuvo que obligarlos a valerse por sí mismos al marcharse).

Fue un viaje divertido y, en retrospectiva, muy exitoso. El equipo ahora está en camino de dejar atrás esa era. Pero el enfoque tampoco era trivial. Tal vez te dé algunas ideas, y me atrevo a decir que necesitarás el apoyo incondicional de tu desarrollador sénior o lo quitarás de esa posición (de cualquier manera que esté disponible para ti). Siéntese y tenga una larga conversación con él, si está en posición de hacerlo, el tipo de conversación "dónde queremos estar en 5 años"...

Una nota, que no se puede enfatizar lo suficiente: el sistema existente puede ser excelente (en realidad, probablemente lo fue, para poder sobrevivir tanto tiempo), pero habrá problemas organizativos en torno al enfoque. Hay un gran problema con la documentación, la distribución general de conocimientos, el factor camión y tener una fase de aprendizaje muy larga para los nuevos colegas. Además, muchos, especialmente los desarrolladores más jóvenes, no tienen mucho interés en invertir mucho aprendizaje en un contexto de aplicación muy específico que no les ayudará en absoluto con proyectos futuros. Razones como esta fueron (en mi caso) las que llevaron al cambio descrito, y hablar abiertamente sobre ellas quita el aguijón personal del problema.

Lectura adicional: según los comentarios, parece que no soy yo quien inventó este proceso. :-) Consulte el patrón StranglerApplication para obtener más información sobre el tema.

Precisamente. Hay mucha inercia institucional en situaciones como esa, y se necesita tiempo y esfuerzo para cambiar de dirección. +1.
Esto supone que el sistema existente es realmente malo y debe ser reemplazado. Según la información de la pregunta, no asumiría de inmediato que ese es el caso. Si ese es el caso, entonces esta es una buena solución.
El proceso que describió se parece mucho al patrón "StranglerApplication" .
¡Gran descubrimiento, @tavnab! An alternative route is to gradually create a new system around the edges of the old, letting it grow slowly over several years until the old system is strangled. Doing this sounds hard, but increasingly I think it's one of those things that isn't tried enough. => perfecto.
@rooby, al contrario. El sistema existente puede ser excelente (en realidad, probablemente fue capaz de sobrevivir tanto tiempo), pero puede haber problemas organizativos en torno al enfoque. Hay un gran problema con la documentación, la distribución general de conocimientos, el factor camión y tener una fase de aprendizaje muy larga para los nuevos colegas. Además, muchos, especialmente los desarrolladores más jóvenes, no tienen mucho interés en invertir mucho aprendizaje en un contexto de aplicación muy específico que no les ayudará en absoluto con proyectos futuros. Razones como esta fueron (en mi caso) las que llevaron al cambio descrito.
Comenzaste tu respuesta como "He sido el chico mayor". ¿Cuál es la diferencia entre "He sido el chico senior" y "Soy el chico senior"????
@IamtheMostStupidPerson AnoE no es literalmente el desarrollador senior descrito en el OP, pero ha estado en una posición muy similar hace unos años. Su respuesta describe cómo cambió eso, por lo que ya no está en esa posición.
"No te dice nada sobre la inteligencia, el carácter o cualquier agenda oculta de tu desarrollador". Gracias por esto, esto realmente ayudó a "desmonizar" a este desarrollador en mi cabeza. Es fácil dejar que mis emociones se interpongan y asumir lo peor de sus intenciones/habilidades.

Parece que ese desarrollador acaparó un mercado. Buena herramienta de negociación para las negociaciones salariales de revisión de fin de año.

En mi humilde opinión, la lógica comercial no pertenece al traductor. Puede sugerir una división de ese traductor en capas, separando una lógica comercial de los métodos de traducción simples.

Prepárate para que ese desarrollador esté en contra;)

Además, la gerencia puede ponerse del lado de él, indicando el esfuerzo/costo adicional que supondría.

Puede ser una batalla larga, y al final podrías ser tú quien haga la separación ;)

¿Cómo puedo convencer a este desarrollador (y al resto de mi equipo, que son bastante pasivos con este tipo de problemas) de que es una mala idea?

No es su tarea "convencer" al desarrollador.

Básicamente, la pregunta principal aquí es sobre su posición:

  • si solo es un colega del mismo nivel o inferior, puede señalar los riesgos a la gerencia. Mientras hace eso, concéntrese en los problemas que pueden surgir del sistema actual. Entonces es su decisión y no tu problema;
  • si usted es el jefe , póngase de acuerdo con otros gerentes sobre la necesidad de cambiar el sistema de programación y luego comunique la decisión a los programadores. La decisión debe estar justificada y comunicada correctamente (google "gestión del cambio) y debe organizarse una transición, pero luego debe esperar que sus subordinados se adapten a ella. Puede ofrecer algunos compromisos al programador senior para que se quede con la empresa, por ejemplo, un aumento de sueldo, más días libres y algo de satisfacción de su ego.

Cuando se trabaja para una empresa, es importante desarrollar también la capacidad de despegarse y no preocuparse. ¡En un sentido positivo! Si está tratando de cambiar algo que nadie más quiere cambiar, terminará odiado por los colegas y la gerencia.

Así que concéntrate en cuál es tu tarea. Señale e informe, pero deje que las tomen las personas que de hecho son responsables de tomar decisiones. No importa si tienes razón, conozco a muchas personas, incluido yo mismo, que terminaron despedidas a pesar de tener razón, o por tener razón.

El párrafo "si tú eres el jefe" es realmente un mal consejo. Un gerente que toma decisiones técnicas y exige que el equipo las acepte es un gerente incompetente para el que no vale la pena trabajar, incluso si las decisiones son sólidas desde un punto de vista técnico.
Hay algunos buenos consejos aquí. El despegarse me costó pero @Toss es muy correcto. Los gerentes y compañeros de trabajo se separan del empleado que sigue presionando su agenda. +1 señor.

Editar: no renuncies a tu trabajo; tuve una idea equivocada

Wow, al leer originalmente la publicación, la solución técnica sonaba como una capa de traducción que realizaba tareas no relacionadas innecesariamente. Sonaba muy contrario al "principio de responsabilidad única" / filosofía UNIX, no muy cohesivo o bien estructurado.

Creo que el detalle clave que me perdí fue que se trata de un sistema back-end arcaico que ejecuta la lógica comercial central, y creo que está implícito que el negocio está atascado por alguna razón comprensible. Gracias a los comentarios y votos negativos por empujarme a reconocer eso.

Dado que es antiguo, la empresa probablemente no quiera tocarlo. O bien, es posible que la lógica comercial implementada en la capa de traducción no tenga ninguna relación con el propósito de este back-end central.

Otros comentarios tienen razón; la documentacion esta en orden

La decisión de escribir una capa de traducción suena razonable ahora que siento que tengo una imagen más precisa de la realidad en mi cabeza.

Lo que está describiendo no suena tanto como un nuevo lenguaje de programación como quizás un nuevo marco, escrito específicamente para este caso de uso. Suena como ingeniería bastante estándar en lo que ahora entiendo que es el escenario.

Debe familiarizarse con el código, y usted y sus compañeros necesitan capacitación y documentación para comprender el sistema. Sería eficiente escribir documentación sobre las cosas a medida que las aprende.

Esto parece una reacción exagerada a una situación que es básicamente bastante normal en las organizaciones más grandes, en su mayoría se reduce a "nadie quiere escribir documentación" por lo que puedo ver.
La "capa de traducción" no es necesariamente mala. No tenemos datos sobre eso, solo la opinión del OP. Es muy posible que sea una buena y sólida pieza de ingeniería (que necesita una mejor documentación), y el OP mucho más joven solo muestra un poco de actitud "pero eso no es lo que nos enseñaron en la escuela".
Atentamente: gracias por los votos negativos y los comentarios. No entendí bien la imagen completa. Edité mi respuesta en traje.