¿Deberíamos persistir con un empleado que todavía escribe código incorrecto después de muchos años? [cerrado]

13

Estoy haciendo esta pregunta a los programadores de C ++ porque: a) Solo un programador de C ++ puede juzgar los méritos técnicos de los ejemplos; b) Solo un programador tendrá una idea del temperamento de otro programador que escriba código como este.

Recursos Humanos y los directores son conscientes de que hay un problema simplemente porque ven evidencia en el campo. Es mi decisión si le damos más tiempo al programador en cuestión. Muchos de los errores están en un nivel muy básico: mi pregunta (para los programadores) es si alguien que profesa ser un desarrollador senior de C ++ debería beneficiarse de una duda basada en muestras de su código actual. Los que no son programadores, incluso las personas que están fuera de la programación en C ++, no pueden juzgar esto.

Por antecedentes, me asignaron la tarea de administrar desarrolladores para una empresa bien establecida. Tienen un único desarrollador que se especializa en toda su codificación C ++ (desde siempre), pero la calidad del trabajo es abismal. Las revisiones y pruebas de código han revelado muchos problemas, uno de los cuales es la pérdida de memoria. El desarrollador nunca ha probado su código en busca de fugas, y descubrí que las aplicaciones podrían perder muchos MB con solo un minuto de uso. Los usuarios informaron grandes desaceleraciones, y su opinión fue: "no tiene nada que ver conmigo; si dejan de fumar y se reinician, todo vuelve a estar bien".

Le di herramientas para detectar y rastrear las fugas, y me senté con él durante muchas horas para demostrar cómo se usan las herramientas, dónde ocurren los problemas y qué hacer para solucionarlos. Estamos 6 meses en el camino y le asigné a escribir un nuevo módulo. Lo revisé antes de que se integrara en nuestra base de código más grande, y me consternó descubrir la misma codificación incorrecta que antes. La parte que encuentro incomprensible es que parte de la codificación es peor que la de un aficionado. Por ejemplo, quería una clase (Foo) que pudiera poblar un objeto de otra clase (Bar). Decidió que Foo haría una referencia a Bar, por ejemplo:

class Foo {
public:
    Foo(Bar& bar) : m_bar(bar) {}
private:
    Bar& m_bar;
};

Pero (por otras razones) también necesitaba un constructor predeterminado para Foo y, en lugar de cuestionar su diseño inicial, escribió esta gema:

Foo::Foo() : m_bar(*(new Bar)) {}

Entonces, cada vez que se llama al constructor predeterminado, se filtra una barra. Para empeorar las cosas, Foo asigna memoria del montón para otros 2 objetos, pero no escribió un destructor o un constructor de copias. Por lo tanto, cada asignación de Foo realmente filtra 3 objetos diferentes, y puede imaginar lo que sucedió cuando se copió un Foo. Y - solo mejora - repitió el mismo patrón en otras tres clases, por lo que no es un error único. Todo el concepto está mal en muchos niveles.

Me sentiría más comprensivo si viniera de un novato total. Pero este tipo ha estado haciendo esto durante muchos años y ha recibido capacitación y consejos muy centrados en los últimos meses. Me doy cuenta de que ha estado trabajando sin tutoría o revisiones por pares la mayor parte del tiempo, pero empiezo a sentir que no puede cambiar. Entonces mi pregunta es, ¿persistirías con alguien que está escribiendo un código tan obviamente malo?

usuario94986
fuente
15
Si ya viste que estaba escribiendo un código incorrecto, ¿por qué lo dejaste escribir su mierda durante 6 meses sin supervisarlo?
Billy McNuggets
44
En mi opinión, cuando ves a alguien haciendo un mal trabajo por un tiempo, NO PUEDES dejar que trabaje solo, incluso si solo se trata de depurar / reparar. Si es su voluntad mantenerlo en su empresa, DEBE supervisarlo y DESPUÉS ver si aún obtiene malos resultados de él. Dejarlo trabajar solo durante 6 meses sin mirarlo es un mal manejo de la OMI.
Billy McNuggets
3
@ user94986 Entonces, si pasas tiempo con él y le explicas que sus hábitos son malos, debes vigilarlo y, si nada cambia, no esperes 6 meses para hablar con él.
Billy McNuggets
44
Si no cree que las pérdidas de memoria sean un problema, no tiene sentido enseñarle a evitarlas y brindar herramientas que lo ayuden. El principal problema puede ser que comprende incorrectamente los objetivos y requisitos del producto.
maxim1000
2
Esta pregunta parece estar fuera de tema porque se trata de lo que efectivamente es el asesoramiento legal de RR.
Ingeniero mundial

