¿Cómo explicar las prioridades de negocio a un programador?

Tengo un desacuerdo recurrente con un programador sobre la calidad del código. Insiste en que todo su código está escrito al más alto nivel (es decir, que se parece a los ejemplos de los libros de texto de estilos de codificación), independientemente del impacto que esto tenga en la funcionalidad. Yo, por otro lado, creo que es más importante que el código escrito satisfaga las necesidades del negocio, es decir, que funcione de manera eficiente, que no tarde demasiado en desarrollarse y que sea razonablemente mantenible.

Recientemente tuvimos una discusión, en la que un guión específico que escribió se ve muy bien, tiene un estilo perfecto y funciona exactamente como los diversos libros describen como mejores prácticas. Tengo una versión alternativa, que ha sido escrita usando el llamado "antipatrón", y él insiste en que es un código absolutamente terrible que nunca debería usarse. Sin embargo, también funciona aproximadamente cinco veces más rápido.

He estado tratando de convencerlo de que necesita usar este antipatrón, incluso si es un "código incorrecto", porque correr rápido es más importante que verse bien. Él no está de acuerdo y se ha negado rotundamente a considerar escribir cualquier código que no se ajuste a los patrones de estilo "buenos" reconocidos, incluso si esto significa que lleva más tiempo escribirlo y no funciona tan bien.

Caso de ejemplo: Quiere usar un ORM para acceder a la base de datos. Para una consulta particularmente complicada, el ORM no la optimiza bien y tarda más de 4 horas en ejecutarse. Inserté algo de SQL sin procesar directamente y reduje el tiempo de ejecución a menos de 30 segundos. Él objetó, muy fuertemente, diciendo que escribir consultas sql sin procesar directamente es una mala práctica, y que siempre debemos usar el ORM. Ahora se niega a trabajar en esa parte del programa.

Traté de explicarle que tener un programa que funcione bien es más importante que tener un código que se vea bien, pero él simplemente dice "no, no lo es" y continúa escribiendo su código elegante e ineficiente, que a veces tengo que reescribir mal. antes de que pueda ser utilizado.

Por el momento, estamos en una mala posición, porque él se niega a comprometer sus estándares, lo que significa que todo lo que hace tiene que ser revisado por mí y, en algunos casos, modificado para asegurarme de que cumple con las necesidades del negocio, y no sólo sus estándares estéticos.

¿Cómo puedo convencerlo de que vuelva a priorizar y anteponga los objetivos del negocio a la belleza de su código?

Editar: Stephan Kolassa sugirió que incluyera esto: técnicamente soy su gerente, pero somos una empresa tan pequeña (~ 10 personas) que también programo, por lo que soy una especie de compañero al mismo tiempo, lo que lo convierte en un un poco más complicado, y no tenemos estándares organizacionales fijos o procedimientos de resolución de conflictos.

Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat . Si bien puede ser interesante discutir los aspectos técnicos de esta pregunta, hay otros sitios de SE (o chat) que son un medio mucho mejor para esa discusión. ¡Gracias!
¿Qué nivel de experiencia es este programador? Si es un desarrollador junior, podría ser simplemente que necesita aprender que el mundo real y los libros de texto son diferentes. Si se trata de un desarrollador más senior, probablemente será un enfoque diferente.
Observo que dices que el peor código se ejecuta cinco veces más rápido, como si eso fuera algo bueno. ¿A quién le importa si corre cinco veces más rápido? Un script que tarda 0,01 segundos en ejecutarse y un script que tarda 1,0 segundos en ejecutarse, ambos se ejecutan en la misma cantidad de tiempo en lo que a mí respecta, pero uno es cien veces más rápido que el otro. La métrica que debe usar es si el script cumple con el requisito de rendimiento documentado. , no cuál es más rápido . Puede ser que ninguno sea lo suficientemente rápido.
Por favor lleve la discusión a la sala de chat vinculada. Estos comentarios serán eliminados más tarde.
¿Hay realmente conflicto? por ejemplo, la diferencia entre 4 horas y 30 segundos realmente no importa si está ejecutando la consulta durante la noche y no interfiere con otras cosas. ¿Tiene realmente la información relevante? Puede pensar que la consulta solo debe ejecutarse durante la noche y no darse cuenta de que las personas realmente tienen un uso para obtener información que tiene menos de un minuto de antigüedad. O es posible que no se dé cuenta de que hay otras cosas con las que interfiere esta consulta.
Entonces, ¿eres responsable de cualquier código que pueda crear, pero no tienes autoridad para reprender a esta persona? ¿Es eso lo que significa técnicamente ser el gerente de alguien, pero no tener autoridad?
@JeffO Sí, más o menos.
@Jimbo Eso suena bastante preciso, en realidad. Desafortunadamente, si alguien no se enfoca en el dinero, terminaremos sin clientes y nada de esto importará. Al final del día, el propósito del negocio es ganar dinero, no escribir un código atractivo.
Como no puedo publicar la respuesta debido a una falla en el sistema, la agregaré aquí. El otro desarrollador habla sobre la calidad del código. En mi experiencia, el código hermoso siempre produce sistemas de alta calidad. En este caso, sin embargo, el código no es elegante en todos los niveles. El ORM no produce el elegante código SQL para el problema requerido, lo que genera problemas de rendimiento. Le sugiero que le explique al desarrollador que si quiere ser puro con su solución entonces entiende que el ORM tiene sus limitaciones y no es la solución más elegante. Si le preocupa la mantenibilidad, agregue pruebas unitarias
@Gaurav No es un problema técnico. Esta pregunta ha sido protegida. Como no ha obtenido 10 representantes en este sitio , no puede publicar una respuesta.
Idealmente, uno escribe buen código y gana dinero. Si uno está en una pequeña empresa y hay una compensación, entonces ganar dinero (que presumiblemente está relacionado con la funcionalidad) tiene prioridad. Si el empleado no puede comprender esto, tiene un problema de personal con el que lidiar. Si se trata de una empresa pequeña, debe lidiar con esto rápidamente.
@EricLippert Obviamente, tú y yo vivimos en mundos diferentes. Donde trabajo el código se mide por el rendimiento. En mi pequeña tienda no hay "requisitos de rendimiento documentados". Todo mi trabajo es para mi jefe, no hay contratos externos. El rendimiento importa. Si es más rápido, generalmente es mejor.
¿Y cuántos millones de dólares está dispuesto a gastar por porcentaje de aceleración? Claro, más rápido es mejor, pero también es más barato y tiene más funciones. Todas estas cosas cuestan dinero y si no estás haciendo concesiones inteligentes entre ellas, es probable que alguien esté gastando de más.
Benubird, solo envíale a tu programador la url de esta página y dile que lea las respuestas. Renunciará a su trabajo o cumplirá (ambos son resultados positivos).
Parece que esta persona ha leído muchos libros de software, pero no El programador pragmático. Puedo recomendarlo
Por "SQL sin formato", espero desesperadamente que te refieras a "procedimiento almacenado". Hay compromisos, ya sabes.
Su desarrollador puede creer que su trabajo consiste en seguir las "mejores prácticas" y tener miedo de que, al no seguir las mejores prácticas, se le llame la atención por no hacer su trabajo. Es posible que esté buscando acumular experiencia en "mejores prácticas" para justificar tal afirmación en su currículum. Cualquiera que sea la motivación, la "mejor práctica" es un ideal, no una regla rígida. No obstante, las "mejores prácticas", debidamente seguidas, deberían dar como resultado soluciones demostrablemente correctas, eficientes, eficaces y fáciles de mantener. Si el uso de un ORM no cumple con los objetivos comerciales de rendimiento, entonces el uso de SQL más eficiente es perfectamente válido.
¿4 horas o 4 minutos?
Si la velocidad es importante, conviértala en un requisito comercial.
POR CIERTO. ¡Los ORM no son una buena práctica! Son una comodidad para el desarrollador. escriben código pésimo.
@EricLippert ¿Millones de dólares por porcentaje de aceleración? Este es SQL sin formato que la persona de negocios ha escrito para una mejora de velocidad de 480:1.
Personalmente, no creo que su escenario sea posible: cuando escribe un buen código, ese código también resulta ser muy eficiente. Por supuesto, tal vez algún "anti-patrón" le permita lograr un rendimiento ligeramente mejor, pero esa mejora es tan pequeña que ni siquiera puede notarlo (¿4 h a 30 segundos? ¡Por favor! ¿Configuró bien el ORM?) . En otras palabras, su programador es un incompetente y egoísta también. Simplemente se esconde detrás de su "conocimiento" para enmascarar su incompetencia. Deberías despedirlo o al menos amenazarlo para que lo haga a menos que haga lo que le pides.
@Phate Teníamos un almacén de datos que tardó 6 días en procesar los datos de un mes. Después de reconstruirlo desde cero, ahora toma 2 días y procesa 48 veces más datos. Personalmente, reescribí las consultas que tomaban horas y las reduje a unos minutos. El caso más extremo fue una consulta que tomó 6 horas, y después de barajar las tablas, ahora toma 7 segundos. 4 horas a 30 segundos es muy razonable cuando habla de cientos de millones de registros y la consulta toma un mal plan.
¿Qué es ORM en este contexto? Sé algo de programación y SQL y no puedo pensar en una posible explicación para el acrónimo. Bastante seguro de que no es "Gestión de riesgos operativos", por ejemplo....
@YetAnotherRandomUser es un "mapeador relacional de objetos", una biblioteca que convierte objetos de código en entradas de base de datos.

