¿Cómo puedo hacer que un nuevo desarrollador mejore significativamente su código?

Soy el líder técnico y tenemos una contratación reciente que tiene muy poca experiencia. También es muy testarudo y orgulloso de ser un novato y su estilo de código difiere demasiado del del equipo. Pero aún produce código de baja calidad en comparación con los otros empleados.

Sin embargo, esto no es un problema: se supone que debo detectar esos problemas y enseñarle a mejorar en revisiones de código, sesiones de retroalimentación, etc. El problema es: cuando reviso su código, tengo que dejar demasiados comentarios hasta el punto de sentirse como si me estuviera excediendo. Algunas veces dejé pasar algunos problemas, pero esto siempre termina costando el tiempo de otro desarrollador (o el mío).

También probé sesiones de comentarios uno a uno para evitar revisiones públicas, pero fue infructuoso, ya que el desarrollador estaba tratando de justificar cada comentario hasta el punto de descarrilar la sesión.

¿Cuál es la mejor manera de lidiar con esto? Recibo buenos comentarios del equipo con respecto a las revisiones y estoy evitando algunos problemas de producción, pero me siento como el "policía malo" cada vez que entro en sus solicitudes de incorporación de cambios.

¿Cuántos desarrolladores hay en las revisiones de código? Siempre empiezo una revisión de código recitando las reglas básicas, por ejemplo, para tratar la crítica de manera abstracta; hacerlo impersonal. Cuando otros desarrolladores se sometan a la evaluación del código, asegúrese de que el nuevo desarrollador también critique a las personas menos experimentadas. Esto ayudará a que el nuevo desarrollador converja en las expectativas un poco más fácilmente que interminables 1 a 1.
¿Ha considerado herramientas automatizadas para ayudar? Si los problemas están bien definidos, existen muchas herramientas que pueden señalarlos automáticamente. El desarrollador puede tener puntos de vista contradictorios sobre los que dejas pasar o pasas por alto, "pero no fue un problema la última vez, ¿por qué dices que lo es ahora?". Es difícil saber los problemas exactos, pero al menos de esta manera pueden obtener comentarios instantáneos y potencialmente solucionar muchos problemas antes de que los veas.
Especialmente en lo que respecta al "estilo de código", tener controles automatizados como Checkstyle es una buena idea incluso con desarrolladores experimentados .
Para los temas planteados en la revisión del código, ¿son correcciones objetivas que están claramente delineadas o algo subjetivo que es un estilo personal? Si es objetivo, ¿este desarrollador tiene acceso a la documentación adecuada de lo que se espera de él? Un par de muestras, algunas menos graves, algunas de las más graves, y podemos medir mejor lo que se está revisando.
+1 para análisis de código automatizado. Quitamos mucho calor del proceso de revisión del código al delegar la primera ejecución a Sonar. Arregle las banderas generadas automáticamente y luego lo veremos.
¿Involucró a la gerencia? ¿Cuáles son las expectativas establecidas por su superior con respecto a la adhesión al estándar común? ¿Cuáles son las expectativas de la adherencia a las revisiones del código y la antigüedad en el trabajo? Esas cosas deben acordarse explícitamente antes de que el nuevo desarrollador comience a codificar.
¿Has probado a preguntarle qué vas a señalar en su código?
"¿Está dispuesto a escribir código que sea aceptable para su empleador, independientemente de si le gusta?" En caso afirmativo, entonces "Bien, entonces actúe según los comentarios que reciba". Si la respuesta es no, sugiera el trabajo por cuenta propia como una carrera profesional más adecuada e infórmele a Recursos Humanos/a su jefe.
@EliottRobson tenemos muchas herramientas automatizadas, incluidas reglas de linter personalizadas, herramientas de terceros. Los principales problemas son la introducción de errores, problemas de seguridad, prácticas extrañas de nomenclatura de variables, pruebas mal escritas y sobreingeniería.
@mtw "prácticas extrañas de nomenclatura de variables, pruebas mal escritas y sobreingeniería" Tengo exactamente el mismo problema. Pero un poco peor porque solo soy un desarrollador senior.
Como desarrollador que ha estado en un rol principal/principal durante más de 10 años, para mí, lo más preocupante que mencionaste es que tus esfuerzos para dar retroalimentación fueron infructuosos. Parece que el problema no es la falta de aptitud, sino la falta de humildad. Ninguna cantidad de procesos automatizados o documentados puede arreglar eso. Prefiero un desarrollador con una aptitud media y dispuesto a aceptar sugerencias a uno con una aptitud superior a la media que no esté dispuesto a admitir que ha cometido un error. Este último me ha causado más problemas en nuestro entorno de producción que el primero.
Una cosa acerca de aprender profesionalismo en cualquier trabajo es que no se trata de usted y, a veces, las decisiones que no son óptimas para usted son adecuadas para la organización. No le estás haciendo ningún favor a esta persona al ignorar el meta-problema aquí: digamos que lo convences de que tu estilo es "correcto". Él/ella va a meterse en otra pelea con el próximo revisor en el próximo trabajo. Concéntrese en el ángulo de la profesionalidad, es decir, "tendrá varios trabajos a lo largo de su carrera, la mayoría de los cuales, si tiene suerte, tendrán una guía de estilo interna y tendrá que adaptarse a esto repetidamente".
@RicardovandenBroek eso es lo que más me ha preocupado también. Si fuera un desarrollador muy experimentado con la misma actitud, probablemente tendría los mismos problemas.
Hay una solución fácil: ¡no contrate a ese tipo de trabajadores!
@David Estoy de acuerdo con tu punto. Desafortunadamente, fue contratado por mi superior, pero si se hubiera comportado en la entrevista como se comporta en el trabajo, definitivamente habría marcado su solicitud. Estoy a favor de tener Juniors en el equipo, pero si no están entusiasmados con aprender más o no aceptan comentarios, entonces no vale la pena tenerlos en el equipo.

