2018-01-09 13:13:19 +0000 2018-01-09 13:13:19 +0000
106
106

¿Cómo puedo tratar con los gerentes que se niegan a aceptar el uso de patrones de diseño de ingeniería de software comunes?

Antecedentes

Soy un ingeniero de software y un TDD practicante en mi empresa. Mi gerente también es responsable de la codificación (si es necesario), y de la gestión de sus subordinados ingenieros.

Recientemente tuve algunos debates acalorados con mi gerente sobre el uso de patrones de diseño de software.

El problema

Frecuentemente cuando se me encomienda la implementación de una característica y un código, mi gerente me desafía durante las revisiones de código por mi uso de patrones de diseño de software comunes. Él piensa que es innecesario y que uno debe codificar lo más “sencillo” posible. Puse citas sobre lo sencillo, porque parece que no estamos de acuerdo con el alcance de una “característica”. En muchos casos, la característica no es tan “directa” como piensa mi gerente y requiere el uso de patrones de diseño para separar responsabilidades y minimizar el impacto en la base de código (en su mayoría no probada).

Hay dos casos de uso común Aplicaré patrones de diseño para resolver un problema:

  • Implementación de nuevas características que requieren cambios en una clase de legado no comprobable

  • Abordar las incertidumbres mediante la interconexión de las incógnitas

Nos metimos en algunos argumentos debido a reuniones de diseño similares. En una discusión acalorada, incluso me dijeron que “[ha] estado programando durante más de 20 años!”, lo que implica que ni siquiera debería atreverme a cuestionar su autoridad.

  • Lo que traté de mitigar este problema

  • Comentarios detallados por escrito sobre algunos componentes no tan obvios sobre por qué los necesitaba y para qué sirven

  • Demostré pasivamente que mi diseño es mucho más adaptable a los cambios

  • Un componente que construí tiene un número de fallos significativamente menor que la mayoría de los otros componentes

  • Anticipé correctamente un cambio en los requisitos, que condujo a un cambio mínimo de código necesario para cumplir con ese requisito

  • Trató sus preocupaciones por adelantado cuando me desafían explicando mi proceso de pensamiento y razonamiento

  • Sin embargo, todavía me reprenden por el código de sobreingeniería.

  • Discutió informalmente esto con mis colegas y les pidió sus opiniones en privado

  • La mayoría de ellos aprecian mi enfoque bien razonado y uno incluso mencionó que aprendió mucho de mí. A la mayoría de los ingenieros les gusta discutir sus problemas de codificación conmigo, porque normalmente puedo darles consejos útiles o señalarles algo que podrían haber pasado por alto

  • Realizando presentaciones informales para educar a mis compañeros ingenieros (y al gerente) sobre por qué aplico un patrón de diseño aquí y allá

No quiero parecer arrogante diciendo que mis habilidades de codificación son absolutamente mejores que las de mi gerente, pero realmente me he quedado sin ideas para convencerlo, incluso después de las demostraciones, las explicaciones y los resultados objetivos que se le muestran. Por un lado, me gustaría entregar un código libre de errores, bien probado y diseñado por la unidad. Por otro lado, sigo siendo criticado porque mi diseño no se siente bien y ciertamente ha “complicado” mi código al forzarlo a la forma “aprobada”.

¿Cómo podemos encontrar un punto medio?


Actualización

Como estoy recibiendo muchos comentarios mencionando mi actitud dogmática, incluso demasiado entusiasta para seguir los principios de la ingeniería de software, creo que debo aclarar:

No estoy tratando de ser dogmático ni demasiado entusiasta. Me importa que la gente lea y entienda mi código, tanto si usan/entienden los patrones de diseño como si no. Pedí la opinión de mis colegas durante las revisiones de los códigos si entienden mi código o no. Dijeron que sí y que entienden por qué diseño un componente de esa manera. En una ocasión, mi uso de patrones de diseño ayudó a centralizar la lógica de búsqueda de configuraciones en un lugar en vez de tenerla repartida en docenas de lugares, que tiene que ser cambiada a menudo.

Para ser honesto, estoy bastante decepcionado al ver tantas respuestas con un fuerte estereotipo de “Por qué ustedes los ingenieros no pueden pensar como los gerentes”. Al final del día, todo puede decirse que es sobreingeniería: Por qué marcar los campos como private en lugar de exponerlo todo, por qué probar la unidad si ningún usuario va a ejecutar sólo una unidad, etc.