Respuestas (19)

No trataría de dictar su estilo de codificación, déjalo que lo haga de la manera que quiera. Si el rendimiento es un requisito comercial real documentado y él no lo cumple, llámelo.

Si continúa sin cumplir con los requisitos comerciales, entonces no está haciendo su trabajo, comience a darle advertencias verbales oficiales, luego advertencias por escrito y luego déjelo ir si es necesario.

Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat .
@usuario, hola. En Workplace, buscamos respuestas que también expliquen por qué y cómo , de esta manera los lectores entienden el razonamiento detrás de la respuesta y pueden hacer una interpretación más educada de por qué la respuesta es correcta. ¿Puedes editar esta publicación para incluir la razón por la cual esta es la mejor respuesta? ¡Gracias!

Parece que tienes una prima donna o, peor aún, Michel Angelo, trabajando para ti. ¿Cuánto tiempo lleva en el negocio de la programación? Hago esa pregunta porque hay una gran diferencia entre estar en el negocio de la programación y la programación. Quienes hemos estado en las trincheras durante algún tiempo pueden decirle que la perfección puede ser fea.

Su código puede ser bueno como un libro de texto, pero la realidad es que este código tiene que funcionar y un código que tarda 4 horas en ejecutarse en lugar de 30 segundos: ese código difícilmente puede describirse como funcionando. Hago ingeniería de software, pero desde el lado de DevOps de la casa: si el código no se escala, ese código no es bueno, independientemente de qué tan bien esté escrito y documentado. Y el código resistente y mantenible que funciona mal no es bueno. En lo que a mí respecta, o entiende lo que digo o se va. Tiene la libertad de escribir el código con su propio estilo, pero ese código TIENE que funcionar.

No le digas que vaya en contra de los patrones. Dígale cuál es su requerimiento, asígnele una fecha límite y déle la libertad para averiguar cómo cumplirlo. Dado lo apasionado que es que su código se escriba como un libro de texto, tiene todos los incentivos para cumplir con sus requisitos y mantener su código como un libro de texto posible, y eso no es algo malo.

Como su mánager, tendrás que abusar de él y hacer cumplir la ley. Vas a tener que decirle que él es responsable del desempeño de su código, y vas a tener que asegurarte de que los superiores tienen la autoridad para hacer que esa responsabilidad se mantenga. Le daré un incentivo para presionarlo: como su gerente, USTED será responsable si su código no funciona. Póngalo en el lugar porque si no lo hace, la primera persona a la que irá su alta gerencia será usted.

Dices que eres "técnicamente" su manager. Bueno, o eres su manager o no lo eres. Decídete (*)

Si usted es su gerente, entonces él es responsable ante usted como usted es responsable ante su administración. En cuyo caso, se acabó el tiempo de dar explicaciones que él no escuchará. El requisito no negociable es que el código debe funcionar y él debe cumplir con ese requisito. Eso es todo al respecto.

(*) Me encontré con un problema similar en 1987 con un ingeniero ambiental que no siguió nuestras mejores prácticas establecidas por su servidor. Y dado que mi título era oficialmente igual al suyo, restó importancia a todo lo que dije. Organicé una cita a tres bandas entre él, el mandamás del departamento y yo, en la que expuse en términos explícitos cuáles eran los impactos de no seguir nuestro proceso. El mandamás le ordenó que obedeciera y luego me dijo un par de palabras en privado sobre mi mano dura. No me importó el reproche, lo único que me importaba era que estaba cumpliendo y él ya no perforaba agujeros en el fondo de nuestra nave. La escalada a la alta dirección no fue agradable de contemplar, pero funcionó. Que es todo lo que me importaba.

Mi respuesta es para el OP. La respuesta está en el texto sin formato: el código que es un libro de texto pero no funciona no es bueno. Si el empleado no entiende eso, entonces es como si se fuera. Nadie se opone a que el empleado escriba el libro de texto de códigos, pero ese código debe cumplir con el requisito no negociable de que el código debe cumplir. De lo contrario, bien podría no haber escrito nada. No diseñes un Lamborghini cuando necesites ese auto para correr sobre caminos de tierra.
Me gusta la idea de convertirlo en un desafío para él. Ningún buen programador puede resistir un desafío. "Encuentre una manera de hacer que esto se ejecute en menos de 60 segundos, puede hacer que se vea tan bien como desee y siga las mejores prácticas que desee siempre que se ejecute en menos de 60 segundos".
Umm... los mejores programadores resisten los desafíos para ganarse la vida . Los mejores programadores separan lo necesario de lo divertido y hacen lo necesario.
@corsiKa Yo diría que hay una diferencia entre un desafío de desarrollo y un desafío intelectual. Es un desafío intelectual evitar los desafíos del desarrollo. La diversión viene del desafío intelectual, si eres bueno. Parece que este tipo es complaciente con no tener desafíos intelectuales, lo que en realidad lo convierte en un mal programador a pesar de su supuesto dominio del estilo y las mejores prácticas.
+1 para "la perfección puede ser fea" - ¡muy cierto, especialmente cuando dependes del software imperfecto de otras personas! Fuera de interés, ¿los "agujeros perforados en el fondo de nuestro barco" fueron metafóricos o literales?
@thanby simplemente tendremos que estar de acuerdo en no estar de acuerdo. Parece ser un mal programador según lo que hemos leído, pero no diría que su ambición de encontrar desafíos intelectuales es uno de ellos. No creo que ser bueno programando requiera que lo disfrutes en ningún nivel.
@psmears .. metafórico. Por otro lado, si ese barco, es decir, nuestro proyecto, se hundiera, ellos (la gerencia) se asegurarían de que yo fuera el primero en ahogarme. Me tiemblan las manos por la emoción de tener que pagar la factura del otro tipo errores :)
Miguel Ángel creó obras que todavía se recuerdan hoy en día, ¿cuál era el nombre de las personas que querían que terminara antes, o usara pintura más barata, menos mano de obra, etc.? Por supuesto, es más probable que el hombre en cuestión sea solo un mal decorador.

Como desarrollador sénior, ambos tienen razón. Es encontrar el equilibrio por el que debes trabajar.

En primer lugar, por su parte, sus requisitos deben detallarse claramente. Recomendaría usar el enfoque de desarrollo impulsado por el comportamiento (BDD) . Esto le permite detallar sus requisitos y asegurarse de que el software los cumpla.

Es una buena práctica actual seguir las prácticas de desarrollo basado en pruebas (TDD). En esto, el desarrollador escribe el código "solo lo suficiente" para resolver el problema, escribiendo pruebas fallidas y haciéndolas pasar. Esas definiciones de BDD serían el punto de partida. Se descartarían más pruebas unitarias, pero una vez que todas las pruebas BDD estén en verde, puede estar seguro de que se cumplen los requisitos.

A lo largo de esto, se espera que continúe un diálogo, generalmente al comienzo y al final del desarrollo. Esto asegura que ambas partes entiendan los requisitos, eliminando cualquier ambigüedad. Además, esta conversación podría resaltar la importancia o el valor de la solicitud.

Es importante que el código sea claro y comprensible para el desarrollo y mantenimiento futuros. Sin embargo, se debe establecer un equilibrio entre el pulido constante y la entrega de valor.

Si usted y él no lo han hecho, le sugiero que lea Código limpio: un manual de artesanía de software ágil por Robert C. Martin .

En referencia a su debate sobre ORM, los ORM tienen sus pros y sus contras. Como ha destacado, pueden ser lentos e ineficientes, cuando están mal configurados . Además, escribir SQL en línea puede agregar un acoplamiento adicional entre la base de datos y el código. ¿Por qué no simplemente llamar a los procedimientos almacenados ?

Probablemente haya tantos artículos sobre por qué debería hacerlo como sobre por qué no debería usar un ORM en la web. Sin embargo, una consulta que tarda cuatro horas en ejecutarse, especialmente cuando se puede optimizar a 30 segundos, es inaceptable.

Como reflexión final, ¿es este tu único desarrollador? ¿Quizás se beneficiaría de la programación en pareja con otros? ¿Quizás simplemente no es adecuado para trabajar en su empresa?

Chicos, sé que muchas personas aquí comenzaron con Stack Overflow, pero ya no están allí. Lleve las discusiones técnicas a una sala de chat.
Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat . (cc @Lilienthal)

