Qualidade técnicas Flashcards

(49 cards)

1
Q

O que é código limpo e por que ele é importante?

A

Código limpo é o código fácil de ler, entender e manter, indo além de apenas funcionar [3, 4]. É importante porque facilita colaboração, reduz bugs e custos de manutenção – desenvolvedores compreendem e modificam o sistema mais rapidamente [2, 3]. O objetivo é gerenciar a complexidade e reduzir a carga cognitiva dos desenvolvedores [5].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Quais características definem um código limpo?

A

Código limpo apresenta nomes significativos, funções/classes pequenas e focadas, formatação consistente, tratamento simples de erros e ausência de duplicações desnecessárias [6, 7]. Ele prioriza legibilidade e clareza em vez de truques complicados [6, 8].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

O que dizem os princípios SOLID?

A

SOLID é um acrônimo para Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion [1, 9]. São cinco princípios de design orientado a objetos que tornam o código mais compreensível, flexível e mantível [6, 10].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Explique o princípio do Single Responsibility (SRP).

A

O Princípio da Responsabilidade Única dita que uma classe ou módulo deve ter apenas uma, e somente uma, razão para mudar [11, 12]. Isso isola as responsabilidades, tornando cada componente mais fácil de entender, testar e manter de forma independente [11].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Qual é a essência do Princípio Aberto/Fechado (OCP)?

A

As entidades de software devem ser abertas para extensão, mas fechadas para modificação [13]. Isso significa que novas funcionalidades devem ser adicionadas através de novo código, e não alterando o código existente e já testado [1, 13].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

O que o Princípio da Inversão de Dependência (DIP) defende?

A

Módulos de alto nível não devem depender de módulos de baixo nível; ambos devem depender de abstrações (interfaces ou classes base) [1, 5, 14]. Isso desacopla a lógica de negócio dos detalhes de infraestrutura [14].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

O que significa DRY (Don’t Repeat Yourself)?

A

Significa que ‘Cada peça de conhecimento deve ter uma representação única, não ambígua e autoritativa dentro de um sistema’ [15, 16]. Serve para evitar a duplicação de lógica, regras de negócio ou qualquer forma de conhecimento [15].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

O que significa KISS (Keep It Simple, Stupid)?

A

É um lembrete de que a maioria dos sistemas funciona melhor se for mantida simples em vez de complicada. A simplicidade deve ser um objetivo chave no design [10, 17].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

O que significa YAGNI (You Aren’t Gonna Need It)?

A

Aconselha a implementar funcionalidades apenas quando elas são genuinamente necessárias, e nunca quando se antecipa que possam ser necessárias no futuro. Isso evita o overengineering [10, 17].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

O que é a ‘Regra do Escoteiro’ aplicada ao código?

A

‘Deixe o acampamento (código) mais limpo do que você o encontrou’ [16, 18]. É a prática de fazer pequenas melhorias contínuas e incrementais sempre que se toca no código, prevenindo sua degradação ao longo do tempo [18-20].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Por que nomes de variáveis e funções importam na qualidade do código?

A

Nomes expressivos tornam o código autoexplicativo [21]. Bons nomes devem revelar a intenção, respondendo às perguntas ‘por que existe?’, ‘o que faz?’ e ‘como é usado?’ [12, 22].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Quais os benefícios de ter uma suite de testes automatizados robusta?

A

Benefícios incluem: feedback rápido a cada mudança [23], detecção precoce de bugs antes de chegar em produção [24], documentação viva do comportamento esperado [23], e segurança para refatorar [25]. Aumenta a confiança e agiliza o ciclo de feedback [20].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

O que é a ‘Pirâmide de Testes’ e qual sua ideia principal?

A

É um modelo para uma estratégia de testes automatizados que preconiza uma grande base de testes de unidade (rápidos e baratos), menos testes de integração no meio, e muito poucos testes E2E/UI (lentos e caros) no topo [7, 26-28]. O objetivo é equilibrar cobertura de testes com velocidade e confiabilidade [26].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Por que os testes End-to-End (E2E) devem ser poucos?

A

Porque são lentos para executar, caros para manter e notoriamente frágeis (quebram facilmente com mudanças na UI), levando a um ciclo de feedback lento [16, 27, 29].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

O que é o anti-padrão ‘Cone de Sorvete’ em testes?

A

É uma estratégia de testes invertida, com muitos testes E2E lentos e frágeis e poucos testes de unidade, o que leva a feedback lento e baixa confiança [29-31].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

O que é ‘Shift-Left Testing’?

A

É a prática de mover as atividades de teste para o mais cedo possível no ciclo de desenvolvimento, tornando a qualidade uma responsabilidade de toda a equipe de engenharia [32].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Qual é o propósito dos Padrões de Projeto (Design Patterns) do GoF?

A

Fornecer soluções testadas e comprovadas para problemas recorrentes de design de software [33, 34] e criar um vocabulário comum para discutir soluções em um nível de abstração mais alto [33].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Qual é a principal diferença entre a arquitetura Monolítica e a de Microsserviços?