Respuestas (13)

Sobre ser un "policía malo"

Como se mencionó anteriormente, el camino a seguir es separarse usted mismo o cualquier otra persona de los temas que se plantearán. Esto significa:

  • Sus reglas deben ser claras y escritas, ya sea en un wiki, una guía de estilo, documentos de la empresa, lo que sea que esté usando. Este material debe ser accesible para el desarrollador en cuestión.
  • Cuando señale errores en una revisión, no use frases que lo involucren de alguna manera. En cambio, culpe a sus documentos, como la guía de estilo, y a sus procesos en general. Un ejemplo de esto puede ser, "Línea X: De acuerdo con la guía de estilo [enlace], las variables miembro estáticas deben seguir el patrón Y".

No podrá evitar por completo la sensación de policía malo , esto es parte de las revisiones. Sin embargo, con un tono cuidadoso, puede establecer una cultura de revisión, donde está claro que no se cuestiona a un desarrollador, sino solo al código en sí. Todas las partes deben entender que una revisión no se trata de criticar a una persona o su trabajo, sino simplemente de mejorar el código y, por lo tanto, su producto.

Asignación de tareas adecuadas

Este es probablemente mi punto más importante y el que creo que justifica mi respuesta en primer lugar, ya que hay redundancias en todas las respuestas publicadas:

Otra respuesta de @ Ertai87 menciona que corregir todos los errores menores es agotador, supongo que tanto para el revisor como para el revisor. También menciona que hay tanto que corregir, que todo el ejercicio se descarrila un poco. La respuesta a la que me refiero establece que se centre en los problemas principales e ignore los problemas menores.

En mi opinión, este no es el enfoque correcto.

Cuando las tareas resueltas por el desarrollador en cuestión están tan llenas de problemas que revisarlas se convierte en una tarea enorme, entonces quiero argumentar que estas tareas son demasiado grandes para el desarrollador en cuestión. No están listos y necesitan que se les asignen tareas más pequeñas y que primero aborden las cosas menores. Eso significa, asignar, por ejemplo , correcciones de errores que presumiblemente solo vienen con unas pocas líneas de código, solo funciones muy pequeñas y otros problemas por el estilo. De lo contrario, pasará un montón de tonterías a su base de código porque está tan ocupado arreglando sus errores principales que no puede darse el lujo de arreglar todas las tonterías menores. En última instancia, es probable que este sea el tiempo que dedican otros empleados, que terminan arreglando todas estas cosas cuando, a su vez, trabajan en los mismos pasajes de código.

No debe esperar que su junior esté al mismo nivel que los demás, ya que el proceso de mejora debe ser gradual. Todavía son empleados, por lo que puede esperar que aporten valor a la empresa, incluso si ese valor es relativamente menor y solo aumenta con el tiempo. Así que asígneles tareas más pequeñas y permítales aprender lo básico primero. Cuanto mejor se vuelvan, mayor será su área de responsabilidad y, por lo tanto, sus tareas también pueden aumentar en importancia.

Pregúntate esto. Con el tiempo dedicado a arreglar el código de ese desarrollador, ¿cuánto tiempo en comparación habrías dedicado a hacerlo tú mismo?

Distribuir reseñas

Como líder de equipo, no está escrito en piedra que debe revisar todo el código. Todos los empleados experimentados pueden realizar revisiones, tiene la opción de utilizar esta táctica. Una forma común de hacer esto es tener un conjunto de revisores y un intervalo de tiempo designado, por ejemplo , una vez a la semana, cuando se procesan las revisiones. Durante ese tiempo, todos los miembros del conjunto deben revisar los problemas que están en espera de aceptación/rechazo.

Esto tiene tres ventajas principales:

  • La revisión de código es una tarea que requiere mucha concentración. Solo puede hacer una parte por su cuenta durante un día antes de comenzar a pasar los errores a producción. Más gente en esta tarea significa más concentración como recurso.
  • No importa qué tan experimentado sea, es probable que haya algunos patrones en su código y algunos errores que repite y de los que no está al tanto. Esto es cierto para sus compañeros también. Cuando varias personas revisan a los miembros de su equipo y entre sí, al menos el revisor puede ver otros patrones y otras formas de resolver el problema X. De esta manera, el conocimiento se distribuye en su equipo.
  • Cuanta más gente haga reseñas, menos corre el riesgo de convertirse en el policía malo .

Sin embargo, diré que esto puede depender de la empresa y los procesos implementados. Algunos lugares de trabajo pueden requerir que un líder de equipo apruebe todos y cada uno de los códigos y algunos lugares de trabajo incluso pueden hacerlo debido a una calificación específica que solo un experto aporta. Un ejemplo de esto podría ser la seguridad en un entorno médico. Si no existen tales requisitos especiales, pero los procesos actualmente requieren que usted revise personalmente todo el código que va a producción, entonces esto se puede plantear con la administración argumentando a favor de una mayor eficiencia del equipo. Solo usted sabrá cómo funcionan las cosas en su empresa, use su mejor juicio para determinar si se puede lograr la distribución de reseñas en su lugar de trabajo.


Una nota personal: cuando comenzamos las revisiones de código en nuestra empresa, también hubo baches al principio, porque es difícil no sentirse criticado cuando se rechaza su solicitud de fusión con un montón de cosas que corregir. A estas alturas, el equipo valora las revisiones de código. Personalmente, he aprendido mucho al revisar mi código, al igual que mis compañeros.

