Code FightersSem categoria

Code Comprehension: O que é?

Antes de discutir Code Comprehension, é importante falar um pouco sobre Engenharia de Software. Existem algumas definições que nos levam a um melhor entendimento sobre esta importante área da Computação. Uma definição bem conhecida é do professor e engenheiro de software Barry Boehm. Boehm [1] define Engenharia de Software como:

A aplicação prática do conhecimento científico na concepção e construção de programas de computador e a documentação associada necessária para desenvolver, operar e mantê-los.”

Você também pode ouvir esse conteúdo:

Hoje em dia em que estamos cada vez mais conectados e vivemos em um mundo onde o software controla sistemas críticos em hospitais, meios de transporte, sistemas financeiros, usinas de energia, etc. esta disciplina torna-se essencial não só para a Computação, mas também para a sociedade. O trabalho com um software não termina com o seu lançamento, um software evolui com o tempo, recursos são incorporados ou mesmo removidos de acordo com a necessidade do usuário. Além disso, bugs ocorrem e causam problemas operacionais ou mesmo de segurança. Por essas razões, o software precisa de manutenção adequada. Em grandes bases de código onde muitas pessoas escrevem código ou são responsáveis por componentes, algum entendimento de todo esse ecossistema é essencial para a manutenção.

Code Comprehension

A área que estuda técnicas de extração de informações que auxiliam no entendimento de softwares é conhecida como “Code Comprehension” ou “Program Comprehension”. Este campo de estudo é tão importante que existe uma conferência especializada onde os pesquisadores podem apresentar seus trabalhos sobre compreensão de código, incluindo atividades humanas ou ferramentas que possam auxiliar no processo. A IEEE/ACM International Conference on Program Comprehension (ICPC) se descreve como “um fórum de qualidade para pesquisadores e profissionais da academia, indústria e governo apresentarem e discutirem os resultados mais avançados e as melhores práticas no campo de Program Comprehension” [2].

O principal objetivo do Code Comprehension é extrair informações que possam ser usadas para entender alguns aspectos de um sistema. Alguns desses aspectos são descritos em [9] e são:

  • a estrutura (componentes e suas inter-relações)
  • a funcionalidade (quais operações são realizadas em quais componentes)
  • o comportamento dinâmico (como a entrada é transformada em saída)
  • a justificativa (como foi o processo de design e quais decisões foram tomadas)
  • a construção, módulos, documentação e suítes de teste

Os modelos clássicos de Code Comprehension podem ser definidos como top-down (de cima para baixo), bottom-up (de baixo para cima) e integrados [8].

Modelos top-down são usados quando o programador conhece o domínio do programa. Inicialmente, uma suposição geral sobre como o programa funciona é definida, a qual é então refinada à medida que o programador se aprofunda nos detalhes até ter um conhecimento de baixo nível de como o código funciona. Durante o processo de refinamento, o programador busca beacons, que são informações esperadas em algumas situações e atuam como um fragmento para reconstruir o entendimento [11] (ex .: um identificador de variável que pode dar dicas sobre o código analisado).

Quando o conhecimento sobre o domínio é insuficiente, modelos bottom-up são usados. Nesses casos, o programador precisa examinar o código em detalhes para construir hipóteses sobre o propósito geral do programa. Essa abordagem bottom-up é suportada pela criação de chunks. Chunking é o processo de agrupar comandos e estruturas que pertencem ao mesmo grupo semântico.

O modelo integrado ocorre quando top-down e bottom-up são usados juntos. Um programador que tem conhecimento do domínio de um programa pode formular uma hipótese sobre seu propósito e, se ele encontrar partes que estão além de seu conhecimento, a abordagem bottom-up é usada para essa parte.

Suporte de ferramenta

Embora existam ferramentas construídas especificamente para atividades de Code Comprehension, os ambientes de desenvolvimento integrado (IDEs) modernos já incorporam e fornecem muitas funcionalidades de suporte. Alguns deles estão bem descritos no artigo de Fekete e Porkoláb [10]:

  • visualizações de fluxo de controle (ex.: gráfico de chamadas);
  • navegação de código;
  • localizador de referências;
  • localizador de definições;
  • autocompletar código;
  • visualização de vários arquivos;
  • diagramas (ex.: UML).

Além dessas funcionalidades comuns, alguns dos IDEs modernos também oferecem suporte a plugins que podem ser escritos por desenvolvedores terceirizados para atender a uma necessidade específica.

As imagens abaixo mostram algumas dessas funcionalidades implementadas em um IDE popular (i.e., VSCode) [13]:

Ver e navegar até a definição

Ir para definição

Conclusão

Neste post, cobrimos o tópico Code Comprehension como um campo de pesquisa na área de Engenharia de Software. É um tópico interessante e importante que desempenha um grande papel no desenvolvimento de software e nas atividades de avaliação. Esta é a primeira postagem no blog de uma série sobre Code Comprehension, fique ligado para mais conteúdo sobre o assunto, os desafios e sua relação com revisões de código seguro.

Referências

  1. Software Engineering
  2. 29th IEEE/ACM International Conference on Program Comprehension (ICPC 2021)
  3. What is Software Engineering
  4. What is Software Engineering? Definition, Basics, Characteristics
  5. A Language Processing Tool for Program Comprehension
  6. Program Comprehension
  7. Theories, tools and research methods in program comprehension: past, present and future
  8. Program Comprehension: Past, Present, and Future
  9. Program Comprehension
  10. A comprehensive review on software comprehension models∗
  11. Beacons in computer program comprehension
  12. Software Comprehension – A Review & Research Direction
  13. Getting Started

Autores
Gabriel Quadros – Sênior Information Security Analyst
Ricardo Silva – Information Security Analyst

Nova call to action
About author

Articles

Uma equipe de profissionais, altamente conectados com as notícias, técnicas e informações sobre a segurança de aplicações.
Related posts
Code FightersSegurança de Aplicação

Segurança em GraphQL

Para iniciar, GraphQL é uma linguagem de consulta de API poderosa e flexível que tem ganhado…
Read more
Code FightersSegurança de Aplicação

Como integrar o Semgrep no CI/CD e enviar os resultados para a Conviso Platform

Atualmente, é uma prática muito comum integrar verificações de segurança durante a fase de…
Read more
Code FightersSegurança de Aplicação

Escrevendo código seguro - Um guia de boas práticas

Escrever código seguro envolve a adoção de um conjunto de boas práticas de desenvolvimento de…
Read more

Deixe um comentário