Código Completo

Código Completo
Steve McConnell
Gêneros: Programação
Ano de publicação: 2010
Ano de leitura: 2020
Minha avaliação: Máxima
Número de leituras: 1
Total de páginas: 893
Resumo (páginas): 0
Idioma original da publicação: Inglês
Traduções para outros idiomas: Russo, Chinês

Primeiro, descreverei brevemente todas as principais seções do livro com meus pequenos comentários. Em seguida, farei uma conclusão geral com as vantagens e desvantagens do livro. Spoiler: o livro é muito bom e tem significativamente mais pontos positivos do que negativos.

Fundamentos do Desenvolvimento de Software

Esta parte do livro é inteiramente dedicada aos conceitos básicos de programação e sobre do que é composto o desenvolvimento de software. Aqui são abordadas etapas como definição de requisitos, desenvolvimento, testes e manutenção. Claro que elas são descritas de forma mais detalhada e interessante, então a leitura não será entediante. Embora esta seção seja mais útil principalmente para quem está começando sua carreira como programador. Para uma melhor compreensão desta parte do livro, são usadas metáforas e analogias nos capítulos (por exemplo, a analogia da construção). Como em muitos livros semelhantes, aqui também é mencionado o custo dos erros em diferentes etapas da criação de software (ainda superficialmente, pois isso será discutido em mais detalhes mais adiante). Outra vantagem da seção é que já aqui é mencionado que existem diferentes abordagens para o desenvolvimento: iterativas (em espiral) e em cascata. As vantagens e desvantagens de cada abordagem são brevemente descritas. Termos e métodos mais modernos como Scrum ou Agile não são mencionados aqui, mas as metodologias indicadas pelo autor já são suficientes para um iniciante. Finalmente, o autor também aborda características importantes que o software deve possuir, como: escalabilidade, manutenção, portabilidade, tolerância a falhas, segurança e outras.

Código de Alta Qualidade

Se você acha que, após bastante material (mas interessante), você vai mergulhar diretamente na seção sobre como escrever código incrível e discutir tópicos polêmicos como nomeação de funções, variáveis, uso de tabs e espaços, está enganado. Em seguida, vem uma seção inteira sobre design de software. Eu não diria que se trata diretamente de arquitetura completa — como a arquitetura em camadas (se considerarmos, por exemplo, monólitos) ou microserviços. Aqui o foco está mais na descrição do sistema como um todo, destacando grandes módulos dentro deste sistema, e depois projetando classes individuais, que por sua vez são descritas em forma de métodos separados. É uma espécie de programação abstrata usando diagramas e fluxogramas. Não posso garantir que hoje em dia essa abordagem (com fluxogramas e diagramas) ainda seja amplamente utilizada. A única vez que eu lidei com isso foi na faculdade e na universidade. Em nenhum emprego precisei desenhar fluxogramas, e nem meus amigos e colegas. Esta seção também foca em programação orientada a objetos, e para casos de programação funcional, pode não ser tão simples e óbvio. Portanto, é interessante conhecer esta seção, mas a aplicabilidade prática é uma questão em aberto.

Aqui o foco está mais na resolução de pequenas e médias tarefas do que em projetos completos. Nada sobre tecnologias, uso extensivo de abstrações e aderência ao SOLID. Aliás, o conceito de OOP é bem explicado. Claro, você poderia ler um livro separado sobre isso, mas para iniciantes já é suficiente. Bastante atenção é dada também à nomeação correta de classes e métodos. São analisadas as razões para criar ou não métodos separados. Algumas palavras sobre exceções e tratamento de erros. Outro ponto interessante para iniciantes é a programação usando pseudocódigo. Eu também gosto de chamar isso de "programação no papel". Será especialmente útil para quem não sabe ainda como escrever completamente um determinado algoritmo.

Variáveis

A partir desta seção, eu recomendaria que todos os programadores, mesmo aqueles que já escreveram vários projetos e têm anos de experiência, leiam com mais atenção.

Cem páginas de conteúdo. Pode parecer que não há tanto para discutir sobre variáveis, mas há, e muito. A seção começa com um teste interessante sobre tipos de dados (incluindo árvores, heaps e outros tipos). São mostrados exemplos de boas e más inicializações de variáveis em diferentes linguagens. São explicados escopos de variáveis com o uso de imagens claras. São listadas dicas gerais para minimizar o escopo das variáveis.

É abordado o tema da duração dos dados, nomeação de variáveis temporárias, status (flags), convenções de nomeação para diferentes linguagens. São discutidas abreviações adequadas e aceitas, prefixos padrão e boas práticas de encurtamento de nomes.

No final da seção, há uma análise mais detalhada dos tipos de dados e suas limitações: números de ponto flutuante, enums, constantes, tipos de dados próprios, arrays, structs, ponteiros.

Operadores

Esta parte do livro trata da organização sequencial do código, uso de operadores condicionais e loops. A seção também tem 100 páginas, então há bastante conteúdo. Por exemplo, há uma comparação detalhada da construção e desempenho (duração e tempo de execução) dos mesmos loops em diferentes linguagens: C, C++, C#, Java e Visual Basic. Também são abordados temas como recursão e o uso do goto.

Melhorando o Código

A seção consiste nos seguintes capítulos:

  • Qualidade do Software
  • Construção Colaborativa
  • Testes realizados pelos desenvolvedores
  • Depuração
  • Refatoração
  • Estratégias de Otimização de Código
  • Métodos de Otimização de Código