En primer lugar, ambos están equivocados. Se equivoca al insistir en que el código se ve bien, y usted se equivoca al insistir en usar un antipatrón. La forma adecuada de desarrollar software se encuentra en algún lugar en medio de sus dos ideologías. Es posible seguir las mejores prácticas y aún tener un código que se puede desarrollar rápidamente, tiene un buen rendimiento y se puede mantener, y aquí es donde ambos deben llegar.

Hay muchas maneras de hacer esto. Su desarrollador parece ser del tipo que ve las "mejores prácticas" y nunca se desvía, incluso cuando las mejores prácticas cambian. La mejor manera de solucionarlo es encontrar una mejor práctica que satisfaga sus necesidades, y luego ambos deben seguirla.

Es importante no quedarse atascado en la terminología o la metodología precisa, y esto parece que puede ser un problema para su desarrollador. Ninguna práctica recomendada es buena si no puede implementarla o si da como resultado un código de bajo rendimiento. En lugar de discutir con su desarrollador, debe tratar de comprender por qué se niega a escribir un código que no se ve bien y luego empujarlo hacia una práctica que le permita escribir un código atractivo y un código de buen rendimiento.

En caso de que no crea que el formato es un problema, simplemente busque en Google la frase "programación de espacio o sangría" y sorpréndase con todo. La forma en que se formatea el código tiene mucho que ver con la capacidad de mantenimiento a largo plazo. Además, echa un vistazo a algunos de estos libros , recomendados por Jeff Atwood. Todos son buenos y lo ayudarán a comprender mejor por qué está tan equivocado como su desarrollador.

En última instancia, debe dejar de competir con el desarrollador. Están en lados opuestos del espectro, y si ambos simplemente dicen "Tengo razón", nunca mejorarán. Debes tratar de entender de dónde viene, y con suerte verá el esfuerzo y luego tratará de entender de dónde vienes. Tal vez si intenta optimizar la consulta de 4 horas utilizando una "mejor práctica" diferente que todavía se ve bien, lo entenderá mejor.

Algunos enlaces a algunas metodologías de desarrollo:

Hay muchos otros. Algunos serán buenos, algunos serán malos. Algunos ya no se usan por una razón. Nuestro trabajo pagó un taller Agile, en el que cubrimos Agile en general y elegimos un subconjunto de esos principios para implementar. Nos ha ayudado de muchas maneras, y también nos ha dificultado en un par. Es mucho mejor que lo que hacíamos antes, pero en nuestro caso el problema estaba relacionado con todo el proceso.

Hemos encontrado que la mayor ayuda fue aprender a enfocarse en el producto mínimo viable. Esto significa que le damos al cliente la mínima funcionalidad para satisfacer sus necesidades al principio y la ampliamos según sea necesario. Esto evita que el software se infle con cosas que el cliente nunca pidió.

Sí, en las raras ocasiones en que he podido encontrar un libro o una publicación de blog autorizada que describa alguna solución que quiero implementar, él está dispuesto a hacerlo; creo que su objeción es que no quiere usar ningún patrón de código o marco a menos que lo haya visto descrito en otra parte.
La consulta específica de 4 horas podría haberse optimizado de manera diferente, de tal manera que estaría feliz de usarla, pero eso agregaría más de una semana de trabajo (probablemente dos) al tiempo de desarrollo. Dado que toda la tarea, aparte de esa consulta, tomó menos de una semana, no pensé que el gasto de tiempo fuera justificable.
@Benubird En ambos casos, digo "¿entonces?" Si sabes cómo hacerle entrar en razón, debes hacerlo. Pero tal vez sea menos específico. Encuentre un enfoque general que lo lleve a concentrarse más en un buen código rápidamente. Agile tiene una gama de metodologías para ayudar con eso. Y la programación adecuada a veces lleva más tiempo al principio, y eso siempre se justifica por las mejoras de productividad posteriores.
"eso siempre se justifica por las mejoras de productividad posteriores" - tenga cuidado al usar always ; Puedo pensar en muchas excepciones a esa afirmación.

Nunca me he encontrado con una persona competente en ningún campo que valore la adherencia rígida a las reglas y formas por encima de los resultados y la función. Si envolverse en la bandera es el primer refugio del sinvergüenza, entonces envolverse en un conjunto de reglas rígidas es el primer refugio del incompetente.

Me preocuparía que esté atrapado con un programador de "Cargo Cult" o "libro de cocina", es decir, uno que no entiende su oficio sino que simplemente imita los ejemplos de los demás.

Tal vez se aferre a los patrones y formatos con tanta tenacidad para disimular que en realidad no comprende los matices de cuándo usar qué patrones y prácticas. Utiliza argumentos morales sobre la integridad personal y profesional que, según afirma, le obligan a escribir código de la "única manera verdadera", para ocultar el hecho de que no conoce otra forma de escribir código.

Creo que esto es bastante claro porque todas las declaraciones reales de " mejores prácticas " siempre vienen con la advertencia " para las siguientes circunstancias o parámetros ". No existe un conjunto universal de "mejores prácticas" que siempre será la opción óptima. para cada proyecto.

En particular, las mejores prácticas pueden variar enormemente entre tiendas pequeñas como la suya e instituciones grandes. En las tiendas más pequeñas, los requisitos principales son la velocidad, la flexibilidad, la ejecución y, sobre todo, el envío. Si eres pequeño y no envías, te mueres. Cuestiones como el formato y el estilo no importan mucho porque las personas que mantienen el código probablemente serán las que lo escribieron. Las tiendas pequeñas hacen más trabajo llave en mano en el que el rendimiento de ajuste manual es un valor agregado importante.

Por el contrario, en grandes instituciones corporativas o gubernamentales, los requisitos principales suelen ser la integración en proyectos más grandes combinados con la capacidad de mantenimiento a largo plazo por parte de personas que no escribieron el código años después. El rendimiento a menudo no es un problema tan grande porque los grandes a menudo pueden arrojar más hardware al problema.

Me parece que su codificador está obsesionado con las "mejores prácticas" para la programación institucional grande en lugar de las mejores prácticas para la programación de pequeñas empresas. La mayoría de los libros e incluso la educación formal en estos días parece centrarse en ese mercado, por lo que si en realidad solo imita lo que ha leído, es posible que no entienda realmente que las "mejores prácticas" cambian con el medio ambiente.

Creo que necesitas ponerlo a prueba para saber exactamente qué tipo de programador es en realidad, es decir, si es un primo uomo arrogante e idiota con habilidades o un incompetente que se esconde detrás de una fachada de perfeccionismo. Pídale que produzca un código optimizado a mano como usted escribió, solo vea si realmente puede hacerlo.

Si él tiene las habilidades, pero simplemente valora la forma sobre la función, entonces usted podría convencerlo de que no existen las "mejores prácticas" universales y definitivamente no existen las "mejores formas" universales.

Pero apuesto a que descubrirás que carece de las habilidades. En el mejor de los casos, es un programador de libros de cocina y no un vaquero hacker que puede trabajar sin estructura ni reglas si tiene que hacerlo (incluso si no le gusta). Apuesto a que tendrás que dejarlo ir.

Ojalá pudiera votar esto unas 20 veces. Veo a demasiadas personas que ven cualquier metodología que aprendieron en la escuela como One True Way, aunque quizás no debería quejarme, ya que me hace quedar bien cuando exprimo un par de órdenes de magnitud de mejora del rendimiento de su código. :-)
+1'd. Aunque en realidad me encontré con bastantes personas que eran competentes y completamente ciegas para los negocios al mismo tiempo. Cuán competentes eran en la práctica dependía mucho más del gerente / líder del equipo: aprender a usar sus fortalezas y limitar sus debilidades. Esa es una gran parte de ser un líder. Por supuesto, también podría ser simplemente un idiota, pero eso realmente no es algo que el OP pueda decidir por sí mismo. Pero al final, su objetivo es el mejor valor para la empresa y el cliente, lo que generalmente significa cierto grado de compromiso entre la buena mantenibilidad y el rendimiento/velocidad de implementación.
+1 para "He maybe clinging to patterns and formatting with such tenacity to disguise that he doesn't actually understand the nuances of when to use which patterns and practices."No existe tal cosa como una "mejor práctica". Las mejores tecnologías y patrones de codificación varían drásticamente entre diferentes problemas. Utilice la mejor herramienta para el trabajo; no cambie el trabajo para adaptarse a la herramienta. Esta es la clave que el OP necesita para que su programador entienda. Hay ocasiones en las que una aceleración de 10 000x no importa y otras en las que una aceleración del 1 % importa mucho. Los buenos ingenieros conocen la diferencia.
Me encanta una imagen que encontré en Twitter: todo(*) está a escala. Cualquiera de los códigos es más lento o más rápido. Los equipos son más grandes o más grandes. El código es más o menos eficaz. El truco está en decidir dónde trazar la línea en cada circunstancia particular.
@Luaan: no estoy seguro de que la "ceguera comercial" sea de lo que estamos hablando aquí. En mi experiencia, hay poco que saber sobre la correlación entre la habilidad de programación y la flexibilidad y la gestión/organización empresarial. Son conjuntos de habilidades realmente diferentes. De hecho, tener programadores como gerentes es un desarrollo relativamente nuevo. A principios de los 90, la mayoría de las personas que administraban a los programadores no tenían experiencia en codificación porque aún no había suficientes personas que pasaran por la tubería. No creo que esta persona sea ciega a los negocios, es ciega a la programación o al menos tiene una visión de túnel.
@WayneWerner: le comenté a uno de mis profesores en la universidad que parecía "no importa lo que hagas, es una compensación". En mi idealismo juvenil, no pensé que debería ser así, pero mi profesor dijo: "sí, esa segunda ley de la termodinámica es una mierda". Él estaba en lo correcto. Eventualmente se reduce a la física real de la segunda ley. Si pones energía en una característica o lo que sea, tienes que robarla de otra. no hay almuerzo gratis
+1 "Me parece que su codificador está obsesionado con las "mejores prácticas" para la programación institucional grande en lugar de las mejores prácticas para la programación de pequeñas empresas".

