quinta-feira, 11 de março de 2010

Controle de Versão de Software

O desenvolvimento de software envolve um processo contínuo de evolução de código e baseado nesse paradigma, surgiu a necessidade do desenvolvimento de uma solução que gerenciasse o controle de versões dos códigos-fonte, da documentação e do compartilhamento de trabalho. Assim, surgiram os softwares responsáveis de controle de versão.

O sistema de controle de versão rastreia e controla todos os itens do projeto (código-fonte, arquivos de configuração), possibilitando manter e disponibilizar cada versão produzida do projeto, a política de sincronização de mudanças, que evita a sobreposição, e um histórico completo de alterações sobre cada item do projeto.

O Controle de versão apóia o desenvolvimento de diversas maneiras:

· Histórico: Registra toda a evolução do projeto, cada alteração sobre cada arquivo. Com essas informações sabe-se quem fez o que, quando e onde. Além disso, permite reconstruir uma revisão específica do arquivo sempre que desejado;

· Colaboração: O controle de versão possibilita que vários desenvolvedores trabalhem em paralelo sobre os mesmo arquivos sem que um sobrescreva o código de outro, o que traria reaparecimento de defeitos e perda de funcionalidades;

· Variações no Projeto: Mantém linhas diferentes de evolução do mesmo projeto. Por exemplo, mantendo uma versão 1.0 enquanto a equipe prepara uma versão 2.0.

Apresentando todo essas vantagens, o Controle de Versão é amplamente usado no desenvolvimento de sistemas. Seja em times pequenos ou grandes, softwares livres ou fechados, o Controle de Versão organiza e centraliza decisões.

Existem diversas soluções para Controle de Versão, gratuitas e pagas. Entre as opções pagas, destacam-se o SourceSafe (Microsoft) e ClearCase (IBM). Entre as opções gratuitas, estão o CVS, o SVN e o Git. Todas essas ferramentas têm em comum a forma de funcionamento. Em um rápido resumo:

1. Existe um repositório em um servidor qualquer. Esse servidor armazena todas as versões do software.

2. Os desenvolvedores (clientes) acessam o repositório e trabalham nos arquivos do projeto, em seus respectivos computadores.

3. Periodicamente, os desenvolvedores enviam o código atualizado para o repositório (commit).

Enfim, controle de versão é fundamental para o desenvolvimento de software. Todos os ambientes de desenvolvimento modernos, tais como o Eclipse e o NetBeans, já possuem plugins para integração com algum sistema de controle de versão.

O CVS, ou Concurrent Version System (Sistema de Versões Concorrentes) é uma ferramenta open-source de apoio ao desenvolvimento de software cuja principal função é controlar as modificações realizadas nos arquivos de um projeto. É um sistema de controle de versão que permite que se trabalhe com diversas versões de arquivos organizados em um diretório e localizados local ou remotamente, mantendo-se suas versões antigas e os logs de quem e quando manipulou os arquivos. Utiliza uma arquitetura cliente-servidor, conectados por uma LAN ou pela Internet: um servidor armazena a(s) versão(ões) atuais do projeto e seu histórico, e os clientes se conectam a esse servidor para obter uma cópia completa do projeto, trabalhar nessa cópia e então devolver suas modificações. É especialmente útil para se controlar versões de um software durante seu desenvolvimento, ou para composição colaborativa de um documento. É o sistema de controle de versão mais popular disponível hoje. Possui um mecanismo automatizado para identificar e controlar as modificações realizadas nos arquivos de um projeto ao longo do tempo, garantindo a integridade e a rastreabilidade das modificações. O CVS é visto como uma extensão natural do processo de desenvolvimento, permitindo que se possam realizar modificações paralelas de forma coerente e padronizada, especialmente em se tratando de equipes geograficamente dispersas.

Ferramentas CASE

A sigla CASE significa “Computer Aided Software Engeneering”, em português: “Engenharia de Software Auxiliada por Computador”.

Ferramentas CASE são ferramentas utilizadas como suporte para desenvolver um software. Essas ferramentas oferecem um conjunto de serviços, fortemente relacionados, para apoiar uma ou mais atividades do processo de desenvolvimento de software e podem minimizar o tempo de desenvolvimento do programa, mantendo o alto nível de qualidade.

As vantagens em se utilizar uma Ferramenta CASE é o aumento da produtividade, melhor qualidade, diminuição dos custos, melhor gerenciamento e a grande facilidade de manutenção.

Cada ferramenta tem propósitos diferentes, fornece serviços diferentes, mas possuem algumas características em comum.

As ferramentas CASE podem ser classificadas em:

· Horizontais: oferecem serviços utilizados durante todo o processo de software;

· Verticais: utilizadas em fases específicas do processo de software.

Elas também podem ser classificadas de acordo com os serviços que oferecem, dentre as quais, cita-se.

· Documentação;

· Planejamento e gerenciamento de projetos;

· Especificações formais;

· Comunicação;

· Análise e projeto de software;

· Projeto e desenvolvimento de interfaces;

· Programação;

· Gerenciamento de Configuração;

· Controle de Qualidade.

Ou ainda, categoricamente, elas podem ser:

· Lower CASE - ferramentas de codificação (front-end);

· Upper CASE - ferramentas de análise, projeto e implementação;

· Integrated CASE - união de Upper e Lower CASE.

Um dos componentes indispensáveis de uma ferramenta CASE é a modelagem visual, ou seja, a possibilidade de representar, através de modelos gráficos.

As ferramentas CASE automatizam uma grande variedade de tarefas: Geração de documentação, Testes, Geração de código, Geração de Relatórios para acompanhamento do trabalho entre outras atividades.

Exemplo: O DBDesigner é uma ferramenta CASE de código livre que serve para a modelagem de dados, mais especificamente para a elaboração de diagramas MER (Modelo Entidade Relacionamento). Dentre as suas principais vantagens podemos citar a fácil geração de código SQL do modelo criado, a separação dos modelos Físico e Lógico, a sua simples interface gráfica e a sua portabilidade.

Processos, métodos e ferramentas

Um processo de software pode ser visto como o conjunto de atividades, métodos, práticas e transformações que guiam pessoas na produção de software. Um processo eficaz deve, claramente, considerar as relações entre as atividades, os artefatos produzidos no desenvolvimento, as ferramentas e os procedimentos necessários e a habilidade, o treinamento e a motivação do pessoal envolvido.

O objetivo de se definir um processo de software é favorecer a produção de sistemas de alta qualidade, atingindo as necessidades dos usuários finais, dentro de um cronograma e um orçamento previsíveis.

Processo seria um passo-a-passo na construção de um programa. Para se desenvolver um software é necessário adotar uma linha de passos que serão seguidos para que o objetivo do software seja atingido se cumprindo os prazo de entrega e orçamento previstos.

Se considerarmos um software como um processo, ele será desenvolvido a partir de vários sub-processos. O processo de desenvolvimento de um software fica muito mais fácil e rápido se ele for dividido em várias partes, sendo cada uma dessas, um sub-processo.

Para se desenvolver processos ou um software como um todo, é necessário definir formas de desenvolvimento que permitirão que esses processos sejam concluídos. Essas formas são os métodos. Ou seja, métodos são as várias formas que existem para se desenvolver um processo.

Por fim, as ferramentas são tudo o que será utilizado pelos métodos no desenvolvimento de um processo e na construção do software.

Vídeo - A Evolução da Informática



quarta-feira, 10 de março de 2010

Vídeo - História da Internet



Vídeo - História do computador em alguns minutos


Vídeo aulas de Engenharia de Software

Você pode assistir a aulas sobre Engenharia de Software a partir dos links abaixo:

Aula 01 - Parte 01

Aula 01 - Parte 02

Aula 02 - Parte 01

Aula 02 - Parte 02

Aula 03 - Parte 01

Aula 03 - Parte 02

Aula 04 - Parte 01

Aula 04 - Parte 02

Aula 05 - Parte 01

Aula 05 - Parte 02

Aula 06 - Parte 01

Aula 06 - Parte 02

Vídeo - Mal uso da internet

Stakeholders

Stakeholder é qualquer pessoa ou organização que tenha interesse, ou seja afetado pelo projeto.

A palavra vem de:

· Stake: interesse, participação, risco

· Holder: aquele que possui

Entre os stakeholders, podemos destacar:

Gerente de Projeto – É ele que organiza o trabalho. Ele deve analisar o contexto, planejar o projeto (junto com sua equipe), conduzir o trabalho e realizar as entregas. O gerente de projetos vai fazer a integração do projeto, irá supervisionar todo o trabalho, gerenciar os processos, manter as relações entre os stakeholders em equilíbrio, fazer as negociações de prazo, preço etc.

Analista de Sistema – Aquele que irá analisar o que deverá ter o software para atingir o objetivo final, o resultado desejado pelo cliente. É ele que vai analisar todas as especificidades que o software conterá.

Programador – Os desenvolvedores do software. Toda a parte da implementação lógica do software, toda a programação do software é feita pelo programador.

Patrocinador – É aquele que libera os recursos, custeia a produção do projeto. Ele será o responsável por disponibilizar todas as ferramentas necessárias para o desenvolvimento de software.

