.. include:: ../disclaimer-sp.rst

:Original: Documentation/process/1.Intro.rst
:Translator: Avadhut Naik <avadhut.naik@amd.com>

.. _sp_development_process_intro:

Introducción
============

Resumen ejecutivo
-----------------

El resto de esta sección cubre el alcance del proceso de desarrollo del
kernel y los tipos de frustraciones que los desarrolladores y sus
empleadores pueden encontrar allí. Hay muchas razones por las que el
código del kernel debe fusionarse con el kernel oficial (“mainline”),
incluyendo la disponibilidad automática para los usuarios, el apoyo de la
comunidad en muchas formas, y la capacidad de influir en la dirección del
desarrollo del kernel. El código contribuido al kernel de Linux debe
estar disponible bajo una licencia compatible con GPL.

:ref:`sp_development_process` introduce el proceso de desarrollo, el ciclo
de lanzamiento del kernel y la mecánica de la "ventana de combinación"
(merge window). Se cubren las distintas fases en el desarrollo del parche,
la revisión y, el ciclo de fusión. Hay algunas discusiones sobre
herramientas y listas de correo. Se anima a los desarrolladores que deseen
comenzar con el desarrollo del kernel a encontrar y corregir errores como
ejercicio inicial.

:ref:`sp_development_early_stage` cubre la planificación de proyectos en
etapas tempranas, con énfasis en involucrar a la comunidad de desarrollo
lo antes posible.

:ref:`sp_development_coding` trata sobre el proceso de codificación. Se
discuten varios escollos encontrados por otros desarrolladores. Se cubren
algunos requisitos para los parches, y hay una introducción a algunas de
las herramientas que pueden ayudar a garantizar que los parches del kernel
sean correctos.

:ref:`sp_development_posting` trata sobre el proceso de enviar parches para
su revisión. Para ser tomados en serio por la comunidad de desarrollo,
los parches deben estar correctamente formateados y descritos, y deben
enviarse al lugar correcto. Seguir los consejos de esta sección debería
ayudar a garantizar la mejor recepción posible para su trabajo.

:ref:`sp_development_followthrough` cubre lo que sucede después de publicar
parches; el trabajo está lejos de terminar en ese momento. Trabajar con
revisores es una parte crucial del proceso de desarrollo; esta sección
ofrece varios consejos sobre cómo evitar problemas en esta importante
etapa. Se advierte a los desarrolladores que no asuman que el trabajo está
terminado cuando un parche se fusiona en mainline.

:ref:`sp_development_advancedtopics` introduce un par de temas “avanzados”:
la administración de parches con git y la revisión de parches publicados
por otros.

:ref:`sp_development_conclusion` concluye el documento con punteros a las
fuentes para obtener más información sobre el desarrollo del kernel.

De qué trata este documento
---------------------------

El kernel de Linux, con más de 8 millones de líneas de código y más de
1000 colaboradores en cada versión, en uno de los proyectos de software
libre más grandes y activos que existen. Desde sus humildes comienzos en
1991, este kernel ha evolucionado hasta convertirse en el mejor componente
del sistema operativo que se ejecuta en reproductores de música digital
de bolsillo, PC de escritorio, las supercomputadoras más grandes que
existen y todo tipo de sistemas intermedios. Es una solución robusta,
eficiente, y escalable para casi cualquier situación.

Con el crecimiento de Linux, ha llegado un aumento en el número de
desarrolladores (y empresas) que desean participar en su desarrollo. Los
vendedores de hardware quieren asegurarse de que Linux sea compatible con
sus productos, lo que hace que esos productos sean atractivos para los
usuarios de Linux. Los vendedores de sistemas embebidos, que utilizan
Linux como componente de un producto integrado, quieren que Linux sea lo
más capaz y adecuado posible para tarea en cuestión. Los distribuidores
y otros vendedores de software que basan sus productos en Linux tienen un
claro interés en las capacidades, el rendimiento, y la fiabilidad del
kernel de Linux. Y los usuarios finales, también, a menudo desearán
cambiar Linux para que se adapte mejor a sus necesidades.