¿Cómo explicar las prioridades de negocio a un programador?

No, al menos no para este programador que no quiere escucharlo. No es un gerente y, aparentemente, no quiere estar facultado para tomar decisiones o emprender acciones sin dirección para mejorar el negocio.

Quiere entrada en forma de solicitudes de características y quiere proporcionar salida en forma de código perfecto.

Su deseo de capacitarlo para que tome decisiones, o para que se preocupe por el negocio, no es un mal deseo, pero en este caso debe dejar de lado ese deseo y concentrarse en las prioridades del negocio: hacer que este programador sea productivo.

Cuando tiene un sistema que no funciona, puede abrirlo y jugar con las partes internas, o puede jugar con la entrada hasta que produzca la salida correcta.

En este caso, le sugiero que juegue con la entrada al programador, en lugar de intentar cambiar el programador.

Tengo un desacuerdo recurrente con un programador sobre la calidad del código.

Deja de discutir sobre eso.

Corto y dulce:

  • No dejes que él dirija la conversación y que se centre en la "calidad del código".
  • No le digas que lo está haciendo mal o que está perdiendo el tiempo.
  • No crea que está actuando de manera poco profesional, incluso cuando está claro para usted que lo está haciendo.
  • Acepte su explicación de "Ese no es mi trabajo" y comuníquele los REQUISITOS .
  • Todas las solicitudes de tareas futuras ahora deben hacerse por escrito (el correo electrónico está bien) con una discusión de seguimiento.
  • Todas las solicitudes de tareas tienen límites estrictos y objetivos sobre el tiempo que puede dedicar a la tarea y el rendimiento que debe tener la tarea.

Por tanto, la próxima vez que le comuniques una tarea, hazlo de forma similar a la siguiente:

Descripción:

Necesitamos que la función X esté implementada, probada e implementada antes del viernes 3 de junio.

Requisitos:

  • Debe incluir un caso de prueba que atrape fuera de los límites y el funcionamiento correcto.
  • No debe tardar más de 180 segundos en ejecutarse en la base de datos de producción SOME_DATABASE
  • Debe pasar las pruebas LINT/etc para los estándares de codificación de la empresa.

Luego, durante la discusión, averigüe si tiene algún problema con los requisitos. Si lo hace, entonces usted hace la tarea o vuelve a trabajar los requisitos para que se ajusten a sus capacidades. Quítele el trabajo duro y manéjelo usted mismo; debe haber una delimitación clara entre su trabajo y el de él. Cuando falle, no intente "arreglarlo": averigüe por qué no cumplió con sus expectativas y diseñe un requisito que le ayude a comunicarle sus expectativas para la próxima tarea similar.

En este punto, espero que entiendas que tu camino actual de intentar que él cambie para satisfacer tus necesidades no va a funcionar. Debe comprender sus capacidades y luego asignarle solo el trabajo del que es capaz. Si llega a un punto en el que ya no satisface sus necesidades, será mejor que lo despida; si la relación comercial entre sus beneficios y su producción ya no tiene sentido para usted, entonces córtela y busque a alguien más para cumplir con su función. . No necesariamente en ese orden.

En este punto, normalmente hago algunos ruidos conciliadores sobre cómo las personas deberían poder cambiar y mejorar constantemente sus habilidades, pero en este momento solo necesita concentrarse en comprender sus propios requisitos y luego comunicárselos claramente. Una vez que haya descubierto la comunicación , puede pasar a ayudarlo a mejorar sus habilidades para que pueda escribir una consulta ORM que se ejecute a tiempo. Hasta entonces, comuníquese, comuníquese, comuníquese y acepte que hay algunas tareas que simplemente tendrá que hacer usted mismo.

+1 Es muy común que las personas mezclen requisitos y soluciones, especialmente cuando tienen dos sombreros. Muy rara vez existe una solución correcta absoluta y singular, por lo que discutir sobre qué implementación es mejor es contraproducente si los requisitos no son claros, medibles y documentados.

Se trata más de prácticas de código que de prioridades comerciales.

Soy programador y estoy un poco ajustado a mis costumbres, pero este programador está fuera de la red. No entiendo por qué alguien preferiría el estilo a la velocidad. ORM son convenientes pero no eficientes. No es mal estilo usar SQL. No es un mal estilo desnormalizar una base de datos para mejorar el rendimiento. La optimización prematura es una mala práctica de código, pero optimizar los cuellos de botella es una buena práctica de código. Revisaré cualquier consulta que tarde más de 2 segundos.

Mi motivo favorito son los controles personalizados. El negocio me pedirá una mirada muy específica y yo responderé pero el control estándar presenta la información. Los controles estándar son rápidos y probados. Cuando actualizamos, no necesitamos coordinar varias bibliotecas.

¿Por qué un programador querría usar un ORM que tarda 4 horas en ejecutarse? Se necesitarían 4 horas para probar. Si el programador estuviera luchando para pasar a SQL para reducir 4 segundos de una consulta de 8 segundos y la empresa dijera que 8 segundos es lo suficientemente bueno, queremos permanecer en ORM para la mantenibilidad, entonces obtendría ese debate.

¿En cuanto a cómo convencer al programador? Lo llamaría más un problema de prácticas de código que prioridades comerciales. Una empresa no necesita justificar que una búsqueda de 30 segundos es mejor que una búsqueda de 4 horas. Solo hago ORM porque escribir SQL sin procesar es una mala práctica, simplemente no es aceptable. Si el idioma y la plataforma admiten SQL sin procesar, entonces es aceptable. El programador necesita ser puesto en un programa de acción correctiva y RH necesita estar involucrado. Si no eres su jefe, ve con su jefe.

Yo estoy totalmente de acuerdo. Soy un desarrollador sénior y es muy, muy importante adaptar la tecnología para que se ajuste al problema, ¡y no al revés...!
Es una mala práctica no escribir SQL cuando la situación lo requiere. Es demasiado ignorante para saber eso. No se debe permitir que nadie toque un ORM sin una experiencia completa en la escritura de código SQL porque si no comprende lo que necesita la base de datos, entonces es ignorante y dañará el sistema. Los datos nunca son una caja negra que no necesita comprender. El significado de los datos y cómo están estructurados es fundamental para obtener la respuesta correcta. ORM en manos de alguien que sabe lo que está haciendo es una buena práctica, en manos de un novato es un desastre esperando a suceder.
Why would any programmer want to use a ORM that takes 4 hours to run? It would take 4 hours to test.Esto solo tiene mi voto. Si el programador defiende su posición diciendo que el estilo ahorra tiempo al mantener el código, entonces los argumentos sobre cómo la eficiencia puede reducir los costos de mantenimiento son infinitamente mejores que cualquier argumento de "la eficiencia es mejor que el estilo". Presente siempre un argumento en términos que la otra persona ya haya reconocido que son importantes.

Argumentar a partir de primeros principios.

Ningún cliente o cliente realmente se preocupa por las "mejores prácticas". Pero ciertamente se preocupan por la calidad . Por encima de todo, quieren que su problema se resuelva, y cuanto más rápido, más fácil y más barato, mejor. (También quieren ahorrar tiempo, dinero y esfuerzo a largo plazo, lo cual es una gran parte de la "calidad").

Sí, algunos clientes usan "mejores prácticas" como indicador de calidad, eficiencia, etc. Pero solo porque sus principales intereses son la calidad, la eficiencia, etc.

Así que cualquiera que ofrezca un servicio (incluso un programador que ofrece servicios a una empresa) debe evaluar su trabajo con preguntas como "¿es de alta calidad?", "¿se entrega rápidamente?", "¿hace lo que el cliente quiere?", " ¿Ahorra tiempo/dinero/recursos a largo plazo?"

