O que é código limpo e por que ele é importante?
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].
Quais características definem um código limpo?
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].
O que dizem os princípios SOLID?
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].
Explique o princípio do Single Responsibility (SRP).
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].
Qual é a essência do Princípio Aberto/Fechado (OCP)?
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].
O que o Princípio da Inversão de Dependência (DIP) defende?
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].
O que significa DRY (Don’t Repeat Yourself)?
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].
O que significa KISS (Keep It Simple, Stupid)?
É 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].
O que significa YAGNI (You Aren’t Gonna Need It)?
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].
O que é a ‘Regra do Escoteiro’ aplicada ao código?
‘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].
Por que nomes de variáveis e funções importam na qualidade do código?
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].
Quais os benefícios de ter uma suite de testes automatizados robusta?
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].
O que é a ‘Pirâmide de Testes’ e qual sua ideia principal?
É 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].
Por que os testes End-to-End (E2E) devem ser poucos?
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].
O que é o anti-padrão ‘Cone de Sorvete’ em testes?
É 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].
O que é ‘Shift-Left Testing’?
É 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].
Qual é o propósito dos Padrões de Projeto (Design Patterns) do GoF?
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].
Qual é a principal diferença entre a arquitetura Monolítica e a de Microsserviços?
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].
Qual a principal vantagem da Arquitetura Orientada a Eventos (EDA)?
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].
O que é o padrão Facade?
Fornece uma interface simplificada e unificada para um conjunto de interfaces em um subsistema complexo, tornando-o mais fácil de usar [31, 39].
O que é integração contínua (CI) e qual sua relação com qualidade?
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].
Cite algumas ferramentas populares de análise estática de código.
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].
Para que serve uma ferramenta como o SonarQube?
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].
Como o code review melhora o código?
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].