Sobre el comportamiento defensivo

Hay algunas cosas que se pueden discutir y otras que no requieren debate. Discutir esta o aquella arquitectura no es raro. Al hacerlo, es importante tener una buena razón por la que desea cambiar la implementación X a la implementación Y. Simplemente decir "esto es mejor" es insuficiente. Por supuesto, puede seguir el camino de la autoridad, pero es probable que esto lo desmoralice y muestre una falta de perspicacia. Por otro lado, cuando su equipo desarrolló su guía de estilo, espero que haya pensado un poco en por qué decidió que quería hacer las cosas X de la manera Y. Estas cosas no deberían terminar en debates interminables cada vez, al menos si el consenso del equipo sobre el asunto no ha cambiado.

En general, el comportamiento defensivo no es un problema tan rápido o simple para resolver en mi experiencia. Sugiero hacer charlas uno-a-uno de vez en cuando. Similar a las revisiones de desempeño, pero con la intención de ser una conversación no interrogativa entre dos miembros del equipo, en lugar de un jefe que le da el negocio a su subordinado. Este es un momento en el que puede compartir sus quejas sobre el desempeño del empleado sugiriendo mejoras. Es importante escuchar su versión también. ¿Están contentos con lo que están haciendo? Si no, ¿cuáles son los problemas en su mente? ¿Cómo se pueden resolver?

Dicho esto, si todos esos intentos no dan fruto, entonces la forma autorizada puede ser todo lo que queda. En este caso, explíquele al desarrollador que su desempeño no es satisfactorio, por difícil que parezca. Esto es básicamente un disparo de advertencia y en este punto consideraría dejar ir a esa persona.

Entiendo que esto puede sonar duro, pero en última instancia, todos los empleados necesitan aportar valor a la mesa con el tiempo. El valor de un junior al principio puede ser apenas superior a cero, incluso puede ser una inversión en productividad futura, sin ninguna ganancia inmediata. Sin embargo, si pasa el tiempo y no se observa ninguna mejora, entonces la empresa está desperdiciando dinero y el empleado no es el adecuado para usted.

Sin embargo, hay muchas cosas que probar antes de que esto suceda, algunas mencionadas anteriormente. Debe preguntarse si puede mejorar su comunicación con ese empleado y partir de ahí. ¿Estás expresando cosas que los obligan a adoptar una postura defensiva? Si el desarrollador resulta ser un activo para la empresa que solo se vio obstaculizado por la mala comunicación entre ellos y usted, todos ganan una vez que esto se reconoce y se resuelve.


Otra nota personal: he estado trabajando y enseñando bastante a jóvenes en mis últimas dos empresas, en su mayoría estudiantes de licenciatura y maestría, dando los primeros pasos de codificación para aplicaciones del mundo real, pero también programadores autodidactas. como juniors con un trasfondo educativo diferente. Una cosa que muchos estudiantes aprenden después de dar este paso es que las habilidades técnicas, sin importar cuán bueno sea, son parte de una ecuación más grande. Las habilidades blandas son más importantes y deben ponerse al día si es necesario.

Hoy en día filtramos a los candidatos evaluando su carácter más que su habilidad técnica. Tienen una educación similar y nos basamos en este hecho. Sin embargo, la compatibilidad de personalidades es muy importante, porque una manzana podrida puede envenenar toda la cesta. Hasta ahora, principalmente al promover una cultura empresarial muy acogedora, hemos podido integrar a todos nuestros estudiantes y cada uno de ellos se convirtió eventualmente en un activo, pero nos tomamos nuestro tiempo con ellos y no asignamos a alguien que esté aprendiendo el cuerdas tareas gigantes. Como se dijo, el progreso es incremental.

Espero que este muro de texto te ayude de una forma u otra. ¡Buena suerte!

Excelente respuesta! También recomendaría este libro, Code Complete 2, para ayudar a hacer listas de verificación y guías de estilo. amazon.com/Code-Complete-Practical-Handbook-Construction/dp/…
+1 bien pensado y señala cómo el equipo en su conjunto es importante, la habilidad se puede mejorar fácilmente, la personalidad es mucho más difícil.
Sobre el tema de los lugares de trabajo donde se requiere que un cliente potencial revise: por lo general, aún es factible que alguien más en el equipo lo revise primero, para el cumplimiento general y la calidad, y luego, una vez que alcance un estándar aceptable, haga que el cliente potencial lo revise para cualquiera que sea su la experiencia específica es. En algunos casos, eso podría implicar revisar todo en detalle, pero al menos reduciría la carga de trabajo del líder.
Habiendo tratado este problema yo mismo en múltiples ocasiones, apoyo especialmente la idea de asignar tareas adecuadamente. Alguien que aún no entiende cómo el equipo organiza el código, los estándares locales, las convenciones de formato, etc... realmente no debería estar escribiendo (por ejemplo) modelos y clases completos. O deberían hacerlo sabiendo que deben imitar los patrones y hábitos que se muestran en otros lugares, porque cuando se trata de código, lo más importante es la consistencia.
Una guía de estilo no necesita justificación más allá de: "Tomamos una decisión arbitraria y nos atenemos a ella para mantener una base de código consistente". Por supuesto, es preferible tener una justificación adecuada, pero una parte sustancial de la motivación para tener una guía de estilo es hacer que el código sea consistente.
@ConorMancone sí, los lugares de trabajo igualitarios son geniales cuando todos están al mismo nivel o al menos hay un nivel básico general que les permite elegir tareas de manera responsable. Puede volverse bastante terrible cuando la experiencia varía demasiado, pero todos pueden hacer todas las tareas disponibles, incluso si todos siguen las reglas y, desde su perspectiva, hacen lo mejor para el equipo.