No início, novamente, são discutidos os requisitos e características do software — praticamente os mesmos mencionados no começo. Fala-se sobre o custo de encontrar e corrigir defeitos. A seção é em grande parte teórica, com pouco código. O autor menciona programação em par. Como escrevi acima na descrição da primeira seção, este material, incluindo esta seção, é um pouco controverso, pois algumas coisas estão desatualizadas. O teste também é mencionado. Aliás, em breve farei uma resenha separada sobre um livro dedicado a testes. Mas, ao contrário de livros comuns que ensinam que tipos de testes existem, o que cobrir e como escrever, aqui o autor aborda por outro lado. Por exemplo, ele descreve erros típicos em testes, como a análise de valores-limite. Fala sobre ferramentas de cobertura de testes (que já existiam na época), menciona ferramentas de teste, TDD e alguns padrões aceitos.

Mas a parte mais interessante desta seção começa com o capítulo sobre refatoração. Mais um exemplo de loop for em testes em diferentes linguagens mostra como a mesma construção pode ter desempenho e consumo de recursos bem diferentes dependendo da linguagem. O tipo de compilador também desempenha um papel importante. Há uma tabela interessante mostrando a velocidade relativa do código escrito em diferentes linguagens. Aos exemplos comparativos de código em C, C++, C#, Java e Visual Basic são adicionados PHP e Python. Frequentemente são mostradas comparações de desempenho de operações comuns entre C++ e Java. É difícil dizer se esses testes ainda são relevantes hoje, pois novas versões dos compiladores foram lançadas, linguagens ganharam novas construções, e até interpretadores, como o do PHP, estão sendo reescritos e otimizados a cada versão. Mas o objetivo deste capítulo não era tanto comparar o tempo necessário para um algoritmo ou função básica (como calcular uma raiz quadrada), mas sim mostrar que o mesmo código (função) em diferentes linguagens pode funcionar de forma completamente diferente (às vezes mais lenta, às vezes mais rápida).

No final da seção, há um exemplo de como a mudança para tipos de dados mais adequados pode afetar a velocidade de execução de um algoritmo (novamente, com exemplo em diferentes linguagens).

Perguntas Sistêmicas

A seção consiste nos seguintes capítulos:

  • Como o tamanho do programa influencia a construção
  • Gerenciamento da construção
  • Integração
  • Ferramentas de programação

O que há de interessante aqui? Por exemplo, é abordado como o tamanho da equipe pode afetar a eficiência, além de listar a porcentagem aproximada de programadores que contribuem com código em relação ao total de código dependendo da equipe. Fala-se sobre como o tamanho do projeto em linhas de código se relaciona aproximadamente com a densidade de erros. Talvez os gráficos e tabelas sejam um pouco controversos, mas vale a pena ler sobre isso. Em primeiro lugar, eu até recomendaria esta seção para gerentes.

No geral, a seção é teórica e quase não há código. Também é mencionada a questão da mudança de requisitos durante a implementação do projeto e o quanto isso pode afetá-lo. Também são listados os principais fatores relacionados aos programadores e à equipe, que também podem influenciar a velocidade. O autor inclui entre esses fatores:

  • experiência e habilidades do programador;
  • motivação da equipe;
  • qualidade da gestão;
  • quantidade de código reutilizado;
  • rotatividade de pessoal;
  • variabilidade dos requisitos;
  • e outros.

É abordado o tema da relação e construção de comunicação com os programadores. Por exemplo, como os programadores passam seu tempo. Ou seja, já naquela época o tema do burnout era relevante. Além disso, é mencionada uma questão ligada a "religião" — como a escolha da IDE, nomenclatura e estilo de código, uso de linters e outros.

Discute-se a integração — incremental e em etapas, em forma de T e algumas outras. São descritas as vantagens e desvantagens de cada uma. Mas o material é bastante controverso, pois não há uma única menção sobre CI/CD moderno.

Mestria em Programação

Como resultado, esta é uma seção geral do livro, incluindo muitas outras e também referenciando seções já lidas. Os conselhos gerais são especificados, e há muitos exemplos de código — desde a colocação de comentários até o trabalho com classes e métodos. Eu não diria que esta seção pode ser vista como uma conclusão de todo o livro — é mais um complemento às anteriores. A seção termina com lições morais do autor, por exemplo, sobre como lidar com preguiça, precisão e outras qualidades. No final, há uma enorme lista de referências, o que pelo menos indica uma abordagem profissional para o livro e o cuidado em sua elaboração durante a escrita.

Conclusões

Este livro tem quase 900 páginas, mas não se deixe assustar por isso, pois o material apresentado aqui, na minha opinião, é até significativamente melhor do que o de Robert Martin. Vamos listar os principais prós e contras do livro.

Contras:

  1. O livro é enorme, e nem todos conseguirão lê-lo por completo.
  2. O ano de publicação não é o mais recente, então alguns exemplos e tópicos podem estar desatualizados. Por exemplo, não há menções a algumas linguagens modernas de programação, e as abordagens atuais para o deployment de aplicações e as tecnologias de desenvolvimento de software mudaram bastante.

Prós:

  1. Estrutura excelente e clara.
  2. Leitura fácil.
  3. No final de cada capítulo há um resumo com os pontos importantes.
  4. Frequentemente são apresentados exemplos de código ruim seguidos de melhorias até chegar a um bom código.
  5. O código é apresentado em várias linguagens, além de comparações de algoritmos entre elas.

Definitivamente, é um ótimo livro. Eu diria que é um dos melhores livros teóricos sobre programação, que vale a pena ser lido tanto por iniciantes quanto por desenvolvedores experientes.

Вверх