Cliente (usuário) – Aquele que encomenda o software de acordo com a sua necessidade. Poderá ser o único usuário, mas se o cliente for uma empresa, por exemplo, o software terá mais de um usuário.

Tipos de Software

De acordo com suas aplicações, um software pode ser classificado das seguintes formas:

Software Básico: É uma coleção de programas escritos para dar apoio a outros programas. A área do software básico é caracterizada por forte interação com o hardware de computador, intenso uso por múltiplos usuários, operações concorrentes que exigem escalonamento (schedule), compartilhamento de recursos e sofisticada administração de processo, estruturas de dados complexas múltiplas interfaces internas.

Software de Tempo Real: É um software que monitora, analisa, controla eventos do mundo real. Um sistema de tempo real deve responder dentro de restrições de tempo escrita. O tempo de resposta de um software assim é curo, variando de 1 milésimo de segundo a 1 minuto.

Software Comercial: São softwares que processam informações comerciais. As aplicações dessa área reestruturam os dados de uma forma que facilita aas operações comerciais e as tomadas de decisões administrativas.

Software Científico e de Engenharia: São softwares que auxiliam as aplicações científicas. Têm sido caracterizados por algoritmos de processamentos de números.

Software Embutido ou Embarcado: São softwares próprios de um determinado hardware. O software embutido é usado para controlar produtos e sistemas para os mercados industriais e de consumo. O software embutido pode executar funções muito limitadas e particulares (por exemplo, controle do teclado para fornos de microondas) ou oferecer recursos funcionais de controles significativos (por exemplo, funções digitais em automóveis, tais como controle de combustível, mostradores nop painel, sistemas de freio etc.).

Software de Computador Pessoal: São softwares para os computadores pessoais que, entre muitas outras aplicações, são responsáveis por processamento de textos, planilhas eletrônicas, computação gráfica.

Software de Inteligência Artificial: O software de inteligência artificial faz uso de algoritmos não-numéricos para resolver problemas complexos que não sejam favoráveis à computação ou a análise direta. Atualmente, a área de AI (Artificial Intelligency) mais ativa é a dos sistemas especialitas, também chamados sistemas baseados em conhecimento. Porém, outras áreas de aplicação para o software de AI são o reconhecimento de padrões (voz e imagem), jogos e demonstração de teoremas. Nos últimos anos, desenvolveu-se um novo ramo do software de AI, chamado redes neurais artificiais. Uma rede neural simula a estrutura dos processos cerebrais e pode, por fim, levar a uma nova classe de software que consegue reconhecer padrões complexos e aprender com a “experiência” passada.

Software Online: São softwares que funcionam em conexão com a internet. Neles os arquivos para execução do software não são carregados localmente, é feita através de um servidor assim como o tráfego de dados. Têm tempo de resposta curto, porém maior que o software de tempo real.

Ciclo de Vida de um Software

O ciclo de vida clássico de um software designa todas as etapas do desenvolvimento de um software, da sua concepção ao seu desaparecimento (inutilização do software).

1ª fase – Concepção

É o surgimento da idéia do sistema em detrimento de alguma necessidade do usuário.

2ª fase – Especificação

É a fase de levantamento de necessidades e definição de um modelo lógico do sistema, com base em estudos e interação com o usuário do sistema.

3ª fase – Projeto Físico

Tem como finalidade obter o modelo físico de implementação, levando em consideração o Modelo Lógico obtido e os recursos tecnológicos existentes ou a serem determinados, bem como suas restrições. Nesta fase há a especificação completa da arquitetura de hardware e software, estruturas de controle, estruturas de dados do sistema, interfaces, etc. que serão utilizadas para o desenvolvimento do software.

4ª fase – Implementação

Construção do software conforme especificado e projetado.

5ª fase – Validação

É a fase de testes do software. Tem como finalidade certificar se o software produzido atende ao que foi especificado. Esses testes são feitos pelo usuário.

6ª fase – Instalação

Neste momento, o software é instalado e os usuários treinados para a sua correta utilização. .Implantação de maneira gradativa, a fim de evitar insatisfação e possibilitando a correção do sistema.

7ª fase – Manutenção

Durante a utilização de um software, alguns erros podem aparecer ou até mesmo a necessidade de novas funcionalidades que aquele programa poderia abranger. Em razão disso, um software deve receber manutenção com determinada freqüência. A manutenção pode ser corretiva (corrige erros e mudanças causadas por eles) ou adaptativa (há um acréscimo de novas funcionalidades ao software).

Crise e Engenharia de Software