Respuestas:

22

Mi consejo sería confrontarlo con este ejemplo en particular y ver qué dice. Si niega que haya algo malo con el código, me temo que hay poco que pueda hacer. Si acepta que cometió un error (incluso si está a la defensiva al respecto), entonces al menos hay margen de mejora. Si acepta el tiempo y el esfuerzo para mejorarlo, entonces usted o un programador sénior deberá sentarse y codificar hasta que todas estas tendencias se aplanen (prepárese para dedicar a esta persona durante al menos 1 mes).

Un mal programador, por lo general puedo trabajar, pero un programador que no puede mejorar, no puedo.

Neil
fuente
12
+1 para "Un mal programador, generalmente puedo trabajar, pero un programador que no puede mejorar, no puedo".
Sí, también, le diría al chico que es bastante serio. Parece que no le han dicho o no ha reconocido que hay un problema durante años. Venga a la conversación listo para señalar ejemplos de cosas que no debería haber hecho y cómo impactó la calidad de la aplicación. Si todavía no está dispuesto a confesar un problema con su código, probablemente lo dejaría ir. Y probablemente no le daría mucho tiempo para actuar juntos si lo hiciera. Definitivamente debe subrayar que su futuro en la compañía está en juego y que le falta una habilidad bastante crítica para un desarrollador de C ++.
Erik Reppen
@ErikReppen Estoy de acuerdo, pero también creo que los programadores pueden ser los tipos más tercos de la tierra. Si presiona demasiado, puede negar cualquier problema con su código simplemente por estar a la defensiva. Creo que es importante enfatizar la gravedad de la situación, pero aún así trataría de simpatizar con él. "Me di cuenta de este pequeño error. ¿También lo entendiste? ¿Supones que cometiste este mismo error en otras áreas de su programa?
Neil
@Neil La única forma de atravesar una pared de terco es una patada en el culo. Y hablo por experiencia como el lado obstinado de esa ecuación. Dicho esto, si es la primera vez que escucha que hay un problema con su código, sí, me volvería un poco más suave, pero parece que han intentado comunicar un problema al menos una vez antes
Erik Reppen
@ErikReppen Quizás, pero te arriesgas a que se adapte solo para sacarte de su cola. A ese ritmo, también podrías decir "Ponte en forma, o estás despedido". Al menos este enfoque descubre si es consciente de sus errores.
Neil
18

Entonces mi pregunta es, ¿persistirías con alguien que está escribiendo un código tan obviamente malo?

No. Yo despediría a cualquier desarrollador profesional de C ++ que careciera de la comprensión básica de la administración de memoria.

Si se trata de alguien que viene de Java o C # o algo así, les daría algo de libertad, pero esto es pura incompetencia.

Telastyn
fuente
99
No puedo entender cómo se puede votar esta respuesta. Despedir a alguien no es un asunto que deba tomarse a la ligera.
Florian Margaine
3
@FlorianMargaine - Claro, pero esto parece un caso claro. ¿Cuánto le está costando este empleado a la empresa la pérdida de ventas debido a pérdidas de memoria o vulnerabilidades de seguridad? ¿Cuánto tiempo perdido para probar / arreglar esta basura? ¿Cuánto en hacer que el OP los cuide? ¿Cuánto en tener otros programadores sufren de su mera presencia ? A menos que el empleado tenga una cantidad absurda de conocimiento de dominio (o chantaje), no hay forma de que reemplazarlo sea más costoso.
Telastyn
1
@FlorianMargaine, este tipo de empleado es el que no es despedido lo suficiente, paraliza a la compañía en una deuda técnica difícil de arreglar. Dice en grandes luces rojas: "No les importa, ¿por qué deberíamos?". ¿Sabes lo que diría el empleado que realmente quieres? "... pero me importa, así que necesito ir a un lugar que sí". A los malos ya no les importaba, así que permanecen en su oficina. DEBE eliminar a las personas que perjudican la productividad, más de lo que contribuyen. Esta no es una elección tomada a la ligera, sin embargo, es realmente una línea clara, no actuar es una acción clara.
JM Becker
13