Una de las características más convincentes de Linux es que es accesible
a estos desarrolladores; cualquier persona con las habilidades necesarias
puede mejorar Linux e influir en la dirección de su desarrollo. Los
productos propietarios no pueden ofrecer este tipo de apertura, que es una
característica del proceso de software libre. Pero, en todo caso, el
kernel es aún más libre que la mayoría de los otros proyectos de software
libre. Un ciclo típico de desarrollo de kernel de tres meses puede
involucrar a más de 1000 desarrolladores que trabajan para más de 100
empresas diferentes (o sin pertenecer a ninguna empresa).

Trabajar con la comunidad de desarrollo del kernel no es especialmente
difícil. Pero, a pesar de eso, muchos colaboradores potenciales han
experimentado dificultades al tratar de hacer el trabajo del kernel. La
comunidad del kernel ha desarrollado sus propias formas distintivas de
operar, lo que le permite funcionar de manera fluida (y producir un
producto de alta calidad) en un entorno donde miles de líneas de código
se cambian todos los días. Por lo tanto, no es sorprendente que el
proceso de desarrollo del kernel de Linux difiera mucho de los métodos de
desarrollo propietarios.

El proceso de desarrollo del kernel puede parecer extraño e intimidante
para los nuevos desarrolladores, pero hay buenas razones y una sólida
experiencia detrás de él. Un desarrollador que no entienda las formas de
la comunidad del kernel (o, peor aún, que intente burlarse o eludirlas)
tendrá una experiencia frustrante por delante. La comunidad de
desarrollo, si bien es servicial para aquellos que están tratando de
aprender, tiene poco tiempo para aquellos que no escuchan o que no se
preocupan por el proceso de desarrollo.

Se espera que quienes lean este documento puedan evitar esa experiencia
frustrante. Hay mucho material aquí, pero el esfuerzo que implica leerlo
será recompensado en poco tiempo. La comunidad de desarrollo siempre
necesita desarrolladores que ayudan a mejorar el kernel; el siguiente
texto debería ayudarle – o a quienes trabajan para usted, a unirse a
nuestra comunidad.

Créditos
--------

Este documento fue escrito por Jonathan Corbet, corbet@lwn.net. Ha sido
mejorado por los comentarios de Johannes Berg, James Berry, Alex Chiang,
Roland Dreier, Randy Dunlap, Jake Edge, Jiri Kosina, Matt Mackall, Arthur
Marsh, Amanda McPherson, Andrew Morton, Andrew Price, Tsugikazu Shibata y
Jochen Voß.
Este trabajo fue respaldado por la Fundación Linux; gracias especialmente
a Amanda McPherson, quien reconoció el valor de este esfuerzo e hizo que
todo sucediera.

Importancia de integrar el código en el mainline
------------------------------------------------

