| .. include:: ../disclaimer-sp.rst |
| |
| :Original: Documentation/process/6.Followthrough.rst |
| :Translator: Carlos Bilbao <carlos.bilbao.osdev@gmail.com> and Avadhut Naik <avadhut.naik@amd.com> |
| |
| .. _sp_development_followthrough: |
| |
| Seguimiento |
| =========== |
| |
| Llegados a este punto, ha seguido las directrices dadas hasta ahora, lo que |
| sumado a sus propias habilidades de ingeniería, ha resultado en una serie |
| de parches perfectos. Uno de los mayores errores que incluso los |
| desarrolladores de kernel experimentados pueden cometer es concluir que su |
| trabajo ya está hecho. En verdad, publicar parches indica una transición a |
| la siguiente etapa del proceso, con, posiblemente, bastante trabajo aún por |
| hacer. |
| |
| Es raro un parche que sea tan bueno en su primera publicación que no haya |
| espacio para la mejora. El proceso de desarrollo del kernel reconoce este |
| hecho y, como resultado, está muy orientado hacia la mejora del código |
| publicado. Y usted, como autor de ese código, se espera que trabaje con la |
| comunidad del kernel para asegurarse de que su código esté a la altura de |
| los estándares de calidad del kernel. No participar en este proceso es muy |
| probable que impida la inclusión de sus parches en la línea principal. |
| |
| Trabajando con revisores |
| ------------------------ |
| |
| Un parche de cualquier importancia resultará en una serie de comentarios de |
| otros desarrolladores a medida que revisan el código. Trabajar con los |
| revisores puede ser, para muchos desarrolladores, la parte más intimidante |
| del proceso de desarrollo del kernel. Sin embargo, la vida puede ser mucho |
| más fácil si tiene en cuenta algunas cosas: |
| |
| - Si ha explicado bien su parche, los revisores entenderán su valor y por |
| qué se tomó la molestia de escribirlo. Pero ese valor no les impedirá |
| hacer una pregunta fundamental: ¿cómo será mantener un kernel con este |
| código en él cinco o diez años después? Muchos de los cambios que se le |
| pueden pedir que haga, desde ajustes de estilo de codificación hasta |
| reescrituras sustanciales, provienen de la comprensión de que Linux |
| seguirá existiendo y en desarrollo dentro de una década. |
| |
| - La revisión de código es un trabajo arduo y es una ocupación |
| relativamente ingrata; la gente recuerda quién escribió el código del |
| kernel, pero hay poca fama duradera para aquellos que lo revisaron. Así |
| que los revisores pueden ponerse de mal humor, especialmente cuando ven |
| los mismos errores repetirse una y otra vez. Si recibe una revisión que |
| parece enojada, insultante o abiertamente ofensiva, resista el impulso de |
| responder de la misma manera. La revisión de código se trata del código, |
| no de las personas, y los revisores de código no lo están atacando |
| personalmente. |
| |
| - De manera similar, los revisores de código no están tratando de promover |
| las agendas de sus empleadores a expensas de la suya. Los desarrolladores |
| del kernel a menudo esperan estar trabajando en el kernel dentro de |
| varios años, pero entienden que su empleador podría cambiar. |
| Verdaderamente, casi sin excepción, están trabajando hacia la creación |
| del mejor kernel posible; no están tratando de causar incomodidad a los |
| competidores de sus empleadores. |
| |
| - Esté preparado para solicitudes aparentemente ridículas de cambios en el |
| estilo de codificación y solicitudes para factorizar parte de su código |
| en partes compartidas del kernel. Una de las tareas que realizan los |
| maintainers es mantener las cosas con una apariencia uniforme. A veces, esto significa que el truco ingenioso en su driver para sortear un problema necesita convertirse en una característica generalizada del kernel lista para la próxima vez. |
| |
| En resumen, cuando los revisores le envían comentarios, necesita prestar |
| atención a las observaciones técnicas que están haciendo. No permita que su |
| forma de expresarse o su propio orgullo le impidan hacerlo. Cuando reciba |
| comentarios de revisión sobre un parche, tómese el tiempo para entender lo |
| que el revisor está tratando de decir. Si es posible, arregle las cosas que |
| el revisor le está pidiendo que corrija. Y responda al revisor: |
| agradézcales y describa cómo responderá a sus preguntas. |
| |
| Tenga en cuenta que no tiene que estar de acuerdo con cada cambio sugerido |
| por los revisores. Si cree que el revisor ha malinterpretado su código, |
| explique lo que realmente está sucediendo. Si tiene una objeción técnica a |
| un cambio sugerido, descríbalo y justifique su solución al problema. Si sus |
| explicaciones tienen sentido, el revisor las aceptará. Sin embargo, si su |
| explicación no resulta persuasiva, especialmente si otros comienzan a estar |
| de acuerdo con el revisor, tómese un tiempo para reflexionar nuevamente |
| sobre las cosas. Puede ser fácil quedar cegado por su propia solución a un |
| problema hasta el punto de no darse cuenta de que algo está |
| fundamentalmente mal o, quizás, ni siquiera está resolviendo el problema |
| correcto. |
| |
| Andrew Morton ha sugerido que cada comentario de revisión que no resulte en |
| un cambio de código debería resultar en un comentario adicional en el |
| código; eso puede ayudar a los revisores futuros a evitar las preguntas que |
| surgieron la primera vez. |
| |
| Un error fatal es ignorar los comentarios de revisión con la esperanza de |
| que desaparezcan. No desaparecerán. Si vuelve a publicar código sin haber |
| respondido a los comentarios que recibió la vez anterior, es probable que |
| descubra que sus parches no van a ninguna parte. |
| |
| Hablando de volver a publicar código: tenga en cuenta que los revisores no |
| recordarán todos los detalles del código que publicó la vez anterior. Así |
| que siempre es una buena idea recordarles sobre problemas planteados |
| anteriormente y cómo los manejó; el registro de cambios del parche es un |
| buen lugar para este tipo de información. Los revisores no deberían tener |
| que buscar en los archivos de la lista para familiarizarse con lo que se |
| dijo la última vez; si les ayuda a tener un buen comienzo, estarán de mejor |
| humor cuando revisiten su código. |
| |
| ¿Qué sucede si ha intentado hacer todo bien y las cosas aún no van a |
| ninguna parte? La mayoría de los desacuerdos técnicos pueden resolverse |
| mediante discusión, pero hay momentos en los que alguien simplemente tiene |
| que tomar una decisión. Si realmente cree que esta decisión está en su |
| contra de manera incorrecta, siempre puede intentar apelar a una autoridad |
| superior. En el momento de escribir esto, esa autoridad superior tiende a |
| ser Andrew Morton. Andrew tiene un gran respeto en la comunidad de |
| desarrollo del kernel; a menudo puede desbloquear una situación que parece |
| estar irremediablemente bloqueada. Sin embargo, apelar a Andrew no debe |
| hacerse a la ligera, y no antes de que se hayan explorado todas las demás |
| alternativas. Y tenga en cuenta, por supuesto, que él puede no estar de |
| acuerdo con usted tampoco. |
| |
| ¿Qué pasa después? |
| -------------------- |
| |
| Si un parche se considera algo bueno para agregar al kernel, y una vez que |
| se hayan resuelto la mayoría de los problemas de revisión, el siguiente |
| paso suele ser la entrada en el árbol del mantenedor de un subsistema. Cómo |
| funciona eso varía de un subsistema a otro; cada mantenedor tiene su propia |
| forma de hacer las cosas. En particular, puede haber más de un árbol, uno, |
| quizás, dedicado a los parches planificados para la próxima ventana de |
| fusión y otro para trabajos a más largo plazo. |
| |
| Para los parches que se aplican a áreas para las que no hay un árbol de |
| subsistema obvio (parches de gestión de memoria, por ejemplo), el árbol |
| predeterminado suele ser -mm. Los parches que afectan a múltiples |
| subsistemas también pueden terminar pasando por el árbol -mm. |
| |
| La inclusión en un árbol de subsistema puede dar mayor visibilidad a un |
| parche. Ahora, otros desarrolladores que trabajan con ese árbol recibirán |
| el parche por defecto. Los árboles de subsistemas típicamente alimentan |
| linux-next también, haciendo que su contenido sea visible para la comunidad |
| de desarrollo en su conjunto. En este punto, hay una buena probabilidad de |
| que reciba más comentarios de un nuevo conjunto de revisores; estos |
| comentarios necesitan ser respondidos como en la ronda anterior. |
| |
| Lo que también puede suceder en este punto, dependiendo de la naturaleza de |
| su parche, es que aparezcan conflictos con el trabajo que están realizando |
| otros. En el peor de los casos, conflictos pesados de parches pueden |
| resultar en que algunos trabajos se pongan en espera para que los parches |
| restantes puedan ser ajustados y fusionados. Otras veces, la resolución de |
| conflictos involucrará trabajar con otros desarrolladores y, posiblemente, |
| mover algunos parches entre árboles para asegurarse de que todo se aplique |
| sin problemas. Este trabajo puede ser un dolor, pero cuente sus |
| bendiciones: antes de la llegada del árbol linux-next, estos conflictos a |
| menudo solo surgían durante la ventana de fusión y tenían que ser abordados |
| de prisa. Ahora pueden resolverse con calma, antes de que se abra la |
| ventana de fusión (merge window). |
| |
| Algún día, si todo va bien, iniciará sesión y verá que su parche ha sido |
| incluido en el kernel principal. ¡Felicidades! Una vez que la celebración |
| termine (y se hayas agregado al archivo MAINTAINERS), vale la pena |
| recordar un pequeño hecho importante: el trabajo aún no está hecho. La |
| inclusión trae sus propios desafíos. |
| |
| Para empezar, la visibilidad de su parche ha aumentado una vez más. Puede |
| haber una nueva ronda de comentarios de desarrolladores que no estaban al |
| tanto del parche antes. Puede ser tentador ignorarlos, ya que ya no hay |
| cuestión de que su código sea fusionado. Sin embargo, resista esa |
| tentación; aún necesita ser receptivo a los desarrolladores que tienen |
| preguntas o sugerencias. |
| |
| Más importante aún, la inclusión en la línea principal pone su código en |
| manos de un grupo mucho más grande de probadores. Incluso si ha contribuido |
| un driver para hardware que aún no está disponible, se sorprenderá de |
| cuántas personas construirán su código en sus kernels. Y, por supuesto, |
| donde hay probadores, habrá informes de errores. |
| |
| El peor tipo de informes de errores son las regresiones. Si su parche causa |
| una regresión, encontrará un número incómodo de ojos sobre usted; las |
| regresiones pueden dar lugar a mucho malestar en la comunidad y pueden |
| hacer que algunos desarrolladores comiencen a preguntarse si su parche |
| realmente debería haber sido fusionado en primer lugar. Así que esté atento |
| a los comentarios sobre problemas y, si es posible, corrija los errores de |
| inmediato. |
| |
| Después de haber abordado cualquier regresión, puede haber otros errores |
| ordinarios que resolver. El período de estabilización es su mejor |
| oportunidad para corregir estos errores y garantizar que el debut de su |
| código en una versión del kernel principal sea lo más sólido posible. Así |
| que, por favor, responda a los informes de errores y solucione los |
| problemas si es posible. Para eso es el período de estabilización; puede |
| comenzar a crear parches nuevos y geniales una vez que se hayan resuelto |
| los problemas de los antiguos. |
| |
| Y no olvide que hay otros hitos que también pueden generar informes de |
| errores: la próxima versión estable del kernel principal, cuando |
| distribuidores prominentes adopten una versión del kernel que contenga su |
| parche, etc. Continuar respondiendo a estos informes es una cuestión de |
| orgullo básico en su trabajo. Sin embargo, si eso no es suficiente |
| motivación, también vale la pena considerar que la comunidad de desarrollo |
| recuerda a los desarrolladores que pierden interés en su código después de |
| que se fusiona. La próxima vez que publique un parche, lo evaluarán con la |
| suposición de que no estará disponible para mantenerlo después. |
| |
| Otras cosas que pueden suceder |
| ------------------------------- |
| |
| Un día, puede que abra su cliente de correo y vea que alguien le ha enviado |
| un parche para su código. Esa es una de las ventajas de tener su código |
| disponible públicamente, después de todo. Si está de acuerdo con el parche, puede reenviarlo al maintainer del subsistema (asegúrese de incluir una |
| línea From: adecuada para que la atribución sea correcta, y añada su propia |
| firma), o enviar una respuesta Acked-by: y dejar que el autor original lo |
| envíe hacia arriba. |
| |
| Si no está de acuerdo con el parche, envíe una respuesta educada explicando |
| por qué. Si es posible, dígale al autor qué cambios deben hacerse para que |
| considere el parche aceptable. Existe una cierta resistencia a incluir |
| parches que son rechazados por el autor y el maintainer del código, pero |
| esto tiene un límite. Si se interpreta que bloque buen trabajo, esos |
| parches eventualmente lo eludirán y se incorporarán al kernel de todos |
| modos. En el kernel de Linux, nadie tiene poder de veto absoluto sobre |
| ningún código. Excepto quizás Linus. |
| |
| En muy raras ocasiones, puede encontrar algo completamente diferente: otro |
| desarrollador publica una solución distinta a su problema. En ese punto, es |
| probable que uno de los dos parches no se incluya, y "el mío fue el |
| primero" no se considera un argumento técnico convincente. Si el parche de |
| otra persona desplaza al suyo y se incorpora al kernel, realmente solo hay |
| una manera de responder: alegrarse de que su problema se haya resuelto y |
| continuar con su trabajo. Que su trabajo sea desplazado de esta manera |
| puede ser doloroso y desalentador, pero la comunidad recordará su reacción |
| mucho después de que hayan olvidado de quién era el parche que realmente se |
| incluyó. |