1.. include:: ../disclaimer-sp.rst 2 3:Original: Documentation/process/7.AdvancedTopics.rst 4:Translator: Carlos Bilbao <[email protected]> and Avadhut Naik <[email protected]> 5 6.. _sp_development_advancedtopics: 7 8Temas avanzados 9=============== 10 11Llegados a este punto, con suerte, tiene una idea de cómo funciona el 12proceso de desarrollo. Sin embargo, ¡todavía hay más que aprender! Esta 13sección cubrirá varios temas que pueden ser útiles para los desarrolladores 14que desean convertirse en una parte regular del proceso de desarrollo del 15kernel Linux. 16 17Gestionar parches con git 18------------------------- 19 20El uso del control de versiones distribuido para el kernel comenzó a 21principios de 2002 cuando Linus comenzó a jugar con la aplicación 22propietaria BitKeeper. Aunque BitKeeper fue controvertido, el enfoque de 23la gestión de versiones de software que incorporó ciertamente no lo fue. 24El control de versiones distribuido permitió una aceleración inmediata 25del proyecto de desarrollo del kernel. En los tiempos actuales, existen 26varias alternativas gratuitas a BitKeeper. Para bien o para mal, el 27proyecto del kernel ha optado por git como su herramienta preferida. 28 29Administrar parches con git puede hacer la vida mucho más fácil para el 30desarrollador, especialmente a medida que crece el volumen de esos 31parches. Git también tiene sus asperezas y representa ciertos peligros; 32es una herramienta joven y poderosa que aún está siendo civilizada por 33sus desarrolladores. Este documento no intentará enseñar al lector cómo 34usar git; eso sería material suficiente para un documento extenso por 35derecho propio. En su lugar, el enfoque aquí será cómo git encaja en el 36proceso de desarrollo del kernel en particular. Los desarrolladores que 37deseen ponerse al día con git encontrarán más información en: 38 39 https://git-scm.com/ 40 41 https://www.kernel.org/pub/software/scm/git/docs/user-manual.html 42 43y en varios tutoriales que se encuentran en la web. 44 45El primer orden del negocio es leer los sitios mencionados anteriormente 46y comprender cómo funciona git antes de intentar usarlo para poner 47parches a disposición de otros. Un desarrollador que usa git debe ser 48capaz de obtener una copia del repositorio mainline, explorar el historial 49de revisiones, hacer commits en el árbol, usar ramas, etcétera. También es 50útil entender las herramientas de git para rescribir la historia (como 51rebase). Git viene con su propia terminología y conceptos; un nuevo 52usuario de git debe conocer las referencias, las ramas remotas, el índice, 53las fusiones fast-forward, los pushes y pulls, las cabezas separadas, 54etcétera. Todo puede ser un poco intimidante al principio, pero los 55conceptos no son tan difíciles de entender con un poco de estudio. 56 57Usar git para generar parches para enviarlos por correo electrónico puede 58ser un buen ejercicio mientras te pones al día. 59 60Cuando esté listo para comenzar a publicar árboles de git para que otros 61los vean, necesitará por supuesto, un servidor del que se pueda extraer. 62Configurar un servidor de este tipo con git-daemon es relativamente 63sencillo si tiene un sistema accesible a Internet. De lo contrario, los 64sitios de alojamiento público y gratuitos (GitHub, por ejemplo) están 65comenzando a aparecer en la red. Los desarrolladores establecidos pueden 66obtener una cuenta en kernel.org, pero no son fáciles de conseguir; ver 67https://kernel.org/faq/ para más información. 68 69El flujo de trabajo normal de git implica el uso de muchas ramas. Cada 70línea de desarrollo puede separarse en una “rama temática” separada y 71mantenerse de forma independiente. Las ramas en git son baratas, no hay 72razón para no hacer uso gratuito de ellas. Y, en cualquier caso, no debe 73desarrollarse en ninguna rama de la que tenga la intención de pedir a 74otros que hagan un pull. Las ramas disponibles públicamente deben crearse 75con cuidado; fusione los parches de las ramas de desarrollo cuando estén 76en forma completa y listos para usar – no antes. 77 78Git proporciona herramientas poderosas que permiten reescribir su historia 79de desarrollo. Un parche inconveniente (uno que rompe la bisección, por 80ejemplo, o que tiene algún otro tipo de error obvio) se puede corregir en 81su lugar o hacer que desaparezca de la historia por completo. Una serie de 82parches se puede reescribir como si se hubiera escrito sobre el mainline 83de hoy, aunque haya estado trabajando en ella durante meses. Los cambios 84se pueden transferir de manera transparente de una rama a otra. Y así 85sucesivamente. El uso juicioso de la capacidad de git para revisar el 86historial puede ayudar en la creación de conjuntos de parches limpios con 87menos problemas. 88 89El uso excesivo de esta capacidad puede llevar a otros problemas más allá 90de una simple obsesión por crear la historia perfecta del proyecto. 91Reescribir la historia rescribirá los cambios contenidos en esa historia, 92convirtiendo un árbol del kernel probado (con suerte) en uno no probado. 93Pero más allá de eso, los desarrolladores no pueden colaborar fácilmente 94si no tienen una vista compartida del historial del proyecto; si reescribe 95la historia que otros desarrolladores han introducido en sus repositorios, 96les hará la vida mucho más difícil a esos desarrolladores. Por lo tanto, 97aquí se aplica una regla simple general: la historia que se ha exportado 98a otros generalmente debe considerarse inmutable a partir de entonces. 99 100Por lo tanto, una vez que envié un conjunto de cambios a su servidor 101disponible públicamente, esos cambios no deben reescribirse. Git 102intentará hacer cumplir esta regla si intenta enviar cambios que no 103resulten en un “fast-forward merge” (es decir, cambios que no comparten 104el mismo historial). Es posible anular esta comprobación, y puede haber 105ocasiones en las que sea necesario reescribir un árbol exportado. Mover 106conjuntos de cambios entre árboles para evitar conflictos en linux-next 107es un ejemplo. Pero tales acciones deberían ser raras. Esta es una de las 108razones por las que el desarrollo debe hacerse en ramas privadas (que se 109pueden reescribir si es necesario) y solo trasladarse a ramas públicas 110cuando esté en un estado razonablemente avanzado. 111 112A medida que el mainline (u otro árbol en el que se basa un conjunto de 113cambios) avanza, es tentador fusionarse con ese árbol para permanecer a 114la vanguardia. Para una rama privada, la rebase puede ser una manera fácil 115de mantenerse al día con otro árbol, pero la rebase no es una opción una 116vez que el árbol se exporta al mundo. Una vez que eso sucede, se debe 117realizar una fusión completa. Fusionar ocasionalmente tiene sentido, pero 118las fusiones demasiado frecuentes pueden desordenar el historial 119innecesariamente. La técnica sugerida en este caso es fusionar con poca 120frecuencia y, por lo general, solo en puntos de lanzamiento específicos 121(como una versión -rc del mainline). Si está nervioso por cambios 122específicos, siempre puede realizar fusiones de prueba en una rama 123privada. La herramienta git “rerere” puede ser útil en tales situaciones; 124recuerda cómo se resolvieron los conflictos de fusión para que no tenga 125que hacer el mismo trabajo dos veces. 126 127Una de las mayores quejas recurrentes sobre herramientas como git es la 128siguiente: el movimiento masivo de parches de un repositorio a otro hace 129que sea fácil deslizar cambios más aconsejados que pasan al mainline 130debajo del radar de revisión. Los desarrolladores del kernel tienden a 131descontentarse cuando ven que suceden ese tipo de cosas; poner un árbol 132de git con parches no revisados o fuera de tema puede afectar su capacidad 133para hacer que los árboles sean integrados en el futuro. Citando a Linus: 134 135:: 136 137 Puede enviarme parches, pero para que yo acepte un parche de git de 138 su parte, necesito saber que usted sabe lo que está haciendo, y 139 necesito poder confiar en las cosas *sin* tener que revisar 140 manualmente cada cambio individual. 141 142(https://lwn.net/Articles/224135/). 143 144Para evitar este tipo de situación, asegúrese de que todos los parches 145dentro de una rama determinada se adhieran estrictamente al tema asociado; 146una rama de “correcciones de drivers” no debería hacer cambios en el 147código central de gestión de memoria. Y, lo más importante, no utilice un 148árbol git para eludir el proceso de revisión. Publique un resumen 149ocasional del árbol en la lista relevante y, cuando sea el momento 150adecuado, solicite que el árbol se incluya en linux-next. 151 152Si y cuando otros comiencen a enviar parches para su inclusión en su 153árbol, no olvide revisarlos. Además, asegúrese de mantener la información 154de autoría correcta; la herramienta git “am” hace lo mejor que puede es 155este sentido, pero es posible que tenga que agregar una línea “From:” al 156parche si ha sido reenviado a través de un tercero. 157 158Al solicitar un pull, proporcione toda la información relevante: dónde 159está su árbol, qué rama se debe pull, y que cambios resultarán del pull. 160El comando git request-pull puede ser útil en este sentido; formateará la 161solicitud como otros desarrolladores esperan, y también comprobará para 162asegurarse de que ha recordado enviar esos cambios al servidor público. 163 164Revisión de parches 165------------------- 166 167Algunos lectores seguramente se opondrán a incluir esta sección con 168“temas avanzados” porque incluso los desarrolladores principiantes del 169kernel deberían revisar los parches. Es cierto que no hay mejor manera de 170aprender a programar en el entorno del kernel que mirando el código 171publicado por otros. Además, los revisores siempre escasean; al revisar 172código, puede contribuir significativamente al proceso en su conjunto. 173 174Revisar el código puede ser una perspectiva intimidante, especialmente 175para un nuevo desarrollador de kernel que puede sentirse nervioso al 176cuestionar el código – en público – publicado por aquellos con más 177experiencia. Sin embargo, incluso el código escrito por los desarrolladores 178más experimentados se puede mejorar. Quizás el mejor consejo para los 179revisores (todos los revisores) es este: expresar los comentarios de 180revisión como preguntas en lugar de críticas. Preguntar “¿cómo se libera 181el bloqueo en este camino?” siempre funcionará mejor que decir “el 182bloqueo aquí es incorrecto”. 183 184Otra técnica que es útil en caso de desacuerdo es pedir a otros que 185intervengan. Si una discusión llega a un punto muerto después de algunos 186intercambios, solicite las opiniones de otros revisores o maintainers. A 187menudo, aquellos que están de acuerdo con un revisor permanecen en 188silencio a menos que se les invite a participar. La opinión de varias 189personas tiene exponencialmente más peso. 190 191Diferentes desarrolladores revisarán el código desde diferentes puntos de 192vista. Algunos se preocupan principalmente por el estilo de codificación 193y si las líneas de código tienen espacios en blanco al final. Otros se 194enfocarán principalmente en si el cambio implementado por el parche en su 195totalidad es beneficioso para el kernel o no. Sin embargo, otros 196comprobarán si hay bloqueos problemáticos, uso excesivo de la pila, 197posibles problemas de seguridad, duplicación de código encontrado en 198otras partes, documentación adecuada, efectos adversos en el rendimiento, 199cambios en la ABI del espacio de usuario, etcétera. Todos los tipos de 200revisión, si conducen a un mejor código en el kernel, son bienvenidos y 201valen la pena. 202 203No hay ningún requisito estricto para usar etiquetas específicas como 204``Reviewed-by``. De hecho, las revisiones en Inglés sencillo son más 205informativas y alentadas incluso cuando se proporciona una etiqueta, por 206ejemplo, “Revisé los aspectos A, B y C de esta propuesta y me parece 207bien”. 208¡Alguna forma de mensaje de revisión o respuesta es obviamente necesaria, 209de lo contrario, los maintainers no sabrán que el revisor ha revisado el 210parche en absoluto! 211 212Por último, pero no menos importante, la revisión de parches puede 213convertirse en un proceso negativo, centrado en señalar problemas. ¡Por 214favor, dé un cumplido de vez en cuando, especialmente a los principiantes! 215