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