Si hay tantos errores en el código, tal vez una revisión del código sea demasiado tarde para detectarlos. Tal vez necesites dar un paso atrás. Hay algunos enfoques alternativos que podría tomar:

  1. Capacitación. No tiene que ser un curso. Podría ser un libro, una serie de videos, un sitio de ejercicios.

  2. Orientación personalizada. En lugar de señalar repetidamente los mismos errores en las revisiones de código, tal vez lo lleve a un lado y explique los más comunes con más detalle.

  3. Programación en pareja. Déjalo seguir a algunos de los otros desarrolladores. Es la forma más rápida de adquirir el estilo de código interno.

  4. Tutoría. Asigne oficialmente a otro desarrollador como mentor para ayudar con las revisiones de código. Idealmente, esto debería ser algo en lo que ambas partes estén de acuerdo.

1. requiere que el individuo quiera mejorar, lo que no parece ser el caso aquí. 2. parece haberse hecho en exceso. 3. Puede ser una opción pero costosa. 4. otra vez - necesita cooperación. Y te olvidaste 5. : Déjalo ir.
@Fildor La idea de que la programación en pareja es de alguna manera costosa es un gran error. La creación de software no es una línea de producción en la que todos deben estar ocupados y utilizarse al máximo. Es un trabajo de diseño creativo. Y los mejores diseños provienen de la colaboración y la comunicación.
@Euphoric Sé lo que quieres decir. He hecho pp antes. A veces lo hago de vez en cuando. es caro _ Eso no tiene nada que ver con si esos gastos están justificados o crean un ROI más adelante. Además, en este caso, pp no ​​tendría los beneficios ni la intención que describe. Sería simplemente cuidar niños. Cuidado de niños caro.
@Fildor, ya hay un costoso cuidado de niños: solo ocurre durante la revisión del código cuando el desarrollador cree que ha "terminado" y está a la defensiva de sus decisiones. En mi experiencia, cuanto antes se da la retroalimentación en el proceso de desarrollo, es más probable que se tome bien, por lo que cambiar a la programación en pareja por un tiempo podría generar mejores resultados sin gastar mucho más tiempo.
@ParkerCoates No argumentó en contra de eso. Puede valer la pena intentarlo.
@ParkerCoates Estoy de acuerdo en que la programación en pareja es una opción válida, pero también depende mucho del carácter. Conozco personas que se cierran mentalmente cuando necesitan emparejar un programa, la presencia de otro les perturba en sus pensamientos o les hace cambiar al modo ejecutor ("está bien, dime qué escribir"), esto último suele suceder especialmente con jóvenes o personas que se sienten inferiores a los demás o que están muy a la defensiva y evitan la confrontación directa. Nuevamente, por todos los medios, considéralo o pruébalo, pero como muchas herramientas, su utilidad depende del contexto.

Se supone que el revisor de código es el "policía malo". Ese es tu trabajo. Si te sientes como un "policía malo", eso es algo bueno y debes aceptarlo. Dicho esto...

  1. Los desarrolladores junior cometen muchos errores. Señalarlos a todos es agotador, frustrante y desmoralizador. Si, por ejemplo, nombran una variable incorrectamente, o usan una búsqueda lineal en lugar de una búsqueda binaria para un conjunto de datos lo suficientemente pequeño, o no escribieron una prueba unitaria para un fragmento de código que cree que funciona correctamente, probablemente no valga la pena discutirlo. Guarda tu energía para problemas serios, al menos en la primera pasada...

  2. Haz varias pasadas. En el primer paso, observe solo los problemas más críticos. Luego, deje que el desarrollador los arregle y pase a los siguientes problemas más graves. Es posible que desee hacer 3-4 pases en un PR para solucionar todos los problemas. Demasiados temas es desmoralizador y confuso de leer.

  3. Señale cuando el desarrollador hace algo genial que le gusta. También puede ser alentador en su revisión de código si agrega un comentario como "¡Oh, esa es una manera genial de hacer un buen trabajo!" de vez en cuando.

  4. Reconsidere si tal vez sus prácticas de codificación son demasiado estrictas. Si tiene algo como "cada variable int tiene que terminar con la palabra Int", tal vez sea una restricción tonta que debería considerar relajar. ¿Cuántas de sus reglas son estándares de la industria y cuántas son esotéricas?

  5. Si todo lo demás falla, a veces hay que poner el pie en el suelo. Usted es el revisor de código. El código no se fusiona sin su consentimiento. También eres el mayor del equipo, él es el menor. Llega un punto en el que simplemente dices "Soy mejor que tú, haz lo que digo". Trate de no sacar la tarjeta de antigüedad con demasiada frecuencia o se volverá tóxica y desmoralizadora, pero puede sacarla de vez en cuando cuando sienta que lo necesita. Si vas a sacar la tarjeta de antigüedad, asegúrate de estar 100% seguro de que tienes toda la razón. Si saca la tarjeta de antigüedad y resulta que está equivocado, perderá mucho prestigio, tanto con este desarrollador como con su jefe y equipo. A nadie le gusta el tipo que lloriquea y se queja y luego, cuando se sale con la suya, hace que la producción se derrumbe.