A

O Monolito é uma única unidade coesa de implantação [35], enquanto os Microsserviços decompõem a aplicação em serviços pequenos e independentes, cada um executando em seu próprio processo e com implantação própria [16, 34, 36].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Qual a principal vantagem da Arquitetura Orientada a Eventos (EDA)?

A

Promove um desacoplamento extremo (temporal e espacial) entre os serviços [35, 37, 38]. Um produtor de evento não precisa saber quem são os consumidores, aumentando a resiliência e a escalabilidade do sistema [37].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

O que é o padrão Facade?

A

Fornece uma interface simplificada e unificada para um conjunto de interfaces em um subsistema complexo, tornando-o mais fácil de usar [31, 39].

21
Q

O que é integração contínua (CI) e qual sua relação com qualidade?

A

CI é a prática de integrar código em bases compartilhadas com alta frequência, rodando builds e testes automaticamente a cada mudança [40, 41]. Ajuda a manter o software sempre em estado executável e testado, detectando problemas imediatamente [40, 41].

22
Q

Cite algumas ferramentas populares de análise estática de código.

A

SonarQube (plataforma de qualidade de código) [42], ESLint (JavaScript) [43, 44], Pylint (Python) [45], RuboCop (Ruby) [45], e Infer (analisador estático da Meta/Facebook) [44, 46].

23
Q

Para que serve uma ferramenta como o SonarQube?

A

O SonarQube analisa o código-fonte em busca de bugs, vulnerabilidades, códigos duplicados e violações de padrões [42, 44]. Ele impõe padrões de engenharia e mede a qualidade do código continuamente, atuando como um ‘Quality Gate’ [41, 44, 47].

24
Q

Como o code review melhora o código?

A

Revisão de código traz um segundo par de olhos que pode encontrar bugs, melhorar design e garantir aderência a padrões [48, 49]. Também dissemina conhecimento e serve como mentoria [49, 50].

