C贸mo guardamos la revisi贸n del c贸digo


Soy un desarrollador l铆der de Java en Yandex.Money.


Cada ma帽ana de trabajo en 2018, recib铆 unas 30 solicitudes de extracci贸n esperando una revisi贸n, y no tuve tiempo suficiente para ordenarlas todas en un d铆a. Al final del verano, me fui de vacaciones, y cuando regres茅, encontr茅 una fila de 50 relaciones p煤blicas que me asignaron. No hab铆a ganas de rastrillarlos, pero de hecho solo era la punta del iceberg, lo que vi con mis propios ojos. Ese d铆a decid铆 que era hora de cambiar algo.


Esta es la historia de c贸mo aceleramos la revisi贸n del c贸digo, descargamos a los principales desarrolladores y mejoramos las herramientas que usamos todos los d铆as.


Revisi贸n de c贸digo 1.0. 驴C贸mo estuvo antes?


En Yandex.Money, una revisi贸n de c贸digo ha sido durante mucho tiempo un paso de desarrollo obligatorio, y todos han estado acostumbrados a ella. Algunos se dieron cuenta de que esto era tan importante como las pruebas; otros consideraron esto como un mal necesario, y alguien encontr贸 una revisi贸n de c贸digo solo como el autor de las solicitudes de extracci贸n, pero evit贸 la revisi贸n de c贸digo de otra persona. Creo que muchos han viajado sucesivamente del 煤ltimo al primero, y esto es normal.


Para la revisi贸n del c贸digo, utilizamos Bitbucket desde el principio. Para cada repositorio de componentes, se agreg贸 una lista de 3-4 revisores predeterminados, que se agregaron a todos los RP. Por lo general, esta lista fue compilada y editada por el jefe del departamento, y a veces se agregaron all铆 voluntarios que ellos mismos quer铆an revisar un componente en particular. En los repositorios de la biblioteca fue un poco m谩s f谩cil: la lista de revisores fue la misma para todas las bibliotecas, y los desarrolladores senior se incluyeron all铆.


Como resultado, casi toda la carga recay贸 en los revisores de los desarrolladores senior, que gradualmente dejaron de ser suficientes, teniendo en cuenta el crecimiento del departamento a 60 personas, un aumento en el n煤mero de repositorios (m谩s de 60 componentes, m谩s de 100 bibliotecas) y la aceleraci贸n de nuestro CI / CD.


Adem谩s de la gran carga de trabajo y la falta de recursos de los revisores, hubo otros problemas:


  • en algunos componentes, uno podr铆a esperar una reacci贸n de los revisores por m谩s de un d铆a,
  • alta carga de trabajo de los nombrados como revisores en varios componentes,
  • es dif铆cil atraer nuevos revisores, incluso debido al p谩rrafo anterior,
  • si el revisor principal se enferm贸 o estuvo de vacaciones, la revisi贸n del c贸digo de tiempo de los componentes comenz贸 a aumentar notablemente,
  • los revisores designados no siempre ten铆an experiencia real en el componente, debido a esto la calidad de la revisi贸n del c贸digo sufri贸.

Antes de resolver estos problemas, debe decidir qu茅 esperamos generalmente de una revisi贸n de c贸digo.


La revisi贸n correcta del c贸digo es 驴c贸mo?


Hemos identificado cuatro puntos que deber铆an estar en la revisi贸n de c贸digo actualizada:


  1. Validar la arquitectura de la soluci贸n . Cosa bastante obvia. Esperamos esto de los desarrolladores senior con experiencia en este componente.
  2. Verificaci贸n de la implementaci贸n t茅cnica , que tambi茅n esperamos de especialistas superiores y medios con experiencia en este componente.
  3. La transferencia de conocimiento , que consiste en el estudio de la l贸gica empresarial y la base del c贸digo por parte de principiantes y junio a trav茅s de revisiones de c贸digo.
  4. Capacidad para evaluar las habilidades dif铆ciles de los desarrolladores . Quiero que a cada desarrollador se le asigne un mentor que eval煤e el crecimiento, determine el vector de desarrollo, note algunas deficiencias, haga comentarios, etc. Por lo tanto, el mentor tambi茅n deber铆a ver el c贸digo de sus pupilos.