Mi motivación en el uso del patrón de diseño o de hecho de cualquier ingeniería de software es minimizar el riesgo y llevar valor a la empresa (por ejemplo, reduciendo la propagación innecesaria de la lógica en el código base, para que puedan ser gestionados en un solo lugar).

Lo siento si esto suena como un despotricamiento. Estoy buscando respuestas del tipo “cómo podemos encontrar un punto medio” en lugar de algunas respuestas condescendientes como “los ingenieros se creen inteligentes aplicando patrones de diseño que nadie entiende”.

Respuestas (11)

235
235
235
2018-01-09 13:48:28 +0000

¿Hacerlo a tu manera ha ayudado alguna vez? ¿Hubo alguna vez en la que utilizaste la inyección indirecta y las interfaces adicionales, y hubo un desvío de última hora, y todo se manejó de forma suave y hermosa sin juramentos? Incluso en un trabajo anterior, si nunca has sido capaz de conseguir que el código se comprometa aquí?

voy a asumir que sí. Practica contando esa historia. Es específica y real. No es “x podría suceder” o “y podría cambiar”, sino “Érase una vez, lo hice de esta manera y así es como funcionó”. Los gerentes (hablo como uno) son recelosos acerca de gastar dinero (y créeme, escribir un código más complicado que otros no pueden entender en una primera pasada es gastar dinero) por lo que podría suceder. No quieren financiar la especulación que sólo puede basarse en el “aprendizaje de libros” y la última moda según Internet. Pero cuando te apoyas en tu experiencia… Esa es una situación completamente diferente.

No soy un gran fan de las fábricas, proveedores, inyectores y demás. Por lo general, están configurados para cosas que nunca sucederán realmente (cambiar de MS SQL a Oracle) o que tienen un pequeño impacto cuando lo hacen (cambiar la carpeta donde se guardan los archivos). Tienen un lugar en los arreglos que son muy volátiles, en los que parece estar usted. Así que tienes que mostrar que tienen ese lugar. Parece que vienes de una posición de, “Esta es la forma normal de hacer las cosas, y necesito una razón para no hacerlo”. Tu gerente viene de, “Esto no es normal; lo normal es directo y simple. Dame una buena razón para poner otra capa en el camino.” Trabaja en esa razón. Trabaja en una historia de éxito pasada donde esa capa extra ahorró días o semanas de trabajo. Justifica tu ingeniería o de lo contrario es un exceso de ingeniería.

157
157
157
2018-01-09 15:37:37 +0000

Esta cita de uno de tus comentarios me preocupa.:

Como ingeniero de software, se convierte en mi segunda naturaleza hacer “cosas que no pueden tener una buena razón en la superficie”, como interconectar las incógnitas que he mencionado. Tener que estar constantemente al borde de explicarme sobre temas profundamente técnicos (y a veces muy dogmáticos) me agota.

He visto varias repeticiones del siguiente ciclo de vida:

  • Un equipo de programadores experimentados llega a un enfoque diferente de la programación.
  • Se ve durante unos pocos años, hasta una década, como algo que debería ser utilizado universalmente, a pesar de cualquier inconveniente y limitaciones. Durante esta fase, basta con decir “estoy aplicando la metodología X” sin analizar si X es un beneficio neto.
  • Pasa de moda, pero sus ideas más útiles permanecen como parte del conjunto de herramientas de desarrollo de software, para ser extraídas y utilizadas siempre que aporten beneficios netos.

En mi opinión, tanto el TDD como los patrones de diseño están rondando la división entre la segunda y la tercera fase del ciclo de vida de la metodología de programación. Estoy seguro de que TDD y muchos patrones de diseño tendrán una larga y valiosa vida en el conjunto de herramientas, para ser usados siempre que ayuden más de lo que perjudiquen. También creo que todavía pueden estar siendo utilizados en exceso, por hábito más que por pensamiento deliberado.