No podemos responder la parte más amplia de su pregunta. A saber, si retiene o despide a ese empleado. Despedir a un empleado es difícil, pero esa es una decisión fuera del alcance de una comunidad como esta.

Actualizó su pregunta para restringir las respuestas a los programadores de C ++. Para mis antecedentes / calificaciones: corté mis dientes en C, y puedo codificar en C ++, C # y Java. Y me gusta perseguir las condiciones de carrera entre hilos porque creo que es divertido. Sí, me "vuelvo" un poco tonto.

Su respuesta y decisión se ajustan a esto: si alguien puede cambiar o no depende de la persona y si quiere cambiar.

Pero comencemos con algunas preguntas tuyas:

  1. ¿Le has preguntado sobre el código y el ejemplo que mencionaste? ¿Cuál fue su impresión de la crítica?
  2. ¿Le diste detalles durante esos 6 meses acerca de comprender la manipulación de la memoria y asegurarse de que su código no tuviera pérdidas de memoria?
  3. ¿Le proporcionó comentarios razonablemente frecuentes durante esos 6 meses para indicar si estaba progresando o no?
  4. ¿Explicó explícitamente que su antigua forma de codificación ya no era aceptable en el nuevo código?

Debe asegurarse de poder decir que sí a todas esas preguntas. Si no, todavía hay una carga de prueba de su parte para comunicarse con él.

Su respuesta a su reciente revisión será la parte más reveladora.

Si lo ha intentado y muestra algunos signos de progreso, tal vez necesite revisar su proceso de tutoría. En todo caso, tal vez deba considerar emparejarlo con un programador más experimentado para que pueda obtener comentarios inmediatos mientras toma decisiones de diseño. No soy fanático de la programación de pares, pero puede ser muy útil en un caso como este. Enviarlo continuamente para que haga más y más revisiones al código antiguo no siempre es una ruta práctica para el aprendizaje.

Si no lo ha intentado, entonces necesita comprender mejor su motivación. ¿No entendió que necesita esforzarse más? ¿Simplemente no le importa? ¿Hay otras áreas en el equipo donde sus habilidades encajarían mejor y está más interesado en eso? Si no le importaba intentarlo, entonces debes entender por qué.

A partir de ahí, sabrás si quiere cambiar y si puede cambiar. Ningún deseo de cambiar es equivalente a no poder cambiar. Si hay deseo y un grado de progreso, considere cambiar la forma en que está tratando de rehabilitarlo.


fuente
1
+1 por "Enviarlo continuamente para que haga más y más revisiones al código antiguo no siempre es una ruta práctica para aprender"
Bill
+1 para los últimos párrafos. El progreso logrado por alguien versus el esfuerzo invertido en guiar que alguien necesita tener en cuenta en cualquier juicio de desempeño.
Marjan Venema
10

Me temo que su código incorrecto no es el único problema en su equipo.

  1. ¿Quién revisa su código? ¿Por qué se escapó sin una advertencia por aceptar código con vulnerabilidad de pérdida de memoria?
  2. ¿Por qué las pruebas de estrés no encontraron este problema? ¿Los usas? Si es así, ¿por qué no están trabajando?
  3. Lo dejaron desatendido por un largo período de tiempo. ¿Por qué?
  4. No está usando las herramientas que le diste. ¿Cómo lo motivó a comenzar a usar las herramientas adecuadas?

Dices que ha estado en la empresa durante un período prolongado de tiempo. Despedir a esa persona rara vez es una buena idea (a menos que sea un empleado tipo Wally). Su conocimiento de las necesidades del cliente, los productos que posee, etc. a menudo es mucho más valioso que el código que escriben.

Soluciones:

  • moverlo a QA para que aprenda qué evitar
  • emparejar la programación con alguien que pueda señalar sus errores
  • esfuerzo extendido de control de calidad en su código
  • hacer que escriba pruebas de estrés, si ve que su máquina de desarrollo falla después de crear y destruir 10k de objetos, tal vez aprenderá
  • algunos / todos ellos arriba :)