Estas son preguntas difíciles de responder. Es mucho más fácil responder preguntas como "¿Sigo las convenciones de codificación?", "¿Implemento la especificación correctamente?" y "¿Tengo una descripción de Javadoc para cada método?" Tales preguntas son una manera fácil de evitar las preguntas difíciles. Pero un buen programador hace las preguntas difíciles de su código.

Las mejores prácticas son importantes. Ayudan a crear productos de calidad que ahorran tiempo/dinero/recursos a largo plazo. Son particularmente útiles cuando está tratando de tomar una decisión y tiene poca evidencia sólida sobre qué alternativa es mejor. Pero cuando tiene información clara sobre una alternativa (por ejemplo, tomaría 10 minutos en lugar de 4 horas, con muy pocas posibilidades de crear problemas más adelante), ¡entonces el sentido común triunfa sobre las mejores prácticas!

Si su programador piensa que un fragmento de código es "terrible y nunca debe usarse", pídale que lo justifique desde los primeros principios (en lugar de las mejores prácticas). ¿Tiene un error? ¿Existe el riesgo de que contenga una vulnerabilidad de seguridad? ¿Es probable que añada mucho tiempo al mantenimiento o nuevas funciones en el futuro? ¿Confundirá a otros programadores? ¿Y los problemas con él realmente valen la pena el tiempo dedicado a implementar una alternativa "mejor"? Asegúrate de escuchar lo que dice. Si tiene un argumento fuerte, no dejes que tu ego lo anule.

Una nota sobre la integridad y el hábito

Los buenos hábitos son valiosos. Si sus desarrolladores están constantemente practicando y perfeccionando su capacidad para escribir código claro, limpio y bien documentado, serán más eficientes y estarán menos tentados a ser perezosos y tomar atajos. ¡Esto es excelente para la calidad de su base de código!

Su programador claramente tiene integridad. No intentes matarlo, ¡úsalo! Asígnele tareas donde la calidad sea importante. Por ejemplo, pídale que limpie el código desordenado escrito por otra persona que se está volviendo difícil de mantener. Pídele que implemente la funcionalidad donde sea importante que el código se pueda mantener.

Insiste en que todo su código está escrito al más alto nivel (es decir, que se parece a los ejemplos de los libros de texto de estilos de codificación), independientemente del impacto que esto tenga en la funcionalidad. Yo, por otro lado, creo que es más importante que el código escrito satisfaga las necesidades del negocio, es decir, que funcione de manera eficiente, que no tarde demasiado en desarrollarse y que sea razonablemente mantenible.

Te das cuenta de que ambos tienen el mismo objetivo, ¿verdad?

Las mejores prácticas son tales por una razón. Existen para mantener el código bien organizado y separado para que funcione de manera eficiente, no tarde demasiado en desarrollarse y sea razonablemente fácil de mantener.

Claro, su desarrollador podría beneficiarse de una pizca de pragmatismo o una mejor comprensión de cuándo se pueden romper las reglas de manera segura. Pero también parece que podría beneficiarse de una visión a más largo plazo de cómo la calidad del código base ayuda a sus objetivos comerciales.

Su pregunta es sobre cómo explicar las prioridades comerciales al programador, pero parece que ya lo ha hecho. Lo que no has hecho es escuchar las prioridades comerciales de tu programador. Ustedes dos tendrán que comprometerse. Hay muchas más soluciones al problema que "usar SQL directo" y "usar el ORM". Puede buscar mejorar el rendimiento del ORM. Puede buscar aislar el SQL para que sea menos problemático para el programador.

En resumen, para obtener lo que desea, debe dejar de discutir y comenzar a cooperar.

Parece que le ha dado a este desarrollador muchas oportunidades para explicarse, y este desarrollador no lo ha hecho. Escuchar y comprender a sus programadores es una cosa, dejar que dicten la estructura de la aplicación a un nivel perjudicial no es aceptable.
@Zibbobz: ¿cómo te imaginas? Está bastante claro que el programador está diciendo "la limpieza del código es importante para mí". Es posible que no puedan articular bien por qué , pero luego le corresponde al gerente profundizar en eso: debe ser el comunicador experto en ese rol. No estoy diciendo que dejes que dicten las cosas, pero obligarlos a hacer las cosas a tu manera (microgestión) es igual de malo.
@Telastyn: asumes que "la limpieza del código es importante para mí", pero me parece que esta es la estructura del código que hago y me niego a usar un patrón de diseño diferente porque me gusta el patrón que estoy usando. A pesar de que el patrón que está utilizando el programador es ineficaz e ineficiente para la tarea que se le ha asignado.
Re "Las mejores prácticas son tales por una razón". Sí, pero con demasiada frecuencia la razón es que la persona que está promulgando un conjunto particular de "mejores prácticas" pensó que se vendería mejor si las etiquetara como "mejores" en lugar de "mis gustos personales". (Alimento para reflexionar: si las prácticas son realmente "mejores", ¿por qué hay tantas diferentes?)
@jamesqf: algunos documentos internos no son las mejores prácticas. Un consenso general de expertos (como las respuestas revisadas por pares sobre SE) está mucho más cerca.
@Telastyn: Supongo que aquí las "mejores prácticas" significan lo que el OP denomina libros de texto de estilo de codificación, patrones de diseño, varias metodologías con palabras de moda (me viene a la mente Agile) y cosas por el estilo. Todos afirmaron ser "mejores" por sus creyentes, sin AFAIK mucha evidencia objetiva.
"Lo que no has hecho es escuchar las prioridades comerciales de tu programador". ¿Cómo es que puede elegir su propio conjunto especial y diferente de prioridades comerciales? a menos que deposite dinero y sea propietario de una parte de la empresa?
@FlorianHeigl: porque él es el experto (o al menos lo más cercano a un experto que tiene esta empresa). Ignorar los consejos de sus expertos es una forma rápida y fácil de fallar.

Para ser honesto, disciplinaría al tipo y lo despediría si fuera necesario. Las respuestas ya publicadas aquí tienen varios puntos buenos con respecto a la flexibilidad en los enfoques de los problemas, por lo que no los repetiré.

Parece que el empleado con el que tiene problemas ya está en el nivel superior o cerca de él, y entiende mucho sobre cómo programar. Sin embargo, ese no es todo su trabajo. Si técnicamente eres su manager, necesita escucharte sin importar si le gusta o no. Obviamente, no hemos observado cómo ustedes dos discuten los problemas, pero debe estar poniéndose bastante tenso. Sí, hay más de una forma de resolver la mayoría de los problemas, y ambos deberían aprender a ser más flexibles, pero varias de las cosas que ha dicho indican que esta persona es un detrimento para la empresa, no un activo.

Ahora se niega a trabajar en esa parte del programa.

Inaceptable e infantil, y también una negativa a cumplir con un deber en su trabajo , que en lo que a mí respecta, es motivo de despido.

pero él simplemente dice "no, no lo es" y continúa escribiendo su código elegante e ineficiente, que a veces tengo que reescribir mal antes de que pueda usarse.

Igual aquí.

Solo puedo imaginar (y espero) que en su frustración haya embellecido un poco, y espero que como su gerente "técnicamente" pueda mantenerse a un nivel más alto y no tener desacuerdos infantiles con esta persona. Sin embargo, si la situación es como usted dice que es, el empleado es inflexible hasta el extremo. Potencialmente, podría usar algo de educación y orientación sobre cómo tratar con personas difíciles pero, al final del día, este empleado se niega rotundamente a mejorar un producto basado en estándares esotéricos. Solo hay una forma en que esto puede afectar a sus clientes, y es de forma deficiente. No importa cuán bueno sea este programador, en algún momento se convertirá en una responsabilidad para la empresa (quizás ya lo sea).

Al final del día, los está empleando para producir un producto que funcione, no un código bonito. Si no pueden hacer eso, entonces no están haciendo su trabajo.

Habiendo dicho mi artículo, trate de recordar que no es blanco y negro, y definitivamente no es usted contra ellos, solo tiene ideas diferentes sobre lo que es correcto. Mis comentarios aquí se basan en el entendimiento de que ha tratado de explicar las prioridades comerciales y a la persona no parece importarle, lo que en mi opinión significa que no encajan bien en su empresa. Tal vez a este tipo le iría bien en un sitio web que enseña las mejores prácticas o algo así.

Desafortunadamente, no es un adorno: esta mañana estaba tratando de explicarle esto, y se puso los auriculares y se dio la vuelta mientras yo hablaba. Dice (cita) "Soy programador. Me pagan por programar, no por pensar en el negocio". El problema es que la mayor parte de su código es muy bueno, y realmente no podemos permitirnos pagarle a un reclutador para encontrar a alguien nuevo, o tomar las varias semanas que requeriría capacitarlo.
Bueno, entonces tienes que tomar una decisión difícil: esa actitud es totalmente incorrecta. Es probable que las acciones disciplinarias hagan que se sienta más resentido contigo, lo que tampoco será bueno. Tendrás que decidir si solo quieres tratar con él o pasar por el dolor de encontrar a alguien nuevo y entrenarlo. Está bastante claro qué es lo mejor a largo plazo... ¿Su empresa utiliza incentivos? Tal vez pueda vincular algún tipo de recompensa/castigo directamente a los objetivos de la empresa.
@Benubird ¿Puede su empresa permitirse, a largo plazo, aferrarse a este programador obstinado que se niega a escuchar a su jefe? De lo contrario, deberían comenzar a invertir en reclutamiento ahora .
@DrewJordan Gracias por esa publicación. Fue mi pensamiento instantáneo cuando comencé a leer la pregunta. después de todas las respuestas hasta ahora, no pude ver que mi impresión cambiara.