De hecho, nombrar incorrectamente una variable podría ser aún peor si engaña a un mantenedor sobre lo que está sucediendo en el sistema.
@Kevin Pero usar una búsqueda lineal para un conjunto de datos lo suficientemente pequeño no es un problema ... Es más fácil de implementar, más fácil de verificar, más fácil de entender (para revisores y futuros lectores) y es posible que no necesite ser probado. Ha intercambiado una eficiencia marginal que podría no importar por una tonelada de tiempo ahorrado. $$$. Ciencias económicas. Además, posiblemente sea una solución más rápida para algunos n < N. Estas son cosas en las que un revisor de código experimentado debería pensar antes de gastar $$$ y presionar el botón "rechazar".
Una cosa: recomendaría dar un paso atrás en 'hacer pases múltiples', y primero averiguar si el junior tiene un problema con muchos comentarios a la vez que lo hacen sentir abrumado, o si los pases múltiples le darían al junior la sensación de que ' nunca es lo suficientemente bueno' o molesto por tener que ir y venir tanto (definitivamente caigo en la última categoría, me molestaría mucho si descubro que alguien ya sabía que algo andaba mal pero lo guardó para después de 3 años atrás, y -adelante mientras que podría haberlo arreglado la primera vez también). Es una buena estrategia para los primeros, no para los segundos.
@Tinkeringbell para enmendar, no todos saben de qué manera los frustra más antes de probarlo, PERO al menos dejaría en claro que habrá varias rondas, por lo que a) el otro desarrollador ya puede considerar buscar la guía de estilo en los suyos y mejoran más de lo explícitamente mencionado yb) saben que viene más y no se van a hacer después de esa ronda. Es más frustrante cuando ya cerraste mentalmente el tema que si sabes que aún no lo has hecho.

La respuesta es un poco mezquina, pero... todo se está alineando en el bote de "hacer todo lo posible por hacer cumplir la ley" , por mucho que odie verlo de esa manera.

Quiero decir, has dicho:

  • Él "produce código de baja calidad" (incluso aparte de las diferencias de estilo)
  • Las cosas que ya ha dejado pasar le han costado a sus otros desarrolladores tiempo innecesario.
  • Es "muy inexperto".
  • Es obstinado y no está dispuesto a cambiar.

La razón por la que señalo estas cosas es... ¿Qué pasaría si de repente simplemente dijeras: "¿Sabes qué? Este tipo no puede pasar nada de su código a producción hasta que el código se ajuste por completo a nuestros estándares".

No es que el desarrollador esté produciendo un montón de código increíblemente productivo y que sus estándares se consideren molestos y retrasen los resultados de la empresa. No es que el desarrollador sea receptivo a cambios no forzados y que este problema desaparezca después de otros meses. No es que el desarrollador esté publicando un código que no le cuesta el tiempo de mantenimiento innecesario del otro desarrollador debido a las desviaciones de los estándares.

... y tan triste como es? No es que el desarrollador sea un activo extremadamente valioso para la empresa. Eso es exactamente lo que sucede cuando combinas "Jóvenes sin experiencia" con "Renuencia a aprender o cambiar".

Debido a todo esto, lo mejor que puede hacer es trazar una línea y decir: "No puedes promocionar el código a menos que se ajuste por completo a los estándares. Punto. Tendrás que empezar a seguir los estándares cuando compongas tu código , o comience a presupuestar tiempo para reescribirlo antes de que pueda ponerlo en producción". Y no dejes que nada se escape.

Es probable que el desarrollador odie eso . Quizás terminen mejorando y escribiendo código de calidad. Tal vez no lo hagan. Pero... esa es la parte más triste. Un joven sin experiencia que se niega a aprender o cambiar y decide dejar su grupo no es un resultado tan terrible.

EDITAR: Oh, algo más que olvidé agregar: son un junior "muy inexperto". Si bien definitivamente no voy a decir: "Nunca escuches a los jóvenes porque no tendrán nada que aportar", no tiene nada de malo decir: "Escucha, sé mucho más sobre esto y te digo : esta es la forma en que opera nuestro grupo, y este es el estándar. Debe cambiar su código para que coincida", y luego pasar al siguiente problema en la revisión del código.

¿Cuántas de estas reglas de estilo están realmente escritas?

Mi organización (a veces) revisa el código, pero uno de los problemas es que no seguimos ninguna regla significativa con respecto a la autoría del código. Puede obtener comentarios completamente diferentes (y con frecuencia contradictorios) dependiendo de quién haga la revisión. Tampoco ayuda que la mayor parte del código se haya escrito antes de que llegara alguien del equipo actual, lo que significa que nada de eso se alinea y usar el código anterior como ejemplo no funcionó.

Para que la revisión del código sobre estilo/organización funcione, es necesario que existan reglas claras. Es increíblemente frustrante tratar de adherirse a reglas que son casi "simplemente conocidas" dentro del equipo. Imagine tratar de replicar una pintura mientras la ve a través de la niebla.

En el caso de su desarrollador junior, podría simplemente decirle que el código debe "adherirse a la guía de estilo" y enviárselo en lugar de hacer un aluvión de comentarios repetidos.

No debe detener las revisiones de código, pero también debe asegurarse de que el nuevo desarrollador esté en una posición razonable para saber cuáles son las reglas.