Quiz谩s alguien vea otras metas o no est茅 de acuerdo con la nuestra: comparta en los comentarios. Mientras tanto, pasar茅 de la formulaci贸n de objetivos a la b煤squeda de medios para alcanzarlos; decidimos que queremos alcanzarlos todos y (casi) de inmediato.


Revisi贸n de c贸digo 2.0. Como es


驴Qu茅 se nos ocurri贸? Comenzamos a razonar paso a paso.


En Yandex.Money, los desarrolladores trabajan en equipos en 谩reas de negocios, generalmente de 2 a 4 desarrolladores en un equipo.


Digamos que voy a abrir una solicitud de extracci贸n, es decir, soy su autor . Tengo mi equipo , cuyos desarrolladores son conscientes de la l贸gica empresarial de lo que estoy haciendo, porque todos participamos en proyectos comunes, a menudo sincronizamos y generalmente interactuamos activamente. Por lo tanto, primero quiero agregarlos a mis solicitudes de extracci贸n, para que al menos est茅n al d铆a con lo que estoy haciendo.


Cada componente en Yandex.Money tiene un equipo que es responsable y lo acompa帽a en la producci贸n.


Si modifico un componente del que es responsable otro equipo, entonces parece l贸gico agregar desarrolladores de este equipo a los revisores: son responsables de este componente y deben monitorear la calidad de su c贸digo. Pero para no sobrecargar a los revisores, solo tomamos una persona aleatoria de este equipo; creemos que esto es suficiente.


Puede suceder que el equipo responsable del componente no tenga suficiente experiencia en 茅l. Esto sucede cuando los reci茅n llegados aparecen en el equipo o se les ha confiado este componente solo recientemente. Sin embargo, s茅 que tenemos expertos reales en esta compa帽铆a en este repositorio, 隆y ser铆a genial si uno de ellos mirara mi c贸digo! Por supuesto, mi conocimiento es dif铆cil de formalizar, pero puede tomar el historial del repositorio y calcular la revisi贸n del c贸digo en funci贸n del n煤mero de RP y estad铆sticas, que trabajaron mucho en este c贸digo y / o lo revisaron mucho. Calculamos la m茅trica de experiencia en el repositorio, seleccionamos los mejores desarrolladores para esta m茅trica, los llamamos expertos y agregamos un experto aleatorio a los revisores.


En 2018, presentamos el instituto de mentor铆a en la empresa, por lo que ahora un mentor entre los desarrolladores senior est谩 observando a cada equipo. Adem谩s, cada reci茅n llegado a la empresa al principio tiene un mentor personal.


隆Deje que mi mentor mire mi c贸digo! Podr谩 ayudar en caso de problemas en la revisi贸n del c贸digo, y tambi茅n tendr谩 una idea de mis fortalezas y debilidades en las habilidades t茅cnicas.



En total, se pueden agregar de cinco a seis personas a los revisores de cada solicitud de extracci贸n. Pero, de hecho, generalmente son un poco m谩s peque帽os, porque se pueden combinar diferentes roles en una sola persona. Mi mentor puede ser un experto al mismo tiempo, y mi equipo puede ser responsable del componente. Subjetivamente, 3-4 revisores ser铆an 贸ptimos para las solicitudes de extracci贸n.


Revisi贸n de c贸digo 2.0. 驴Qu茅 hay debajo del cap贸?


El punto es peque帽o: haz que todo funcione. Aqu铆 ayud贸 que todas nuestras alineaciones ya estuvieran configuradas en un sistema separado que proporciona la API REST para recibirlas. Por lo tanto, despu茅s de un par de semanas de desarrollo pausado en mi tiempo libre, naci贸 la primera versi贸n del complemento para Bitbucket, que se desarroll贸 gradualmente y adquiri贸 todo el conjunto de funcionalidades necesarias durante el oto帽o.