Es posible que necesite averiguar lo que él considera importante. "Buen estilo" es solo eso, estilo. Debe adaptarse para satisfacer las necesidades comerciales y él debe saberlo. Sin embargo, puede haber un temor subyacente con el que está lidiando y que debe abordarse.

Como caso de estudio, trabajé en un equipo que constantemente producía software a un ritmo más lento de lo que necesitaban los clientes. La gerencia estaba continuamente enojada con nosotros. Teníamos una buena razón para la lentitud. La gerencia había establecido un entorno de desarrollo hostil en el que no se podía cambiar ninguna pieza de código sin un comando explícito de nuestro cliente. Desafortunadamente, teníamos el requisito explícito de mantener este software durante décadas, mientras que pocos o ninguno de nuestros clientes pensaron en más de un mes por adelantado, lo que hizo imposible convencerlos de un ROI a largo plazo. Se nos dio una gran responsabilidad por el software, pero poca o ninguna autoridad para hacer algo al respecto. Nuestro mantra era "El primer prototipo de trabajo que se muestra al cliente será su implementación final". Nunca resolvimos este obstáculo. La gerencia nunca trabajó con nosotros para apoyar el programa de una manera acorde con nuestras responsabilidades (en realidad, se nos ordenó que no tratáramos de resolverlo, porque simplemente mencionar el problema correría el riesgo de continuar con la financiación). En cambio, el programa terminó muriendo porque nadie abordó el fracaso comercial subyacente.

Pasamos mucho tiempo después de esto, como desarrolladores, tratando de averiguar qué salió mal exactamente y qué podríamos hacer la próxima vez para evitarlo. Una de nuestras conclusiones de este ejercicio fue el valor de tener múltiples formas de abordar un problema. ¿Le gusta el estilo ORM, mientras que usted ahorra eones de computación con uno o dos comandos SQL? Haz que ambos puedan existir uno al lado del otro. Muy a menudo, el valor de un enfoque no es obvio para la otra parte hasta mucho después de haberlo terminado. Permita que ambos estilos coexistan en la naturaleza y descubra cuál sobrevive a los rigores de los negocios. Desarrolle un sentido de armonía entre los enfoques en lugar de tratar de dictar un enfoque para gobernarlos a todos. Quizás hace todo su desarrollo primario usando su estilo extremo, pero el producto final requiere la adición de trucos.

Si no acepta esto, entonces en realidad está equivocado. No es la voz de la empresa, es simplemente un empleado. Su voz es parte del todo y no el centro del todo (a menos que lo contrate para ser el centro). Un empleado que no puede flexionar porque mantiene principios que violan las necesidades de la empresa debe ser despedido. Pero por el contrario, los desarrolladores tienen un punto de vista del software que no se puede encontrar en ningún otro lugar. La empresa necesita flexibilizarse cuando el desarrollador señala un problema que es difícil de ver para los demás.

El objetivo es descubrir cómo hacer que los dos puntos de vista coexistan el tiempo suficiente para explorarlos adecuadamente. Sin embargo, eso puede fallar eventualmente si un lado está particularmente atascado en el barro. En ese momento, deberá mantener una conversación cortés explicando que su estilo de codificación no es el centro del mundo, y si se interpone en el camino de los negocios, se le asignarán tareas que le otorgan cada vez menos libertad en los enfoques. se le permite tomar. Alternativamente, es libre de aceptar ceder terreno en cosas como "tamaño del cheque de pago" a cambio de la libertad de hacer su trabajo.

No quería crear otra respuesta que sugiriera un desarrollo iterativo, pero sí quería agregarla al final de mi respuesta. El desarrollo iterativo le da la oportunidad de explorar el "buen estilo" en una iteración y luego hacer que usted aplique los tornillos de mariposa comerciales para convertirlo en un producto útil. Puede que no sepas a priori que una tarea se puede hacer en 30 segundos. Sin embargo, después de la primera iteración, debe tener una idea del tiempo. Este sentido del tiempo debería permitirle proporcionar requisitos de tiempo en la segunda iteración.

Si establece un requisito comercial para que una consulta demore menos de 5 minutos, y él dice que no se puede hacer, quítele educadamente la tarea y hágalo usted mismo. Déjalo jugar con sus pulgares hasta que comience a darse cuenta de que su cheque de pago está en peligro.

La mejor respuesta que he leído sobre este tema proviene de las preguntas frecuentes de C++.

https://isocpp.org/wiki/faq/big-picture#biz-dominates-tech

Puede que no te guste esto, pero la respuesta corta es: "No". (Con la advertencia de que esta respuesta está dirigida a los profesionales, no a los teóricos).

Los diseñadores de software maduros evalúan situaciones en función de criterios comerciales (tiempo, dinero y riesgo) además de criterios técnicos como si algo es o no "buen OO" o "buen diseño de clase". Esto es mucho más difícil ya que involucra cuestiones comerciales (horario, habilidad de las personas, averiguar a dónde quiere ir la empresa para que sepamos dónde diseñar la flexibilidad en el software, la voluntad de tener en cuenta la probabilidad de cambios futuros, cambios que son probable en lugar de meramente teóricamente posible, etc.), además de cuestiones técnicas. Sin embargo, da como resultado decisiones que tienen muchas más probabilidades de generar buenos resultados comerciales.

Como desarrollador, usted tiene la responsabilidad fiduciaria con su empleador de invertir solo en formas que tengan una expectativa razonable de retorno de esa inversión. Si no hace las preguntas comerciales además de las técnicas, tomará decisiones que tendrán consecuencias comerciales aleatorias e impredecibles.

Nos guste o no, lo que eso significa en la práctica es que probablemente sea mejor dejar términos como "buen diseño de clase" y "buen OO" sin definir. De hecho, creo que las definiciones precisas y puramente técnicas de esos términos pueden ser peligrosas y pueden costar dinero a las empresas y, en última instancia, tal vez incluso costarles a las personas sus trabajos. Eso suena extraño, pero hay una muy buena razón: si estos términos se definen en términos técnicos puros y precisos, los desarrolladores bien intencionados tienden a ignorar las consideraciones comerciales en su deseo de cumplir con estas definiciones técnicas puras de "bueno".

Cualquier definición puramente técnica de "bueno", como "buen OO" o "buen diseño" o cualquier otra cosa que pueda evaluarse sin tener en cuenta el cronograma, los objetivos comerciales (para que sepamos dónde invertir), los cambios futuros esperados, la cultura corporativa con con respecto a la voluntad de invertir en el futuro, los niveles de habilidad del equipo que realizará el mantenimiento, etc., es peligroso. Es peligroso porque engaña a los programadores haciéndoles creer que están tomando decisiones "correctas" cuando en realidad podrían estar tomando decisiones que tienen terribles consecuencias. O esas decisiones pueden no tener consecuencias comerciales terribles, pero ese es el punto: cuando ignora las consideraciones comerciales mientras toma decisiones, las consecuencias comerciales serán aleatorias y algo impredecibles. Eso es malo.

Es un hecho simple que las cuestiones comerciales dominan las cuestiones técnicas, y cualquier definición de "bueno" que no reconozca ese hecho es mala.

Considere esta declaración:

  • Como programador, la creación de código razonablemente eficiente es parte de su trabajo tanto como ser un tipeador razonablemente rápido es parte del trabajo de un mecanógrafo.

Luego muéstrele un ejemplo de cómo se puede mejorar drásticamente su código.

Si no puede (o no quiere) unir los puntos entre esa declaración y su ejemplo, debe deshacerse de él. Es como tener un representante de atención al cliente que se niega a usar su teléfono porque prefiere enviar correos electrónicos a los clientes.

Parece que el OP ha intentado esto y el programador ha rechazado las versiones "Mejoradas" varias veces.
Entonces se aplica la segunda parte de la respuesta: "... tienes que deshacerte de él".

En realidad, hay dos preguntas separadas: una es que un desarrollador de software (comprensiblemente) quiere crear un código de la más alta calidad, mientras que la empresa quiere que cree un código que ofrezca la mayor funcionalidad posible al mismo tiempo.

Hay un compromiso que se debe tomar: en algún momento, el pulido excesivo del código ya no brinda ninguna ventaja. Por otro lado, si la calidad del código no es lo suficientemente buena, obtendrá un código que produce resultados incorrectos, se bloquea, es demasiado lento o no se puede mantener.

