Implementação de Software
Neste capítulo, estudaremos sobre métodos de programação, documentação e desafios na implementação de software.
Programação Estruturada
No processo de codificação, as linhas de código vão se multiplicando, assim, o tamanho do software aumenta. Gradualmente, torna-se quase impossível lembrar o fluxo do programa. Se alguém esquecer como o software e seus programas, arquivos e procedimentos subjacentes são construídos, torna-se muito difícil compartilhar, depurar e modificar o programa. A solução para isso é a programação estruturada. Ele encoraja o desenvolvedor a usar sub-rotinas e loops em vez de usar saltos simples no código, trazendo clareza no código e melhorando sua eficiência. A programação estruturada também ajuda o programador a reduzir o tempo de codificação e organizar o código corretamente.
A programação estruturada indica como o programa deve ser codificado. A programação estruturada usa três conceitos principais:
Top-down analysis- Um software é sempre feito para realizar algum trabalho racional. Esse trabalho racional é conhecido como problema na linguagem do software. Portanto, é muito importante que entendamos como resolver o problema. Na análise de cima para baixo, o problema é dividido em pequenos pedaços, onde cada um tem algum significado. Cada problema é resolvido individualmente e as etapas são claramente definidas sobre como resolver o problema.
Modular Programming- Durante a programação, o código é dividido em grupos menores de instruções. Esses grupos são conhecidos como módulos, subprogramas ou sub-rotinas. Programação modular baseada no entendimento da análise top-down. Ele desencoraja saltos usando instruções 'goto' no programa, o que geralmente torna o fluxo do programa não rastreável. Saltos são proibidos e o formato modular é encorajado na programação estruturada.
Structured Coding - Em referência à análise de cima para baixo, a codificação estruturada subdivide os módulos em outras unidades menores de código na ordem de sua execução. A programação estruturada usa estrutura de controle, que controla o fluxo do programa, enquanto a codificação estruturada usa estrutura de controle para organizar suas instruções em padrões definíveis.
Programação Funcional
A programação funcional é um estilo de linguagem de programação, que usa os conceitos de funções matemáticas. Uma função em matemática deve sempre produzir o mesmo resultado ao receber o mesmo argumento. Em linguagens procedurais, o fluxo do programa passa por procedimentos, ou seja, o controle do programa é transferido para o procedimento chamado. Enquanto o fluxo de controle está sendo transferido de um procedimento para outro, o programa muda de estado.
Na programação procedural, é possível que um procedimento produza resultados diferentes quando é chamado com o mesmo argumento, pois o próprio programa pode estar em um estado diferente ao chamá-lo. Esta é uma propriedade e também uma desvantagem da programação procedural, na qual a sequência ou o tempo de execução do procedimento torna-se importante.
A programação funcional fornece meios de computação como funções matemáticas, que produzem resultados independentemente do estado do programa. Isso torna possível prever o comportamento do programa.
A programação funcional usa os seguintes conceitos:
First class and High-order functions - Essas funções têm capacidade de aceitar outra função como argumento ou retornam outras funções como resultados.
Pure functions - Essas funções não incluem atualizações destrutivas, ou seja, não afetam nenhuma E / S ou memória e, se não estiverem em uso, podem ser facilmente removidas sem prejudicar o restante do programa.
Recursion- Recursão é uma técnica de programação onde uma função chama a si mesma e repete o código do programa nela, a menos que alguma condição predefinida corresponda. A recursão é a maneira de criar loops na programação funcional.
Strict evaluation- É um método de avaliação da expressão passada para uma função como um argumento. A programação funcional tem dois tipos de métodos de avaliação, estritos (ansiosos) ou não estritos (preguiçosos). A avaliação estrita sempre avalia a expressão antes de chamar a função. A avaliação não estrita não avalia a expressão a menos que seja necessária.
λ-calculus- A maioria das linguagens de programação funcional usa λ-cálculo como seus sistemas de tipo. As expressões λ são executadas avaliando-as à medida que ocorrem.
Common Lisp, Scala, Haskell, Erlang e F # são alguns exemplos de linguagens de programação funcionais.
Estilo de programação
O estilo de programação é um conjunto de regras de codificação seguidas por todos os programadores para escrever o código. Quando vários programadores trabalham no mesmo projeto de software, eles frequentemente precisam trabalhar com o código do programa escrito por outro desenvolvedor. Isso se torna tedioso ou às vezes impossível, se todos os desenvolvedores não seguirem algum estilo de programação padrão para codificar o programa.
Um estilo de programação apropriado inclui o uso de nomes de funções e variáveis relevantes para a tarefa pretendida, usando recuo bem colocado, código de comentários para a conveniência do leitor e apresentação geral do código. Isso torna o código do programa legível e compreensível por todos, o que, por sua vez, torna a depuração e a solução de erros mais fáceis. Além disso, o estilo de codificação adequado ajuda a facilitar a documentação e a atualização.
Diretrizes de codificação
A prática do estilo de codificação varia com as organizações, sistemas operacionais e linguagem de codificação em si.
Os seguintes elementos de codificação podem ser definidos sob as diretrizes de codificação de uma organização:
Naming conventions - Esta seção define como nomear funções, variáveis, constantes e variáveis globais.
Indenting - Este é o espaço deixado no início da linha, geralmente de 2 a 8 espaços em branco ou tabulação única.
Whitespace - Geralmente é omitido no final da linha.
Operators- Define as regras de escrita de operadores matemáticos, de atribuição e lógicos. Por exemplo, o operador de atribuição '=' deve ter espaço antes e depois, como em “x = 2”.
Control Structures - As regras para escrever if-then-else, case-switch, while-until e para instruções de fluxo de controle somente e de maneira aninhada.
Line length and wrapping- Define quantos caracteres devem haver em uma linha, principalmente uma linha com 80 caracteres. Quebra automática define como uma linha deve ser quebrada, se for muito longa.
Functions - Isso define como as funções devem ser declaradas e chamadas, com e sem parâmetros.
Variables - Isso menciona como as variáveis de diferentes tipos de dados são declaradas e definidas.
Comments- Este é um dos componentes de codificação importantes, pois os comentários incluídos no código descrevem o que o código realmente faz e todas as outras descrições associadas. Esta seção também ajuda a criar documentações de ajuda para outros desenvolvedores.
Documentação de software
A documentação do software é uma parte importante do processo de software. Um documento bem escrito fornece uma ótima ferramenta e meio de repositório de informações necessárias para saber sobre o processo de software. A documentação do software também fornece informações sobre como usar o produto.
Uma documentação bem mantida deve envolver os seguintes documentos:
Requirement documentation - Esta documentação funciona como uma ferramenta fundamental para o designer, desenvolvedor e equipe de teste de software realizarem suas respectivas tarefas. Este documento contém todas as descrições funcionais, não funcionais e comportamentais do software pretendido.
Fonte deste documento podem ser dados previamente armazenados sobre o software, software já em execução no final do cliente, entrevista do cliente, questionários e pesquisas. Geralmente, ele é armazenado na forma de planilha ou documento de processamento de texto com a equipe de gerenciamento de software de ponta.
Esta documentação funciona como base para o software a ser desenvolvido e é utilizada principalmente nas fases de verificação e validação. A maioria dos casos de teste é construída diretamente a partir da documentação de requisitos.
Software Design documentation - Estas documentações contêm todas as informações necessárias, que são necessárias para construir o software. Contém:(a) Arquitetura de software de alto nível, (b) Detalhes de design de software, (c) Diagramas de fluxo de dados, (d) Projeto de banco de dados
Esses documentos funcionam como repositório para desenvolvedores implementarem o software. Embora esses documentos não forneçam detalhes sobre como codificar o programa, eles fornecem todas as informações necessárias para a codificação e implementação.
Technical documentation- Essas documentações são mantidas pelos desenvolvedores e programadores reais. Esses documentos, como um todo, representam informações sobre o código. Ao escrever o código, os programadores também mencionam o objetivo do código, quem o escreveu, onde será necessário, o que faz e como faz, que outros recursos o código usa, etc.
A documentação técnica aumenta o entendimento entre vários programadores que trabalham no mesmo código. Ele aprimora a capacidade de reutilização do código. Isso torna a depuração fácil e rastreável.
Existem várias ferramentas automatizadas disponíveis e algumas vêm com a própria linguagem de programação. Por exemplo, java vem a ferramenta JavaDoc para gerar documentação técnica de código.
User documentation- Esta documentação é diferente de todas as explicadas acima. Todas as documentações anteriores são mantidas para fornecer informações sobre o software e seu processo de desenvolvimento. Mas a documentação do usuário explica como o produto de software deve funcionar e como deve ser usado para obter os resultados desejados.
Essas documentações podem incluir procedimentos de instalação de software, guias de procedimentos, guias do usuário, método de desinstalação e referências especiais para obter mais informações como atualização de licença, etc.
Desafios de implementação de software
Existem alguns desafios enfrentados pela equipe de desenvolvimento durante a implementação do software. Alguns deles são mencionados abaixo:
Code-reuse- As interfaces de programação das linguagens atuais são muito sofisticadas e estão equipadas com enormes funções de biblioteca. Ainda assim, para reduzir o custo do produto final, a gerência da organização prefere reutilizar o código, que foi criado anteriormente para algum outro software. Existem enormes problemas enfrentados pelos programadores para verificações de compatibilidade e decidir quanto código reutilizar.
Version Management- Cada vez que um novo software é lançado para o cliente, os desenvolvedores precisam manter a versão e a documentação relacionada à configuração. Esta documentação precisa ser altamente precisa e disponível no prazo.
Target-Host- O programa de software, que está sendo desenvolvido na organização, precisa ser projetado para máquinas host no final do cliente. Mas às vezes, é impossível projetar um software que funcione nas máquinas de destino.