C贸mo funciona el complemento


Normalmente, al crear un PR, Bitbucket rellena previamente los visores que se especifican en la configuraci贸n del proyecto o repositorio. Desde el punto de vista del usuario, nada ha cambiado aqu铆: todos los revisores tambi茅n se rellenan previamente cuando se abre esta p谩gina, excepto que se ha agregado un campo con una descripci贸n de qu茅 revisor en qu茅 rol se agreg贸. Y los roles de los revisores han aparecido de la siguiente manera:


  • teammate es miembro del equipo del autor de relaciones p煤blicas, se agrega f谩cilmente gracias a la API REST con composiciones de equipo,
  • propietario del repositorio: un miembro aleatorio del equipo responsable del componente; en la configuraci贸n del repositorio era necesario dar la oportunidad de elegir el equipo responsable,
  • experto en repositorios - experto en repositorios aleatorio; Te contar茅 m谩s sobre esto m谩s tarde
  • mentor: un mentor para un equipo o un principiante, tambi茅n est谩 disponible a trav茅s de la API REST de un servicio con composiciones de equipo.

Expertos en repositorios


Te contar茅 un poco m谩s sobre c贸mo consideramos expertos. Todos los d铆as, el complemento pasa por todos los repositorios, analiza todas las solicitudes de extracci贸n del 煤ltimo a帽o y considera dos m茅tricas simples:


  • la cantidad de solicitudes de extracci贸n creadas por el desarrollador,
  • el n煤mero de RP que revis贸 y estableci贸 aprobar, necesita trabajo o rechazar.

Agregamos ponderaciones a estas m茅tricas basadas en el hecho de que desde el punto de vista de la experiencia en el c贸digo, el refinamiento de este c贸digo es m谩s importante que la revisi贸n. Primero, estimamos el n煤mero de solicitudes de extracci贸n creadas una vez y media m谩s importante que una revisi贸n, y luego aumentamos la proporci贸n de tres a uno. Resumimos las m茅tricas multiplicadas por sus pesos y obtenemos la calificaci贸n de desarrollador.


A continuaci贸n, clasificamos a todos estos desarrolladores por calificaci贸n, seleccionamos los 5 mejores, en el camino, cortamos a aquellos cuya calificaci贸n est谩 por debajo del umbral para cortar a los transe煤ntes ocasionales. Y generalmente tenemos de tres a cinco expertos para cada repositorio.


Arriba, le describ铆 el enfoque para la selecci贸n de revisores, que elegimos e implementamos, pero a lo largo del camino implementamos varias peque帽as mejoras a la vez, lo que hizo que el proceso de revisi贸n del c贸digo sea a煤n m谩s r谩pido, m谩s conveniente y m谩s agradable.


Prohibir solicitud de extracci贸n de fusi贸n hasta que la tarea se haya registrado en Jira


Una cosa tan obvia y necesaria que, desafortunadamente, no sale de la caja. Solo obtenemos c贸digo estable en dev, que no solo pas贸 las comprobaciones est谩ticas y las pruebas de desarrollador, sino tambi茅n las pruebas de integraci贸n junto con otros servicios. El estado de tales pruebas para nosotros se refleja solo en la tarea de Jira y, por lo tanto, antes, los desarrolladores ten铆an que ver manualmente si la tarea estaba marcada para ralentizar la solicitud de extracci贸n.


Solicitud de extracci贸n autom谩tica de fusi贸n


La solicitud de extracci贸n puede pasar una parte considerable de su vida en un estado en el que nada le impide tomarse el tiempo, pero una persona se olvida de hacerlo o no lo hace de inmediato. Un ejemplo sorprendente es la expectativa de probar una tarea, sin la cual no la mantenemos en desarrollo. Aqu铆 es donde resulta 煤til una fusi贸n autom谩tica, que funciona de acuerdo con un principio simple: si las relaciones p煤blicas pueden congelarse, entonces lo hacemos.