Na década de 70 o desenvolvimento de software apresentava muitas dificuldades frente ao rápido crescimento da demanda por software, da complexidade dos problemas a serem resolvidos e da inexistência de técnicas estabelecidas para o desenvolvimento de sistemas que funcionassem adequadamente ou pudessem ser validados. Este período ficou conhecido como crise do software.

A crise se manifestava de várias formas, entre elas: projetos estourando o orçamento, projetos estourando o prazo, software de baixa qualidade, softwares que muitas vezes não atingiam os requisitos.

Segundo Friedrich Ludwig Bauer, "Engenharia de Software é a criação e a utilização de sólidos princípios de engenharia a fim de obter software de maneira econômica, que seja confiável e que trabalhe eficientemente em máquinas reais". O próprio significado de engenharia já traz os conceitos de criação, construção, análise, desenvolvimento e manutenção.

O termo Engenharia de Software foi criado na década de 1960 e utilizado oficialmente em 1968 na NATO Conference on Software Engineering (Conferência sobre Engenharia de Software da OTAN). Sua criação surgiu numa tentativa de contornar a crise do software e dar um tratamento de engenharia (mais sistemático e controlado) ao desenvolvimento de sistemas de software complexos, visando melhorar a qualidade dos produtos de software e aumentar a produtividade no processo de desenvolvimento. Um sistema de software complexo se caracteriza por um conjunto de componentes abstratos de software (estruturas de dados e algoritmos) encapsulados na forma de procedimentos, funções, módulos, objetos ou agentes e interconectados entre si, compondo a arquitetura do software, que deverão ser executados em sistemas computacionais.

Os fundamentos científicos envolvem o uso de modelos abstratos e precisos que permitem ao engenheiro especificar, projetar, implementar e manter sistemas de software, avaliando e garantindo suas qualidades. Além disto, deve oferecer mecanismos para se planejar e gerenciar o processo de desenvolvimento. Empresas desenvolvedoras de software passaram a empregar esses conceitos sobretudo para orientar suas áreas de desenvolvimento, muitas delas organizadas sob a forma de Fábrica de Software.

Engenharia de Software x Engenharia da Computação

Como já foi dito, a Engenharia de Software tem como objetivo implementar soluções para os problemas de gestão e processamento da informação. É uma perspectiva prática de resolução dos problemas que as pessoas sentem, e fazê-lo de forma eficiente, que pode ser repetida e comprovada a sua eficácia para a resolução de problemas concretos. Ou seja, a Engenharia de Software se preocupa com as práticas de produção do software, seus custos e prazos.

Já a Engenharia da Computação é focada no projeto e desenvolvimento de equipamentos computacionais. Em outras palavras, é uma área que trabalha mais com hardware. Quem se forma neste curso, torna-se apto a projetar e implementar sistemas de hardware e software em equipamentos, aplicações industriais, redes de comunicação, entre outros.

Engenharia de Software x Sistemas de Informação

Como já foi dito, a Engenharia de Software tem como objetivo implementar soluções para os problemas de gestão e processamento da informação. É uma perspectiva prática de resolução dos problemas que as pessoas sentem, e fazê-lo de forma eficiente, que pode ser repetida e comprovada a sua eficácia para a resolução de problemas concretos. Ou seja, a Engenharia de Software se preocupa com as práticas de produção do software, seus custos e prazos.

Sistemas de Informação é um curso focado no planejamento e desenvolvimento de sistemas de informação e automação. Além disso, o estudante de Sistemas da Informação recebe preparos para atuar no desenvolvimento e suporte de softwares. Também são aplicados conhecimentos de administração, negócios e relações humanas. O profissional desta área é capaz de aplicar recursos de informática na solução de problemas das empresas.

Ou seja, Sistemas de Informação é um curso que abrange mais formas de atuação que a Engenharia de Software, que é um curso mais específico: trabalha com as formas de desenvolvimento de software.

Engenharia de Software x Ciência da Computação

A Engenharia de Software tem como objetivo implementar soluções para os problemas de gestão e processamento da informação. É uma perspectiva prática de resolução dos problemas que as pessoas sentem, e fazê-lo de forma eficiente, que pode ser repetida e comprovada a sua eficácia para a resolução de problemas concretos.

A Ciência da Computação é uma disciplina com rigor matemático que tem como enfoque a máquina e o algoritmo e não as pessoas, como acontece na Engenharia de Software. As demonstrações matemáticas da Ciência da Computação continuarão a ser válidas daqui a 100 anos, enquanto que as boas práticas da Engenharia de Software vão seguramente evoluir muito nas próximas décadas e nunca serão uma ciência exata.