Debe convencer a sus desarrolladores de que no se excedan, y ellos deben convencerlo de que no adherirse a un estándar limitado a veces es costoso a corto plazo y, a menudo, costoso a largo plazo. Por otro lado, ser costoso a largo plazo puede ser aceptable si solo entregando en poco tiempo el negocio sobrevive lo suficiente como para preocuparse por el largo plazo. Si no puede convencer a sus desarrolladores para que produzcan elcantidad de calidad y le cuesta dinero, es posible que deba separarse. (Obviamente, si alguien produce baja calidad en ocho horas, y alguien más produce alta calidad en ocho horas y no se puede lograr que produzca baja calidad en seis horas, usted aún prefiere el segundo desarrollador. O si ese desarrollador está contento con la creación de alta calidad y productivo, y al obligarlo a abandonar la calidad lo vuelves infeliz e improductivo, eso tampoco es bueno).

La otra pregunta: parece que su desarrollador insiste en algún enfoque formal que es ineficiente, en lugar de usar un enfoque informal que es muy eficiente (cuando la ineficiencia es realmente un problema para el negocio). Eso lo veo como un problema serio. Si la empresa tiene un problema que necesita ser resuelto, entonces cualquier técnica que no resuelva el problema no es aceptable, e insistir en tal técnica sabiendo otra diferente que soluciona el problema, eso no me parece aceptable.

Si es necesario, el desarrollador debe sentirse libre de agregar comentarios al código con una diatriba de por qué la técnica que está usando es mucho peor que la otra técnica, pero debe hacerse por eficiencia. (En realidad, podría ser una buena idea escribir las razones en caso de que se le pregunte por qué utilizó este enfoque dentro de dos años). Sin embargo, lo que debe hacerse debe hacerse.

No estoy de acuerdo con que el programador "quiera crear código de la más alta calidad". Es más bien que ha internalizado una definición de calidad que se adhiere a estándares académicos abstractos (incluso diría cuasi-religiosos), pero no tiene ninguna relación con los estándares que necesita su empleador, es decir, que el código se ejecuta en tiempo práctico. y ser mantenible. (El código escrito según algún estándar académico en particular a veces es menos comprensible para las personas que no están familiarizadas con esos estándares).
Uno de mis dichos es "las mejores prácticas no son Turing completas".

Este es un problema con su actitud, y necesita cambiar.

Sus intenciones parecen lo suficientemente nobles: está tratando de implementar el código que aprendió en la escuela, que aprendió que es seguro e higiénico para el programa, y ​​se apega a las mejores prácticas para la codificación. Este aspecto es algo que quieres de un programador.

Lo que no quiere que sienta es que puede tomar decisiones de alto nivel sobre cómo debería funcionar la aplicación. Es, supongo, un programador junior , y aún no ha aprendido a adaptarse a situaciones especiales, y mucho menos a las complejidades de su propia aplicación.

Si este es un incidente que se repite, le sugiero que hable con él sobre cómo las mejores prácticas, aunque es bueno seguirlas, no siempre son la solución correcta. Recuérdale también que eres su jefe y que no tolerarás que rechace tus decisiones o que vaya a tus espaldas a programar 'a su manera'.

Y a nivel individual, su grupo debería revisar el código antes de comprometerse de todos modos, así que aproveche la oportunidad para repasar su código bien formateado pero altamente ineficiente y exponer, paso a paso, por qué es ineficiente.

Si se niega a cambiar, asigna el cambio a otra persona o hazte cargo tú mismo. Desafortunadamente, esto podría ser una señal de que no funciona bien en grupos, y eventualmente tendrás que dejarlo ir, o encontrar un grupo diferente que funcione mejor con su estilo de codificación 'siempre estricto'.

Intenté explicarle que las mejores prácticas no siempre son la mejor solución, pero él simplemente no lo entiende; no debo estar haciendo un buen trabajo al explicarlo. Supongo que no podría señalarme algunos recursos que lo expliquen, ¿tal vez mejor que yo?
@Benubird Le señalaría la respuesta más votada a esta pregunta. ;) Aunque si quieres algo más específico para problemas individuales, hay un SE completo dedicado a ese tipo de cosas.
@Benubird: le recomendaría que deje de intentar desafiar las "Mejores prácticas" y, en cambio, sugiera que necesita encontrar una manera de aplicar esas mejores prácticas de una manera que tenga sentido comercial.
@ReallyTiredOfThisGame "No siempre" la mejor solución no significa "Nunca" la mejor solución. Las mejores prácticas se llaman así por una razón, pero el código de trabajo supera al código bonito.
@Zibbobz - Estoy de acuerdo. Pero cuando desafías una creencia firmemente sostenida de alguien, inmediatamente siente la necesidad de defender su creencia y, por lo tanto, cualquier desafío a esa creencia debe ser defendido y cualquier otro punto tiende a ser ignorado. Entonces, en lugar de desafiar esas creencias directamente, permita que el programador determine por sí mismo que hay otras formas de hacer las cosas. Lo más probable es que si es mucho menos eficiente, el programador esté aplicando incorrectamente las mejores prácticas de todos modos.
@ReallyTiredOfThisGame Cuando dejas que alguien se golpee contra una pared, se detendrán cuando se den cuenta de cuánto duele o continuarán hasta que se destruyan. Creo que si es un problema recurrente que todavía se niega a cambiar (y eso es si es recurrente y causa problemas con la aplicación), entonces es hora de abordar esos problemas directamente.
@Zibbobz - Y si la pregunta fuera "¿debería deshacerme de este programador?" Entonces esa sería una respuesta válida. El OP ha preguntado cómo puede comunicarse con el programador. Al igual que el OP quiere que el programador sea efectivo, el OP pregunta cómo puede ser un administrador más efectivo. Entonces, en lugar de sugerir que golpeó la pared de una manera diferente, sugiérale que busque una forma de rodear la pared. (tu metáfora no la mía)
@ReallyTiredOfThisGame No descarte "deshacerse de este programador" como respuesta. Sin embargo, parece que tienes tu propia solución a este problema, ¿tal vez deberías publicarla? Admito que hay fallas en esta respuesta, que podrían ser abordadas por otra respuesta.
@Zibbobz: creo que, en su mayor parte, su respuesta es acertada. Simplemente estaba tratando de abordar el comentario de Benubirds donde dijo que estaba tratando de explicar que las mejores prácticas no siempre eran las mejores. Básicamente, tratando de que implemente su respuesta de una manera ligeramente diferente a la que ha intentado en el pasado.

En tu pregunta no hablas de que el código funcione correctamente . Tal vez su programador pasa demasiado tiempo haciendo que el código se vea bonito, pero tal vez está siendo minucioso en su verificación de errores. Un buen código tiene algunos requisitos:

  • Debe funcionar una cantidad aceptable del tiempo.
    • Aceptable puede significar al menos el 95 % o nunca menos del 100 %; es su definición
  • No debe producir efectos secundarios en otros códigos/sistemas (ver primer punto)
  • Debe ser mantenible
    • El código bien formateado es mucho más fácil de mantener que el código mal formateado
  • Debe ser entregado en la fecha límite (siempre que sea y recordando que los plazos se pueden reajustar en función de las necesidades del negocio)
  • debe ser asequible
  • Probablemente muchos otros puntos

Como administrador/representante de la empresa en su conjunto, desea un código de alta calidad, económico y desarrollado rápidamente. Desafortunadamente, la experiencia ha demostrado que solo puedes obtener dos de esos. El código desarrollado rápidamente y de alta calidad es costoso. El código barato y desarrollado rápidamente es de baja calidad. El código barato y de alta calidad requiere mucho tiempo para desarrollarse.

Algunos programadores no comprometerán la calidad (admito que soy uno de ellos) debido a la gran cantidad de tiempo adicional que se requiere para solucionar problemas, corregir errores y reescribir después. No permitiré a sabiendas que se publique un nuevo error.

Una vez trabajé en un proyecto enorme y mal escrito. El código fue heredado de un tercero y tuvimos muy buenos desarrolladores trabajando en él. El negocio seguía pidiendo que fuera mejor y nosotros seguíamos diciendo "Esto es lo mejor que se puede". Eventualmente conseguimos que el código funcionara mejor, pero tomó de 6 meses a un año para que eso sucediera y nunca tuvimos una idea clara de cómo hacer que el código se ejecutara más rápido en ese momento. Cuando dijimos "Esto es lo mejor posible", lo que realmente queríamos decir era "Hemos agotado todas nuestras ideas actuales".

Su programador podría estar en una situación similar. Literalmente está haciendo lo mejor que puede y no puede pensar en mejores formas de hacer las cosas. Probablemente no le guste que le den a la fuerza ciertas ideas y las rechazará automáticamente. Si a él se le ocurre la misma idea de forma independiente, ¡ambos ganan! Ser una empresa pequeña significa que probablemente no tenga muchas oportunidades de compartir ideas con otras personas o recibir ideas de pensamiento lateral de personas que no están tan cerca del proyecto.