Andrzej Bobak
fuente
3

Tomar la decisión de despedir a alguien es una decisión difícil para cualquiera. Sin embargo, su situación se ve agravada por varios factores:

  1. Parece que este desarrollador ha estado en la empresa durante varios años.
  2. El desarrollador escribe el código C ++ de todas las empresas.
  3. Parece que antes de ti nadie discutió el nivel de código deficiente con el desarrollador
  4. Como nuevo gerente, no tiene idea de quién / qué sabe el desarrollador en / sobre la compañía y cuáles son las ramificaciones políticas de despedir al desarrollador

Dicho esto, ha pasado los últimos 6 meses mostrando al desarrollador el error de sus costumbres y su nuevo código aún no ha mejorado.

En esta etapa, realmente necesita comenzar una gestión proactiva para que dentro de 3 meses tenga

  • Un programador decente de C ++ que sabe lo que está haciendo.

o

  • Terminado el desarrollador.

Para hacer esto, aunque necesita sentarse con el desarrollador, explicar lo que está mal por escrito / correo electrónico, explicar cómo puede mejorar el desarrollador y decir muy claramente que si no se materializa la mejora esperada, se terminará en 3 meses.

¡También debe tener muy claro que se espera la mejora a partir de este momento para el resto de su empleo en la empresa y no solo para el período de 3 meses!

También debe informar a su propio gerente y al Departamento de Recursos Humanos (si corresponde).

Durante este proceso, tendrá que administrar activamente al desarrollador y revisar las tareas / código cada 1-2 días y asegurarse de que estén a la altura, detallar los que no lo están y explicar qué se puede hacer para mejorarlos.

armitage
fuente
1

O no ha sido claro acerca de cuán en serio se toma su mala mano de obra (es decir, es posible que vea el tiempo que ha pasado con él como una opción si quiere mejorar en lugar de una necesidad absoluta), o tiene una increíblemente mala actitud que es insostenible. Si aún no está claro para este desarrollador que está considerando su posición sobre este tema, entonces debe explicarse (suponiendo que su liderazgo esté bien con su autoridad para finalizar). El choque con suerte traerá cambios.

Sin embargo, la decisión de empleo tiene implicaciones mucho más amplias que solo este tipo, debe considerar el impacto en el equipo. Si se permite que su actitud prospere, puede proporcionar resentimiento hacia los demás o hacer que otros sientan que este tipo de cosas también está bien. Sin embargo, desde el punto de vista del equipo, debe quedar absolutamente claro que si fue, fue por las razones correctas y tuvo una amplia oportunidad de mejorar.

Una joya que compré en un curso hace años es el hecho de que las personas con conocimientos técnicos que otros no tienen pueden liderar la administración para darles holgura. Es malo para el equipo. Puede tener miedo de perder el único desarrollador de c ++, pero pueden ser reemplazados. Obviamente, existen riesgos inherentes si conoce bien los productos lanzados, pero a menudo he visto a personas con conocimientos técnicos / de productos aparentemente irremplazables reemplazados más fácilmente de lo previsto. Los equipos y las organizaciones a menudo pueden llenar los vacíos que inicialmente parecen difíciles de llenar. Por supuesto, si él no tiene habilidades de C ++ o conocimiento específico de la organización que cree que será difícil de reemplazar, ¡hay mucho menos problema!

Wayne M
fuente
1
Sospecho que este tipo se sorprendería al descubrir que su gerente está pensando en despedirlo. Algunas personas a las que solo debes golpear la cabeza con una tabla y decirles que tienen que mejorar o serán despedidas.
HLGEM
0

Por supuesto que no deberías. Recuerde, esto no es una organización benéfica, está intercambiando dinero por trabajo. Si no está retrasando su parte del trato, entonces, como cualquier transacción, dejaría de pagar.

MetaGuru
fuente
-1

Si desea darle una oportunidad, desarrolle una prueba estandarizada que reúna métricas sobre pérdida de memoria. Monitoree su progreso semanalmente, insistiendo en ver el código que ha cambiado, y busque mejoras. Si no puede arreglárselas en ese punto, despide a la inútil invectiva.

Jack Aidley
fuente