Assim, enquanto a Engenharia de Software se preocupa com as práticas de produção do software, seus custos e prazos, a Ciência da Computação se preocupa com a teoria e os fundamentos, com a maneira que um software é executado internamente em uma máquina, por exemplo.

terça-feira, 9 de março de 2010

Estabelecendo diferenças entre Sistema, Software e Programa

Sistema - Conjunto de partes que interagem entre si, visando um objetivo em comum. É um conjunto de software, hardware e recursos humanos.

Programa - Algoritmo executável que é utilizado para resolver problemas. Algoritmo é uma sequência de passos lógicos para se resolver determinado problema.

Software - Toda a documentação envolvida, incluindo o programa.


Definindo Engenhar, Engenharia e Engenharia de Sofwtare

Engenhar significa construir, inventar, idear, engendrar.

Engenharia é a aplicação de métodos científicos e empíricos, e certas habilitações específicas, à criação de estruturas, dispositivos e processos para converter recursos naturais em formas adequadas ao atendimento das necessidades humanas.

Definições de Engenharia de Software

“Engenharia de Software é uma estratégia sistemática, disciplinada e quantificável para a Programação. Envolve o desenvolvimento, operação e manutenção do software. Tem como elementos fundamentais: métodos, ferramentas e procedimentos.”

“A engenharia de software é um rebento da engenharia de sistemas e de hardware. Ela abrange um conjunto de três elementos fundamentais – métodos, ferramentas e procedimentos – que possibilita ao gerente o controle do processo de desenvolvimento do software e oferece ao profissional uma base para a construção de software de alta qualidade produtivamente.”

“Conjunto total de atividades necessárias para transformar os requisitos de um usuário em software” ES James página1, 5° parágrafo.

“É a aplicação dos princípios científicos, métodos, modelos, padrões e teorias que possibilitem gerenciar, planejar, modelar, projetar, implementar, medir, analisar, manter e aprimorar um sistema de software. Resulta numa produção econômica de software de qualidade.”

"Engenharia de Software é a criação e a utilização de sólidos princípios de engenharia a fim de obter software de maneira econômica, que seja confiável e que trabalhe eficientemente em máquinas reais".

“Engenharia de software é uma área do conhecimento da computação voltada para a especificação, desenvolvimento e manutenção de sistemas de software aplicando tecnologias e práticas de gerência de projetos e outras disciplinas, objetivando organização, produtividade e qualidade. Atualmente, essas tecnologias e práticas englobam linguagens de programação, banco de dados, ferramentas, plataformas, bibliotecas, padrões, processos e a questão da Qualidade de Software.”

Definição e Características de um Software

Existem diversas definições que podem ser aplicada a palavra software. Didaticamente, software poderia ser descrito como: “Software é: (1) instruções (programas de computador) que, quando executadas, produzem a função e o desempenho desejados; (2) estruturas de dados que possibilitam que os programas manipulem adequadamente a informação; e (3) documentos que descrevem a operação e o uso dos programas”.

Software é uma sentença escrita em uma linguagem computável, para a qual existe uma máquina (computável) capaz de interpretá-la. A sentença (o software) é composta por uma seqüência de instruções (comandos) e declarações de dados, armazenável em meio digital. Ao interpretar o software, a máquina computável é direcionada à realização de tarefas especificamente planejadas, para as quais o software foi projetado.

De maneira geral, um software objetiva atender às necessidades de um usuário.

Os componentes de software são construídos usando uma linguagem de programação que tem um vocabulário limitado, uma gramática explicitamente definida e regras de sintaxe e semântica bem formadas.

O software é um sistema lógico, e não físico (não tem propriedades físicas que, por exemplo, podem ser medidas). Portanto, o software tem características que são consideravelmente diferentes das do hardware:

1- O software é desenvolvido ou projetado por engenharia, não manufaturado no sentido clássico. Isso implica que ambas as atividades dependem de pessoas, mas a relação entre as pessoas envolvidas e o trabalho executado é diferente. Ambas as atividades exigem a construção de um “produto”, mas as abordagens são diferentes. Os custos do software estão concentrados no trabalho de engenharia (desenvolvimento) e não na manufatura.

2- Software não se “desgasta”. Algo que pode ocorrer com o hardware. Entretanto, o software deteriora-se, pois com manutenções corretivas ou adaptativas) que todo software recebe é provável que novos defeitos sejam introduzidos ao software, fazendo com que o nível do índice de falhas mínimo comece a se elevar.

3- A maioria dos softwares é feita sob medida em vez de ser montada a partir de componentes existentes, como o hardware.