Esto está bien si los problemas de revisión de código son "usar mayúsculas y minúsculas" o "sangrar usando tabulaciones en lugar de espacios". Pero si el desarrollador tiene muchos errores o código que no incluye la verificación de errores, eso no se puede cubrir con una guía de estilo.
Los errores de @DaveG no lo serían, pero las pruebas unitarias para verificar los errores sí lo serían. Las reglas de manejo de errores también estarían en dicha guía. Las guías de estilo de código probablemente se llamen con mayor precisión pautas de desarrollo.
En lugar de escribirlos usted mismo , también puede usar algunos estándares de codificación de uso común (con ajustes menores, si lo desea). Esto también podría facilitar que los desarrolladores experimentados se unan a su equipo, ya que es más probable que ya hayan estado usando esos estándares y hace que sea menos probable que no estén de acuerdo con un punto determinado.
El siguiente paso sería usar herramientas automatizadas para analizar que el código sigue los estándares (por ejemplo, un linter). Ser capaz de ejecutar algo que produce una lista de problemas en algún código es mucho más fácil que encontrar esos problemas usted mismo según lo que dice un documento de 10 páginas. Algunas de estas herramientas también pueden identificar algunos errores.
Edición sugerida: "¿Cuántas de estas reglas de estilo están realmente escritas?" -> "En realidad escribe estas reglas de estilo". La declaración enfatiza que estás recomendando algo, mientras que la pregunta parece más conversacional o como si estuvieras pidiendo una aclaración.
"Escribir todo" es la razón por la cual los sistemas legales son tan complicados y propensos a lagunas. (¿Debería escribir "los nombres de las variables deben estar en inglés"? ¿Qué hay de los comentarios? Vaya, ahora tenemos un vacío legal en el que los nombres de las funciones aún pueden estar en klingon, o alguien ha nombrado una variable con un nombre_de_variable_muy_largo_definitivamente_en_inglés). Es por eso que tenemos derecho común, también conocido como código previamente escrito. Si nadie en su equipo sigue el código escrito previamente y todos dan comentarios contradictorios, no tiene ninguna ley, solo tiene anarquía, y ese es un problema diferente.
@ user3067860 los sistemas legales tienen que manejar a las personas que intentan violarlos activamente. Asumiendo un esfuerzo de buena fe por parte de los desarrolladores, las pautas de desarrollo no necesitan ser tan largas.
@MatthewGaiser Ese es mi argumento, ya que veo muchas respuestas que dicen que no debe haber suficientes reglas escritas explícitamente.
OP aquí. El "estilo de código" no se aplica solo a la estructura superficial. Tenemos linters. También estoy de acuerdo con @user3067860 en que no deberíamos estar obligados a escribir todo para que una de cada veinte personas no lo rompa.
@mtw He visto un código que es el equivalente a "Nací a una edad muy temprana"... técnicamente correcto, pero tampoco lo hagas.

Hay muchas buenas respuestas a esta pregunta, voy a agregar algunos pensamientos que no he visto en las otras respuestas.

  • ¿Sus estándares de codificación se desvían mucho de los estándares del lenguaje? Si es así, será más difícil lograr que los desarrolladores lo sigan, especialmente los nuevos desarrolladores que tienen dificultades para entender el código.
  • Si sus estándares de codificación no se desvían mucho de los estándares de idioma, puede señalar que son los estándares de idioma, y ​​será lo mismo para la mayoría de las empresas.
  • ¿Utiliza herramientas para hacer la mayor parte posible de la revisión de forma automática? Dar formato a las plantillas en el editor resuelve muchas cosas. El análisis de código estático ayuda con mucho más.
  • Las revisiones de código son para mejorar el código ahora y en el futuro. Debe asegurarse de que el desarrollador pueda aprender. Una forma es dar crédito cuando algo es bueno. Otro para permitir que el desarrollador revise el código de otros, de esa manera es posible ver un buen código. Tenga en cuenta que no sugiero necesariamente que el desarrollador junior deba ser el único revisor.
  • La mayoría de las personas recién egresadas de la universidad o lo que sea no saben cuánto no saben y creen que lo saben todo. Si bien esto puede ser frustrante, es así, y será mejor cuanto más aprendan que no saben. La actitud mejorará al mismo tiempo.
  • Creo que debe esperar que algún código no cumpla con todos sus estándares, especialmente para un desarrollador junior. Concéntrese en lograr que las partes importantes cumplan con los estándares y agregue comentarios adicionales cuando corresponda. De esa manera, el desarrollador no sentirá que nada es lo suficientemente bueno y se dará por vencido.
OP Aquí: Nuestros estándares de código se derivan en gran medida de lo que usan los grandes actores de la industria. Las desviaciones se encuentran principalmente en cosas extrañas que no pueden ser capturadas por linters y otras herramientas. Sinceramente, veo esto como un intento de cumplimiento malicioso.

No he visto esta opción en ninguna parte... pero si no tiene algo como la aplicación automática de linting/stylecop como parte de su proceso de desarrollo, este sería un excelente primer paso, ya que detectará una gran parte de los problemas. sin que nadie tenga que sentirse como un "policía malo".

Póngalo en el código como parte de una compilación: si se viola alguna de las reglas, como si tal vez esperara un espacio con un si, es decir, en lugar de o si if (...)una if(...)variable no debería tener un guión bajo y debería ser camelCase en lugar de PascalCase y eso rompe la compilación si se viola... entonces si violan la regla y les explota, sabrán qué hicieron mal y qué deben hacer para solucionarlo sin tener que afectar el tiempo de nadie más.

Con esto en su lugar, los sentimientos o el orgullo de nadie están siendo heridos innecesariamente porque sus problemas menores están siendo capturados por la biblioteca de aplicación de estilo y no por otra persona. Esto también le permitirá concentrarse en los olores del código y en problemas más importantes.

Cuando llegue el momento de poner ojos reales en su código, si algo no está bien, dígalo y explique POR QUÉ se hizo incorrectamente. Espere un poco de rechazo, y eso está bien si pueden dar una razón válida (rendimiento, mantenibilidad, etc.) por qué lo hicieron de una mejor manera. Mantén una mente abierta al respecto. Si empiezan a ponerse demasiado a la defensiva y erizados, dígaselo también, pero de una manera no combativa, como "Oye, somos un equipo, nos hundimos o nadamos juntos. No estoy tratando de hacerte sentir mal, yo Estoy tratando de ayudarte a evitar trampas en las que yo mismo caí".