Todas las condiciones necesarias para la fusi贸n est谩n cubiertas por cheques. Verificamos el 茅xito del ensamblaje, el nivel de cobertura de la prueba, la ausencia de dependencias de instant谩neas de las bibliotecas, el estado de la tarea en Jira y la presencia de todas las actualizaciones necesarias. Es decir, tenemos todo para usar dicha funcionalidad y olvidarnos de las relaciones p煤blicas desde el momento de pasar la revisi贸n del c贸digo y enviar la tarea a la prueba (a menos que, por supuesto, el control de calidad encuentre problemas en ella).


E implementamos esto de una manera bastante conveniente: introdujimos un bot especial AutoMergeBot, que solo necesitamos agregar a los revisores, para que pueda comenzar a monitorear esta solicitud de extracci贸n y congelarla cuando llegue el momento.


Contabilizaci贸n de la ausencia de revisores.


Si el propietario o experto del componente est谩 de vacaciones o de baja por enfermedad, el revisor no lo agregar谩, y su lugar lo ocupar谩 el que est茅 en el lugar de trabajo. Como beneficio adicional, una monta帽a de solicitudes de atracci贸n de otras personas no caer谩 en este cr铆tico al salir de las vacaciones. Darse cuenta de esto no fue dif铆cil debido al hecho de que toda la falta de empleados con nosotros se present贸 con solicitudes en Jira.


Contabilidad para el empleo de revisores


Alguien revisa diez relaciones p煤blicas al d铆a, y unos cinco. Alguien ya ha acumulado 20 relaciones p煤blicas no vistas, mientras que alguien casi no tiene ninguno. Tomamos todo esto en cuenta para distribuir la carga de manera m谩s uniforme en los revisores. Cuanta m谩s carga, menos se agrega a los nuevos RP, todo es simple.


Marcar tama帽os de relaciones p煤blicas al crear


En la p谩gina de creaci贸n de solicitud de extracci贸n, el autor puede elegir su tama帽o aproximado: S, M o L. Esto ayuda a los revisores a estimar el tiempo aproximado que pasar谩n en la revisi贸n del c贸digo. Por ejemplo, tengo 5 minutos libres, y entiendo que puedo lograr ver la solicitud de extracci贸n de tama帽o S. No tiene sentido abrir M o L, porque no tengo tiempo para verlos y la pr贸xima vez tendr茅 que empezar desde cero.


En el futuro, queremos tener en cuenta estos atributos al calcular las estad铆sticas de relaciones p煤blicas.


Etiquetado Urgente PR


Adem谩s, al crear un PR, el autor puede indicar que la tarea es muy urgente al agregar dicho s铆mbolo al nombre PR. Los revisores lo ver谩n de inmediato e intentar谩n verlo primero. Parece ser un poco, pero muy 煤til y conveniente.


Seguimiento de revisi贸n de c贸digo de inicio y finalizaci贸n


Si al mejorar el proceso es imposible entender cu谩nto ha mejorado, entonces no tiene sentido comenzar.


Lo mismo ocurre con la revisi贸n del c贸digo: podemos intentar mejorarlo tanto como queramos, pero 驴c贸mo nos aseguraremos de una din谩mica positiva sin m茅tricas y estad铆sticas? En nuestro caso, esta no es la tarea m谩s f谩cil: fuera de la caja, Bitbucket y Jira no dieron la oportunidad de rastrear el tiempo de revisi贸n del c贸digo. Solo ten铆amos la m茅trica de vida 煤til de relaciones p煤blicas en servicio, lo que no nos conven铆a del todo, porque solo retiramos la solicitud despu茅s de que se completa la prueba de la tarea, por lo tanto, los indicadores extra帽os se mezclaron en esta m茅trica.


Jira almacena y le permite cargar todos los puntos de control del ciclo de vida de la tarea, por lo que pensamos que es correcto enriquecer estos datos con dos etiquetas adicionales: la hora de inicio y finalizaci贸n de la revisi贸n del c贸digo. Solo era necesario ense帽arle al plugin para que Bitbucket pusiera estas etiquetas en Jira. Por lo tanto, Jira fue, y sigue siendo, un 煤nico punto de verdad para la tarea, y con este conjunto de datos podemos separar el tiempo de la revisi贸n del c贸digo del momento de probar la tarea.