25
Qual é o objetivo principal do Code Review segundo o padrão do Google?
Garantir que a saúde geral do código base melhore continuamente, favorecendo a aprovação de mudanças que representem uma melhoria, mesmo que não sejam perfeitas [16, 51, 52].
26
O que o Google recomenda sobre perfeição no code review?
Recomenda não exigir perfeição absoluta. O objetivo é a melhoria contínua [51]. Revisores devem buscar melhoria contínua e não barrar um PR por detalhes cosméticos irrelevantes – sugestões menores podem ser marcadas como 'Nit:' e não impedir a aprovação [53, 54].
27
Quais aspectos devem ser verificados em um code review?
O revisor deve checar: **design** (segue princípios?), **funcionalidade** (faz o que promete sem bugs?), **complexidade**, **nomeação** e clareza, **testes** (cobertura suficiente?), e **estilo** (conformidade com padrões de formatação) [55, 56].
28
Qual é uma boa prática para o tamanho de um Pull Request (PR)?
Manter os PRs pequenos e focados, idealmente entre 200-400 linhas de código, para facilitar uma revisão completa e eficaz [16, 57, 58].
29
Como garantir que code reviews não se tornem gargalos no processo?
Práticas incluem definir **SLAs para review** (feedback em X horas) [59, 60], automatizar o máximo com CI para liberar revisores humanos [60], e submeter Pull Requests menores [60].
30
O que é Débito Técnico?
É o custo implícito de retrabalho futuro causado pela escolha de uma solução fácil ou rápida agora em vez de uma abordagem melhor, mas mais demorada [16, 53, 61]. É comparado a uma dívida financeira que 'cobra juros' na forma de manutenção difícil e lentidão de evolução [62, 63].
31
Quais são os quatro quadrantes do Débito Técnico de Martin Fowler?
(1) **Prudente e Deliberado**: Decisão estratégica; (2) **Imprudente e Deliberado**: Decisão consciente de ignorar boas práticas; (3) **Prudente e Inadvertido**: Surge do aprendizado; (4) **Imprudente e Inadvertido**: Resultado de falta de conhecimento ou habilidade [16, 61, 64, 65].
32
O que é um débito técnico 'Prudente e Deliberado'?
É uma decisão estratégica e consciente de tomar um atalho (e.g., para lançar um produto) com pleno conhecimento das consequências e um plano para pagar a dívida (refatorar) mais tarde [16, 57, 66].
33
O que é um débito técnico 'Imprudente e Inadvertido'?
É o débito criado por falta de conhecimento ou habilidade, onde a equipe cria um design ruim sem perceber [16, 55, 67]. É a bagunça causada por desenvolvedores que não estão familiarizados com os princípios de design [67].
34
Débito técnico é sempre algo negativo?
Não [63]. Nem toda dívida técnica é má intencionalmente – às vezes é estratégica (Prudente e Deliberada) [66, 68]. O objetivo não é eliminá-lo, mas sim gerenciá-lo ativamente, documentar e quitá-lo quando possível [63, 69].
35
Como identificar que um sistema tem dívida técnica alta?
Sintomas comuns incluem: código difícil de entender (code smells), alta taxa de bugs regressivos, dificuldade em adicionar novas funcionalidades [68], baixa cobertura de testes e o time gastar muito esforço 'remendando' código [70].
36
Cite estratégias para reduzir dívida técnica.
1) **Refatoração incremental contínua** (Regra do Escoteiro) [70, 71]. 2) **Alocar tempo no planejamento** (e.g., 20% do sprint) [70, 72]. 3) **Priorizar por impacto** no negócio/risco [70, 73]. 4) **Strangler Pattern** para reescrita parcial e gradual de módulos legados [74].
37
O que é o Strangler Pattern?
É uma forma de substituir um sistema legado de forma incremental (analogia da figueira estranguladora) [74]. Você gradualmente cria uma nova aplicação ao redor da antiga, migrando funcionalidades e desativando as legadas, minimizando os riscos de uma reescrita total [23, 74].
38
O que é a Taxa de Débito Técnico (TDR)?
Uma métrica de alto nível para quantificar o débito, calculada como a razão entre o Custo de Correção do código e o Custo para Desenvolvê-lo do zero. Uma TDR mais alta indica um débito maior [16, 75, 76].
39
O que é TDD e como ele se relaciona com código limpo?
Test-Driven Development (TDD) é a técnica de escrever primeiro o teste que falha, depois implementar o código mínimo para passar, e então refatorar (ciclo vermelho-verde-refatora) [25, 77]. TDD incentiva design simples e responsabilidades claras, produzindo naturalmente código mais coeso e menos acoplado (características de código limpo) [77].
40
O que é um 'code smell'? Dê um exemplo.
'Code smell' (mau cheiro de código) é um indício superficial no código que sugere um problema mais profundo de design ou qualidade [78]. Não é um bug, mas um sinal de que algo pode estar errado [78]. Exemplo: uma função com 500 linhas (smell Long Method) ou código duplicado espalhado [78].
41
Quais métricas podem ser usadas para avaliar qualidade de código?
Algumas métricas incluem: **Complexidade ciclomática** (fluxos lógicos) [60], **Cobertura de testes** (percentual de código exercitado) [79], **Número de Code Smells/Bugs/Vulnerabilities** (via SonarQube) [79], e **Tamanho médio de funções/classes** [79].
42
Qual a definição de 'código legado' segundo Michael Feathers?
'Código legado é código sem testes' [31]. A ausência de testes torna qualquer mudança perigosa e imprevisível, o que é o cerne do problema com o código legado [31].
43
Qual é o 'dilema do código legado' ao adicionar testes?
Para mudar o código de forma segura, você precisa de testes. Mas para colocar testes em código legado, muitas vezes você precisa mudar o código primeiro [31].
44
Qual é a diferença entre os padrões Strategy e Template Method?
Strategy usa composição para trocar algoritmos inteiros em tempo de execução. Template Method usa herança para permitir que subclasses redefinam partes de um algoritmo [31].
45
Por que 'código é um liability/passivo, não um ativo', como dizem no Google?
Significa que ter mais código implica em mais coisa para manter – cada linha é um potencial ponto de falha ou custo de atualização [80]. O valor está em o código **funcionar e entregar valor**, logo, minimizar complexidade é desejável [81].
46
O que é overengineering e por que é uma armadilha?
Overengineering é o excesso de zelo técnico, aplicando padrões complexos desnecessariamente ou antecipando flexibilidade não requisitada (violando YAGNI) [82]. É uma armadilha porque resulta em código abstrato demais e difícil de entender, aumentando a complexidade em vez de reduzi-la [82, 83].
47
Como a cultura ágil/DevOps influencia na qualidade técnica?
Ágil enfatiza 'prontidão para mudança', o que exige código de qualidade e testes automatizados [81]. DevOps prioriza automação de build, teste e deploy (CI/CD), o que reduz erros manuais e cria feedback rápido [84]. Também promove a responsabilidade de ponta a ponta ('você constrói, você opera'), incentivando alta qualidade e confiabilidade [84].
48
Qual a filosofia da NASA/JPL em software crítico?
O Jet Propulsion Laboratory (JPL) da NASA estabeleceu regras rigorosas (como 'The Power of 10') para codificação segura em C, visando eliminar classes inteiras de erros. Esse rigor resultou em software que operou com quase zero bugs em produção [85].
49
O que é a arquitetura em Microsserviços, e qual o seu trade-off em relação ao Monolito?
Microsserviços são um conjunto de serviços pequenos, independentes e implantáveis individualmente [36]. O trade-off é que eles trocam a simplicidade operacional do Monolito pela flexibilidade de implantação e escalabilidade granular [86-88], mas introduzem complexidade de sistemas distribuídos (rede, consistência de dados) [87].