Después de haber trabajado en el código de otras personas, puedo decirles que a veces he tenido que pasar media hora reformateando el código antes de poder empezar a entenderlo. El formato del código es esencial para la eficiencia de su programador, aunque se ejecute de manera idéntica.

No intente convencer a su programador de que acepte "código incorrecto". Explique por qué hay múltiples formas de hacer lo mismo y solo porque una es un "buen código" no convierte automáticamente a las otras en "mal código". Tienes que demostrarle que estás de su lado. ¡También quieres un buen código! Pero luego defina qué es un buen código. Si tener un buen desempeño es importante, ¡entonces déle el desafío de hacerlo! Indique claramente el resultado esperado. Por ejemplo, necesitamos ejecutar esta consulta 1000 veces por hora, lo que significa que debe poder ejecutarse al menos una vez cada 3,6 segundos (¡lo que probablemente sea un rendimiento terrible!)

Ha sido contratado para ser un experto técnico, no un experto en negocios. Como tal, sus objetivos profesionales pueden no ser lo que le gustaría que fueran. Debe explicar cómo lo que hace afecta al resto del negocio, al mismo tiempo que comprende cómo el resto del negocio afecta su trabajo. No recomendaría la gestión del rendimiento a menos que esté planeando despedirlo.

También podría investigar la posibilidad de un formateador de código automático. De esa manera, podría concentrarse en la programación y usar una macro o una pequeña utilidad para reformatear el código de la manera que le gusta en menos de un segundo. Con el SQL, estoy de acuerdo con él en que las consultas escritas directamente son malas, pero, por ejemplo, en PHP, puede usar PDO para ejecutar exactamente las mismas consultas con entrada desinfectada. ¡Esta es una buena práctica! Debería haber un compromiso en el que obtienes la velocidad que deseas y él obtiene el "buen código" que desea.

También sugeriría que haga un perfil del código para encontrar los cuellos de botella y convertirlos en una prioridad para la eficiencia. Al final del día, si su bonito código funciona rápidamente (y lo escribe rápidamente), no te importa, ¿verdad? Quiere que vea su punto de vista, así que demuestre que puede ver y valorar su punto de vista. Tendrán que reparar el daño causado a su relación profesional y es importante que ambos confíen el uno en el otro.

No hay nada intrínsecamente malo en escribir SQLcode, de hecho, en muchas circunstancias es lo correcto. Las bases de datos prefieren SQl bien escrito (que a menudo no es elegante a los ojos de un no experto en bases de datos) porque eso es con lo que fueron diseñadas para funcionar mejor. El código mal escrito, especialmente cuando está diseñado para que sea posible la inyección SQl, es malo, el código SQL bien escrito es bueno y, a menudo, necesario. El problema con un ORM es que pierde la capacidad de capacitar a alguien sobre cómo resolver los problemas difíciles para los que un ORM es una mala herramienta porque nunca aprenden los conceptos básicos de SQL.

Esto puede ser complicado. Depende mucho de lo que su comportamiento está afectando negativamente.


rendimiento del programa

Un buen programador debe comprender la separación de la interfaz y la implementación. Los requisitos son la "interfaz" por así decirlo del proyecto, y un buen diseño

Supongo que usted es al menos parcialmente responsable de los requisitos de este proyecto. Puede crear un requisito para que este script se ejecute en 6 minutos.

Mientras cumpla con los requisitos, no te importa lo que esté haciendo. (Esta es la implementación.)

Puede ayudarlo a ver que, desde el punto de vista de todos los demás (que no pueden ver su código fuente) , su programa es una porquería .


Tiempo de desarrollo

Esto es un poco más complicado. Por un lado, podría hacer tiempo para completar un "requisito" del proyecto, pero estimar el tiempo para completar un proyecto se deja (apropiadamente) a la persona que lo construye.

Este tiene que ver mucho con su desempeño laboral. Debe abordarlo como lo haría con cualquier otro problema relacionado con el desempeño laboral. Esto probablemente signifique una reunión seria, en la que expreses tus preocupaciones sobre su capacidad para terminar el trabajo a tiempo, etc. Aquí no hay soluciones fáciles.

El hecho de que este programador se niegue a trabajar en ese componente es una clara señal para mí de que se trata de una cuestión de responsabilidad del componente.

Desde el punto de vista de su cliente, su optimización es lo correcto: la caja negra que es su programa funciona mejor y su empresa como entidad es responsable de toda la caja.

Dentro de su empresa, las personas individuales son responsables de los componentes individuales, y cada vez que un componente se rompe, la culpa recae en el mantenedor de ese componente.

No se puede desvincular esa responsabilidad del poder de decisión.

Anular la decisión es su prerrogativa como gerente, pero al mismo tiempo asume toda la responsabilidad por la decisión, que incluye un registro en papel que documenta las objeciones de su programador y por qué fueron anuladas, con una copia para todos.

Su programador está prediciendo que esto tendrá consecuencias negativas en el futuro y está tratando de cubrir su trasero inferior.

Esto no es realmente una respuesta a la pregunta, sino un nuevo análisis del problema... ya ha habido mucho de eso.
@ReallyTiredOfThisGame, la respuesta es aceptar la responsabilidad de la decisión. Ninguna de las otras respuestas habla de eso.

Dígale que su trabajo NO es escribir programas per se; su trabajo es escribir código que agregue ganancias a la empresa.

Recuérdele Para que sea comercialmente viable como empleado, el código que escribe debe ser comercialmente viable. Si no puede hacer esto, entonces es una responsabilidad comercial para la empresa y será tratado como tal. Usted dice que es una empresa pequeña, por lo que existe la posibilidad de que pueda derribar toda la empresa.

Además, puede explicarle que puede escribir programas por diversión y placer (o para mejorar sus habilidades) en su tiempo libre, y muchos programadores lo hacen. Pero los programas escritos en el tiempo de la empresa deben generar ganancias para la empresa.

Si se niega a cambiar su estilo (posiblemente para hacer que el código sea menos atractivo pero que mejore sustancialmente el rendimiento), pregúntele cómo le gustaría que la empresa le pagara de la misma manera: solo el 10 % de su salario, pero usando un color realmente agradable. cheque impreso. Obra de arte, escrita a mano y firmada a mano por el CEO, puede colgarla en la pared :-)

Sí, las soluciones pragmáticas a veces acumulan deuda técnica -- ( wikipedia ) para brindar VALOR para los negocios.

Negarse a aceptar la deuda técnica es lo mismo que negarse a aceptar la deuda financiera: a veces, la solución válida es pedir dinero prestado para entregar el producto (incluso si más tarde necesita pagar la deuda).

Tener un código menos que idealmente mantenible pero con un mejor rendimiento es similar a pagar un crédito rotativo: permite que la empresa permanezca en el negocio.

Si le toma 10 veces más de su tiempo entregar una solución, solo merece el 10% del salario. Si no logra entregar valor para el negocio, debe ser reemplazado por alguien que sí lo haga. (Estoy seguro de que esto me dará algunos votos a la baja, porque es una droga directa y no un lenguaje cálido y confuso; oh, bueno, la vida es demasiado corta. Y sí, los votos a la baja están llegando a raudales. Es por eso que ya no contribuyo a este foro. ).

Esto no es realmente una respuesta a la pregunta, sino un nuevo análisis del problema... ya ha habido mucho de eso.
Si cambiara esto a 'dígale...' sería una buena respuesta. Necesita saber que su trabajo depende de que escriba código comercialmente viable.
Cambió. Obviamente, esto es algo que se debe discutir con el programador.
La pregunta OP es: ¿cómo explicar las prioridades comerciales a un programador que está convencido de que fue contratado para escribir un buen código, sin tener en cuenta el rendimiento? ¿Cómo mi primera oración NO responde esa pregunta?
"Esta oración es un resumen de lo que dijeron otras personas con muchas más palabras, y todo lo que hay que decir. Caso cerrado". - eso no se lee como una explicación para mí. Consulte Respaldar y no repetir otros
No estoy seguro de cómo crees que podría mejorarse mi respuesta. La primera frase es realmente todo lo que hay que decir. ¿Necesito explicar por qué la empresa necesita ser rentable?
Quiero decir, incluso me vinculé a la explicación de qué es la deuda técnica, y por qué y cuándo tiene sentido acumularla (qué programador se niega a entender). ¿Qué más hay que explicar?
Hola Peter, aunque puedes abordar esto en la primera oración, el OP está buscando cómo lidiar con esta situación. Una sola línea que le dice que haga algo sin explicar cómo debe hacerlo el OP no es muy útil para ellos; como otros han dicho, la pregunta es "¿cómo puedo explicar las prioridades comerciales?"
¿Qué tan difícil podría ser decir esa frase a ese programador? El programador está iluminado y cambia su enfoque, o no, y cambiará la empresa.
Voto positivo por el último párrafo. Todo el resto es basura.