Cuando alguien tiene que ser un "policía malo", intente impulsar eso en el código sin emociones tanto como sea posible, ya que no le importa si a alguien le gusta o no. Cuando tenga que asumir ese papel, sea un "policía bueno" que dé "amor duro" en lugar de un "policía malo".

Exactamente. Y la mayoría de las herramientas de análisis de calidad del código (como Sonarqube, Codacy, LGTM, etc.) le darán un recuento numérico de diferentes tipos de problemas (problemas de estilo, olores de código, vulnerabilidades, etc.) que actúa como una "puntuación". El desarrollador puede trabajar por su cuenta para mejorar su puntaje, antes de enviar el código para una revisión.

También probé sesiones de comentarios uno a uno para evitar revisiones públicas, pero fue infructuoso, ya que el desarrollador estaba tratando de justificar cada comentario hasta el punto de descarrilar la sesión.

Parece que sus estilos de trabajo son incompatibles : usted quiere que él trabaje de una manera particular (apertura a la retroalimentación, código de alta calidad, enfoque en la mantenibilidad, ...) y él quiere trabajar de manera diferente (llamémoslo "vaquero solitario"). codificación"). Eso es frustrante para ambos lados.

Tomando prestada la terminología de los juegos de roles: necesita una sesión cero . Siéntese, explíquele lo que se espera de él a largo plazo (apertura a la retroalimentación, código de mayor calidad, voluntad de cambio, etc.) y determine si esto es algo que realmente quiere .

  • Si lo hace... explíquele que usted está aquí para ayudarlo a convertirse en ese yo futuro que encaja bien con su empresa, y que se requerirá mucho aprendizaje y cambios. Necesita comprometerse con ese objetivo y aceptar que las revisiones de código son una herramienta para llevarlo allí. Cuantos más comentarios reciba sobre las revisiones de código, más podrá mejorar y alcanzar ese objetivo.

  • Si no lo hace... bueno, podría ser mejor para ambas partes separarse amistosamente. Actualmente, los programadores tienen una gran demanda, por lo que no debería tener problemas para encontrar una empresa en la que se aprecie un enfoque menos estructurado para el desarrollo de software (hay muchas preguntas aquí en The Workplace.SE que se quejan de tales empresas).

Creo que necesita tener un poco de experiencia antes de que su "estilo de codificación" pueda considerarse razonablemente cuando se compara con una base de código existente. Incluso considerar el estilo aquí es realmente poner el carro delante del caballo, considerando que la pregunta es sobre un desarrollador junior que básicamente se niega a aprender.
@kungphu: No quise decir "estilo de codificación" en el sentido de "dónde poner los frenos", me refiero al "estilo de desarrollo de software" más general, digamos "codificación de vaquero solitario" frente a un proceso de desarrollo centrado en mantenibilidad del código y una fuerte cultura de retroalimentación. El junior parece preferir el primero (ya sea por inexperiencia o por convicción no importa, si no quiere cambiar), mientras que la empresa del OP requiere el segundo. Estoy de acuerdo en que la frase "estilo de codificación" es engañosa aquí, la he cambiado.
Está bien, eso tiene sentido. Aunque parece que esta situación se trata menos de que el nuevo desarrollador prefiera algo en particular, se trata de ser fundamentalmente ignorante de muchas cosas que los desarrolladores experimentados (y cualquiera que haya trabajado con éxito en equipos) darían por sentado... para mí, el La conclusión principal de esta pregunta fue que contrataron a un niño pero no estaban preparados para criarlo. Espero que la empresa o el departamento aprovechen esta oportunidad para hacerlo bien con esta contratación si tienen la intención de seguir contratando desarrolladores junior, en lugar de despedirlo por algo que realmente deberían haber visto venir.

Póngalo en un Plan de Mejora del Desempeño.

Parece que en este momento está generando un valor negativo para la empresa: le pagan un salario para que desperdicie el tiempo de otros desarrolladores más experimentados. Obviamente, esta no es una posición viable para él en el negocio, y algo debe cambiar. Como resultado, podría ser una buena idea formalizar esto con un Plan de Mejora del Desempeño que incluya hitos y metas concretas que debe alcanzar, de modo que pueda mejorar su desempeño para obtener un beneficio neto para el negocio o ser despedido con causa. para que ya no sea un perjuicio neto para su rendimiento.

Esto sería mucho más razonable si no fuera un nuevo empleado "muy inexperto". Quien lo contrató sabía que no tenía experiencia. La pregunta se parece mucho más a que el proceso de contratación resultó en la incorporación de un desarrollador muy joven sin proporcionar el contexto, la capacitación o los materiales necesarios para que comprendieran los estándares y las expectativas. Un PIP puede ser desalentador y desmoralizador incluso para alguien experimentado; para un nuevo empleado podría arruinar cualquier buena voluntad, entusiasmo o relación.
Todavía tengo que ver una sola instancia en la que un PIP proporcione algún valor real a un empleado. No es más que una forma de intentar salir del pago del paro cuando se da de baja a un empleado.