Algunas empresas y desarrolladores ocasionalmente se preguntan por qué
deberían molestarse en aprender cómo trabajar con la comunidad del
kernel y obtener su código en el kernel mainline (el “mainline” es el
kernel mantenido por Linus Torvalds y utilizado como base por los
distribuidores de Linux. A corto plazo, contribuir con código puede
parecer un gasto evitable; parece más fácil mantener el código separado
y dar soporte a los usuarios directamente. La verdad del asunto es que
mantener el código separado (“fuera del árbol”) es pan para hoy y hambre
para mañana.

Para ilustrar los costos del código fuera-del-árbol, aquí hay algunos
aspectos relevantes del proceso de desarrollo del kernel. La mayoría de
estos se discutirán con mayor detalle más adelante en este documento.
Considerar:

- El código que se ha fusionado con el kernel mainline está disponible
  para todos los usuarios de Linux. Estará presente automáticamente en
  todas las distribuciones que lo habiliten. No hay necesidad de discos
  de controladores, descargas, o las molestias de admitir múltiples
  versiones de múltiples distribuciones; todo simplemente funciona, para
  el desarrollador y para el usuario. La incorporación al mainline
  resuelve un gran número de problemas de distribución y soporte.

- Mientras los desarrolladores del kernel se esfuerzan por mantener una
  interfaz estable para el espacio de usuario, la API interna de kernel
  está en constante cambio. La falta de una interfaz interna estable es
  una decisión deliberada de diseño; permite realizar mejoras
  fundamentales en cualquier momento y da como resultado un código de
  mayor calidad. Pero uno resultado de esa política es que cualquier
  código fuera-del-árbol requiere un mantenimiento constante si va a
  funcionar con los nuevos kernels. Mantener el código fuera-del-árbol
  requiere una cantidad significativa de trabajo sólo para que ese código
  siga funcionando.

  En su lugar, el código en el mainline no requiere este trabajo como
  resultado de una regla simple que requiere que cualquier desarrollador
  que realice un cambio en la API también corrija cualquier código que
  se rompa como resultado de ese cambio. Así que, el código fusionado en
  el mainline tiene costos de mantenimiento significativamente más bajos.

- Más allá de eso, el código que está en el kernel a menudo será
  mejorado por otros desarrolladores. Resultados sorprendentes pueden
  provenir de capacitar a su comunidad de usuarios y clientes para mejorar
  su producto.

- El código del kernel se somete a revisión, tanto antes como después
  de fusionarse con el mainline. No importa cuán fuertes sean las
  habilidades del desarrollador original, este proceso de revisión
  invariablemente encuentra formas en las que se puede mejorar el código.
  A menudo la revisión encuentra errores graves y problemas de seguridad.
  Esto es especialmente cierto para el código que se ha desarrollado en
  un entorno cerrado; dicho código se beneficia fuertemente de la
  revisión por desarrolladores externos. El código fuera-del-árbol es
  de menor calidad.

- La participación en el proceso de desarrollo es su manera de influir en
  la dirección del desarrollo del kernel. Los usuarios que se quejan
  desde el sofa son escuchados, pero los desarrolladores activos tienen
  una voz más fuerte – y la capacidad de implementar cambios que hacen
  que el kernel funcione mejor para sus necesidades.

- Cuando el código se mantiene por separado, siempre existe la posibilidad
  de que un tercero contribuya a una implementación diferente de una
  característica similar. Si eso sucede, conseguir que su código
  fusionado será mucho más difícil – hasta el punto de la imposibilidad.
  Entonces se enfrentará a las desagradables alternativas de (1) mantener
  una característica no estándar fuera del árbol indefinidamente, o
  (2) abandonar su código y migrar sus usuarios a la versión en el árbol.

- La contribución del código es la acción fundamental que hace que todo
  el proceso funcione. Al contribuir con su código, puede agregar nuevas
  funcionalidades al kernel y proporcionar capacidades y ejemplos que son
  útiles para otros desarrolladores del kernel. Si ha desarrollado código
  para Linux (o está pensando en hacerlo), claramente tiene un interés
  en el éxito continuo de esta plataforma; contribuir con código es una
  de las mejores maneras de ayudar a garantizar ese éxito.

Todo el razonamiento anterior se aplica a cualquier código de kernel
fuera-del-árbol, incluido el código que se distribuye en forma propietaria
y únicamente en binario. Sin embargo, hay factores adicionales que deben
tenerse en cuenta antes de considerar cualquier tipo de distribución de
código de kernel únicamente en binario. Estos incluyen:

- Las cuestiones legales en torno a la distribución de módulos
  propietarios del kernel son, en el mejor de los casos, confusas;
  bastantes titulares de derechos de autor del kernel creen que la
  mayoría de los módulos binarios son productos derivados del kernel y
  que, como resultado, su distribución es una violación de la licencia
  Pública General de GNU (sobre la que se dirá más adelante). El autor
  de este texto no es abogado, y nada en este documento puede considerarse
  asesoramiento legal. Solo los tribunales pueden determinar el verdadero
  estatus legal de los módulos de código cerrado. Pero la incertidumbre
  que acecha a esos módulos está ahí a pesar de todo.

- Los módulos binarios aumentan enormemente la dificultad de depurar
  problemas del kernel, hasta el punto de que la mayoría de los
  desarrolladores del kernel ni siquiera lo intentarán. Por lo tanto,
  la distribución de módulos únicamente en binario hará que sea más
  difícil para sus usuarios obtener soporte de la comunidad.

- El soporte también es más difícil para los distribuidores de módulos
  únicamente en binario, que deben proporcionar una versión del módulo
  para cada distribución y cada versión del kernel que deseen apoyar.
  Podría requerir docenas de compilaciones de un solo módulo para
  proporcionar una cobertura razonablemente completa, y sus usuarios
  tendrán que actualizar su módulo por separado cada vez que
  actualicen su kernel.

- Todo lo que se dijo anteriormente sobre la revisión de código se aplica
  doblemente al código cerrado. Dado que este código no está disponible
  en absoluto, no puede haber sido revisado por la comunidad y, sin duda,
  tendrá serios problemas.

Los fabricantes de sistemas embebidos, en particular, pueden verse
tentados a ignorar gran parte de lo que se ha dicho en esta sección
creyendo que están enviando un producto autónomo que utiliza una
versión de kernel congelada y no requiere más desarrollo después de su
lanzamiento. Este argumento desaprovecha el valor de la revisión
generalizad del código y el valor de permitir que sus usuarios agreguen
capacidades a su producto. Pero estos productos también tienen una vida
comercial limitada, después de la cual se debe lanzar una nueva versión.
En ese punto, los vendedores cuyo código esté en el mainline y bien
mantenido estarán en una posición mucho mejor para preparar el nuevo
producto rápidamente para el mercado.

Licencias
---------

El código se contribuye al kernel de Linux bajo varias licencias, pero
todo el código debe ser compatible con la versión 2 de la Licencia
Pública General de GNU (GPLv2), que cubre la distribución del kernel. En
la práctica, esto significa que todas las contribuciones de código están
cubiertas ya sea por la GPLv2 (con, opcionalmente, un lenguaje que permite
la distribución en versiones posteriores de la GPL) o por la licencia BSD
de tres cláusulas. Cualquier contribución que no esté cubierta por una
licencia compatible no será aceptada en el kernel.

No se requieren (ni se solicitan) cesiones de derechos de autor para el
código aportado al kernel. Todo el código fusionado en el kernel
mainline conserva su propiedad original; como resultado, el kernel ahora
tiene miles de propietarios.

Una implicación de esta estructura de propiedad es que cualquier intento
de cambiar la licencia del kernel está condenado a un fracaso casi seguro.
Hay pocos escenarios prácticos en los que se pueda obtener el acuerdo de
todos los titulares de derechos de autor (o eliminar su código del
kernel). Así que, en particular, no hay perspectivas de una migración a
la versión 3 de la GPL en un futuro previsible.

Es imperativo que todo el código aportado al kernel sea legítimamente
software libre. Por esa razón, no se aceptará código de colaboradores
anónimos (o seudónimos). Todos los colaboradores están obligados a
“firmar” su código, indicando que el código puede ser distribuido con
el kernel bajo la GPL. El código que no ha sido licenciado como software
libre por su propietario, o que corre el riesgo de crear problemas
relacionadas con los derechos de autor para el kernel (como el código que
se deriva de esfuerzos de ingeniería inversa que carecen de las garantías
adecuadas) no puede ser contribuido.

Las preguntas sobre cuestiones relacionadas con los derechos de autor son
comunes en las listas de correo de desarrollo de Linux. Normalmente, estas
preguntas no recibirán escasez de respuestas, pero se debe tener en cuenta
que las personas que responden a esas preguntas no son abogados y no
pueden proporcionar consejo legal. Si tiene preguntas legales relacionadas
con el código fuente de Linux, no hay sustituto para hablar con un abogado
que entienda este campo. Confiar en las respuestas obtenidas en listas
técnicas de correo es un asunto arriesgado.
