1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
|
.. SPDX-License-Identifier: GPL-2.0
Como funciona o processo de desenvolvimento
===========================================
O desenvolvimento do kernel Linux no início dos anos 1990 era uma
atividade bastante informal, envolvendo um número relativamente pequeno de
usuários e desenvolvedores. Com uma base de usuários atualmente na casa
dos milhões e com cerca de 2.000 desenvolvedores envolvidos ao longo de
um ano, o kernel desde então teve que evoluir uma série de processos
para manter o desenvolvimento acontecendo de forma fluida. Uma
compreensão sólida de como o processo funciona é necessária para ser uma
parte eficaz dele.
A Visão Geral
-------------
O kernel Linux usa um modelo de desenvolvimento de lançamento contínuo
(*rolling release*), vagamente baseado em tempo. Um novo lançamento de
versão principal do kernel (que chamaremos, como exemplo, de 9.x) [1]_
ocorre a cada dois ou três meses, trazendo novos recursos, alterações em
APIs internas e muito mais. Um lançamento típico pode conter cerca de
13.000 conjuntos de alterações (*changesets*) com modificações em várias
centenas de milhares de linhas de código. Lançamentos recentes,
juntamente com suas datas, podem ser encontrados na `Wikipedia
<https://en.wikipedia.org/wiki/Linux_kernel_version_history>`_.
.. [1] Rigorosamente falando, o kernel Linux não utiliza o esquema de
numeração de versionamento semântico, mas, em vez disso, o par
9.x identifica a versão de lançamento principal como um número
inteiro. Para cada lançamento, x é incrementado, mas o 9 é
incrementado apenas se x for considerado grande o suficiente
(por exemplo, o Linux 5.0 foi lançado após o Linux 4.20).
O processo de integração (*merging*) de patches segue um fluxo simples a
cada lançamento. No início de cada ciclo de desenvolvimento, abre-se a
**"janela de integração" (*merge window*)**. Durante esse período, todo
código considerado estável e aprovado pela comunidade é unificado ao
kernel principal (*mainline*). A maior parte das novidades e todas as
grandes mudanças estruturais — entra obrigatoriamente nessa fase, em um
ritmo frenético que chega a **1.000 patches (ou conjuntos de alterações)
por dia**.
(Como observação secundária, vale destacar que as mudanças integradas durante
a janela de integração não surgem do nada; elas foram coletadas, testadas e
organizadas com antecedência. Como esse processo funciona será descrito em
detalhes mais adiante).
A janela de integração dura aproximadamente duas semanas. Ao final desse
período, Linus Torvalds declarará que a janela está fechada e lançará o
primeiro dos kernels "rc". Para o kernel que está destinado a ser o 9.x,
por exemplo, o lançamento que ocorre ao final da janela de integração será
chamado de 9.x-rc1. O lançamento -rc1 é o sinal de que o prazo para integrar
novos recursos terminou e que o período para estabilizar o próximo kernel
começou.
Ao longo das próximas seis a dez semanas, apenas patches que corrijam
problemas devem ser submetidos ao kernel principal. Ocasionalmente, uma
mudança mais significativa será permitida, mas esses casos são raros;
desenvolvedores que tentam integrar novos recursos fora da janela de
integração costumam receber uma recepção pouco amigável. Como regra geral,
se você perder a janela de integração para um determinado recurso, o melhor
a fazer é esperar pelo próximo ciclo de desenvolvimento. (Abre-se uma
exceção ocasional para drivers de hardware que antes não eram suportados;
se eles não modificarem nenhum código já existente na árvore, não podem
causar regressões e deve ser seguro adicioná-los a qualquer momento).
À medida que as correções são integradas ao kernel principal, o ritmo de
envio de patches diminui com o tempo. Linus lança novos kernels -rc cerca
de uma vez por semana; uma série normal chega a algo entre -rc6 e -rc9 antes
que o kernel seja considerado suficientemente estável e o lançamento final
seja realizado. Nesse ponto, todo o processo recomeça.
Como exemplo, veja como ocorreu o ciclo de desenvolvimento da versão 5.4
(todas as datas são de 2019):
============== ===============================
Setembro 15 5.3 Lançamento estável do 5.3
Setembro 30 5.4-rc1, fechamento da janela de integração
Outubro 6 5.4-rc2
Outubro 13 5.4-rc3
Outubro 20 5.4-rc4
October 27 5.4-rc5
Novembro 3 5.4-rc6
Novembro 10 5.4-rc7
Novembro 17 5.4-rc8
Novembro 24 5.4 Lançamento estável do 5.4
============== ===============================
Como os desenvolvedores decidem quando encerrar o ciclo de desenvolvimento
e criar o lançamento estável? A métrica mais significativa utilizada é a
lista de regressões de lançamentos anteriores. Nenhum bug é bem-vindo, mas
aqueles que quebram sistemas que funcionavam no passado são considerados
especialmente graves. Por esta razão, patches que causam regressões são
vistos de forma desfavorável e têm grande probabilidade de serem revertidos
durante o período de estabilização.
O objetivo dos desenvolvedores é corrigir todas as regressões conhecidas
antes que o lançamento estável seja feito. No mundo real, esse tipo de
perfeição é difícil de alcançar; há simplesmente variáveis demais em um
projeto deste tamanho. Chega um ponto em que adiar o lançamento final apenas
torna o problema pior; o volume de mudanças esperando pela próxima janela de
integração crescerá ainda mais, criando ainda mais regressões no ciclo
seguinte. Portanto, a maioria dos kernels é lançada com um pequeno número de
regressões conhecidas, embora, felizmente, nenhuma delas seja grave.
Assim que um lançamento estável é feito, sua manutenção contínua é passada
para a "equipe estável" (*stable team*), atualmente composta por Greg
Kroah-Hartman e Sasha Levin. A equipe estável lançará atualizações ocasionais
para a versão estável utilizando o esquema de numeração 9.x.y.
Para ser considerado para um lançamento de atualização, um patch deve (1)
corrigir um bug significativo e (2) já estar integrado ao kernel principal
(*mainline*) para o próximo kernel de desenvolvimento. Os kernels normalmente
receberão atualizações estáveis por um pouco mais de um ciclo de
desenvolvimento após o seu lançamento inicial. Assim, por exemplo, o histórico
do kernel 5.2 ocorreu da seguinte forma (todas as datas são de 2019):
============== ===============================
7 de Julho Lançamento estável do 5.2
14 de Julho 5.2.1
21 de Julho 5.2.2
26 de Julho 5.2.3
28 de Julho 5.2.4
31 de Julho 5.2.5
... ...
11 de Outubro 5.2.21
============== ===============================
A versão 5.2.21 foi a última atualização estável do lançamento 5.2.
Alguns kernels são designados como kernels de "longo prazo" (*long term*);
eles receberão suporte por um período mais longo. Por favor, consulte o
seguinte link para obter a lista de versões ativas do kernel de longo prazo
e seus respectivos mantenedores:
https://www.kernel.org/category/releases.html
A seleção de um kernel para suporte de longo prazo é puramente uma questão
de um mantenedor ter a necessidade e o tempo para manter esse lançamento.
Não há planos conhecidos para suporte de longo prazo para nenhum lançamento
futuro específico.
O Ciclo de Vida de um Patch
---------------------------
Os patches não vão diretamente do teclado do desenvolvedor para o kernel
principal. Em vez disso, existe um processo um tanto complexo (embora um
tanto informal) projetado para garantir que cada patch seja revisado quanto
à sua qualidade e que cada patch implemente uma mudança que seja desejável
ter no mainline. Esse processo pode acontecer rapidamente para correções
menores ou, no caso de mudanças grandes e controversas, arrastar-se por
anos. Grande parte da frustração dos desenvolvedores vem da falta de
compreensão desse processo ou de tentativas de burlá-lo.
Com a esperança de reduzir essa frustração, este documento descreverá como
um patch entra no kernel. O que se segue abaixo é uma introdução que
descreve o processo de uma forma um tanto idealizada. Um tratamento muito
mais detalhado virá nas seções posteriores.
As etapas pelas quais um patch passa são, geralmente:
- Design. É aqui que os requisitos reais para o patch e a forma
como esses requisitos serão atendidos são definidos. O trabalho de
design geralmente é feito sem envolver a comunidade, mas é melhor realizar
esse trabalho abertamente, se possível; isso pode economizar muito tempo
evitando ter que refazer o projeto mais tarde.
- Revisão inicial. Os patches são postados na lista de
discussão relevante, e os desenvolvedores dessa lista respondem com os
comentários que tiverem. Se tudo correr bem, esse processo deve apontar
qualquer problema grave no patch.
- Revisão ampla. Quando o patch estiver próximo de estar
pronto para inclusão no mainline, ele deve ser aceito por um mantenedor de
subsistema relevante — embora essa aceitação não seja uma garantia de que
o patch chegará até o kernel principal. O patch aparecerá na árvore de
subsistema do mantenedor e nas árvores -next. Quando o processo funciona,
esta etapa leva a uma revisão mais ampla do patch e à descoberta de
quaisquer problemas resultantes da integração deste patch com o trabalho
que está sendo feito por outros.
- Por favor, note que a maioria dos mantenedores também tem seus empregos
regulares, portanto, integrar o seu patch pode não ser a maior prioridade
deles. Se o seu patch estiver recebendo feedback sobre alterações que são
necessárias, você deve fazer essas alterações ou justificar por que elas
não devem ser feitas. Se o seu patch não tiver nenhuma objeção de revisão,
mas não estiver sendo integrado pelo mantenedor do subsistema ou driver
adequado, você deve ser persistente em atualizar o patch para o kernel
atual (garantindo que ele seja aplicado de forma limpa) e continuar
enviando-o para revisão e integração.
- Integração no mainline. Eventualmente, um
patch bem-sucedido será integrado ao repositório principal (*mainline*)
gerenciado por Linus Torvalds. Mais comentários e/ou problemas podem surgir
neste momento; é importante que o desenvolvedor seja responsivo a eles e
corrija quaisquer problemas que venham a aparecer.
- Lançamento estável. O número de usuários potencialmente
afetados pelo patch agora é grande, portanto, mais uma vez, novos
problemas podem surgir.
- Manutenção de longo prazo. Embora seja perfeitamente
possível para um desenvolvedor esquecer o código após integrá-lo, esse
tipo de comportamento tende a deixar uma má impressão na comunidade de
desenvolvimento. Integrar o código elimina parte do fardo de manutenção,
já que outros corrigirão problemas causados por mudanças de API. No entanto,
o desenvolvedor original deve continuar assumindo a responsabilidade pelo
código se ele quiser que este permaneça útil no longo prazo.
Um dos maiores erros cometidos por desenvolvedores do kernel (ou por seus
empregadores) é tentar reduzir todo o processo a uma única etapa de
"integração no mainline". Essa abordagem invariavelmente leva à frustração
de todos os envolvidos.
Como os patches entram no Kernel
--------------------------------
Existe exatamente uma pessoa que pode integrar patches no repositório do
kernel principal: Linus Torvalds. Mas, por exemplo, dos mais de 9.500 patches
que entraram no kernel 2.6.38, apenas 112 (cerca de 1,3%) foram escolhidos
diretamente pelo próprio Linus. O projeto do kernel há muito tempo cresceu
para um tamanho onde nenhum desenvolvedor sozinho conseguiria inspecionar e
selecionar cada patch sem ajuda. A maneira como os desenvolvedores do kernel
lidaram com esse crescimento foi através do uso de um sistema de "tenentes"
(*lieutenant system*) construído em torno de uma cadeia de confiança.
A base de código do kernel é logicamente dividida em um conjunto de
subsistemas: rede, suporte a arquiteturas específicas,
gerenciamento de memória, dispositivos de vídeo, etc. A maioria dos
subsistemas possui um mantenedor designado, um desenvolvedor que tem a
responsabilidade geral pelo código dentro daquele subsistema. Esses
mantenedores de subsistemas são os guardiões (de forma flexível)
da parte do kernel que gerenciam; são eles que (geralmente) aceitarão um
patch para inclusão no kernel principal.
Cada um dos mantenedores de subsistemas gerencia sua própria versão da árvore
de fontes do kernel, geralmente (mas certamente nem sempre) usando a
ferramenta de gerenciamento de código-fonte Git. Ferramentas como o Git
(e ferramentas relacionadas como o quilt ou mercurial) permitem que os
mantenedores acompanhem uma lista de patches, incluindo informações de
autoria e outros metadados. A qualquer momento, o mantenedor pode identificar
quais patches em seu repositório não são encontrados no mainline.
Quando a janela de integração se abre, os mantenedores de
alto nível pedirão a Linus para realizar o pull de seus repositórios os patches
que selecionaram para integração. Se Linus concordar, o fluxo de patches
subirá para o seu repositório, tornando-se parte do kernel principal. A
quantidade de atenção que Linus dedica a patches específicos
recebidos em uma operação de pull varia. Está claro que, às vezes, ele os
examina bem de perto. Mas, como regra geral, Linus confia que os mantenedores
de subsistemas não enviarão patches ruins para o upstream.
Os mantenedores de subsistemas, por sua vez, podem realizar o pull dos patches
de outros mantenedores. Por exemplo, a árvore de rede é
construída a partir de patches que se acumularam primeiro em árvores dedicadas
a drivers de dispositivos de rede, rede sem fio, etc. Essa cadeia
de repositórios pode ser arbitrariamente longa, embora raramente exceda dois
ou três elos. Como cada mantenedor na cadeia confia naqueles que gerenciam as
árvores de nível inferior, esse processo é conhecido como a "cadeia de
confiança".
Claramente, em um sistema como este, colocar patches no kernel depende de
encontrar o mantenedor correto. Enviar patches diretamente para Linus
normalmente não é o caminho certo a seguir.
Árvore -next
-------------
A cadeia de árvores de subsistemas orienta o fluxo de patches para o kernel,
mas também levanta uma questão interessante: e se alguém quiser dar uma
olhada em todos os patches que estão sendo preparados para a próxima janela
de integração? Os desenvolvedores estarão interessados em saber quais outras
mudanças estão pendentes para ver se há conflitos com os quais se preocupar; um
patch que altera o protótipo de uma função central do kernel, por exemplo,
entrará em conflito com quaisquer outros patches que usem a forma mais antiga
dessa função. Revisores e testadores querem ter acesso às mudanças em sua forma
integrada antes que todas essas alterações cheguem ao kernel principal. Seria
possível realizar o pull das mudanças de todas as árvores de subsistemas
interessantes, mas isso seria um trabalho enorme e propenso a erros.
A resposta vem na forma das árvores -next, onde as árvores de subsistemas
são coletadas para testes e revisão. A mais antiga dessas árvores, mantida
por Andrew Morton, é chamada de "-mm" (de *memory management*, gerenciamento
de memória, que foi como ela começou). A árvore -mm integra patches de uma
longa lista de árvores de subsistemas; ela também possui alguns patches
destinados a ajudar na depuração (*debugging*).
Além disso, a árvore -mm contém uma coleção significativa de patches que
foram selecionados diretamente por Andrew. Esses patches podem ter sido
postados em uma lista de discussão ou podem se aplicar a uma parte do kernel
para a qual não existe uma árvore de subsistema designada. Como resultado, a
-mm opera como uma espécie de árvore de subsistema de "último recurso"; se
não houver outro caminho óbvio para um patch entrar no mainline, é provável
que ele acabe na -mm. Patches diversos que se acumulam na
-mm eventualmente serão encaminhados para uma árvore de subsistema adequada
ou enviados diretamente para Linus. Em um ciclo de desenvolvimento típico,
aproximadamente 5% a 10% do total de patches que entram no mainline chegam
lá por meio da -mm.
O patch -mm atual está disponível no diretório "mmotm" (*-mm of the moment*)
em:
https://www.ozlabs.org/~akpm/mmotm/
O uso da árvore MMOTM, no entanto, provavelmente será uma experiência
frustrante; existe uma chance real de que ela sequer compile.
A árvore primária para a integração de patches do próximo ciclo é a
linux-next, mantida por Mark Brown. A árvore linux-next é, por design, um
snapshot do que se espera que o mainline se pareça após o
fechamento da próxima janela de integração. As árvores
linux-next são anunciadas nas listas de discussão linux-kernel e linux-next
quando são montadas; elas podem ser baixadas em:
https://www.kernel.org/pub/linux/kernel/next/
A linux-next tornou-se uma parte integrante do processo de desenvolvimento
do kernel; todos os patches integrados durante uma determinada janela de
integração devem, idealmente, ter encontrado seu caminho para a linux-next algum
tempo antes da abertura da janela de integração.
Árvores de laboratório
----------------------
A árvore de fontes do kernel contém o diretório drivers/staging/, onde residem
muitos subdiretórios para drivers ou sistemas de arquivos que estão a caminho
de serem adicionados à árvore do kernel. Eles permanecem em drivers/staging/
enquanto ainda precisam de mais trabalho; uma vez concluídos, podem ser movidos
para o kernel proper Esta é uma maneira de acompanhar drivers que não estão à
altura dos padrões de codificação ou de qualidade do kernel Linux, mas que as
pessoas podem querer usar e acompanhar o desenvolvimento.
Greg Kroah-Hartman atualmente mantém a árvore de staging. Os drivers que
ainda precisam de trabalho são enviados a ele, com cada driver tendo seu
próprio subdiretório em drivers/staging/. Junto com os arquivos de código-fonte
do driver, um arquivo TODO também deve estar presente no diretório. O arquivo
TODO lista o trabalho pendente que o driver precisa para ser aceito no kernel
propriamente dito, bem como uma lista de pessoas que devem receber cópia
(*Cc'd*) em quaisquer patches para o driver. As regras atuais exigem que os
drivers contribuídos para o staging devem, no mínimo, compilar corretamente.
O staging pode ser uma maneira relativamente fácil de colocar novos drivers
no mainline onde, com sorte, eles chamarão a atenção de outros desenvolvedores
e melhorarão rapidamente. No entanto, a entrada no staging não é o fim da
história; o código no staging que não apresentar progresso regular será,
eventualmente, removido. Os distribuidores também tendem a ser relativamente
relutantes em habilitar drivers do staging. Portanto, o staging é, na melhor
das hipóteses, uma parada no caminho para se tornar um driver mainline adequado.
Ferramentas
-----------
Como pode ser visto no texto acima, o processo de desenvolvimento do kernel
depende fortemente da capacidade de guiar coleções de patches em várias
direções. Todo esse sistema não funcionaria nem de longe tão bem quanto
funciona sem ferramentas adequadamente poderosas. Tutoriais sobre como usar
essas ferramentas estão muito além do escopo deste documento, mas há espaço
para algumas indicações.
De longe, o sistema de gerenciamento de código-fonte dominante usado pela
comunidade do kernel é o Git. O Git é um entre vários sistemas de controle
de versão distribuídos desenvolvidos na comunidade de software livre. Ele é
bem sintonizado para o desenvolvimento do kernel, uma vez que apresenta um
excelente desempenho ao lidar com grandes repositórios e grandes volumes de
patches. Ele também tem a reputação de ser difícil de aprender e usar, embora
tenha melhorado ao longo do tempo. Algum tipo de familiaridade com o Git é
quase um requisito para os desenvolvedores do kernel; mesmo que não o usem
em seu próprio trabalho, eles precisarão do Git para acompanhar o que outros
desenvolvedores (e o mainline) estão fazendo.
O Git agora é empacotado por quase todas as distribuições Linux. Existe uma
página inicial em:
https://git-scm.com/
Essa página possui indicações para documentações e tutoriais.
Entre os desenvolvedores do kernel que não usam o Git, a escolha mais popular
é, quase certamente, o Mercurial:
https://www.selenic.com/mercurial/
O Mercurial compartilha muitos recursos com o Git, mas oferece uma interface
que muitos consideram mais fácil de usar.
A outra ferramenta que vale a pena conhecer é o Quilt:
https://savannah.nongnu.org/projects/quilt/
O Quilt é um sistema de gerenciamento de patches, em vez de um sistema de
gerenciamento de código-fonte. Ele não rastreia o histórico ao longo do
tempo; em vez disso, ele é orientado a rastrear um conjunto específico de
alterações em relação a uma base de código em evolução. Alguns mantenedores
de grandes subsistemas usam o Quilt para gerenciar patches destinados a ir
para o upstream. Para o gerenciamento de certos tipos de árvores (-mm, por
exemplo), o Quilt é a melhor ferramenta para o trabalho.
Listas de discussão
-------------------
Uma grande parte do trabalho de desenvolvimento do kernel Linux é realizada por
meio de listas de discussão. É difícil ser um membro plenamente ativo da
comunidade sem se inscrever em pelo menos uma lista em algum lugar. No entanto,
as listas de discussão do Linux também representam um risco potencial para os
desenvolvedores, que correm o risco de serem soterrados por uma avalanche de
e-mails, de violar as convenções utilizadas nas listas do Linux, ou ambos.
A maioria das listas de discussão do kernel é hospedada no kernel.org; a
lista mestre pode ser encontrada em:
https://subspace.kernel.org
Existem listas hospedadas em outros locais; por favor, verifique o arquivo
MAINTAINERS para encontrar a lista relevante para qualquer subsistema específico.
A lista de discussão central para o desenvolvimento do kernel é, naturalmente,
a linux-kernel. Esta lista é um lugar intimidador para se estar; o volume pode
atingir 500 mensagens por dia, a quantidade de ruído é alta, a conversa pode
ser severamente técnica e os participantes nem sempre estão preocupados em
demonstrar um alto grau de polidez. No entanto, não há outro lugar onde a
comunidade de desenvolvimento do kernel se reúna como um todo; desenvolvedores
que evitam esta lista perderão informações importantes.
Existem algumas dicas que podem ajudar na sobrevivência na lista linux-kernel:
- Faça com que a lista seja entregue em uma pasta separada, em vez de na sua
caixa de entrada principal. É preciso ser capaz de ignorar o fluxo de e-mails
por períodos prolongados de tempo.
- Não tente acompanhar cada conversa ninguém mais faz isso. É importante
filtrar tanto pelo tópico de interesse (embora note que conversas longas
podem se desviar do assunto original sem que a linha de assunto do e-mail
seja alterada) quanto pelas pessoas que estão participando.
- Não alimente os trolls. Se alguém estiver tentando provocar uma resposta
irada, ignore-o.
- Ao responder a um e-mail da lista linux-kernel (o mesmo valendo para outras
listas), preserve o cabeçalho Cc: para todos os envolvidos. Na ausência de um
motivo forte (como uma solicitação explícita), você nunca deve remover
destinatários. Sempre certifique-se de que a pessoa a quem você está
respondendo esteja na lista de Cc:. Essa convenção também torna desnecessário
solicitar explicitamente ser copiado em respostas às suas postagens.
- Pesquise nos arquivos da lista (e na internet como um todo) antes de fazer
perguntas. Alguns desenvolvedores podem ficar impacientes com pessoas que
claramente não fizeram sua lição de casa.
- Use respostas intercaladas, o que torna sua resposta mais fácil
de ler. (ou seja, evite o "top-posting" — a prática de colocar sua resposta
acima do texto citado ao qual você está respondendo). Para mais detalhes, veja
:ref:`Documentation/process/submitting-patches.rst <interleaved_replies>`.
- Pergunte na lista de discussão correta. A lista linux-kernel pode até ser o
ponto de encontro geral, mas não é o melhor lugar para encontrar desenvolvedores
de todos os subsistemas.
O último ponto, encontrar a lista de discussão correta é um lugar comum
onde os desenvolvedores iniciantes costumam errar. Alguém que faça uma pergunta
relacionada a redes na lista linux-kernel quase certamente receberá uma
sugestão educada para perguntar na lista netdev em seu lugar, já que essa é a
lista frequentada pela maioria dos desenvolvedores de redes. Existem outras
listas para os subsistemas SCSI, video4linux, IDE, filesystem (sistemas de
arquivos), etc. O melhor lugar para procurar por listas de discussão é no
arquivo MAINTAINERS empacotado junto com o código-fonte do kernel.
Começando com o desenvolvimento do kernel
-----------------------------------------
Perguntas sobre como começar com o processo de desenvolvimento do kernel são
comuns — tanto por parte de indivíduos quanto de empresas. Igualmente comuns
são os passos em falso que tornam o início do relacionamento mais difícil do
que precisa ser.
As empresas frequentemente buscam contratar desenvolvedores bem conhecidos para
dar o pontapé inicial em um grupo de desenvolvimento. Esta pode, de fato, ser
uma técnica eficaz. No entanto, ela também tende a ser cara e não faz muito para
expandir o grupo de desenvolvedores de kernel experientes. É possível capacitar
desenvolvedores internos no desenvolvimento do kernel Linux, desde que haja o
investimento de um pouco de tempo. Dedicar esse tempo pode dotar um empregador
de um grupo de desenvolvedores que entendem tanto o kernel quanto a própria
empresa, e que também podem ajudar a treinar outros. A médio prazo, esta é
frequentemente a abordagem mais lucrativa.
Desenvolvedores individuais frequentemente, e de forma compreensível, ficam sem
saber por onde começar. Iniciar com um grande projeto pode ser intimidante;
muitas vezes deseja-se testar o terreno com algo menor primeiro. Este é o ponto
onde alguns desenvolvedores saltam para a criação de patches que corrigem erros
de ortografia ou pequenos problemas de estilo de código. Infelizmente, tais
patches criam um nível de ruído que distrai a comunidade de desenvolvimento
como um todo, por isso, cada vez mais, eles são vistos com desdém. Novos
desenvolvedores que desejam se apresentar à comunidade não receberão o tipo de
recepção que desejam por esses meios.
Andrew Morton dá este conselho para aspirantes a desenvolvedores do kernel:
::
"O projeto número um para todos os iniciantes no kernel certamente deveria
ser 'certificar-se de que o kernel funcione perfeitamente o tempo todo em
todas as máquinas em que você conseguir colocar as mãos'. Normalmente, a
maneira de fazer isso é trabalhar com outros para resolver as coisas (isso
pode exigir persistência!), mas tudo bem — isso é parte do desenvolvimento
do kernel."
(https://lwn.net/Articles/283982/).
Na ausência de problemas óbvios para corrigir, os desenvolvedores são
aconselhados a olhar para as listas atuais de regressões e bugs abertos em
geral. Nunca há escassez de problemas que precisam de correção; ao abordar
esses problemas, os desenvolvedores ganharão experiência com o processo
enquanto, ao mesmo tempo, constroem respeito com o restante da comunidade de
desenvolvimento.
|