Diría que le asignas una tarea pequeña, luego revisas el resultado y le dejas que vuelva a trabajar en lo que ha hecho hasta que estés satisfecho con ella. Si trata de discutir y se equivoca (eso es importante obviamente), entonces dígale que debe saber qué es lo que está mal y pregúntele por qué cree que tiene que defender lo indefendible. Si hay estilos de codificación a los que todos se adhieren, dígale que se adhiera a ellos. Tenga cuidado allí: tengo algunos hábitos de codificación porque son mejores, algunos porque la consistencia es importante en algunos casos y otros hábitos de codificación que son solo hábitos.

El problema es: cuando reviso su código, tengo que dejar demasiados comentarios hasta el punto de sentir que me estoy excediendo . Algunas veces dejé pasar algunos problemas, pero esto siempre termina costando el tiempo de otro desarrollador (o el mío).

Significa que el primer problema a solucionar es usted y la empresa. ¿Cómo? ¿Por qué?

Si la empresa es al menos mínimamente profesional, debe haber lineamientos formales de codificación por escrito, lineamientos de diseño, etc. está de acuerdo), opcional. Estas pautas deben ser obligatorias y seguidas por todos.

Si lo anterior se implementa y funciona, el chico nuevo puede simplemente revisar su trabajo de acuerdo con las reglas, antes de revisarlo. Muchas de las cosas se arreglarían "por sí mismas".

Ya que hablamos de software, el uso de una herramienta de análisis estático (acordada y configurada por la empresa) debería ser obligatorio. Esa herramienta captará una buena cantidad de cosas (con suerte), y el chico nuevo puede hacer mucho trabajo de forma independiente antes de hablar con alguien más.


Reseñas - con un toque

No solo que sus colegas deben revisar su trabajo, sino que él también debe revisar el trabajo de sus colegas. Aprenderá cómo funcionan realmente las reseñas y aprenderá por qué algunas cosas son importantes.

Recordará las críticas que hizo por el trabajo de otra persona cuando su trabajo sea criticado.


  • Si yo fuera el chico nuevo, y
  • si no hubiera pautas formales,

entonces tendría una postura mucho más fuerte contra sus críticas:

¿Por qué tu opinión es mejor que mi opinión?

o mejor:

¿Por qué? ¿Dónde está escrito?

Actualización: ¡ el chico ya lo está haciendo! (Me perdí esta información cuando leí la pregunta inicialmente)

También probé sesiones de comentarios uno a uno para evitar revisiones públicas, pero fue infructuoso, ya que el desarrollador estaba tratando de justificar cada comentario hasta el punto de descarrilar la sesión .

Al carecer de un punto/sistema de referencia, cualquier opinión es tan buena como cualquier otra opinión.

@Michael: Gracias por el comentario. Tienes razón, actualizaré la respuesta. Tenía en mente más como "atrapará todo lo que pueda atrapar".

En la Philokalia, se dice que tal y cual puede ayudar a la gente con tal o cual deficiencia, y tal y cual puede ayudar a la gente con tal o cual deficiencia, "pero solo Dios puede ayudar a los orgullosos".

El orgullo es, además de un pecado, una debilidad que pone una guardia de hierro alrededor de otras debilidades (cf. Chesterton). Alguien que es humilde e inexperto puede progresar constantemente aprendiendo. Alguien que te mira con desdén y se exime de cada corrección tiene una calificación de problema más alta que alguien que es bueno, anticuado e inexperto.

Necesitas un humilde programador. Póngalo en un plan de mejora del rendimiento, como última medida de misericordia en lugar de simplemente despedirlo (lo cual está justificado).

su estilo de código difiere demasiado del equipo

No me queda claro si crees que el estilo es el único/principal problema con su código, o si también es pobre en otros aspectos, pero este es fácilmente solucionable.

La solución es hacer que sea imposible verificar el código que se desvía de sus expectativas. No tienes que ser el malo. Deja que la computadora sea la mala.

El primer paso es codificar sus expectativas. Checkstyle (una herramienta de Java) utiliza un formato de estilo XML. También es extensible para cheques personalizados. Lo he encontrado bastante bien. También debe tener una versión legible por humanos, preferiblemente con ejemplos.

A continuación, desea asegurarse de que su compilación falle si un desarrollador se desvía del estilo esperado (tiene una compilación automatizada, ¿no es así?). Usamos el complemento Maven Checkstyle para nuestros proyectos.

Es más fácil solucionar problemas localmente que esperar hasta que falle la compilación automatizada, por lo que me parece recomendable configurar un gancho de confirmación previa para ejecutar el mismo complemento de compilación, de modo que no sea posible (sin eludir deliberadamente el gancho) empujar algo que se desvía del estilo esperado.

El último paso es asegurarse de que la vida de sus desarrolladores no se consuma tratando de adherirse a su estilo; necesita distribuir recursos para ayudarlos a hacerlo. Este paso es importante para asegurarte de que no te odien por los 3 pasos anteriores. Configure su IDE para que coincida con su guía de estilo y exporte la configuración para que su equipo pueda importarla. Coloque el archivo de configuración en un repositorio al que todos tengan acceso. Si diferentes miembros del equipo prefieren diferentes IDE, considere EditorConfig que hace esto de una manera independiente del IDE. Una vez que haya hecho esto, adherirse al estilo debería ser tan fácil como presionar un atajo de teclado.

También busque complementos IDE que coincidan con la herramienta que está utilizando como parte de la compilación. Usamos un complemento de estilo de verificación para IntelliJ que puede cargar un archivo XML de estilo personalizado y mostrará las infracciones en línea, como un error de sintaxis.

Para tantas infracciones como sea posible, automatice las correcciones . Encuentro que el formateo automático de todo el código a menudo da algunos resultados extraños. En algunos casos, como declaraciones de importación no utilizadas, una computadora puede arreglarlas fácilmente con poco riesgo.