Nunca debes nunca aplicar un patrón de diseño porque es una segunda naturaleza, o tener problemas para explicar tu uso de él. En su lugar, antes de aplicar un patrón de diseño, piense en sus costos y beneficios en esta situación particular. Si sus beneficios realmente superan sus costes, deberías saber exactamente por qué, de modo que explicar la compensación no debería agotarte. Si sus beneficios no superan sus costos, no lo uses. Una vez más, su propia reflexión sobre el diseño debe prepararle para responder si le preguntan por qué no utilizó un patrón de diseño posiblemente aplicable.

Recuerde que tiene que pensar en estas compensaciones en términos de la sostenibilidad general del programa, no sólo en hacer que su pieza funcione rápidamente. Demasiada indirección puede hacer más difícil para los futuros programadores averiguar lo que realmente está pasando.

52
52
52
2018-01-10 18:53:35 +0000

¿Soy la única persona perpleja por cómo en el lugar de trabajo vemos tanto enfoque en las prácticas de codificación en lugar del conflicto real en el lugar de trabajo? Así que tomaré un enfoque diferente.

Aquí están los aspectos generalizados de su problema tal y como yo lo veo:

  1. Usted está en un campo calificado que requiere colaboración
  2. No hay procedimientos documentados que regulen cómo debe hacerse este trabajo de colaboración
  3. Hay un desacuerdo sobre cómo se debe hacer este trabajo de colaboración
  4. Uno de los que no están de acuerdo es su gerente

Me parece que su grupo necesita reunirse y acordar qué estándares y prácticas adoptará y adoptarlos globalmente, para bien o para mal. Porque nada es peor para un producto que un equipo que está constantemente en desacuerdo, y nada es peor para su relación con su empleador que repetir constantemente las discusiones con ellos.

Así que trate de reunir a su equipo para acordar algunos estándares, y use esa reunión para defender su caso por las prácticas que está usando. Si los consigues, ¡genial! Si no, que así sea. Tu trabajo no es escribir un hermoso código. Su trabajo es entregar un producto terminado. Si tu empleador (como lo encarna tu gerente) y una pluralidad de tu grupo insiste en que lo hagas de cierta manera, entonces ¿quién eres tú para contradecirlo?

Sin embargo, parece que la mayoría de tu equipo está de acuerdo contigo, por lo que debería ser bastante evidente durante estas discusiones que tu gerente es el que está fuera. Si esta persona sigue negándose a cambiar el consenso del equipo, entonces es una disfunción que no podemos ayudarle a resolver (aparte de recomendar que se cambie a un equipo diferente).

23
23
23
2018-01-09 19:58:25 +0000

Desafortunadamente, es tu representante, y no estás escribiendo el código de la manera que él quiere que lo escribas. Si él es el gerente, puede que no esté planeando salir de la compañía en 2-3 años como la mayoría de los desarrolladores planean. Estás escribiendo un código que será más difícil de arreglar para tus reemplazos, por lo que es duro para ti por construirlo de esa manera.

Si se me permite hacer una suposición aquí, sabiendo muy bien que podría estar fuera de la marca, ¿para qué estás escribiendo estas cosas? Me sorprendería bastante si es algo más que solicitudes de LOB. Los patrones de diseño son probablemente demasiado complicados para una aplicación LOB que no necesita ser particularmente complicada.

En mis 10 años de desarrollo, un verdadero patrón de estrategia/fabricación ha sido necesario sólo tres veces, dos de las cuales son de trabajos:

  • En una aplicación que mostraba información de productos, donde algunos de esos productos eran esencialmente un montón de productos más pequeños en una caja, usamos una estrategia para determinar qué fábrica se necesitaba para transformar la información del producto (solicitada a través de una llave) en una vista. No es muy glorioso, pero hizo el trabajo. Si se me permite igualar su humilde opinión sobre los bichos, en todo mi tiempo allí nunca tuvimos un solo bicho! (uno fue reportado después de que me fui pero resultó ser un error de usuario :)).
  • En una aplicación que mostraba a los usuarios dónde ir para una clase a la que asistían, usamos una fábrica y una abstracción para permitir un cambio rápido entre una API de Bing Maps y una API de Google Maps. Esto se debió a que ambos tenían un costo/beneficio y la empresa no estaba haciendo progresos determinando cuál utilizar. Finalmente nos enteramos en nuestra oficina central de que ya teníamos una clave de API para uno de ellos y pudimos pasar en el último segundo a esa API, justo antes del lanzamiento.