El punto m谩s delgado aqu铆 es c贸mo determinar cu谩ndo finalizar una revisi贸n de c贸digo. 驴Tal vez este es el momento de obtener la primera aplicaci贸n, tal vez la 煤ltima, o tal vez este es el momento de los 煤ltimos cambios realizados por el autor de PR? No tengo una respuesta a esta pregunta, aqu铆 solo necesito estar de acuerdo entre nosotros y elegir una cosa o cubrir los tres eventos con m茅tricas y seguir las desviaciones.


Seguimiento de descargas de revisores


Otra m茅trica 煤til es la carga de trabajo de los revisores. Como escrib铆 anteriormente, lo tenemos en cuenta al asignar revisores a nuevos RP, pero tambi茅n publicamos esta informaci贸n para monitorear la din谩mica de los equipos, departamentos o empresas. A veces, esto ayuda a detectar anomal铆as y posibles problemas: si est谩 claro que una o m谩s personas en un equipo cuelgan 10 o m谩s RP no vistos todos los d铆as, entonces hay una raz贸n para averiguar si todo est谩 en orden.


Ver m茅tricas en Grafana


La creaci贸n de informes sobre datos de Jira es 煤til, pero no muy conveniente, por lo que tambi茅n agregamos el env铆o de m茅tricas para los principales eventos en StatsD con el fin de crear gr谩ficos sobre datos operativos en Grafana. Monitoreamos el tiempo promedio hasta la primera prueba, el tiempo de vida promedio del RP, y tambi茅n observamos los valores an贸malos de estas m茅tricas para encontrar y resolver problemas r谩pidamente.


Al momento de escribir, nuestro tablero se ve as铆:



驴Qu茅 obtuviste al final?


Desafortunadamente, todos somos fuertes en retrospectiva, por lo que no presentamos las m茅tricas de revisi贸n de c贸digo mencionadas anteriormente antes de que el proceso en s铆 comenzara a cambiar (septiembre-octubre de 2018), pero ya en el camino, por lo que solo podemos rastrear de manera confiable las mejoras o deterioros desde principios de diciembre de 2018 驴Qu茅 logramos notar?


Lo primero que llama la atenci贸n es la reducci贸n de la carga en los revisores superiores, y sent铆 esto con mi propio ejemplo. Como ya mencion茅, era normal para m铆 ver unos 30 RP en l铆nea por la ma帽ana, pero ahora este n煤mero fluct煤a entre 10 y 15. Las estad铆sticas del departamento lo confirman: desde diciembre de 2018, nadie ha aumentado el n煤mero m谩ximo de RP que esperan una revisi贸n. arriba 15. En promedio, observamos una imagen que sugiere que, en promedio, cada desarrollador espera de 4 a 5 relaciones p煤blicas no vistas por la ma帽ana, lo que parece ser un n煤mero bastante adecuado.



En cuanto a la relevancia de la selecci贸n de revisores y la calidad de la revisi贸n del c贸digo, aqu铆 solo podemos confiar en indicadores subjetivos. De acuerdo con las encuestas de colegas, realmente comenzamos a obtener una excelente selecci贸n de revisores, ahora nadie tiene que agregar manualmente y no se dejan abandonados ni olvidados los RP.



Si hablamos sobre el tiempo que lleva pasar la revisi贸n del c贸digo, entonces es demasiado pronto para calcular estad铆sticas sobre este indicador, porque comenzamos a recopilarlo recientemente. A nuestra disposici贸n solo existe el tiempo de vida de las solicitudes de extracci贸n, que en realidad no aument贸 ni disminuy贸. Esta m茅trica incluye el tiempo de prueba de la tarea, por lo que es dif铆cil sacar conclusiones claras al respecto, adem谩s, al cambiar el c贸digo de revisi贸n, no lo hicimos m谩s largo.

Source: https://habr.com/ru/post/446654/


All Articles