1.. SPDX-License-Identifier: GPL-2.0 2 3.. _pt_process_howto: 4 5COMO FAZER o desenvolvimento do kernel Linux 6============================================ 7 8Este é o documento definitivo sobre este tópico. Ele contém instruções 9sobre como se tornar um desenvolvedor do kernel Linux e como aprender a 10trabalhar com a comunidade de desenvolvimento do kernel Linux. Ele tenta 11não conter nada relacionado aos aspectos técnicos da programação do kernel, 12mas ajudará a apontar a direção certa para isso. 13 14Se algo neste documento ficar desatualizado, por favor, envie patches para 15o mantenedor deste arquivo, que está listado no final do documento. 16 17 18Introdução 19------------ 20 21Então, você quer aprender como se tornar um desenvolvedor do kernel Linux? 22Ou o seu gerente lhe disse: "Vá escrever um driver Linux para este 23dispositivo". O objetivo deste documento é ensinar tudo o que você precisa 24saber para conseguir isso, descrevendo o processo pelo qual você deve passar 25e oferecendo dicas sobre como trabalhar com a comunidade. Ele também tentará 26explicar algumas das razões pelas quais a comunidade trabalha da forma que 27trabalha. 28 29O kernel é escrito principalmente em C, com algumas partes dependentes de 30arquitetura escritas em assembly. Um bom entendimento de C é necessário para 31o desenvolvimento do kernel. O conhecimento de Assembly (de qualquer 32arquitetura) não é obrigatório, a menos que você planeje fazer 33desenvolvimento de baixo nível para essa arquitetura específica. Embora não 34sejam um substituto para uma formação sólida em C e/ou anos de experiência, 35os seguintes livros são bons para, no mínimo, referência: 36 37 - "The C Programming Language" por Kernighan e Ritchie [Prentice Hall] 38 39 - "Practical C Programming" por Steve Oualline [O'Reilly] 40 41 - "C: A Reference Manual" por Harbison e Steele [Prentice Hall] 42 43O kernel é escrito usando o GNU C e a GNU toolchain. Embora ele siga o 44padrão ISO C11, ele utiliza uma série de extensões que não estão presentes 45no padrão. O kernel é um ambiente C independente (freestanding), sem 46dependência da biblioteca C padrão (libc), portanto, algumas partes do 47padrão C não são suportadas. Divisões arbitrárias de "long long" e ponto 48flutuante não são permitidas. Às vezes, pode ser difícil entender as 49suposições que o kernel faz sobre a toolchain e as extensões que ele utiliza 50e, infelizmente, não existe uma referência definitiva para elas. Por favor, 51verifique as páginas de informações do gcc (`info gcc`) para obter algumas 52informações sobre elas. 53 54Por favor, lembre-se de que você está tentando aprender como trabalhar com a 55comunidade de desenvolvimento existente. É um grupo diversificado de pessoas, 56com altos padrões de codificação, estilo e procedimento. Esses padrões foram 57criados ao longo do tempo com base no que se descobriu funcionar melhor para 58uma equipe tão grande e geograficamente dispersa. Tente aprender o máximo 59possível sobre esses padrões com antecedência, pois eles estão bem 60documentados; não espere que as pessoas se adaptem a você ou à forma de fazer 61as coisas da sua empresa. 62 63 64Questões Legais 65--------------- 66 67O código-fonte do kernel Linux é lançado sob a GPL. Por favor, veja o arquivo 68COPYING no diretório principal da árvore de fontes. As regras de licenciamento 69do kernel Linux e como usar os identificadores `SPDX <https://spdx.org/>`_ no 70código-fonte estão descritas em :ref:`Documentation/process/license-rules.rst <kernel_licensing>`. 71Se você tiver mais perguntas sobre a licença, por favor, entre em contato com 72um advogado e não pergunte na lista de discussão do kernel Linux. As pessoas 73nas listas de discussão não são advogados e você não deve confiar em suas 74declarações sobre assuntos jurídicos. 75 76Para perguntas e respostas comuns sobre a GPL, por favor, veja: 77 78 https://www.gnu.org/licenses/gpl-faq.html 79 80 81Documentação 82------------ 83 84A árvore de fontes do kernel Linux possui uma vasta gama de documentos que 85são inestimáveis para aprender como interagir com a comunidade do kernel. 86Quando novos recursos são adicionados ao kernel, recomenda-se que novos 87arquivos de documentação também sejam adicionados explicando como usar o 88recurso. Quando uma mudança no kernel faz com que a interface que o kernel 89expõe para o espaço do usuário (userspace) mude, recomenda-se que você envie 90a informação ou um patch para as páginas de manual explicando a mudança para 91o mantenedor das páginas de manual em alx@kernel.org, e coloque em cópia (CC) 92a lista linux-api@vger.kernel.org. 93 94Aqui está uma lista de arquivos que estão na árvore de fontes do kernel e 95que são de leitura obrigatória: 96 97 :ref:`Documentation/admin-guide/README.rst <readme>` 98 Este arquivo fornece um breve histórico sobre o kernel Linux e descreve 99 o que é necessário fazer para configurar e compilar o kernel. Pessoas 100 que são novas no kernel devem começar por aqui. 101 102 :doc:`changes` 103 Este arquivo fornece uma lista das versões mínimas de vários pacotes de 104 software que são necessários para compilar e executar o kernel com 105 sucesso. 106 107 :ref:`Documentation/process/coding-style.rst <codingstyle>` 108 Este documento descreve o estilo de codificação do kernel Linux e parte 109 da fundamentação por trás dele. Espera-se que todo código novo siga as 110 diretrizes deste documento. A maioria dos mantenedores apenas aceitará 111 patches se essas regras forem seguidas, e muitas pessoas apenas 112 revisarão o código se ele estiver no estilo adequado. 113 114 :ref:`Documentation/process/submitting-patches.rst <submittingpatches>` 115 Este arquivo descreve em detalhes explícitos como criar e enviar 116 um patch com sucesso, incluindo (mas não limitado a): 117 118 - Conteúdo do e-mail 119 - Formato do e-mail 120 - Para quem enviá-lo 121 122 Seguir estas regras não garantirá o sucesso (já que todos os patches 123 estão sujeitos a um escrutínio de conteúdo e estilo), mas não segui-las 124 quase sempre o impedirá. 125 126Outras excelentes descrições de como criar patches adequadamente são: 127 128 "O Patch Perfeito" 129 https://www.ozlabs.org/~akpm/stuff/tpp.txt 130 131 "Formato de Submissão de Patch do Kernel Linux" 132 https://web.archive.org/web/20180829112450/http://linux.yyz.us/patch-format.html 133 134 :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>` 135 Este arquivo descreve a justificativa por trás da decisão consciente de 136 não ter uma API estável dentro do kernel, incluindo pontos como: 137 138 - Camadas de adaptação (shim-layers) de subsistemas (para compatibilidade?) 139 - Portabilidade de drivers entre sistemas operacionais. 140 - Mitigação de mudanças rápidas dentro da árvore de fontes do kernel 141 (ou impedimento de mudanças rápidas). 142 143 Este documento é crucial para compreender a filosofia de desenvolvimento 144 do Linux e é muito importante para pessoas que estão migrando para o 145 Linux vindas do desenvolvimento em outros Sistemas Operacionais. 146 147 :ref:`Documentation/process/security-bugs.rst <securitybugs>` 148 Se você acredita ter encontrado um problema de segurança no kernel Linux, 149 por favor, siga os passos descritos neste documento para ajudar a 150 notificar os desenvolvedores do kernel e auxiliar na resolução do problema. 151 152 :ref:`Documentation/process/management-style.rst <managementstyle>` 153 Este documento descreve como os mantenedores do kernel Linux operam e o 154 ethos compartilhado por trás de suas metodologias. Esta é uma leitura 155 importante para qualquer pessoa nova no desenvolvimento do kernel (ou 156 para qualquer pessoa simplesmente curiosa sobre isso), pois resolve muitos 157 equívocos comuns e confusões sobre o comportamento único dos mantenedores 158 do kernel. 159 160 :ref:`Documentation/process/stable-kernel-rules.rst <stable_kernel_rules>` 161 Este arquivo descreve as regras sobre como ocorrem os lançamentos das 162 versões estáveis (stable) do kernel e o que fazer se você desejar que 163 uma alteração seja incluída em um desses lançamentos. 164 165 :ref:`Documentation/process/kernel-docs.rst <kernel_docs>` 166 Uma lista de documentação externa que pertence ao desenvolvimento do 167 kernel. Por favor, consulte esta lista caso não encontre o que está 168 procurando dentro da documentação interna do kernel. 169 170 :ref:`Documentation/process/applying-patches.rst <applying_patches>` 171 Uma boa introdução descrevendo exatamente o que é um patch e como 172 aplicá-lo aos diferentes ramos (branches) de desenvolvimento do kernel. 173 174O kernel também possui um grande número de documentos que podem ser 175gerados automaticamente a partir do próprio código-fonte ou de 176marcações ReStructuredText (ReST), como esta. Isso inclui uma 177descrição completa da API interna do kernel e regras sobre como 178manipular o bloqueio (locking) corretamente. 179 180Todos esses documentos podem ser gerados em formato PDF ou HTML ao 181executar:: 182 183 make pdfdocs 184 make htmldocs 185 186respectivamente, a partir do diretório principal do código-fonte do kernel. 187 188Os documentos que utilizam a marcação ReST serão gerados em 189Documentation/output. Eles também podem ser gerados nos formatos 190LaTeX e ePub com:: 191 192 make latexdocs 193 make epubdocs 194 195Como se tornar um desenvolvedor do kernel 196------------------------------------------ 197 198Se você não sabe nada sobre o desenvolvimento do kernel Linux, você deve 199consultar o projeto Linux KernelNewbies: 200 201 https://kernelnewbies.org 202 203Ele consiste em uma lista de discussão útil onde você pode fazer quase 204qualquer tipo de pergunta básica sobre o desenvolvimento do kernel 205(certifique-se de pesquisar nos arquivos primeiro, antes de perguntar 206algo que já foi respondido no passado). Ele também possui um canal de 207IRC que você pode usar para fazer perguntas em tempo real, e muita 208documentação útil para aprender sobre o desenvolvimento do kernel Linux. 209 210O site possui informações básicas sobre a organização do código, 211subsistemas e projetos atuais (tanto in-tree quanto out-of-tree). 212Também descreve algumas informações logísticas básicas, como por exemplo, 213como compilar um kernel e aplicar um patch. 214 215Se você não sabe por onde começar, mas deseja procurar alguma tarefa 216para iniciar sua integração na comunidade de desenvolvimento do kernel, 217acesse o projeto Linux Kernel Janitor: 218 219 https://kernelnewbies.org/KernelJanitors 220 221É um ótimo lugar para começar. Ele descreve uma lista de problemas 222relativamente simples que precisam ser limpos e corrigidos dentro da 223árvore de códigos-fonte do kernel Linux. Ao trabalhar com os 224desenvolvedores responsáveis por este projeto, você aprenderá o básico 225sobre como incluir seu patch na árvore do kernel Linux e, 226possivelmente, será orientado sobre o que trabalhar em seguida, caso 227ainda não tenha uma ideia. 228 229Antes de fazer qualquer modificação real no código do kernel Linux, é 230imperativo entender como o código em questão funciona. Para esse 231propósito, nada é melhor do que lê-lo diretamente (a maioria das partes 232complexas está bem comentada), talvez até com a ajuda de ferramentas 233especializadas. Uma ferramenta particularmente recomendada é o projeto 234Linux Cross-Reference, que é capaz de apresentar o código-fonte em um 235formato de página web indexada e auto-referenciada. Um excelente 236repositório atualizado do código do kernel pode ser encontrado em: 237 238 https://elixir.bootlin.com/ 239 240 241O processo de desenvolvimento 242----------------------------- 243 244O processo de desenvolvimento do kernel Linux consiste atualmente em algumas 245"branches" (ramos) principais diferentes e muitos ramos de subsistemas 246específicos. Esses diferentes ramos são: 247 248 - Árvore principal (mainline) do Linus 249 - Várias árvores estáveis com múltiplos números de versão principal 250 - Árvores específicas de subsistemas 251 - Árvore de testes de integração linux-next 252 253Árvore principal (Mainline tree) 254~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 256A árvore principal é mantida por Linus Torvalds e pode ser encontrada em 257https://kernel.org ou no repositório. Seu processo de desenvolvimento é 258o seguinte: 259 260 - Assim que um novo kernel é lançado, uma janela de duas semanas é aberta; 261 durante esse período, os mantenedores podem enviar grandes diffs para 262 Linus, geralmente patches que já foram incluídos na linux-next por algumas 263 semanas. A forma preferida de enviar grandes mudanças é usando o git 264 (a ferramenta de gerenciamento de código-fonte do kernel, mais informações 265 podem ser encontradas em https://git-scm.com/), mas patches simples 266 também são aceitos. 267 - Após duas semanas, um kernel -rc1 é lançado e o foco passa a ser tornar 268 o novo kernel o mais sólido possível. A maioria dos patches neste estágio 269 deve corrigir uma regressão. Bugs que sempre existiram não são regressões, 270 portanto, envie esses tipos de correções apenas se forem importantes. 271 Observe que um driver (ou sistema de arquivos) totalmente novo pode ser 272 aceito após o -rc1 porque não há risco de causar regressões com tal 273 mudança, desde que a alteração seja autocontida e não afete áreas fora do 274 código que está sendo adicionado. O git pode ser usado para enviar 275 patches para Linus após o lançamento do -rc1, mas os patches também 276 precisam ser enviados para uma lista de discussão pública para revisão. 277 - Um novo -rc é lançado sempre que Linus considerar que a árvore git atual 278 está em um estado razoavelmente estável e adequado para testes. O objetivo 279 é lançar um novo kernel -rc a cada semana. 280 - O processo continua até que o kernel seja considerado "pronto"; o 281 processo deve durar cerca de 6 semanas. 282 283Vale a pena mencionar o que Andrew Morton escreveu na lista de discussão 284do kernel Linux sobre os lançamentos do kernel: 285 286 *"Ninguém sabe quando um kernel será lançado, porque ele é 287 lançado de acordo com o status percebido dos bugs, não de acordo 288 com um cronograma pré-concebido."* 289 290Várias árvores estáveis com múltiplos números de versão principal 291~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 292 293Kernels com versões de 3 partes são kernels -stable (estáveis). Eles 294contêm correções relativamente pequenas e críticas para problemas de 295segurança ou regressões significativas descobertas em um determinado 296lançamento principal da árvore mainline. Cada lançamento em uma série 297estável principal incrementa a terceira parte do número da versão, 298mantendo as duas primeiras partes iguais. 299 300Este é o ramo recomendado para usuários que desejam o kernel estável 301mais recente e não estão interessados em ajudar a testar versões de 302desenvolvimento ou experimentais. 303 304As árvores estáveis são mantidas pela equipe "stable" 305<stable@vger.kernel.org> e são lançadas conforme a necessidade exigir. 306O período normal de lançamento é de aproximadamente duas semanas, mas 307pode ser mais longo se não houver problemas urgentes. Por outro lado, 308um problema relacionado à segurança pode fazer com que um lançamento 309ocorra quase instantaneamente. 310 311O arquivo :ref:`Documentation/process/stable-kernel-rules.rst <stable_kernel_rules>` 312na árvore do kernel documenta quais tipos de mudanças são aceitáveis para 313a árvore -stable e como o processo de lançamento funciona. 314 315Árvores específicas de subsistemas 316~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 317 318Os mantenedores dos vários subsistemas do kernel — e também muitos 319desenvolvedores de subsistemas do kernel — expõem seu estado atual de 320desenvolvimento em repositórios de código-fonte. Dessa forma, outros 321podem ver o que está acontecendo nas diferentes áreas do kernel. Em 322áreas onde o desenvolvimento é rápido, um desenvolvedor pode ser 323solicitado a basear suas submissões em tal árvore de subsistema do 324kernel para que conflitos entre a submissão e outros trabalhos já em 325andamento sejam evitados. 326 327A maioria desses repositórios são árvores git, mas também existem outros 328SCMs em uso, ou filas de patches sendo publicadas como séries quilt. Os 329endereços desses repositórios de subsistemas estão listados no arquivo 330MAINTAINERS. Muitos deles podem ser navegados em https://git.kernel.org/. 331 332Antes que um patch proposto seja incluído em tal árvore de subsistema, 333ele está sujeito a uma revisão que ocorre principalmente em listas de 334discussão (veja a seção respectiva abaixo). Para vários subsistemas do 335kernel, este processo de revisão é rastreado com a ferramenta patchwork. 336O Patchwork oferece uma interface web que mostra as postagens de patches, 337quaisquer comentários sobre um patch ou revisões feitas a ele, e os 338mantenedores podem marcar os patches como "sob revisão", "aceitos" ou 339"rejeitados". A maioria desses sites patchwork está listada em 340https://patchwork.kernel.org/. 341 342Árvore de testes de integração linux-next 343~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 344 345Antes que as atualizações das árvores de subsistemas sejam mescladas na 346árvore mainline, elas precisam ser testadas quanto à integração. Para 347este propósito, existe um repositório de testes especial no qual 348praticamente todas as árvores de subsistemas são integradas (pulled) 349quase diariamente: 350 351 https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git 352 353Dessa forma, a linux-next oferece uma visão resumida do que se espera 354que entre no kernel mainline no próximo período de mesclagem (merge 355window). Testadores aventureiros são muito bem-vindos para testar a 356linux-next em tempo de execução. 357 358 359Relato de Bugs 360-------------- 361 362O arquivo 'Documentation/admin-guide/reporting-issues.rst' no diretório 363principal de códigos-fonte do kernel descreve como relatar um possível 364bug no kernel e detalha que tipo de informação é necessária para os 365desenvolvedores do kernel ajudarem a rastrear o problema. 366 367Gerenciando relatos de bugs 368--------------------------- 369 370Uma das melhores maneiras de colocar em prática suas habilidades de hacking 371é corrigindo bugs relatados por outras pessoas. Você não apenas ajudará a 372tornar o kernel mais estável, mas também aprenderá a resolver problemas do 373mundo real, melhorará suas habilidades e outros desenvolvedores passarão a 374notar sua presença. Corrigir bugs é uma das melhores formas de obter mérito 375entre outros desenvolvedores, pois poucas pessoas gostam de gastar tempo 376corrigindo bugs de terceiros. 377 378Para trabalhar em relatos de bugs já existentes, encontre um subsistema no 379qual você esteja interessado. Verifique no arquivo MAINTAINERS para onde 380os bugs daquele subsistema são relatados; geralmente será uma lista de 381discussão, raramente um rastreador de bugs (bugtracker). Pesquise nos 382arquivos de mensagens do local indicado por relatos recentes e ajude onde 383achar apropriado. Você também pode verificar o site 384https://bugzilla.kernel.org para relatos de bugs; apenas alguns 385subsistemas do kernel o utilizam ativamente para relato ou rastreamento, 386entretanto, bugs de todo o kernel acabam sendo registrados lá. 387 388 389Listas de discussão 390------------------- 391 392Como alguns dos documentos acima descrevem, a maioria dos desenvolvedores 393do núcleo (core) do kernel participa da Linux Kernel Mailing List (LKML). 394Detalhes sobre como se inscrever e cancelar a inscrição na lista podem 395ser encontrados em: 396 397 https://subspace.kernel.org/subscribing.html 398 399Existem arquivos de mensagens da lista na web em muitos lugares diferentes. 400Use um mecanismo de busca para encontrar esses arquivos. Por exemplo: 401 402 https://lore.kernel.org/linux-kernel/ 403 404É altamente recomendável que você pesquise nos arquivos sobre o tópico que 405deseja abordar antes de postar na lista. Muitas coisas já discutidas em 406detalhes estão registradas apenas nos arquivos das listas de discussão. 407 408A maioria dos subsistemas individuais do kernel também possui sua própria 409lista de discussão separada, onde realizam seus esforços de desenvolvimento. 410Consulte o arquivo MAINTAINERS para obter uma lista de quais são essas 411listas para os diferentes grupos. 412 413Muitas das listas estão hospedadas no kernel.org. Informações sobre elas 414podem ser encontradas em: 415 416 https://subspace.kernel.org 417 418Por favor, lembre-se de seguir bons hábitos de comportamento ao usar as 419listas. Embora um pouco clichê, a URL a seguir possui algumas diretrizes 420simples para interagir com a lista (ou qualquer outra lista): 421 422 https://subspace.kernel.org/etiquette.html 423 424Se várias pessoas responderem ao seu e-mail, a lista de destinatários em 425CC: pode se tornar bem grande. Não remova ninguém da lista CC: sem um 426bom motivo, e não responda apenas para o endereço da lista. Acostume-se 427a receber o e-mail duas vezes (um do remetente e outro da lista) e não 428tente ajustar isso adicionando cabeçalhos de e-mail complexos; as pessoas 429não gostarão disso. 430 431Lembre-se de manter o contexto e a atribuição de suas respostas intactos; 432mantenha as linhas do tipo "John Kernelhacker escreveu...:" no topo da 433sua resposta e adicione seus comentários entre as seções citadas 434individualmente, em vez de escrever tudo no topo do e-mail. 435 436Se você adicionar patches ao seu e-mail, certifique-se de que sejam texto 437puro legível, conforme declarado em 438:ref:`Documentation/process/submitting-patches.rst <submittingpatches>`. 439Os desenvolvedores do kernel não querem lidar com anexos ou patches 440compactados; eles podem querer comentar linhas individuais do seu patch, 441o que só funciona dessa forma. Certifique-se de usar um programa de 442e-mail que não altere espaços e caracteres de tabulação (tabs). Um bom 443primeiro teste é enviar o e-mail para si mesmo e tentar aplicar o seu 444próprio patch. Se isso não funcionar, conserte seu programa de e-mail ou 445troque-o até que funcione. 446 447Acima de tudo, por favor, lembre-se de mostrar respeito aos outros 448inscritos. 449 450 451Trabalhando com a comunidade 452---------------------------- 453 454O objetivo da comunidade do kernel é fornecer o melhor kernel possível. 455Quando você envia um patch para aceitação, ele será revisado por seus 456méritos técnicos e apenas por eles. Então, o que você deve esperar? 457 458 - críticas 459 - comentários 460 - solicitações de mudança 461 - solicitações de justificativa 462 - silêncio 463 464Lembre-se, isso faz parte do processo de incluir seu patch no kernel. 465Você deve ser capaz de aceitar críticas e comentários sobre seus patches, 466avaliá-los em nível técnico e retrabalhar seus patches ou fornecer 467raciocínios claros e concisos sobre o porquê de certas mudanças não 468deverem ser feitas. Se não houver respostas à sua postagem, aguarde 469alguns dias e tente novamente; às vezes, as coisas se perdem no enorme 470volume de mensagens. 471 472O que você não deve fazer? 473 474 - esperar que seu patch seja aceito sem questionamentos 475 - tornar-se defensivo 476 - ignorar comentários 477 - reenviar o patch sem fazer nenhuma das alterações solicitadas 478 479Em uma comunidade que busca a melhor solução técnica possível, sempre 480haverá opiniões divergentes sobre o quão benéfico é um patch. Você deve 481ser cooperativo e estar disposto a adaptar sua ideia para que ela se 482encaixe no kernel. Ou, pelo menos, estar disposto a provar que sua ideia 483vale a pena. Lembre-se: estar errado é aceitável, desde que você esteja 484disposto a trabalhar em direção a uma solução correta. 485 486É normal que as respostas ao seu primeiro patch sejam apenas uma lista 487de uma dúzia de coisas que você deve corrigir. Isso **não** implica que 488seu patch não será aceito e **não** é algo pessoal contra você. Simplesmente 489corrija todos os problemas apontados em seu patch e envie-o novamente. 490 491 492Diferenças entre a comunidade do kernel e estruturas corporativas 493----------------------------------------------------------------- 494 495A comunidade do kernel trabalha de forma diferente da maioria dos ambientes 496tradicionais de desenvolvimento corporativo. Aqui está uma lista de coisas 497que você pode tentar fazer para evitar problemas: 498 499 Boas coisas a dizer em relação às suas mudanças propostas: 500 501 - "Isto resolve múltiplos problemas." 502 - "Isto remove 2000 linhas de código." 503 - "Aqui está um patch que explica o que estou tentando descrever." 504 - "Eu testei isso em 5 arquiteturas diferentes..." 505 - "Aqui está uma série de pequenos patches que..." 506 - "Isto aumenta a performance em máquinas comuns..." 507 508 Coisas ruins que você deve evitar dizer: 509 510 - "Nós fizemos desta forma no AIX/ptx/Solaris, portanto deve ser bom..." 511 - "Eu faço isso há 20 anos, então..." 512 - "Isto é necessário para minha empresa ganhar dinheiro." 513 - "Isto é para nossa linha de produtos Enterprise." 514 - "Aqui está meu documento de design de 1000 páginas que descreve minha ideia." 515 - "Estou trabalhando nisso há 6 meses..." 516 - "Aqui está um patch de 5000 linhas que..." 517 - "Eu reescrevi toda a bagunça atual, e aqui está..." 518 - "Eu tenho um prazo (deadline), e este patch precisa ser aplicado agora." 519 520Outra forma em que a comunidade do kernel difere da maioria dos ambientes 521tradicionais de engenharia de software é a natureza anônima da interação. 522Um benefício de usar e-mail e IRC como as principais formas de comunicação 523é a ausência de discriminação baseada em gênero ou raça. O ambiente de 524trabalho do kernel Linux aceita mulheres e minorias porque tudo o que você 525é, é um endereço de e-mail. O aspecto internacional também ajuda a nivelar 526o campo de jogo porque você não pode adivinhar o gênero com base no nome 527de uma pessoa. Um homem pode se chamar Andrea e uma mulher pode se chamar 528Pat. A maioria das mulheres que trabalharam no kernel Linux e expressaram 529uma opinião tiveram experiências positivas. 530 531A barreira do idioma pode causar problemas para algumas pessoas que não 532se sentem confortáveis com o inglês. Um bom domínio do idioma pode ser 533necessário para transmitir ideias adequadamente nas listas de discussão, 534por isso recomenda-se que você verifique seus e-mails para garantir que 535façam sentido em inglês antes de enviá-los. 536 537 538Divida suas alterações 539---------------------- 540 541A comunidade do kernel Linux não aceita de bom grado grandes blocos de 542código jogados de uma só vez. As mudanças precisam ser devidamente 543introduzidas, discutidas e divididas em porções minúsculas e individuais. 544Isso é quase o exato oposto do que as empresas costumam fazer. Sua proposta 545também deve ser introduzida muito cedo no processo de desenvolvimento, para 546que você possa receber feedback sobre o que está fazendo. Isso também permite 547que a comunidade sinta que você está trabalhando com eles, e não simplesmente 548usando-os como um depósito para sua funcionalidade. No entanto, não envie 54950 e-mails de uma só vez para uma lista de discussão; sua série de patches 550deve ser menor que isso quase sempre. 551 552As razões para dividir as coisas são as seguintes: 553 5541) Patches pequenos aumentam a probabilidade de serem aplicados, pois não 555 exigem muito tempo ou esforço para verificar sua correção. Um patch de 556 5 linhas pode ser aplicado por um mantenedor com apenas um olhar rápido. 557 No entanto, um patch de 500 linhas pode levar horas para ser revisado 558 (o tempo que leva é exponencialmente proporcional ao tamanho do patch, 559 ou algo assim). 560 561 Patches pequenos também tornam muito fácil a depuração (debug) quando 562 algo dá errado. É muito mais fácil reverter patches um por um do que 563 dissecar um patch muito grande após ele ter sido aplicado (e quebrado algo). 564 5652) É importante não apenas enviar patches pequenos, mas também reescrever 566 e simplificar (ou simplesmente reordenar) os patches antes de submetê-los. 567 568Aqui está uma analogia do desenvolvedor do kernel Al Viro: 569 570 *"Pense em um professor corrigindo o dever de casa de um aluno de 571 matemática. O professor não quer ver as tentativas e erros do aluno 572 antes de chegar à solução. Ele quer ver a resposta mais limpa e 573 elegante. Um bom aluno sabe disso e nunca enviaria seu trabalho 574 intermediário antes da solução final.* 575 576 *O mesmo vale para o desenvolvimento do kernel. Os mantenedores e 577 revisores não querem ver o processo de pensamento por trás da solução 578 do problema que se está resolvendo. Eles querem ver uma solução 579 simples e elegante."* 580 581Pode ser desafiador manter o equilíbrio entre apresentar uma solução 582elegante e trabalhar em conjunto com a comunidade discutindo seu trabalho 583inacabado. Portanto, é bom entrar no processo cedo para obter feedback e 584melhorar seu trabalho, mas também manter suas alterações em pequenos blocos 585que possam ser aceitos, mesmo quando sua tarefa completa ainda não esteja 586pronta para inclusão. 587 588Também entenda que não é aceitável enviar patches para inclusão que estejam 589inacabados e que serão "consertados mais tarde". 590 591 592Justifique sua alteração 593------------------------ 594 595Além de dividir seus patches, é muito importante que você deixe a comunidade 596Linux saber por que eles deveriam adicionar essa mudança. Novas 597funcionalidades devem ser justificadas como necessárias e úteis. 598 599 600Documente sua alteração 601----------------------- 602 603Ao enviar seus patches, preste atenção especial ao que você diz no texto 604do seu e-mail. Essas informações se tornarão as informações do ChangeLog 605para o patch e serão preservadas para que todos vejam para sempre. Elas 606devem descrever o patch completamente, contendo: 607 608 - por que a mudança é necessária 609 - a abordagem geral de design no patch 610 - detalhes de implementação 611 - resultados de testes 612 613Para mais detalhes sobre como tudo isso deve ser, por favor, veja a seção 614ChangeLog do documento: 615 616 "O Patch Perfeito" 617 https://www.ozlabs.org/~akpm/stuff/tpp.txt 618 619Todas essas coisas às vezes são muito difíceis de fazer. Pode levar anos 620para aperfeiçoar essas práticas (se é que é possível). É um processo 621contínuo de melhoria que exige muita paciência e determinação. Mas não 622desista, é possível. Muitos fizeram isso antes, e cada um teve que começar 623exatamente onde você está agora. 624 625---------- 626 627Agradecimentos a Paolo Ciarrocchi, que permitiu que a seção "Processo de 628Desenvolvimento" (https://lwn.net/Articles/94386/) fosse baseada em um 629texto que ele escreveu, e a Randy Dunlap e Gerrit Huizenga por parte da 630lista de coisas que você deve ou não dizer. Também agradecemos a Pat Mochel, 631Hanna Linder, Randy Dunlap, Kay Sievers, Vojtech Pavlik, Jan Kara, 632Josh Boyer, Kees Cook, Andrew Morton, Andi Kleen, Vadim Lobanov, Jesper Juhl, 633Adrian Bunk, Keri Harris, Frans Pop, David A. Wheeler, Junio Hamano, 634Michael Kerrisk e Alex Shepard por suas revisões, comentários e contribuições. 635Sem a ajuda deles, este documento não teria sido possível. 636 637Mantenedor: Greg Kroah-Hartman <greg@kroah.com> 638