Capítulo 4 — Programação I
Mapa da aula
Aula 04 publicada. Mapa, exemplo, EX010.
flowchart TD
N0["4.1 Programas como procedimentos precisos"]
N1["4.2 Construções básicas"]
N2["4.3 Lendo registros"]
N3["4.4 Testando com entradas conhecidas"]
N4["4.5 Legibilidade"]
N5["4.6 Biblioteca padrão primeiro"]
N6["Controle de versão"]
N7["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX010"]
Desenho lógico
flowchart LR
N0["4.1 Programas como procedimentos precisos"]
N1["4.2 Construções básicas"]
N2["4.3 Lendo registros"]
N3["4.4 Testando com entradas conhecidas"]
N4["4.5 Legibilidade"]
N5["4.6 Biblioteca padrão primeiro"]
N6["Controle de versão"]
N7["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX010"]
[4.1 Programas como procedimentos precisos]
|
v
[4.2 Construções básicas]
|
v
[4.3 Lendo registros]
|
v
[4.4 Testando com entradas conhecidas]
|
v
[4.5 Legibilidade]
|
v
[4.6 Biblioteca padrão primeiro]
|
v
[Controle de versão]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX010]
Objetivos de aprendizagem
Você vai (1) escrever programas pequenos que leem e resumem registros de log; (2) usar variáveis, laços, condições e funções; (3) testar um programa com entradas conhecidas; (4) manter o código legível para revisores.
4.1 Programas como procedimentos precisos
Um programa é um procedimento que o computador segue à risca. Num SOC, programas pequenos contam, filtram e resumem registros mais rápido e de forma mais consistente do que pessoas. Por serem exatos, os erros neles também se repetem exatamente, por isso precisam ser testados. Uma pessoa contando logins malsucedidos a olho pode deixar passar algumas linhas ou contar uma duas vezes, e cada contagem sairia um pouco diferente. Um programa dá a mesma resposta todas as vezes, o que é tranquilizador quando ele está certo e perigoso quando está errado. É por isso que os scripts do SOC são revisados e testados como qualquer outro artefato de engenharia antes que os analistas confiem em sua saída.
4.2 Construções básicas
Variáveis guardam valores, como uma contagem. Laços visitam cada registro. Condições escolhem o que contar. Funções empacotam uma etapa, como "extrair a rede /24 de um endereço", para que possa ser reutilizada e testada isoladamente. O primeiro script de Amara usa as quatro: um dicionário de contagens indexado por rede, um laço sobre as linhas de log, uma condição que seleciona os logins malsucedidos e uma função que devolve o prefixo /24. Manter a etapa do prefixo em sua própria função permite testá-la com endereços capciosos, como os que ficam na borda de uma faixa, sem rodar o script inteiro.
4.3 Lendo registros
Os logs chegam como linhas de texto ou como registros estruturados. Um programa divide cada linha em campos, converte tipos (texto em números ou horários) e trata linhas malformadas sem travar, registrando quantas foram puladas. Logs reais contêm linhas truncadas, codificações inesperadas e campos em formatos estranhos. Um script que trava na primeira linha ruim não dá resposta alguma; um que ignora as linhas ruins em silêncio pode dar uma resposta errada. Contar as linhas puladas e informá-las junto com os resultados permite ao leitor julgar se os dados estavam limpos o bastante para merecer confiança.
4.4 Testando com entradas conhecidas
Antes de rodar sobre logs reais, Amara alimenta sua função com cinco linhas feitas à mão cuja resposta correta ela já conhece. Se a saída diferir, o código está errado, não os dados. Suas cinco linhas incluem uma falha comum, um sucesso, uma linha malformada, um endereço na fronteira de uma faixa /24 e uma linha com horário de outro fuso. Cada uma testa um erro possível. Quando a primeira execução conta a linha malformada como falha, ela corrige o analisador e roda de novo antes de tocar em dados reais.
4.5 Legibilidade
Funções curtas, nomes claros e comentários sobre a intenção ajudam Paolo a revisar o código dela. Código que só o autor entende é um risco nas operações. Num SOC, os scripts muitas vezes são executados às 3 da manhã, durante um incidente, por alguém que não é o autor. Uma função chamada failed_logins_by_network se explica sozinha; uma chamada proc2, não. Os comentários devem dizer por que uma etapa existe, por exemplo que uma fonte de logs grava a hora local, em vez de repetir o que o código faz.
4.6 Biblioteca padrão primeiro
A biblioteca padrão do Python lê CSV, JSON e datas. Usá-la evita instalar pacotes não revisados nas máquinas do SOC. Cada pacote instalado é código de fora da organização rodando em máquinas que veem dados sensíveis. Cada um exige revisão, atualizações e confiança em seus mantenedores. Para contar, filtrar e analisar formatos comuns, a biblioteca padrão basta, e as máquinas do SOC ficam mais simples de proteger e de reconstruir. Ferramentas maiores são acrescentadas de forma deliberada quando surge uma necessidade real. Paolo mantém uma lista curta de pacotes aprovados, cada um com um responsável nomeado que acompanha suas atualizações.
Controle de versão
Amara mantém seus scripts no repositório de controle de versão da equipe. Cada mudança tem uma mensagem explicando o porquê, e Paolo revisa as mudanças antes que rodem sobre dados de produção. O histórico permite à equipe ver qual versão produziu um dado resultado.
Exemplo resolvido
A primeira função de Amara devolve a rede /24 de um endereço IPv4. Seus casos de teste incluem "203.0.113.14" → "203.0.113.0/24" e um "203.0.113" malformado, que deve devolver None em vez de travar. Um teste falha de início porque ela esqueceu o caso malformado; ela o corrige antes de usar a função nos logs do portal.
Caso sintético. O código e os dados são sintéticos.
Erros e limites
Testes aprovados mostram que o código trata os casos em que você pensou, não todos os casos; acrescente testes quando novas entradas surpreenderem você.
Exercícios
- EX010 — Linhas malformadas. Como um programa de logs deve tratar linhas malformadas? Rubrica: 3 = pular sem travar e contar as linhas puladas; 2 = só pular; 1 = travar; 0 = nada.
- EX011 — Teste com entradas conhecidas. Por que testar primeiro com linhas feitas à mão? Rubrica: 3 = a resposta correta é conhecida, então as diferenças revelam erros no código; 2 = parcial; 1 = nenhum motivo; 0 = nada.
- EX012 — Biblioteca padrão. Por que preferir a biblioteca padrão nas máquinas do SOC? Rubrica: 3 = evita pacotes de terceiros não revisados; já está disponível; 2 = parcial; 1 = velocidade; 0 = nada.
Síntese
Programas pequenos, testados e legíveis tornam a análise de logs consistente; sua exatidão só é uma força quando são verificados.
Continue estudando — capítulo 04 de 50
← Capítulo 03 (rascunho) · Índice de capítulos do curso · Capítulo 05 (rascunho) →