Y un tercero es un proyecto con el que me estoy metiendo, que hace la monitorización de servidores para los servidores de Windows:

  • Utilizo una interfaz para la salida de los datos de monitorización y para los propios monitores. Los monitores son altamente configurables (basados en la configuración de la aplicación). La implementación de la salida varía dependiendo de si estoy probando un nuevo monitor o voy a desplegarlo, de tal manera que IOutputInterface tiene ConsoleOutput y SqlOutput como implementaciones que pueden variar.

Tenga en cuenta que mi proyecto personal inmediatamente hace un uso más frecuente de los patrones e inversión de control (IoC) que mis proyectos de trabajo.

Si puedo darle algún consejo después de todo eso, que sea este: Un trabajo es un trabajo, y si quieres hacer las cosas a tu manera, entonces trata de encontrar un medio feliz. La gente de tecnología no suele quedarse mucho tiempo y no vale la pena pelearse con la dirección por cómo se hace. Haz que tus proyectos personales en casa sean una pila de patrones tanto como quieras.

9
9
9
2018-01-10 06:54:37 +0000

Solución fácil: **En cualquier desacuerdo, la mitad de la culpa es tuya. Tómate un tiempo libre, estudia cómo trabajan los otros equipos, averigua dónde está la diferencia de impedimentos entre tú y la otra parte. Háblales en persona, temprano y a menudo. Si lo haces bien, ambos aprenderán a entender las preocupaciones y credenciales de la otra parte, y ellos aprenderán a valorarte por tu aporte, experiencia y opiniones firmes. Aquí hay algunas áreas a considerar:

  • producto de calidad vs. tiempo de comercialización
  • buen producto vs. buen código
  • código inteligente vs. código auto-explicativo
  • cultura de la compañía de arriba hacia abajo vs. cultura de ingeniería de abajo hacia arriba

Si no funciona bien, considera otro rol en el equipo, otro equipo en la compañía o, finalmente, otra compañía.

9
9
9
2018-01-10 03:54:04 +0000

Si te enfrentas a estas personas de frente te enfrentarás a la mayor resistencia, saltamontes. He sido más efectivo en traer el cambio cuando golpeo estratégicamente los puntos de presión correctos. Requiere mucha paciencia y ceder mucho. Primero debo adaptarme a ellos antes de aplicar presión en los puntos débiles.

Vaciar tu mente, no tener forma. Sin forma, como el agua. Si pones agua en una taza, se convierte en la taza… Ahora, el agua puede fluir o puede chocar. - Bruce Lee

Escúchalos y haz muchas preguntas. Genuinariamente escuchar a alguien le quita el deseo de resistir. Entender lo que motiva su pensamiento y luego hablar su idioma. Dado que sus creencias son axiales, por el momento, es probable que refleje su terquedad, desprecio y frustración. Ya que usted es subordinado, es su elección no unirse a su longitud de onda y la responsabilidad es suya para construir el puente.

Como lo ve, se verá a sí mismo. Como lo tratas a él, te tratarás a ti mismo. Al pensar en él, pensarás en ti mismo. Nunca olvides esto, porque en él te encontrarás o te perderás. - Helen Schucman

Un maestro de Kung Fu de Wing Chun atraerá a su oponente y cerrará la distancia antes de buscar y atacar la línea central donde es más vulnerable. No discutas minucias sólo para ganar, encuentra la línea central del problema más grande y enfoca la presión allí.

Trato con ingenieros a diario que se niegan a retocar o aprender nuevos paradigmas de programación y me han dado alguna forma de argumento de “estoy aquí desde las tarjetas” más veces de las que puedo contar. Estimo que he perdido el 80% de las batallas, pero ese 20%… woh… he hecho que ocurran grandes cambios. Puede que suene vago, pero haz un poco de investigación en Google sobre algunas de estas palabras clave y entenderás lo que quiero decir.

También, trata de conseguir en un nuevo proyecto de squirrel que puedas hacerlo a tu manera. Si realmente funciona y ahorra tiempo o dinero, la gente se interesará por tu forma de pensar. Si no hay un nuevo proyecto, crea uno en tu tiempo libre para resolver un punto de dolor que la compañía tiene y nadie está interesado en tomarse el tiempo para resolverlo.

8
8
8
2018-01-09 13:21:09 +0000

¿Qué debo hacer?

En la ingeniería de software, lo bien que se escribe (o se sobreescribe) el código siempre está sujeto a algún nivel de interpretación (opinión). Para mí, usted está dando los pasos que yo daría en su posición, pero en última instancia su gestor es el que necesita ver la luz….seguir mostrándosela.

Yo continuaría, por muy doloroso que sea, haciendo exactamente lo que usted está haciendo y señalando la rentabilidad de la inversión en el uso del patrón de diseño donde pueda, sin hacer que su gestor parezca malo.

No cambie lo que está haciendo **a menos que se sienta en riesgo de algo peor que una reprimenda. Sigue mostrándoles los beneficios de usar el patrón, y eventualmente deberían entrar en razón.

Mientras continúas la lucha, intenta ganar algunos otros aliados en el equipo. De esta manera no serás la única voz que se escuche hablando a favor del patrón.

En algún momento, sin embargo, si se niegan, tendrás que elegir si este entorno es el adecuado para ti. No creo que estés ahí todavía, pero puede que tengas que pasar a un entorno más aceptable para las buenas prácticas de codificación.

Recuerda, esta lucha en la que estás es un maratón. Si quieres cambiar la cultura de la codificación dependerá de ti demostrar el valor del patrón.

5
5
5
2018-01-12 18:58:58 +0000

En primer lugar, no podemos decir por la información dada quién tiene razón. De hecho, si me llamaran para auditar el proyecto, todavía tendría dificultades para decidir quién tiene razón, porque podría estar diseñando con diferentes objetivos en mente. Pero mi conjetura sería que el jefe conoce los objetivos mejor que tú.

En segundo lugar, tu pregunta: “¿Cómo puedo persuadir a mi jefe?” La respuesta es que probablemente no puedas. Al final, él es el jefe. La única vez que persuadí a mi jefe para que cambiara sus ideas sobre la ingeniería de software fue después de que pasamos un año parcheando una pieza de software poco fiable que estaba escrita como él quería, y le dijimos que no podíamos hacerla fiable excepto diseñándola de forma diferente.

3
3
3
2018-01-14 16:40:57 +0000

No sabemos quién está aquí desde un punto de vista técnico de pocos - podría ser un gerente atrapado en el pasado, o un nuevo desarrollador creyendo ciegamente todo el bombo.

Pero él es tu gerente, y no tratas con el gerente, tratas con su negativa a hacer lo que piensas que es mejor, e insiste en hacer lo que él piensa que es mejor. Y ese es el estado normal de las cosas, que tu manager tome la decisión. También es el estado normal de las cosas que él tiene la responsabilidad del éxito o el fracaso, y no tú. Él tiene la autoridad. Y tiene razón, no deberías cuestionar su autoridad. Puedes cuestionar si él tiene razón, pero no su autoridad. Así que o te ocupas de ello o te cambias a una compañía que hace las cosas a tu manera.

Mientras tanto, en lugar de pensar que las cosas no van como quieres, piensa en cómo producir el mejor código de calidad que puedas dentro de tus limitaciones. Muchas cosas pueden hacerse de diferentes maneras. Hay “directas, mal diseñadas” y “directas, bien diseñadas”. Ve por el último.

1
1
1
2018-01-14 20:06:06 +0000

La experiencia permite juzgar si los beneficios del patrón de diseño son posibles y probables en el futuro. Si el supervisor conoce el patrón y aún así lo rechaza, probablemente reconozca el caso cuando la aplicación de este patrón o de un patrón similar no dé resultados. A veces la experiencia contradice las reglas o es más probable que las interprete. Existe una opinión conocida de que un código más corto y sencillo es más fácil de entender y más abierto a alteraciones significativas.

0
0
0
2018-01-10 10:09:55 +0000

Sugeriría la programación de pares y la revisión de pares. Esto ayudará a tus compañeros a entender mejor tu código, ya que necesitas explicarles por qué y cómo como lo haces en vez de después del hecho.

O bien aprenderán de ti y verán por qué es inteligente, o aprenderás que los mejores programadores escriben código que otros pueden mantener.