<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6983429712622116184</id><updated>2012-01-29T14:42:05.771-03:00</updated><category term='pessoa-mês'/><category term='ciclo de vida'/><category term='linhas de código fonte'/><category term='design software'/><category term='XP'/><category term='viabilidade'/><category term='estimativas software'/><category term='engenharia de software'/><category term='requisitos de software'/><category term='requisitos'/><category term='cenarios'/><category term='cascata'/><category term='pontos por função'/><category term='programação linguagem'/><category term='evolutivo'/><category term='modelo espiral'/><category term='evolucionario'/><category term='processo de software'/><category term='métricas de software'/><category term='retirada'/><category term='software'/><category term='design de software'/><category term='programação extrema'/><category term='design'/><category term='especificação'/><category term='planejamento'/><category term='processo'/><title type='text'>Engenharia de Software</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-4447184180322116861</id><published>2011-12-07T23:12:00.001-03:00</published><updated>2011-12-07T23:51:51.585-03:00</updated><title type='text'>Padrões de Projeto</title><content type='html'>&lt;p&gt;Padrões de projeto (em inglês, Design Patterns) são soluções para problemas específicos que ocorrem de forma recorrente em um determinado contexto que foram identificados a partir da experiência coletiva de desenvolvedores de software. &lt;/p&gt;&lt;p&gt;A proposta original de padrões veio do trabalho de &lt;a href="patternlanguage.com"&gt;Christopher Alexander&lt;/a&gt; na área de arquitetura. Sua definição para padrões é que "Cada padrão é uma regra (esquema) de três partes que expressa uma relação entre um certo contexto, um problema, e uma solução". &lt;/p&gt;&lt;p&gt;O &lt;b&gt;contexto&lt;/b&gt; descreve uma situação no desenvolvimento na qual existe um problema.O &lt;b&gt;problema&lt;/b&gt; que ocorre repetidamente no contexto deve também ser descrito bem como as forças (requisitos, restrições e propriedades) associadas a ele. A &lt;b&gt;solução&lt;/b&gt; descreve uma configuração ou estrutura de componentes e suas interconexões, obedecendo às forças do problema. As &lt;b&gt;forças&lt;/b&gt;, denominação dada por Alexander, descrevem:&lt;ul&gt;&lt;li&gt;os requisitos que caracterizam o problema e que a solução deve satisfazer, &lt;li&gt;as restrições que devem ser aplicadas às soluções&lt;li&gt;as propriedades desejáveis que a solução deve ter. &lt;/ul&gt;&lt;/p&gt;&lt;h3&gt;Exemplo: Observer (Observador)&lt;/h3&gt;&lt;p&gt;Considere uma interface gráfica que permita representar uma estrutura de dados de diversas formas - tabela, gráfico de barras e gráfico de tortas. A solução mais simples é ativar cada uma das classes que implementam as três diferentes visualizações cada vez que a estrutura de dados for ativada. Isso, no entanto, torna o núcleo do software dependente da interface (maior acoplamento). Além disso, para adicionar novas visualizações, é preciso modificar também a estrutura de dados.&lt;/p&gt;&lt;p&gt;Um bom design de software requer um única estrutura de dados independente das três diferentes visualizações e atuando como observadores. Para isso, é preciso que a implementação das visualizações sejam observadores (ouvintes) da estrutura de dados e que sejam avisados quando ocorrer um evento de atualização.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OxpWUSgy-EM/TuAhWDC-mOI/AAAAAAAAHx0/VUDH3OHozVk/s1600/Screen%2BShot%2B2011-12-07%2Bat%2B23.28.53.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="142" width="320" src="http://1.bp.blogspot.com/-OxpWUSgy-EM/TuAhWDC-mOI/AAAAAAAAHx0/VUDH3OHozVk/s320/Screen%2BShot%2B2011-12-07%2Bat%2B23.28.53.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;O padrão Observer oferece uma solução para isso:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Contexto: Situações nas quais vários componentes dependem de dados que são modificados em outro componente (sujeito).&lt;li&gt;Problema: Os dados do componente sujeito modificam-se constantemente e precisam ser atualizados nos outros componentes. O número de componentes pode variar.&lt;li&gt;Solução: Utilizar um mecanismo de registro que permite ao componente sujeito notificar aos interessados sobre mudanças.&lt;/ul&gt;&lt;p&gt;A visualização das classes e a interação dos objetos são ilustrados na figura abaixo.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-S__DS11J_t0/TuAh7Js29AI/AAAAAAAAHyA/ljqOgb58CzM/s1600/Screen%2BShot%2B2011-12-07%2Bat%2B23.29.12.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="226" width="320" src="http://1.bp.blogspot.com/-S__DS11J_t0/TuAh7Js29AI/AAAAAAAAHyA/ljqOgb58CzM/s320/Screen%2BShot%2B2011-12-07%2Bat%2B23.29.12.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Para saber mais:&lt;/p&gt;&lt;p&gt;Pattern-Oriented Software Architecture (POSA) – A System of Patterns – F. Buschmann, R. Meunier, H. Rohnert,  P. Sommerlad, M. Stal John Wiley and Sons Ltd, Chichester, UK, 1996 &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-4447184180322116861?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/4447184180322116861/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=4447184180322116861&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/4447184180322116861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/4447184180322116861'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2011/12/padroes-de-projeto.html' title='Padrões de Projeto'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-OxpWUSgy-EM/TuAhWDC-mOI/AAAAAAAAHx0/VUDH3OHozVk/s72-c/Screen%2BShot%2B2011-12-07%2Bat%2B23.28.53.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-5492826975189960880</id><published>2011-10-17T08:04:00.002-03:00</published><updated>2011-10-17T08:04:31.703-03:00</updated><title type='text'>Usando cenarios para descobrir requisitos</title><content type='html'>O levantamento de informações sobre as tarefas e os usuários pode ser melhor realizado quando os analistas procuram descrever situações do processo de trabalho. Os métodos baseados em cenários consistem de uma coleção de narrativas de situações no domínio que favorecem o levantamento de informações, a identificação de problemas e a antecipação das soluções. Cenários são uma maneira excelente de representar, para clientes e usuários, os problemas atuais e as possibilidades que podem surgir.&lt;br /&gt;&lt;br /&gt;Os cenários têm como foco as atividades que as pessoas realizam nas organizações possibilitando uma perspectiva mais ampla dos problemas atuais onde o sistema será inserido, explicando porque ele é necessário. Eles proporcionam um desenvolvimento orientado a tarefas possibilitando maior usabilidade do sistema.&lt;br /&gt;&lt;br /&gt;Não é objetivo dos cenários oferecer uma descrição precisa, mas provocar a discussão e estimular novos questionamentos. eles permitem também documentar o levantamento de informações a respeito dos problemas atuais, possíveis eventos, oportunidades de ações e riscos.&lt;br /&gt;&lt;br /&gt;Por sua simplicidade, cenários são um meio de representação de fácil compreensão para os clientes e usuários envolvidos que podem avaliar, criticar e fazer sugestões, proporcionando a reorganização de componentes e tarefas do domínio. Cenários oferecem um "meio-intermediário" entre a realidade e os modelos que serão especificados, possibilitando que clientes, usuários e desenvolvedores participem do levantamento das informações e especificação dos requisitos. Em resumo, os cenários permitem compreensão dos problemas atuais pelos analistas e antecipação da situação futura pelo clientes e desenvolvedores.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Elaborando Cenários&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Como toda atividade de análise e especificação de requisitos, a descrição do domínio através de cenários requer técnicas de comunicação e modelagem.&lt;br /&gt;A descrição de cenários deve ser apoiada pelas três técnicas de comunicação vistas anteriormente. Antes de descrever os cenários, os analistas devem entrevistar clientes para entender os problemas e requisitos iniciais. A entrevista com usuários permite que cada um descreva as suas tarefas e os problemas associados a cada uma delas. A observação direta &lt;i&gt;in loco&lt;/i&gt; é fundamental para que os analistas possam descrever a situação de uso como ela realmente vem ocorrendo na prática.&lt;br /&gt;&lt;br /&gt;Após a elaboração dos cenários, clientes, usuários e analistas podem participar de encontros para que possam discutir cada um destes cenários. Eles podem ser afixados em quadros na parede onde os participantes possam analisá-los e fazer comentários, possivelmente afixando pequenos pedaços de papel a cada uma das cenas.&lt;br /&gt;&lt;br /&gt;Cenários podem ser descritos em narrativas textuais ou através de &lt;i&gt;storyboarding&lt;/i&gt;. As narrativas textuais podem ser descritas livremente, identificando os agentes e as ações que eles participam. É possível utilizar notações para descrever roteiros de cinemas ou notações mais precisas como aquelas utilizadas pela Inteligência Artificial para representação de conhecimento.&lt;br /&gt;&lt;br /&gt;Uma técnica que está bastante relacionada com cenários, por permitir descrever situações de uso, é o storyboarding. Essa técnica envolve a descrição através de quadros com imagens que ilustram as situações do domínio. Cada quadro deve apresentar a cena que descreve a situação, os atores e as ações que cada um deve desempenhar. Abaixo de cada quadro devem estar descritas ações que os atores desempenham. Os storyboards são bastante utilizados em cinemas como forma de comunicação entre roteiristas, diretores, atores e técnicos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Exemplos de cenários&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Como exemplo, vamos considerar o domínio de uma locadora de vídeos.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Cena 1: Cliente procura um filme com uma certa atriz &lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Agentes&lt;/b&gt;: Cliente, Atendente, Balconista &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ações&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;Cliente entra na loja e dirige-se até a atendente. &lt;br /&gt;Cliente: - Eu gostaria de alugar um filme com a atriz que ganhou o oscar este ano. &lt;br /&gt;Atendente: - Algum específico?  &lt;br /&gt;Cliente: - Não, mas que não seja policial ou ação. &lt;br /&gt;Atendente: Você sabe o nome dela? &lt;br /&gt;Cliente: Não. &lt;br /&gt;A atendente pergunta à balconista. &lt;br /&gt;Atendente: - Você sabe o nome da atriz que ganhou o Oscar 99? &lt;br /&gt;Balconista: - Ih. É um nome bem complicado. Só sei que começa com G e o sobrenome é algo parecido com Paltrow. &lt;br /&gt;Cliente: É isto mesmo. &lt;br /&gt;A atendente então procura no fichário de atrizes as que começam com G. Não encontra nenhum nome parecido com o que a balconista falou. Ela então lembra-se de consultar uma revista especializada com os ganhadores do Oscar 99 e lá descobre o nome correto da atriz. Entretanto, não existe realmente ficha alguma com os filmes estrelados por esta atriz. O fichário está desatualizado. &lt;br /&gt;A atendente procura nas estantes alguns filmes e lembra-se de dois: O Crime Perfeito e Seven e mostra-os ao cliente. O cliente recusa-se dizendo que não gosta do gênero destes filmes e pergunta pelo filme vencedor do Oscar. &lt;br /&gt;A atendente responde: - Shakespeare Apaixonado? Ainda não saiu em vídeo.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Cena 2: O cliente procura por filmes de um certo gênero &lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Agentes&lt;/b&gt;: Cliente, Atendente, Balconista &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ações&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;Cliente: - Eu gostaria de comprar um filme de ação. &lt;br /&gt;Atendente: - Nós apenas alugamos. &lt;br /&gt;Cliente: - Tudo bem. Então, por favor, me dê algumas dicas de filmes de ação. &lt;br /&gt;Atendente: Com algum ator especial. &lt;br /&gt;Cliente: Pode ser com Chuck Norris, Van Dame, Statellone, Charles Bronson &lt;br /&gt;Atendente: Temos estes aqui. &lt;br /&gt;A atendente apresenta dez filmes. O cliente escolhe cinco e fica em dúvida se já assistiu outros três. Ele também pergunta à atendente se os outros dois filmes são bons. Após conversar durante alguns minutos com a atendente que entende muito do gênero, decide ficar com seis fitas. A atendente encaminha o cliente à balconista para calcular o valor da locação e o prazo de devolução. Após consultar as tabelas de preços e prazos, a balconista apresenta três planos de pagamento. &lt;br /&gt;Balconista: - Se você devolver em um dia, paga apenas R$ 6,00. Se devolver em seis dias paga R$ 12,00 e se devolver em uma semana paga R$ 15,00. Após este prazo paga mais R$ 2,00 por fita, por dia.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Cena 3: Cliente procura por filme usando o sistema de consulta &lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Agentes&lt;/b&gt;: Cliente e Sistema de Consulta &lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Ações&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;João gostaria de assistir a um filme de guerra. Ele vai a uma locadora de fitas e, chegando lá, utiliza um sistema de consulta. Ele não lembra o título nem o diretor, mas sabe que se passava na guerra do Vietnã e lembra bastante da trilha sonora. Utilizando o sistema ele solicita as opções de filmes de guerra. Os sistema oferece a ele as possibilidades de escolher os filmes por local da guerra ou por época. João escolhe a sua opção (guerra) e obtem uma lista com dezenas de filmes sobre o vietnam. Ele pode organizar esta lista, por diretor, atores e título. Na tela do sistema aparecem a ilustração com o cartaz de divulgação do filme  e uma opção para ele visualizar o trailler. O sistema, entretanto, não possibilita ele ouvir a trilha sonora.&lt;br /&gt;Após analisar algumas opções ele finalmente encontra o filme desejado, mas uma informação na tela do sistema indica que o filme está alugado. João quer saber quando o filme será devolvido, mas esta informação não consta no sistema. Ele entretanto pode reservar e o sistema enviará para ele um e-mail avisando quando o filme estiver disponível. Ele sai da loja pensando "Que tempo perdido. Seria melhor que eu pudesse consultar o sistema de casa".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-5492826975189960880?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/5492826975189960880/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=5492826975189960880&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/5492826975189960880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/5492826975189960880'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2011/10/usando-cenarios-para-descobrir.html' title='Usando cenarios para descobrir requisitos'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-5268555029835346233</id><published>2011-01-05T19:10:00.000-03:00</published><updated>2011-01-05T19:10:37.674-03:00</updated><title type='text'>O emprego dos sonhos nos Estados Unidos é ser engenheiro de software.</title><content type='html'>Engenharia de software, uma profissão que envolve o design e a criação de software para diversos dispositivos desde sistemas operacionais a aplicativos de telefones celulares e videogames, foi classificado como o&amp;nbsp; melhor emprego de 2011 nos EUA pelo relatório Jobs Rated da CareerCast. Foram analisadas 200 diferentes profissões em uma ampla variedade de indústrias e foram analisados níveis de habilidades e salários de acordo com cinco critérios: ambiente de trabalho, esforço físico, estresse, salários e perspectivas. O objetivo do estudo é indicar qual emprego é mais gratificante para a maioria dos empregados (e não apenas para os mais bem sucedidos).&lt;br /&gt;&lt;br /&gt;O que torna a engenharia de software como a melhor opção são as possibilidades de duas indústrias em expansão: sistemas Web e Computação-em-Nuvem. Um grande número de empresas está investindo em desenvolver aplicações para smartphones e tablets que fazem uso de recursos situados na "nuvem", ou seja, em servidors ligados à internet com grande capacidade de armazemento e processamento, segurança e disponibilidade. &lt;br /&gt;&lt;br /&gt;Fonte: &lt;br /&gt;&lt;br /&gt;http://www.careercast.com/jobs-rated/10-best-jobs-2011&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-5268555029835346233?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/5268555029835346233/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=5268555029835346233&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/5268555029835346233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/5268555029835346233'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2011/01/o-emprego-dos-sonhos-nos-estados-unidos.html' title='O emprego dos sonhos nos Estados Unidos é ser engenheiro de software.'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-2053847983752791653</id><published>2010-11-23T10:10:00.000-03:00</published><updated>2010-11-23T10:10:46.681-03:00</updated><title type='text'>O que é Arquitetura de Software?</title><content type='html'>A arquitetura de software é descrição abstrata, na forma de modelos, de diferentes visões do sistema em termos de unidade (partes) que interagem entre si.&lt;br /&gt;&lt;br /&gt;Arquitetura não é uma fase do desenvolvimento, mas o resultado das decisões de design sobre a estrutura e o comportamento do software. Mesmo que esta atividades não tenha sido deliberadamente realizada, vale ressaltar que:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Todo software tem uma arquitetura&lt;/li&gt;&lt;li&gt;A arquitetura pode ser analisada por diferentes &lt;i&gt;pontos de vista&lt;/i&gt;&amp;nbsp;&amp;nbsp;(visões arquiteturais)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;A arquitetura deve dar suporte à funcionalidade do sistema (requisitos funcionais) e deve estar em conformidade com a qualidade (requisitos não-funcionais).&lt;br /&gt;&lt;br /&gt;O &lt;b&gt;design arquitetural &lt;/b&gt;é o processo de tomar as decisões que visa definir estrutura e comportamento para atender aos requisitos funcionais e não-funcionais. Um bom arquiteto deve conhecer diferentes modelos e estilos de arquitetura e saber aplica-los de forma a atender aos requisitos.&lt;br /&gt;&lt;br /&gt;Um dos princípios básicos para organização da estrutura e comportamento é manter uma alta coesão e um baixo acoplamento entre as unidades, como ilustrado na figura abaixo. Uma unidade com alta coesão mantém unidades dependentes entre si agrupadas em uma unidade maior. Isto implica que unidades dependentes e com alto grau de comunicação e dependência entre si estejam localizadas numa mesma unidade mais abstrata. Os benefícios deste princípio são:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Facilitar a manutenção e modificação de uma determinada unidade.&lt;/li&gt;&lt;li&gt;Permitir a substituição de unidade por outra.&lt;/li&gt;&lt;li&gt;Diminuir a comunicação entre as unidades mais abstratas, o que pode significar um baixo tráfego na rede.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_HBylqWX7mzs/TOu8ZFY-2DI/AAAAAAAAFHY/mh-_ZQpj1c0/s1600/Coesao+e+Acoplamento.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="141" src="http://4.bp.blogspot.com/_HBylqWX7mzs/TOu8ZFY-2DI/AAAAAAAAFHY/mh-_ZQpj1c0/s320/Coesao+e+Acoplamento.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As unidades (ou partes) que formam podem variar dependendo da visão utilizada. Por exemplo, numa visão de execução, as partes podem ser vistas como componentes e conectores. Os componentes podem ser partes que estão em execução como &lt;i&gt;processos &lt;/i&gt;ou &lt;i&gt;threads &lt;/i&gt;e os conectores os mecanismos de comunicação entre estes processos. Exemplos de conectores são &lt;i&gt;memória compartilhada&lt;/i&gt; ou &lt;i&gt;pipes &lt;/i&gt;entre processos do Unix/Linux.&lt;br /&gt;&lt;br /&gt;Numa visão de implementação ou de código, as unidades podem ser módulos que oferecem serviços a outros módulos. Estes módulos devem estar ligados entre si através de interfaces bem definidas (API) e organizados de acordo com os serviços. É muito comum termos APIs organizadas em &lt;i&gt;camadas&lt;/i&gt;, como nas interfaces de usuário gráficas (GUI).&lt;br /&gt;&lt;br /&gt;Existem na literatura várias propostas de visões arquiteturais, como em :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hofmeister, Nord e Soni, - Applied Software Architecture, Addison Wesley, 2000;&lt;/li&gt;&lt;li&gt;Bass, L.; Clements, P. and Kazman, R. - Software Architecture in Practice - Second Edition, Addison-Wesley 2003.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-2053847983752791653?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/2053847983752791653/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=2053847983752791653&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2053847983752791653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2053847983752791653'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2010/11/o-que-e-arquitetura-de-software.html' title='O que é Arquitetura de Software?'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HBylqWX7mzs/TOu8ZFY-2DI/AAAAAAAAFHY/mh-_ZQpj1c0/s72-c/Coesao+e+Acoplamento.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-486404062163131096</id><published>2010-01-28T17:46:00.002-03:00</published><updated>2010-01-28T17:53:10.780-03:00</updated><title type='text'>Design de software, de IHC e o Ipad</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;Já dissemos anteriormente que o desenvolvimento de software deve começar pelo seu design. O design de um software interativo consiste na elaboração do seu modelo conceitual, na representação visual de seus elementos e na forma de interação com as suas funcionalidades.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:arial, sans-serif;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;Para entender isso na prática &lt;a href="http://www.youtube.com/watch?v=OBhYxj2SvRI" target="_blank" style="color: rgb(87, 151, 176); "&gt;vejamos os vídeos da apresentação do Ipad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O Steve Jobs está falando o tempo todo sobre como humanos podem interagir com programas que já conhecemos há tempos: player de mp3, player de vídeos, leitor de emails, browser de páginas Web, visualizador de fotos, leitor de livros eletronicos (e-reader), e outros.&lt;br /&gt;&lt;br /&gt;Existem dois aspectos importantes:&lt;br /&gt;1. Jobs está o tempo todo chamando a atenção sobre com podemos &lt;b&gt;interagir &lt;/b&gt;com estes programas com os dedos, sentando numa poltrona ou sofá, e ter uma&lt;b&gt;experiência de uso&lt;/b&gt;.&lt;br /&gt;2. Os diferentes produtos foram &lt;b&gt;idealizados&lt;/b&gt; para uma plataforma única, compartilhando alguns elementos comuns&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ou seja, houve um design destes programas, com seus elementos visuais e interativos acoplados a um hardware simples (com poucos elementos, embora tecnologicamente sofisticadíssimo), com um modelo de interação baseado em toques na tela.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A apple já disponibilizou a SDK, mas não acho que alguém vai ter sucesso em desenvolver aplicações se começar diretamente programando. É preciso desenhar, prototipar, definir a seqüencia de interações para depois transformar isso em código.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Observe que alguem que não entende de programação, pode ser capaz de idealizar e desenhar uma boa aplicação para um Ip*d, que posteriormente precisará ser codificada por um programador. Mas um bom programador que esteja mergulhado em códigos fontes, não necessariamente conseguirá idealizar tais produtos.&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-486404062163131096?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/486404062163131096/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=486404062163131096&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/486404062163131096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/486404062163131096'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2010/01/design-de-software-de-ihc-e-o-ipad.html' title='Design de software, de IHC e o Ipad'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-2562733895380811251</id><published>2009-10-29T12:11:00.005-03:00</published><updated>2009-10-29T14:36:50.526-03:00</updated><title type='text'>Diferenças entre engenharia de software e as engenharias de artefatos físicos.</title><content type='html'>&lt;div&gt;As engenharias mais tradicionais lidam com artefatos materiais onde propriedades físicas estão fundamentadas em teorias das ciências.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;O software é um artefato intelectual cuja matéria prima é a informação e o conhecimento humanos representados por códigos e linguagens. A sua construção é um processo de transformação e comunicação de representações através de seus códigos e linguagens que envolve todos os stakeholders (clientes, desenvolvedores, usuários). Nenhuma outra engenharia tem estas peculiaridades. Isto torna a ES diferenciada com processos bem particulares.&lt;br /&gt;&lt;br /&gt;Nas engenharias tradicionais, o &lt;b&gt;design&lt;/b&gt; é tratado separadamente pelas disciplinas de desenho industrial e arquitetura (na civil). Na engenharia de software, o design, isto é a transformação de requisitos em solução, ocorre de forma integra à engenharia de requisitos, à arquitetura de software e ao design de interfaces de usuário.&lt;br /&gt;&lt;br /&gt;Nas engenharias tradicionais, o processo de &lt;b&gt;verificação &lt;/b&gt;é quase sempre nas qualidades do artefato. O aspecto humano, quando considerado, é tratado pelo profissional de fatores humanos ou ergonomia. Em um software, o ser humano e a sua capacidade de interpretar informações, da racionar sobre elas para interagir e resolver problemas, é parte integrante do produto. Um software interativo não funciona sem o componente humano, tal como um software embutido não funciona sem a máquina na qual ele está embarcado. Dessa forma, a avaliação da interação usuário-sistema precisa ser parte necessária e não complementar da verificação. Métodos de desenvolvimento iterativos, com prototipagem e experimentação com usuário ao longo do ciclo é fundamental.&lt;br /&gt;&lt;br /&gt;Por fim, lidar com &lt;b&gt;sistemas legados&lt;/b&gt;, robustos e confiáveis, é um grande desafio e um outro aspecto diferencial da engenharia de software. Como o software não se desgasta ou sofre fadiga material, o processo de reforma ou reciclagem também é diferente. Técnicas de migração por transformação de código é algo particular da indústria de software.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Assim, engenharia de software tem em comum com qualquer engenharia a necessidade de compreender problemas, desenvolver soluções criativas e garantir a qualidade do seus produtos, aliada aos aspectos gerenciais e econômicos. Mas as características do artefato software requer uma engenharia com fundamentos, métodos, técnicas e ferramentas próprios.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-2562733895380811251?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/2562733895380811251/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=2562733895380811251&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2562733895380811251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2562733895380811251'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2009/10/diferencas-entre-engenharia-de-software.html' title='Diferenças entre engenharia de software e as engenharias de artefatos físicos.'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-5039236450825012339</id><published>2009-08-15T17:32:00.006-03:00</published><updated>2009-10-29T14:43:27.583-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programação linguagem'/><title type='text'>Qual a melhor linguagem de programação?</title><content type='html'>Sempre perguntaram-me qual a melhor linguagem de programação. Esta é uma pergunta difícil de responder.&lt;br /&gt;&lt;br /&gt;Recentemente, participei de uma discussão com colegas sobre quais linguagens deveriam ser ensinadas ao alunos e em qual ordem. Não tenho muita experiência com ensino de programação. Assim, não tive muito como contribuir sobre o aspecto pedagógico desta discussão. Mas dei a minha colaboração com a minha experiência e por considerar a linguagem um instrumento de interação humano-computador.&lt;br /&gt;&lt;br /&gt;Tenho apenas experiência com o auto-aprendizado de várias linguagens, em diferentes paradigmas. Comecei com Basic, do Bill Gates, e Assembly 6502, em casa. Minha motivação: aprender o que é computador. Fui para a universidade e aprendi Fortran, Pascal, Assembly 8086 e Cobol, durante graduação. Estudei C, sozinho, para meu trabalho de IC. Também auto-aprendi Prolog e LISP, para o mestrado; C++ e Java para o doutorado; e Perl, Javascript, PHP, HTML e CSS para desenvolvimento Web.&lt;br /&gt;&lt;br /&gt;Não fiz nenhum planejamento pedagógico para o meu aprendizado, mas acho que consegui dar conta de todas. Não sou fluente na maioria, mas programador não é o que sou de profissão. O melhor para mim foi a diversidade, saber pensar de forma diferente utilizando variadas linguagens e saber ler programas escritos por alunos em seus trabalhos, independente da linguagem.&lt;br /&gt;&lt;br /&gt;Poucos trabalhos investigaram cientificamente qual a melhor linguagem? Melhor em que? para ensino? para a pratica profissional? para um certo domínio de aplicação?&lt;br /&gt;&lt;br /&gt;Linguagens naturais e artificiais, são instrumentos de cognição (ação de conhecer) e comunicação (ação de por em comum). E estas são atividades humanas!&lt;br /&gt;&lt;br /&gt;As linguagens de programação têm vários propósitos. Vou destacar 2 deles relacionados à cognição e comunicação:&lt;br /&gt;&lt;br /&gt;- ser um instrumento para codificar conhecimento de pessoas na forma de instruções para um computador executar (para outras pessoas);&lt;br /&gt;&lt;br /&gt;- ser um instrumento para comunicação e documentação do conhecimento em um time de engenharia de software.&lt;br /&gt;&lt;br /&gt;Ou seja, são atividades de cognição e comunicação humanas que precisam ser eficazes e eficientes para que o programa tenha qualidades.&lt;br /&gt;&lt;br /&gt;A interpretação destas linguagens pelos computadores é a parte mais fácil. O computador aprende facilmente a interpretar qualquer linguagem. Desde que alguém codifique um programa para tal, claro.&lt;br /&gt;&lt;br /&gt;Afirmar qual a melhor linguagem para o processo ensino-aprendizado requer uma investigação científica com métodos adequados para avaliar cognição e comunicação humanas. Atualmente, o foco em CC tem sido quase sempre em avaliar as qualidades objetivas (desempenho, paradigmas, tipagem, etc.) destas linguagens. E nem sempre isto é feito! Linguagens de programação são instrumentos de interação humano-computador. Métodos de avaliação da disciplina IHC podem e devem ser aplicados para este fim.&lt;br /&gt;&lt;br /&gt;Ensinar programação é ensinar um instrumento que seja mais adequado a estes propósitos. Ensinar apenas a utilizar o instrumento não é suficiente.&lt;br /&gt;&lt;br /&gt;Não sou favorável a um profissional que apenas sabe falar "Javanês". Chamo Javanês ao estilo de programação utilizando sentenças lingüísticas em Java que são exclusivas daquela linguagem (expressões idiomáticas) praticadas por programadores extremamente competentes e especializados. Além soar pedante, como nos textos dos intelectuais letrados ou das sentenças dos magistrados que muitas vezes são propositadamente escritos para mostrar que eles estão acima dos mortais comuns, não incentiva o entendimento do código pelos seus pares. Isso não cabe numa atividade profissional coletiva, como é a engenharia de software, que visa a colaboração e a evolução da programação.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-5039236450825012339?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/5039236450825012339/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=5039236450825012339&amp;isPopup=true' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/5039236450825012339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/5039236450825012339'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2009/08/qual-melhor-linguagem-de-programacao.html' title='Qual a melhor linguagem de programação?'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-6677638159510545797</id><published>2009-07-30T22:55:00.003-03:00</published><updated>2009-07-30T23:11:59.011-03:00</updated><title type='text'>Temos seguidores?</title><content type='html'>&lt;div&gt;Este blog está parado há bastante tempo, mas as estatísticas indicam que ele continua sendo visitado. Que bom!&lt;/div&gt;&lt;div&gt;Estou me dedicando bastante na implantanção de um curso de graduacão em &lt;a href="http://www.dimap.ufrn.br/bes"&gt;Engenharia de Software&lt;/a&gt; na &lt;a href="http://www.ufrn.br/"&gt;UFRN&lt;/a&gt;. Além disso, temos projetos e aulas em andamento.&lt;/div&gt;&lt;div&gt;Caso você ache que este blog está sendo útil e merece ser continuado, você pode enviar um comentário ou ser um seguidor. Ainda temos muito a falar sobre engenharia de software! &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-6677638159510545797?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/6677638159510545797/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=6677638159510545797&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/6677638159510545797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/6677638159510545797'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2009/07/temos-seguidores.html' title='Temos seguidores?'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-4488421618787001509</id><published>2009-05-29T21:46:00.002-03:00</published><updated>2009-05-29T21:49:02.046-03:00</updated><title type='text'>Graduação em Engenharia de Software</title><content type='html'>Em 2010, a UFRN iniciará um curso de Engenharia de Software (Bacharelado). &lt;a href="http://www.dimap.ufrn.br/bes/"&gt;Veja mais&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-4488421618787001509?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/4488421618787001509/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=4488421618787001509&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/4488421618787001509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/4488421618787001509'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2009/05/graduacao-em-engenharia-de-software.html' title='Graduação em Engenharia de Software'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-3711806528176368499</id><published>2007-07-05T18:33:00.001-03:00</published><updated>2008-03-06T21:12:27.669-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design de software'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Design Conceitual</title><content type='html'>O software pode ser considerado como um &lt;span style="font-style: italic;"&gt;artefato virtual&lt;/span&gt; que compreende as soluções que foram concebidas de acordo com os requisitos. Este artefato virtual é uma entidade abstrata que existe na mente dos usuários quando eles estão interagindo com o software.&lt;br /&gt;&lt;br /&gt;Esta entidade virtual é o &lt;span style="font-style: italic;"&gt;modelo conceitual &lt;/span&gt;do software. Este modelo determina quais conceitos (ou objetos virtuais) estão presentes no software, quais as funções (ou  tarefas) que o usuário pode utilizar &lt;span style="font-style: italic;"&gt;–funcionalidade&lt;/span&gt; – e como ele pode interagir com o software – &lt;span style="font-style: italic;"&gt;interatividade&lt;/span&gt;. Este modelo também é conhecido como metáfora da aplicação.&lt;br /&gt;&lt;br /&gt;Por exemplo, num editor de texto, como o MS Word, temos diversos conceitos que permitem ao usuário entender como está estruturado um documento e o que ele pode fazer com ele. No Word, encontramos os conceitos de página, bordas de página, margens, parágrafos, recuos de parágrafos, espaçamento entre linhas, distância-da-primeira-linha, distância-antes-do-parágrafo, tamanho da letra, estilo da letra e diversos outros. Todos esses conceitos são baseados em conceitos que estão presentes na tipografia ou mesmo em maquinas de escrever.&lt;br /&gt;&lt;br /&gt;A elaboração de um modelo conceitual é fator determinante no sucesso de uma aplicação. O modelo conceitual precisa ser concebido e especificado adequadamente pelo designer, de acordo, com as necessidades, capacidade e limitações dos usuário. Para que o modelo seja adequado aos usuários, a especificação dos requisitos é fundamental. Nela encontramos, os papéis de usuários, o modelo de tarefas, os casos de uso, os conceitos do domínio e outras informações. A partir delas temos condições de elaborar um modelo conceitual que seja adequado aos requisitos dos usuários.&lt;br /&gt;&lt;br /&gt;Para que a aplicação seja utilizada adequadamente é preciso que o usuário conheça o modelo conceitual da aplicação que foi elaborado pelo designer. Para isto é preciso que ele seja comunicado adequadamente ao usuário. Uma das formas de comunicar este modelo é através dos manuais de usuário ou de treinamento feito por pessoas especializadas. A outra forma é tentar expressar os conceitos através da interface de usuário. A interface é quem oferece a imagem externa do sistema e que deve ser interpretada de maneira correta pelo usuário. Ela deve comunicar para o usuário quais os objetos do domínio estão representados, o que ele pode fazer (a funcionalidade) com este conceitos e como ele pode interagir (o modelo de interação) com esta funcionalidade.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exemplo: o modelo conceitual de um sistema operacional&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Ao utilizarmos um sistema operacional, como o unix/linux, sabemos que podemos construir, armazenar e organizar arquivos de software em diretórios. Um arquivo é na verdade uma seqüência de bits como endereço e tamanho definidos. No entanto, para o usuário o arquivo é algo conceitual que se refere a documentos, programas, dados, etc. Esta entidade conceitual é compreendida por usuários por que ele tem um nome, um tipo, uma data de criação e um tamanho em bytes.&lt;br /&gt;&lt;br /&gt;Os arquivos são armazenados em discos em trilhas e setores e podem ser localizados a partir de uma tabela que associa o seu nome ao local físico. Para o usuário, arquivos são colocados "dentro" de uma outra entidade conceitual: o diretório.&lt;br /&gt;&lt;br /&gt;Arquivos e diretórios são os conceitos do software e podem ser criados, destruídos ou modificados por diversas funções do software. Estas funções são, por exemplo, copiar arquivo, apagar arquivos, construir diretórios, remover diretórios, colocar arquivos em um diretório, mover arquivo de um diretório para outro, etc. Esta funções são também entidades conceituais representadas por um nome que devem indicar, para o usuário, o que o sistema faz.&lt;br /&gt;&lt;br /&gt;Por exemplo, o sistema operacional não coloca arquivos “dentro” de um diretório. Isto só existe na mente do usuário. O que o sistema faz é trocar o endereço físico do arquivo na tabela de arquivos e diretórios. Entretanto, a visão de que diretórios são recipientes que armazenam arquivos é muito mais útil para o usuário. Ela permite ao usuário criar na sua mente conceitos que permitem a ele entender o que fazer com o sistema e raciocinar melhor sobre ele.&lt;br /&gt;&lt;br /&gt;O sucesso de uma aplicação vai depender justamente da criação deste modelo conceitual. Quanto mais claros forem o conceitos e as operações que se pode fazer com  eles, mais o usuário vai saber como aplicá-los na resolução de seus problemas. O sucesso de sistemas como o Macintosh ou o Windows deve-se à construção de modelos conceituais mais familiares para o usuário. Os conceitos de pastas e objetos e a representação deles através de janelas e ícones permite ao usuário criar imagens mentais mais clara. O conceito de pasta como recipiente é mais claro que o de diretório (que na verdade é uma lista). No ambiente Windows o usuário move objetos (documentos, aplicativos, figuras, etc.) de uma pasta para outra e para o topo-de-mesa (desktop) como faria no seus escritório.&lt;br /&gt;&lt;br /&gt;A interface de usuário é fundamental para que este modelo conceitual seja comunicado ao usuário. Ela é o melhor meio para que expressar os conceitos da aplicação e as funções que podem ser utilizadas. No MS DOS, a interface é muito pouco expressiva. Na interface o conceito de diretório é visualizado por ele como uma lista de nomes, tipos, tamanhos e datas, que representam cada arquivo do diretório. Cada arquivo é referenciado individualmente pelo seu nome. No Windows 95, o modelo conceitual é representado por desenhos gráficos que representam os conceitos da aplicação de maneira mais clara.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-3711806528176368499?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/3711806528176368499/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=3711806528176368499&amp;isPopup=true' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/3711806528176368499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/3711806528176368499'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/07/design-conceitual.html' title='Design Conceitual'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-7332630361264560771</id><published>2007-07-02T21:38:00.001-03:00</published><updated>2008-03-06T21:11:00.600-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design software'/><title type='text'>Design de Software</title><content type='html'>A atividade de design de software ainda é uma das mais mal compreendidas da engenharia de software. Muitos utilizam o termo para referir-se a definição de “como” o software ser desenvolvido em contraste como a definição do “que” o software deve fazer – determinado pela especificação dos requisitos.&lt;br /&gt;&lt;br /&gt;Design de software também é utilizado como sinônimo de arquitetura de software. No entanto, a arquitetura do software, no sentido proposto na década de 90, como sendo a  estrutura e o comportamento do software em termos de unidades abstratas interconectadas entre si – componentes e conectores – é apenas um dos produtos do design de software.&lt;br /&gt;&lt;br /&gt;Na nossa visão, design é mais do que isso. Design é a atividade de criar, idealizar ou conceber o software. O resultado disso precisa ser expresso através de modelos ou protótipos do software. O design visa apresentar uma solução que satisfaça a especificação de requisitos (funcionais e não-funcionais), definindo o que precisa ser implementado. Este conceito de design é de certa forma contrario àquele tradicionalmente conhecido na engenharia de software, mas segue a linha proposta por Terry Winograd e outros no livro Bringing Design to Software. Precisamos trazer para o desenvolvimento de software a atividade de design que é realizada no desenvolvimento de qualquer produto industrial.&lt;br /&gt;&lt;br /&gt;Design poderia ser traduzido tanto por projeto como por desenho. Entretanto, estes dois termos não expressam exatamente o que é design. Projeto é um termo mais abrangente do que design, pois se aplica a projeto de pesquisa, projeto de desenvolvimento de um produto e envolve planejamento, metodologia, cronograma, recursos, etc. Desenho é uma tradução utilizada no sentido de Desenho Industrial (industrial design), mas leva a conotação de que a atividade resume-se a elaborar os diagramas que descrevem os modelos do produto. Por estes motivos vamos utilizar o termo em inglês: design.&lt;br /&gt;&lt;br /&gt;Segundo David Liddle, "o design de software é o ato de determinar a experiência do usuário com um pedaço de software. Não tem nada a ver sobre como o código opera internamente ou se ele é grande ou pequeno. A tarefa do designer é especificar de forma completa e não ambígua a experiência global do usuário". [David Liddle, Design of The Conceptual Model, em Winograd, T.]&lt;br /&gt;&lt;br /&gt;O design de software compreende a concepção, especificação e prototipação da partes "externas" e "internas" do software. A parte externa compreende o modelo conceitual e a interface de usuário. A parte interna compreende a arquitetura de software e os algoritmos e estruturas de dados que implementam estes componentes.&lt;br /&gt;&lt;br /&gt;Resumindo, o design de software envolve:&lt;br /&gt;Design do modelo conceitual,&lt;br /&gt;Design da interface de usuário,&lt;br /&gt;Design da arquitetura de software e&lt;br /&gt;Design dos algoritmos e estruturas de dados&lt;br /&gt;&lt;br /&gt;Mais adiante, discutiremos estas atividades.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-7332630361264560771?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/7332630361264560771/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=7332630361264560771&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/7332630361264560771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/7332630361264560771'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/07/design-de-software.html' title='Design de Software'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-2277981086402978061</id><published>2007-06-03T18:12:00.000-03:00</published><updated>2007-06-03T18:23:44.430-03:00</updated><title type='text'>Modelos de Software</title><content type='html'>Modelos são essenciais em qualquer atividade de engenharia. O software, por ser um artefato invisível e conceitual, mas do que qualquer outro artefato, precisa ser construído com base em modelos.&lt;br /&gt;&lt;br /&gt;Existem diversos tipos de modelos de software, cada um deles proporcionando visões e níveis de abstração distintos. Diagramas são a forma mais utilizada de modelagem na engenharia de software. Um protótipo também é um tipo de modelo de software que vem sendo utilizado para apoiar diversos métodos de desenvolvimento.&lt;br /&gt;&lt;br /&gt;Modelos de software são construídos para uma visualização do sistema a ser construído, permitindo uma melhor compreensão e entendimento. Eles podem também ser utilizados para a especificação e para a documentação do software. O modelo quando utilizado para especificação possibilita uma descrição precisa do será desenvolvido pelos programadores. A documentação através de modelos deve refletir o que foi desenvolvido e será a base para as atividades de manutenção.&lt;br /&gt;&lt;br /&gt;De acordo com Booch, Rumbaugh e Jacobsonm (1998), alguns princípios devem ser seguidos:&lt;br /&gt;&lt;br /&gt;•    A escolha de qual modelo construir tem uma profunda influência em como um problema é atacado e como uma solução é delineada.&lt;br /&gt;•    Todo modelo pode ser expresso em diferentes níveis de precisão.&lt;br /&gt;•    Os melhores modelos estão conectados à realidade.&lt;br /&gt;•    Nenhum modelo único é suficiente. Todo sistema não trivial é melhor abordado através de um conjunto pequeno de modelos proximamente independentes.&lt;br /&gt;&lt;br /&gt;O uso de modelos em ambientes integrados de desenvolvimento de software vem sendo utilizado para auxiliar a construção de software. Algumas ferramentas permitem que código seja gerado a partir de modelos. Esta abordagem é conhecida como desenvolvimento dirigido por modelos e tem como base o uso de arquiteturas dirigidas por modelos que são construídas utilizando a UML (Linguagem de Modelagem Unificada).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/Modelos.pdf"&gt;Veja slides com conceitos e exemplos sobre modelos de software&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Linguagens de modelagem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Durante muitos anos, o maior problema para a utilização de modelos de software foi a falta de uma linguagem de modelagem comum. As diferentes notações e linguagens existentes foram desenvolvidas visando software com características especificas. Por exemplo, desenvolvedores de software de controle e tempo real utilizavam notações como Statecharts e Redes de Petri; desenvolvedores de sistemas de banco de dados utilizavam Diagramas Entidade-Relacionamento (DER); e desenvolvedores de sistemas de informação utilizavam Diagramas de Fluxos de Dados (DFD), como parte de metodologias estruturadas.&lt;br /&gt;&lt;br /&gt;Como o surgimento do paradigma de programação orientada-a-objetos, o número de métodos com suas notações associadas aumentou bastante, vindo somar-se aos diversos já existentes. No final da década de 90, o OMG (Objetc Management Group) incentivou a criação de uma linguagem padrão para métodos orientados a objetos. A UML que unificou diferentes notações já existentes foi aprovada para ser um padrão da industria de software.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dimap.ufrn.br/%7Ejair/mes/slides/UMLVisaoGeral.pdf"&gt;Veja slides com uma visão geral da UML&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-2277981086402978061?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/2277981086402978061/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=2277981086402978061&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2277981086402978061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2277981086402978061'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/06/modelos-de-software.html' title='Modelos de Software'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-4779176129275399145</id><published>2007-05-27T21:02:00.001-03:00</published><updated>2008-03-06T21:14:07.668-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requisitos'/><category scheme='http://www.blogger.com/atom/ns#' term='cenarios'/><title type='text'>Usando cenários para descobrir requisitos</title><content type='html'>Os cenários consistem de uma coleção de narrativas de situações no domínio que favorecem o levantamento de informações, a identificação de problemas e a antecipação das soluções. Cenários são uma maneira excelente de representar, para clientes e usuários, os problemas atuais e as possibilidades que podem surgir.&lt;br /&gt;&lt;br /&gt;Os cenários têm como foco as atividades que as pessoas realizam nas organizações possibilitando uma perspectiva mais ampla dos problemas atuais onde o sistema será inserido, explicando porque ele é necessário.&lt;br /&gt;&lt;br /&gt;Não é objetivo dos cenários oferecer uma descrição precisa, mas provocar discussões e estimular novos questionamentos. Eles permitem também documentar o levantamento de informações a respeito dos problemas atuais, possíveis eventos, oportunidades de ações e riscos.&lt;br /&gt;&lt;br /&gt;Por sua simplicidade, cenários são um meio de representação de fácil compreensão para os clientes e usuários envolvidos (muitas vezes de formação bastante heterogênea) que podem avaliar, criticar e fazer sugestões, proporcionando a reorganização de componentes e tarefas do domínio. Cenários oferecem um "meio-intermediário" entre a realidade e os modelos possibilitando que clientes, usuários e desenvolvedores participem do levantamento das informações e especificação dos requisitos. Em resumo, os cenários permitem compreensão dos problemas atuais pelos analistas e antecipação da situação futura pelo clientes e desenvolvedores.&lt;br /&gt;&lt;br /&gt;Antes de descrever os cenários, os analistas devem entrevistar clientes para entender os problemas e requisitos iniciais. A entrevista com usuários permite que cada um descreva as suas tarefas e os problemas associados a cada uma delas. A observação direta in loco é fundamental para que os analistas possam descrever a situação de uso como ela realmente vem ocorrendo na prática.&lt;br /&gt;&lt;br /&gt;Após a elaboração dos cenários, clientes, usuários e analistas podem participar de reuniões conjuntas para que possam discutir cada um destes cenários. Eles podem ser afixados em quadros na parede onde os participantes possa analisá-los e fazer comentários, possivelmente afixando pequenos pedaços de papel a cada uma das cenas.&lt;br /&gt;&lt;br /&gt;Uma técnica que está bastante relacionada com cenários, por permitir descrever situações de uso, é o &lt;span style="font-style: italic;"&gt;storyboarding&lt;/span&gt;. Essa técnica envolve a descrição através de quadros com imagens que ilustram as situações do domínio. Cada quadro deve apresentar a cena que descreve a situação, os atores e as ações que cada um deve desempenhar. Abaixo de cada quadro devem estar descritas as ações que os atores desempenham. Os &lt;span style="font-style: italic;"&gt;storyboards&lt;/span&gt; são bastante utilizados em cinemas como forma de comunicação entre roteiristas, diretores, atores e técnicos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exemplos de cenários&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como exemplo vamos considerar o domínio de uma locadora de fitas de vídeo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cena 1: Cliente procura uma fita com uma certa atriz &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Agentes&lt;/span&gt;: Cliente, Atendente, Balconista&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ações&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Cliente entra na loja e dirige-se até a atendente.&lt;br /&gt;Cliente: - Eu gostaria de alugar um filme com a atriz que ganhou o oscar este ano.&lt;br /&gt;Atendente: - Algum específico?&lt;br /&gt;Cliente: - Não, mas que não seja policial ou ação.&lt;br /&gt;Atendente: Você sabe o nome dela?&lt;br /&gt;Cliente: Não.&lt;br /&gt;A atendente pergunta à balconista.&lt;br /&gt;Atendente: - Você sabe o nome da atriz que ganhou o Oscar 99?&lt;br /&gt;Balconista: - Ih. É um nome bem complicado. Só sei que começa com G e o sobrenome é algo parecido com Paltrow.&lt;br /&gt;Cliente: É isto mesmo.&lt;br /&gt;A atendente então procura no fichário de atrizes as que começam com G. Não encontra nenhum nome parecido com o que a balconista falou. Ela então lembra-se de consultar uma revista especializada com os ganhadores do Oscar 99 e lá descobre o nome correto da atriz. Entretanto, não existe realmente ficha alguma com os filmes estrelados por esta atriz. O fichário está desatualizado.&lt;br /&gt;A atendente procura nas estantes alguns filmes e lembra-se de dois: O Crime Perfeito e Seven e mostra-os ao cliente. O cliente recusa-se dizendo que não gosta do gênero destes filmes e pergunta pelo filme vencedor do Oscar.&lt;br /&gt;A atendente responde: - Shakespeare Apaixonado? Ainda não saiu em vídeo.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cena 2: O cliente procura por filmes de um certo gênero &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Agentes&lt;/span&gt;: Cliente, Atendente, Balconista&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ações&lt;/span&gt;:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Cliente: - Eu gostaria de comprar um filme de ação.&lt;br /&gt;Atendente: - Nós apenas alugamos.&lt;br /&gt;Cliente: - Tudo bem. Então, por favor, me dê algumas dicas de filmes de ação.&lt;br /&gt;Atendente: Com algum ator especial.&lt;br /&gt;Cliente: Pode ser com Chuck Norris, Van Dame, Statellone, Charles Bronson&lt;br /&gt;Atendente: Temos estes aqui.&lt;br /&gt;A atendente apresenta dez filmes. O cliente escolhe cinco e fica em dúvida se já assistiu outros três. Ele também pergunta à atendente se os outros dois filmes são bons. Após conversar durante alguns minutos com a atendente que entende muito do gênero, decide ficar com seis fitas. A atendente encaminha o cliente à balconista para calcular o valor da locação e o prazo de devolução. Após consultar as tabelas de preços e prazos, a balconista apresenta três planos de pagamento.&lt;br /&gt;Balconista: - Se você devolver em um dia, paga apenas R$ 6,00. Se devolver em seis dias paga R$ 12,00 e se devolver em uma semana paga R$ 15,00. Após este prazo paga mais R$ 2,00 por fita, por dia.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cena 3: Cliente procura por filme usando o sistema de consulta &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Agentes&lt;/span&gt;: Cliente e Sistema de Consulta&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ações&lt;/span&gt;:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;João gostaria de assistir a um filme de guerra. Ele vai a uma locadora de fitas e, chegando lá, utiliza um sistema de consulta. Ele não lembra o título nem o diretor, mas sabe que se passava na guerra do Vietnã e lembra bastante da trilha sonora. Utilizando o sistema ele solicita as opções de filmes de guerra. Os sistema oferece a ele as possibilidades de escolher os filmes por local da guerra ou por época. João escolhe a sua opção (guerra) e obtem uma lista com dezenas de filmes sobre o vietnam. Ele pode organizar esta lista, por diretor, atores e título. Na tela do sistema aparecem a ilustração com o cartaz de divulgação do filme  e uma opção para ele visualizar o trailler. O sistema, entretanto, não possibilita ele ouvir a trilha sonora.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Após analisar algumas opções ele finalmente encontra o filme desejado, mas uma informação na tela do sistema indica que o filme está alugado. João quer saber quando o filme será devolvido, mas esta informação não consta no sistema. Ele entretanto pode reservar e o sistema enviará para ele um e-mail avisando quando o filme estiver disponível. Ele sai da loja pensando "Que tempo perdido. Seria melhor que eu pudesse consultar o sistema de casa".&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-4779176129275399145?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/4779176129275399145/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=4779176129275399145&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/4779176129275399145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/4779176129275399145'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/05/usando-cenrios-para-descobrir.html' title='Usando cenários para descobrir requisitos'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-164137128719881365</id><published>2007-05-18T18:17:00.001-03:00</published><updated>2008-03-06T21:11:47.930-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requisitos de software'/><category scheme='http://www.blogger.com/atom/ns#' term='requisitos'/><title type='text'>Engenharia de Requisitos</title><content type='html'>&lt;p class="MsoNormal"&gt;Os diversos relacionamento e restrições que os requisitos exercem uns sobre os outros são muito difíceis de ser controlados e gerenciados. Principalmente se considerarmos que algumas decisões de design que afetam um ou mais requisitos só serão tomadas mais adiante do desenvolvimento. Por este motivo, os requisitos precisam ser gerenciados durante todo o desenvolvimento. Um exemplo simples é a decisão de requisitos de segurança mais restritos que podem ir de encontro ao requisito de melhor desempenho. &lt;span style=""&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;A importância e complexidade de todas as atividades relacionadas aos requisitos levaram, no início dos anos 90, ao surgimento da &lt;b&gt;Engenharia de Requisitos.&lt;/b&gt; O objetivo desta denominação é ressaltar que o processo de definir os requisitos de software é uma atividade extremamente importante e independente das outras atividades da engenharia de software. Ela requer fundamentação e processos próprios, e que devem ser planejados e gerenciados ao longo de todo o ciclo de vida.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Os objetivos da Engenharia de Requisitos podem ser categorizados em três grupos principais [Zave]: &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Investigação de objetivos,      funções e restrições de uma aplicação de software&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;ul type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;Ultrapassar as barreiras       de comunicação&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Gerar estratégias       para converter objetivos vagos em propriedades ou restrições específicas&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Compreender       prioridades e graus de satisfação&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Associar requisitos       com os vários agentes do domínio&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Estimar custos,       riscos e cronogramas&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Assegurar completude&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;Especificação do software&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;ul type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;Integrar       representações e visões múltiplas&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Avaliar estratégias       de soluções alternativas que satisfaçam os requisitos&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Obter uma       especificação completa, consistente e não ambígua&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Validar a       especificação - verificar que ela satisfaz aos requisitos&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Obter especificações       que sejam apropriadas para as atividades de design e implementação&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;Gerenciamento&lt;b&gt; &lt;/b&gt;da      evolução e das famílias do software&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;ul type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;Reutilização de       requisitos durante o processo de evolução&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Reutilização de       requisitos no desenvolvimento de software similares&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Reconstrução de       requisitos&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;  &lt;p&gt;A engenharia de requisitos é inerentemente abrangente, interdisciplinar e aberta. Ela lida com a descrição de observações do mundo real através de notações apropriadas. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Os benefícios da Engenharia de Requisitos são: &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Concordância entre      desenvolvedores, clientes e usuário sobre o trabalho a ser feito e quais      os critérios de aceitação do sistema.&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Uma base precisa para a      estimativa dos recursos (custo, pessoal, prazos, ferramentas e      equipamentos)&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Melhoria na usabilidade,      manutenibilidade e outras qualidades do sistema.&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Atingir os objetivos com o      mínimo de desperdício&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;Uma boa especificação de requisitos deve ser: &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Clara e não-ambígua&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Completa&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Correta&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Compreensível&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Consistente&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Concisa&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Confiável&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;(Veja mais em &lt;a href="http://www.sei.cmu.edu/interactive/Features/1999/March/Background/Background.mar99.htm"&gt;Dorfman, Merlin - Requirements Engineering&lt;/a&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;h3&gt;Técnicas de levantamento de requisitos&lt;o:p&gt;&lt;/o:p&gt;&lt;/h3&gt;  &lt;p class="MsoNormal"&gt;Um dos objetivos da Engenharia de Requisitos é ultrapassar barreiras de comunicação entre os clientes e usuários e os analistas para que os requisitos possam capturados e modelados corretamente.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Dentre as técnicas mais importantes para a comunicação podemos citar três: &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;Entrevistas&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;Observação &lt;i&gt;in loco&lt;/i&gt;&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;Encontros&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;Estas três técnicas são complementares e podem todas ser usadas numa mesma análise de requisitos. A &lt;b&gt;entrevista&lt;/b&gt; é normalmente a primeira técnica utilizada. Analistas entrevistam clientes para definir os objetivos gerais e restrições que o software deverá ter. A entrevista deve ser feita de forma objetiva visando obter o máximo de informações do cliente. Diversas seções de entrevistas podem ser marcadas. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Na &lt;b&gt;observação &lt;i&gt;in loco&lt;/i&gt;&lt;/b&gt; os analistas devem estar inseridos na rotina de trabalho da organização tentando entender e descrever as principais atividades que são realizadas. Na observação devem ser identificadas quais as atividades podem ser automatizadas, quem são os potenciais usuários, quais tarefas eles querem realizar com a ajuda do novo sistema, etc. A observação deve ser complementada com entrevistas específicas com os futuros usuários. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Os &lt;b&gt;encontros&lt;/b&gt; são reuniões envolvendo analistas, clientes e usuários que têm por objetivo exclusivamente realizar o levantamento de informações, a descrição dos problemas atuais e indicar metas futuras e requisitos do sistema. Os encontros devem ser realizados em um local neutro (fora da organização), coordenados por um moderador que também não deve pertencer ao grupo dos envolvidos (stakeholders) e normalmente duram de 1 a 3 dias. Nos encontros as informações que vão sendo levantadas vão sendo afixadas em painéis na sala de encontro para que possam ser analisadas e validadas pelos clientes e usuários. Ao final do encontro os analistas devem elaborar um relatório descrevendo os requisitos analisados. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;h3&gt;Modelos de documentos de especificação de requisitos&lt;o:p&gt;&lt;/o:p&gt;&lt;/h3&gt;  &lt;p class="MsoNormal"&gt;O resultado final da análise e especificação de requisitos e das outras atividades da fase de definção deve ser apresentado aos clientes para que eles possam validá-lo. Este documento oferece a concordância entre clientes, analistas e desenvolvedores sobre o que deve ser desenvolvido. É utilizando este documento que as atividades da fase de desenvolvimento (design e programação) serão validadas. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Cada desenvolvedor utiliza um modelo específico para elaborar este documento. A sua estrutura muitas vezes depende do método que está sendo utilizado. Em linhas gerais este modelo deve ser basicamente textual, utilizando o mínimo de termos técnicos, e ilustrados como modelos gráficos que demonstrem mais claramente a visão que os analistas tiveram dos problemas e dos requisitos para o futuro sistema. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Vamos apresentar, a seguir, dois modelos de documentos encontrados na literatura. Estes modelos descrevem não apenas a especificação dos requisitos, mas os resultados do estudo de viabilidade e o processo de desenvolvimento. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/index.html#biblio"&gt;Pressman&lt;/a&gt; apresenta o seguinte documento de especificação de requisitos de software: &lt;/p&gt;  &lt;p&gt;&lt;br /&gt;I. Introdução &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;1. Referências do Sistema&lt;br /&gt;2. Descrição Geral&lt;br /&gt;3. Restrições de projeto do software&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;II. Descrição da Informação &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;1. Representação do fluxo de informação &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 72pt;"&gt;a. Fluxo de Dados&lt;br /&gt;b. Fluxo de Controle&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;2. Representação do conteúdo de informação&lt;br /&gt;3. Descrição da interface com o sistema&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;III Descrição Funcional &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;1. Divisão funcional em partições&lt;br /&gt;2. Descrição funcional &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 72pt;"&gt;a. Narativas&lt;br /&gt;b. Restrições/limitações&lt;br /&gt;c. Exigências de desempenho&lt;br /&gt;d. Restrições de projeto&lt;br /&gt;e. Diagramas de apoio&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;3. Descrição do controle &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 72pt;"&gt;a. Especificação do controle&lt;br /&gt;b. Restrições de projeto&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;IV. Descrição Comportamental &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;1. Estados do Sistema&lt;br /&gt;2. Eventos e ações&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;V. Critérios de Validação &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;1. Limites de desempenho&lt;br /&gt;2. Classes de testes&lt;br /&gt;3. Reação esperada do software&lt;br /&gt;4. Considerações especiais&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;VI. Bibliografia&lt;br /&gt;VII Apêndice &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Uma proposta alternativa é a de &lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/index.html#biblio"&gt;Farley&lt;/a&gt;. De acordo com ele, um documento de especificação de requisitos deve possui as seguintes seções: &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Visão geral do produto e      Sumário&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Ambientes de      desenvolvimento, operação e manutenção&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Interfaces Externas e Fluxo      de Dados&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Requisitos Funcionais&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Requisitos de Desempenho&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Tratamento de Exceções&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Prioridades de Implementação&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Antecipação de mudanças e      extensões&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Dicas e diretrizes de      Design&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Critérios de aceitação&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Índice Remissivo&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Glossário&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Referências&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sei.cmu.edu/interactive/Features/1999/March/Background/Background.mar99.htm"&gt;Dorfman, Merlin - Requirements Engineering&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Zave, Pamela - Classification of Research Efforts in         Requirements Engineering - &lt;a href="http://www.acm.org/dl/"&gt;ACM&lt;/a&gt; Computing Surveys,         vol. 29, no 4, 1997.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-164137128719881365?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/164137128719881365/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=164137128719881365&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/164137128719881365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/164137128719881365'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/05/engenharia-de-requisitos.html' title='Engenharia de Requisitos'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-7774956430247439503</id><published>2007-05-15T10:20:00.000-03:00</published><updated>2007-05-15T13:50:58.129-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requisitos de software'/><category scheme='http://www.blogger.com/atom/ns#' term='requisitos'/><category scheme='http://www.blogger.com/atom/ns#' term='especificação'/><title type='text'>Requisitos de Software</title><content type='html'>Vimos que o software é parte de um sistema computacional mais abrangente e que a Análise de Sistemas é a atividade de identificar os problemas do domínio, apresentar alternativas de soluções e o estudo da viabilidade de cada uma delas. Uma vez que se tenha feito a análise do sistema computacional, e delimitado o escopo do software, os requisitos do software devem ser definidos e especificados.&lt;br /&gt;&lt;br /&gt;O objetivo da definição dos requisitos é especificar o que o sistema deverá fazer e determinar os critérios de validação que serão utilizados para  que se possa avaliar se o sistema cumpre o que foi definido.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;O que são requisitos?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Requisitos são objetivos ou restrições estabelecidas por clientes e usuários que definem as suas diversas propriedades do sistema. Os requisitos  de software são, obviamente, aqueles dentre os requisitos de sistema que dizem respeito a propriedades do software.&lt;br /&gt;&lt;br /&gt;Um conjunto de requisitos pode ser definido como uma condição ou capacidade necessária que o software deve possuir (1) para que o usuário possa resolver um problema ou atingir um objetivo ou (2) para atender as necessidades ou restrições da organização ou dos outros componentes do sistema.&lt;br /&gt;&lt;br /&gt;Tradicionalmente, os requisitos de software são separados em requisitos funcionais e não-funcionais. Os requisitos funcionais são a descrição das diversas funções que clientes e usuários querem ou precisam que o software ofereça. Eles definem a funcionalidade desejada do software. O termo função é usado no sentido genérico de operação que pode ser realizada pelo sistema, seja através comandos dos usuários ou seja pela ocorrência de eventos internos ou externos ao sistema.&lt;br /&gt;&lt;br /&gt;São exemplos de requisitos funcionais:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"o software deve possibilitar o cálculo dos gastos diários, semanais, mensais e anuais com pessoal".&lt;/li&gt;&lt;li&gt;"o software deve emitir relatórios de compras a cada quinze dias"&lt;/li&gt;&lt;li&gt;"os usuários devem poder obter o número de aprovações, reprovações e trancamentos em todas as disciplinas por um determinado período de tempo.&lt;/li&gt;&lt;/ul&gt;A especificação de um requisito funcional deve determinar o que se espera que o software faça, sem a preocupação de como ele faz. É importante diferenciar a atividade de especificar requisitos da atividade de especificação que ocorre durante o design do software. No design do software deve-se tomar a decisão de quais a funções o sistema efetivamente terá para satisfazer àquilo que os usuários querem.&lt;br /&gt;&lt;br /&gt;Requisitos não-funcionais são as qualidades globais de um software, como manutenibilidade, usabilidade, desempenho, custos e várias outras. Normalmente estes requisitos são descritos de maneira informal, de maneira controversa (por exemplo, o gerente quer segurança mas os usuários querem facilidade de uso) e são difíceis de validar.&lt;br /&gt;&lt;br /&gt;São exemplos de requisitos não-funcionais:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"a base de dados deve ser protegida para acesso apenas de usuários autorizados".&lt;/li&gt;&lt;li&gt;"o tempo de resposta do sistema não deve ultrapassar 30 segundo".&lt;/li&gt;&lt;li&gt;"o software deve ser operacionalizado no sistema Linux"&lt;/li&gt;&lt;li&gt;"o tempo de desenvolvimento não deve ultrapassar seis meses".&lt;/li&gt;&lt;/ul&gt;A necessidade de se estabelecer os requisitos de forma precisa é crítica na medida que o tamanho e a complexidade do software aumentam. Além disso, os requisitos exercem influência uns sobre os outros o que determina uma maior dificuldade no processo. Por exemplo, o requisito de que o software deve ter grande portabilidade (por exemplo, ser implementado em Java) pode implicar em que o requisito desempenho não seja satisfeito (programas em Java são, em geral, mais lentos). Devido à esta complexidade, faz-se necessário que as atividades associadas aos requisitos sejam gerenciadas durante todo o ciclo de vida do sistema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Análise e especificação de requisitos de software&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A análise e a especificação de requisitos de software são atividades para determinar os objetivos de um software e as restrições associadas a ele, bem como elaborar a especificação precisa do software.&lt;br /&gt;&lt;br /&gt;Estas atividades devem ser vistas como parte da análise de sistemas. Normalmente, elas são iniciadas juntamente com a análise do sistema, podendo se estender após a elaboração do documento de especificação do sistema, quando serão refinados os requisitos do software.&lt;br /&gt;&lt;br /&gt;Análise e especificação são atividades inter-dependentes e devem ser realizadas conjuntamente. A análise é o processo de observação, classificação e modelagem dos elementos do domínio. Deve-se identificar as pessoas, as atividades, as informações do domínio para que se possa decidir o que fará parte do sistema. Pessoas e as atividades que não serão informatizadas deverão ser consideradas entidades externas ao software.&lt;br /&gt;&lt;br /&gt;A especificação é a descrição sistemática e abstrata do que o software deve fazer, a partir daquilo que foi analisado. Ela apresenta a solução de como os problemas levantados na análise serão resolvidos pelo software do sistema computacional. Visa descrever de maneira sistemática quais as propriedades funcionais são necessárias para resolver o problema do domínio. A especificação é também a forma de comunicação sistemática com os arquitetos, programadores e testadores do software.&lt;br /&gt;&lt;br /&gt;Veja &lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/Requisitos.pdf"&gt;Slides&lt;/a&gt; de aula em PDF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-7774956430247439503?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/7774956430247439503/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=7774956430247439503&amp;isPopup=true' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/7774956430247439503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/7774956430247439503'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/05/requisitos-de-software.html' title='Requisitos de Software'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-1697231112202399141</id><published>2007-05-08T11:58:00.001-03:00</published><updated>2008-12-09T22:27:04.664-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planejamento'/><title type='text'>Planejamento: visão geral resumida</title><content type='html'>Agora que já conhecemos o processo de estimativas e algumas das métricas utilizadas, vejamos um exemplo de como podemos realizar o planejamento.&lt;br /&gt;&lt;br /&gt;A figura a seguir mostra uma visão geral do planejamento.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HBylqWX7mzs/RkCSHBISsQI/AAAAAAAAAJI/aEg5vuzcpDA/s1600-h/Planejamento.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_HBylqWX7mzs/RkCSHBISsQI/AAAAAAAAAJI/aEg5vuzcpDA/s320/Planejamento.png" alt="" id="BLOGGER_PHOTO_ID_5062206630424391938" border="0" /&gt;&lt;/a&gt;Com base no modelo de processo de software podemos definir as atividades que precisam ser realizadas. Estas atividades devem ser organizadas em uma estrutura de divisão do trabalho (WBS - Work Breakdown Structure).&lt;br /&gt;&lt;br /&gt;Para cada uma das atividades estão definidos os artefatos resultantes e podem ser realizadas estimativas de tamanho destes resultados. Por exemplo, o número de linas de código fonte de uma atividade de codificação ou o número de elementos de diagrama em uma atividade de modelagem.&lt;br /&gt;&lt;br /&gt;Com as atividades definidas, pode-se montar a &lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/Equipes.pdf"&gt;equipe de software&lt;/a&gt;. Dados históricos podem indicar as estimativas de produtividade dos membros desta equipe nas atividades definidas no WBS.&lt;br /&gt;&lt;br /&gt;As estimativas de tamanho do software podem ser utilizadas para o cálculo das estimativas de esforço para cada atividade. Este valor permite que a alocação pessoa-atividade seja mais eficiente. Por exemplo, para tarefas com maior esforço, pode-se dividir as tarefas entre vários membros da equipe de forma a encurtar o prazo de conclusão da atividade (veja mais informações no post anterior).&lt;br /&gt;&lt;br /&gt;Com as estimativas de esforço e a alocação pessoa-atividade, podemos elaborar o cronograma e o orçamento do projeto.&lt;br /&gt;&lt;br /&gt;O cronograma deve incluir a definição dos marcos, a análise do caminho crítico através de técnicas PERT/CPM  e o diagrama de Gantt.&lt;br /&gt;&lt;br /&gt;Os gastos com pessoal são fundamentais para o orçamento do projeto. Assim, apenas com a definição do cronograma é que se pode concluir o orçamento. Além dos custos de RH, não se pode deixar de incluir os custos com equipamentos, ferramentas, infra-estrutura e outros. Veja mais sobre &lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/Custos.pdf"&gt;custos&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-1697231112202399141?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/1697231112202399141/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=1697231112202399141&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/1697231112202399141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/1697231112202399141'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/05/planejamento-viso-geral-resumida.html' title='Planejamento: visão geral resumida'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HBylqWX7mzs/RkCSHBISsQI/AAAAAAAAAJI/aEg5vuzcpDA/s72-c/Planejamento.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-2322507643344586351</id><published>2007-04-28T21:39:00.000-03:00</published><updated>2007-05-15T13:53:31.766-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pontos por função'/><category scheme='http://www.blogger.com/atom/ns#' term='métricas de software'/><category scheme='http://www.blogger.com/atom/ns#' term='pessoa-mês'/><category scheme='http://www.blogger.com/atom/ns#' term='linhas de código fonte'/><title type='text'>Métricas</title><content type='html'>&lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Várias métricas podem ser utilizadas na elaboração de estimativas. As mais utilizadas são: o tamanho do software, a produtividade dos desenvolvedores, a taxa de defeitos e o esforço humano.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;&lt;b style=""&gt;Linhas de código fonte&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Uma das métricas mais comuns para software é o número de linha de código fonte (LOC – lines-of-code, em inglês). As linhas de código são, de fato, um resultado imediato da atividade de desenvolvimento do produto final. No entanto, ela não considera diretamente, diversas outras atividades envolvidas, como requisitos, arquitetura, testes e outras. Alguns autores consideram que estas atividades estão implicitamente consideradas, ou seja, para se produzir um certo número de LOC, livre de defeitos, utilizando um certo processo de software, é necessário especificar os requisitos, projetar e modelar a arquitetura e testar o código, por exemplo.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Linhas de código têm a vantagem de ser uma métrica bastante objetiva. Basta analisar o código e se tem o valor do que foi produzido. Estimar LOC é prever quanto precisará ser feito para se obter o produto final.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;O tamanho de um software em linhas de código varia de uma linguagem de programação para outra. Isto significa que as estimativas devem considerar dados de projetos similares apenas naquela mesma linguagem. Ou seja, se existe uma métrica de produtividade com uma certa linguagem, não se pode aplicar a mesma métrica numa outra linguagem. O mesmo vale para a funcionalidade. Se numa certa linguagem, para implementar uma certa função, são necessárias 200 LOC, numa outra linguagem a funcionalidade pode ser implementada com apenas 100 LOC. Por fim, pode-se argumentar que programadores mais eficientes conseguem implementar uma mesma funcionalidade, numa mesma linguagem utilizando menos LOC que outro programador. No entanto, em um processo de software bem controlado, a exigência de padrões e normas de programação limita esta variação.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;&lt;b style=""&gt;Ponto de função&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Análise de pontos de função é um método para identificar uma métrica que é independente da linguagem de programação utiliza e depende apenas da funcionalidade do software. Os pontos-de-função (FP) são dependentes de fatores relacionados aos serviços que o software precisa realizar. Eles são calculados com base em 5 valores que precisam ser atribuídos:&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Número de entradas externas (EI)&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Número de saídas externas (EO)&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Número de consultas externas (EQ)&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Número de tabelas lógicas internas (ILF)&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Número de interfaces externas (EIF)&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Uma vez que todos os valores tenham sido atribuídos, eles precisam ser aplicados numa fórmula empírica para se determinar o número de pontos-de-função. Estes valores são multiplicadores que variam de acordo com a complexidade, sendo classificada em baixa, média e alta. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;A tabela a seguir mostra o cálculo do número de pontos-de-função não ajustados (UFP).&lt;/p&gt;  &lt;table class="MsoNormalTable" style="width: 100%;" border="1" cellpadding="0" cellspacing="1" width="100%"&gt;  &lt;tbody&gt;&lt;tr style=""&gt;   &lt;td rowspan="2" style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size:7;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td colspan="4" style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size:7;"&gt;Complexidade&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Baixa&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Média&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Alta&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Total&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Entradas externas (EI)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 3=EI1&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 4=EI2&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 6=EI3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p&gt;&lt;span style="font-size:7;"&gt;EI1+EI2+EI3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Saídas externas (EO)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 4=EO1&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 5=EO2&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 7=EO3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;EO1+EO2+EO3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Consultas externas (EQ)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 3=EQ1&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 4=EQ2&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 6=EQ3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;EQ1+EQ2+EQ3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Arquivos Lógicos Internos (ILF)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 7=ILF1&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 10=ILF2&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 15=ILF3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;ILF1+ILF2+ILF3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;Interfaces externas (EIF)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 5=EIF1&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 7=EIF2&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;__* 10=EIF3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;EIF1+EIF2+EIF3&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size:7;"&gt;Total UAF&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td colspan="4" style="padding: 1.5pt;"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size:7;"&gt;(EI1+EI2+EI3) +   (EO1+EO2+EO3) + (EQ1+EQ2+EQ3) + (ILF1+ILF2+ILF3) + (EIF1+EIF2+EIF3)&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;O valor final de pontos de função precisa ser ajustado de acordo com 14 características gerais de sistemas, com valores que variam numa escala de 0 a 5 graus, com um menor indicando “sem influência” e o maior indicando “forte influência”. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;As 14 características são:&lt;/p&gt;  &lt;ol style="margin-top: 0cm;" start="1" type="1"&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Comunicação de dados&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Funções distribuídas&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Objetivos de desempenho&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Configuração utilizada&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Taxa de transação&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Entrada de dados on-line&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Eficiência do usuário final&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Atualização on-line&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Processamento complexo&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Reusabilidade&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Facilidade de instalação&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Facilidade de operação&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Múltiplos locais&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Facilidade de mudança&lt;/li&gt;&lt;/ol&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;A soma dos valores de 0 a 5, atribuídos a cada uma das características, é utilizada na fórmula do valor ajustado (VAF), descrita abaixo.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;O valor de ajuste VAF é dado pela fórmula abaixo:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt; font-style: italic;"&gt;VAF = 0.65 + (soma dos valores)/100&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;O valor final de pontos de função é dado pela fórmula&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt; font-style: italic;"&gt;FP = UAF + VAF&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Estimar estes valores para um sistema de informação não é difícil. No entanto, para sistemas de controle, sistemas multimídia, sistema embutidos e outros, não é fácil identificar os valores para estas variáveis.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;&lt;b style=""&gt;Esforço Humano&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Estimar o esforço humano é fundamental para o planejamento. O esforço humano define uma métrica que estabelece a relação entre o tempo necessário para realizar uma atividade e o número de pessoas envolvidas. Isto porque a duração da atividade pode variar de acordo com o número de pessoas envolvidas com ela. Para isto é necessário que a tarefa possa ser dividida e compartilhada entre os desenvolvedores.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Por exemplo, um trabalhador pode colher um laranjal em 10 dias. Se 10 trabalhadores forem utilizados, em apenas 1 dia o laranjal será colhido. No entanto, nem sempre é possível compartilhar uma tarefa, pois embora uma mulher possa gerar 1 filho em 9 meses, 9 mulheres não podem gerar 1 filho em 1 mês!&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Estimar o esforço é indicar a quantidade de pessoas necessária para realizar uma atividade num certo período de tempo. As unidades utilizadas são: pessoa-mês, pessoa-hora, homem-mês, ou qualquer combinação entre ser humano e unidade de tempo.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Para entender melhor, o esforço reflete a relação inversa entre o número de trabalhadores e o tempo para realizar a atividade. Isto, no entanto, não pode deixar de levar em consideração fatores externos que limitam o aumento do número de trabalhadores. Quanto mais trabalhadores compartilhando uma tarefa, mais canais de comunicação são estabelecidos, mais compromissos são gerados, maior cooperação é necessária e maiores conflitos podem existir. Tudo isso pode limitar o aumento da produtividade global da equipe. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;No livro “&lt;span style="font-style: italic;"&gt;The Mythical Man-Month&lt;/span&gt;", um clássico da engenharia de software, Fred Brooks relata sua experiência no desenvolvimento do OS 360 da IBM e mostra que tentar cumprir prazos de projetos atrasados com o aumento do número de trabalhadores pode ter efeito contrário.&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Para saber mais:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;&lt;span style="" lang="EN-US"&gt;Brooks, Jr., F.P. The Mythical Man-Month: Essays on Software Engineering, 20th Anniversary Edition. &lt;/span&gt;Reading, MA: Addison-Wesley, 1995, 322 pages.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-2322507643344586351?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/2322507643344586351/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=2322507643344586351&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2322507643344586351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2322507643344586351'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/04/mtricas.html' title='Métricas'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-1853135667396490109</id><published>2007-04-28T21:31:00.002-03:00</published><updated>2009-03-27T16:49:55.223-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='estimativas software'/><title type='text'>Estimativas de Software</title><content type='html'>&lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;As estimativas do produto e do processo são a base para o planejamento do projeto de software. As estimativas fornecem dados que permite prever a quantidade de pessoas que serão necessárias, o tempo necessário e os custos do projeto. Não é possível elaborar cronograma e orçamento sem o uso de estimativas. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;É importante ressaltar que os diversos elementos do planejamento estão relacionados entre si. Por exemplo, um dos maiores impactos nos custos de um software são os recursos humanos. Normalmente, um desenvolvedor ganha um salário mensal tornado este custo diretamente proporcional ao tempo de desenvolvimento. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Para determinar o tempo de desenvolvimento é necessário estimar a duração das atividades do software. Estimativas da duração do software dependem do tamanho do software que é necessário produzir e da produtividade dos desenvolvedores. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Estimativas são realizadas com base em métricas. Métricas de tamanho, duração, produtividade e esforço estão entre as mais utilizadas. Para fazer as estimativas, pode optar por duas estratégias:&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Métricas com base no histórico da organização&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 6pt;"&gt;Métricas estatísticas de diferentes organizações&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;As métricas históricas funcionam bem quando a organização é estável e já possui informações colhidas em anos de experiência. Para isso, é fundamental que exista um processo de gerenciamento do processo de software cuidadoso e que todos os dados sejam obtidos para serem analisados e avaliados. Como isso, pode-se estimar como a equipe irá produzir ou qual será o tamanho do software a partir de casos anteriores semelhantes.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Neste caso, as estimativas podem ser realizadas por especialistas que atribuem valores com base em sua experiência de projetos anteriores. Neste caso, pode-se utilizar analogias com projetos anteriores e estimar quais seriam os valores para o novo projeto.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;A métricas estatísticas são elaboradas por empresas especializadas que obtêm dados de diversas organizações de desenvolvimento de software. Estes dados devem levar em consideração as diversas condições e características que causem impacto no desenvolvimento do software. Com base nestes valores, os especialistas elaboram tabelas, fórmulas e algoritmos que podem ser aplicadas no planejamento de um processo de software. Isto permite que as organizações de desenvolvimento possam elaborar o seu planejamento ajustando os valores às suas próprias condições.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Os métodos algorítmicos para a realização de estimativas oferecem uma opção mais independente e objetiva. Um exemplo desses métodos são as estimativas de esforço. Esses métodos estão centrados no tamanho do software e da produtividade da equipe:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt; font-style: italic;"&gt;Esforço = Produtividade*Tamanho^B*M&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Existem diversas variantes desta fórmula de maneira que se possa realizar ajustes de acordo com as características da organização e de outros fatores relacionados ao produto.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Um exemplo de modelo baseado nesta fórmula é o COCOMO (Modelo de custos construtivo). A versão inicial foi proposta em 1981, por Barry Boehm. Esta versão evoluiu para o COCOMO II que considera características dos software atuais. O COCOMO II permite associar multiplicadores que levam em consideração o nível (fase) do projeto e a sua complexidade.&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;&lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/EstimativasMetricas.pdf"&gt;Veja a apresentação powerpoint sobre este assunto&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;Para saber mais:&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 6pt;"&gt;&lt;a href="http://sunset.usc.edu/research/COCOMOII/cocomo_main.html"&gt;COCOMO II&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-1853135667396490109?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/1853135667396490109/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=1853135667396490109&amp;isPopup=true' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/1853135667396490109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/1853135667396490109'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/04/estimativas-de-software.html' title='Estimativas de Software'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-1594766913314038526</id><published>2007-04-28T01:32:00.001-03:00</published><updated>2008-03-06T21:12:59.712-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planejamento'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Planejamento e Gerenciamento de Projetos de Software</title><content type='html'>&lt;p class="MsoNormal"&gt;Quase todas as atividades que desempenhamos precisam ser planejadas e gerenciadas. Atividades de engenharia requerem um planejamento cuidadoso. Normalmente, os produtos são complexos, com muitas partes envolvidas, e as atividades são realizadas por um grupo muito grande de pessoas.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Na engenharia de software não é diferente. Um projeto de engenharia de software deve estar baseado em um planejamento para que se possa gerenciar adequadamente a sua realização.&lt;/p&gt;    &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Planejamento&lt;/p&gt;      &lt;p class="MsoNormal"&gt;Planejar é estimar quais as atividades deverão ser realizadas; quem deverá realizá-las; quando devem ser realizadas e finalizadas; e quanto elas deverão custar. Tudo isto requer a elaboração de estimativas em relação ao número e à dimensão dos artefatos, do número de pessoas necessárias, dos prazos e dos custos.&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Para isto, a atividade de planejamento deverá resultar:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;Na realização de estimativas&lt;/li&gt;&lt;li&gt;Na elaboração da estrutura de divisão do trabalho (WBS – Work Breakdown Structure)&lt;/li&gt;&lt;li&gt;Na definição da equipe e demais recursos&lt;/li&gt;&lt;li&gt;Na alocação de pessoa-atividade&lt;/li&gt;&lt;li&gt;Na elaboração do cronograma&lt;/li&gt;&lt;li&gt;Na elaboração do orçamento&lt;/li&gt;&lt;/ul&gt;              &lt;p class="MsoNormal"&gt;Além disso, a análise de riscos e as revisões periódicas do plano são fundamentais para garantir que ele seja cumprido.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;O planejamento está diretamente ligado ao processo de software. Conforme dissemos anteriormente, um processo de software é resultado do planejamento associado a um modelo de processo (método). O modelo de processo indica quais atividades devem ser realizadas e qual a dependência entre elas. Por exemplo, no modelo cascata, deve-se especificar os requisitos, desenhar a arquitetura, fazer o design detalhado, implementar as unidades, integrar as unidades e, finalmente, entregar o software. O planejamento deve indicar quem faz estas atividades, quanto tempo é necessário para eles, quando elas serão realizadas e quanto custará cada um delas.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;Sem um planejamento adequado, os desenvolvedores não saberão o que fazer e não terão datas para iniciar ou terminar o trabalho. Sem estimativas, o responsável pelo planejamento não terá como dimensionar o tamanho e a quantidade dos artefatos a serem produzidos e o esforço necessário para produzi-los. Por fim, sem um orçamento, não se terá noção quanto o software irá custar e se haverá recursos para o desenvolvimento.&lt;/p&gt;      &lt;p class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;Gerenciamento&lt;/span&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;      &lt;p class="MsoNormal"&gt;Gerenciar é fazer cumprir o que foi planejado. O papel do gerente de projetos de software é coordenar a equipe, controlar a produção dos artefatos, fazer cumprir prazos e custos, analisar métricas de produção.&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;O gerenciamento de software está diretamente ligado à garantia da qualidade do processo e do produto de software. O uso de métricas de qualidade, tanto do produto como do processo, são fundamentais para o gerenciamento. Com base em métricas, o gerente tem condições de avaliar se o planejamento está sendo cumprido ou não. Neste caso, as métricas podem apontar as causas dos problemas e permitir as revisões no planejamento.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Exemplos de métricas do produto utilizadas no planejamento são: tamanho do software em linha de código fonte; número de pontos-de-função; número de diagramas de arquitetura; números de defeitos; entre outras.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;Exemplos de métricas de processo utilizadas no planejamento são: o esforço; a produtividade; entre outras.&lt;/p&gt;      &lt;p class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;Plano de Projeto de Software&lt;/span&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;O resultado de um plano de projeto de software é um documento contendo a equipe, o WBS, a alocação pessoa-tarefa, a análise de riscos, o cronograma, o orçamento entre outros.&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;A estrutura de um plano de projeto de software, segundo Ian Sommerville (2004) é a seguinte.&lt;/p&gt;  &lt;ol style="margin-top: 0cm;" start="1" type="1"&gt;&lt;li class="MsoNormal" style=""&gt;Introdução&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Organização      de projeto&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Análise      de riscos&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Requisitos      necessários de hardware e software&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Estrutura      analítica de trabalho&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Cronograma      de projeto&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Mecanismos      de monitoramento e elaboração de relatórios&lt;/li&gt;&lt;/ol&gt;    &lt;p class="MsoNormal"&gt;Esta estrutura pode variar de acordo com as características do projeto.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Diversos outros documentos podem complementar informações importantes:&lt;/p&gt;    &lt;ul&gt;&lt;li&gt;Plano de qualidade – descreve os procedimentos de testes de qualidade que serão utilizados.&lt;/li&gt;&lt;li&gt;Plano de validação – descreve a abordagem, os recursos e o método utilizados pa validação.&lt;/li&gt;&lt;li&gt;Plano de manutenção – prevê requisitos, custos e esforço necessário para a manutenção.&lt;/li&gt;&lt;li&gt;Plano de desenvolvimento da equipe – descreve como as habilidades e a experiência serão desenvolvidas.&lt;/li&gt;&lt;/ul&gt; &lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/PlanejamentoGerenciamentoIntroducao.pdf"&gt;Veja mais em nosso slides&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referência&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wps.aw.com/br_sommer_engen_6/"&gt;Ian Sommerville - Engenharia de Software&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-1594766913314038526?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/1594766913314038526/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=1594766913314038526&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/1594766913314038526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/1594766913314038526'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/04/planejamento-e-gerenciamento-de.html' title='Planejamento e Gerenciamento de Projetos de Software'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-5561335663444827500</id><published>2007-03-11T12:00:00.000-03:00</published><updated>2007-03-11T12:06:52.865-03:00</updated><title type='text'>Por que o Windows Vista atrasou?</title><content type='html'>A empresa de desenvolvimento de software mais poderosa do mundo não conseguiu entregar o seu produto dentro do prazo previsto. O Windows Vista tinha entrega prevista para março de 2006, mas acabou sendo entregue 10 meses depois. Os principais motivos foram problemas com a sua arquitetura e gerência de software. Estes problemas vêm, há anos, sendo descritos na literatura da Engenharia de Software.&lt;br /&gt;&lt;br /&gt;O código do Vista cresceu para o espantoso número de aproximadamente 50 milhões de linhas de código fonte e sua arquitetura tornou-se um caótico “spaghetti”. Uma arquitetura spaguetti é aquela na qual o código torna-se tão dependente de outras partes que o acompanhamento do fluxo de controle possui tantas idas e vindas de uma parte para a outra que fica praticamente impossível entendê-lo. Além disso, qualquer pequeno ajuste em uma pequena parte do sistema é imprevisível e pode desestabilizar o código, levando-o a um comportamento defeituoso.&lt;br /&gt;&lt;br /&gt;Os problemas e causas do código spaguetti foram diagnosticados no final da década de 60 e durante os anos 70 diversas estratégias foram apontadas para evitá-lo. Dentre elas estão as técnicas de programação estruturada, o princípio da informação escondida e a modularização. Para solucionar o problema do código spaguetti, a Microsoft jogou fora o código trabalhado e voltar ao código de base do servidor do Windows 2000/XP que possuía bem menos defeitos. A equipe foi orientada a construir módulos a partir desta base.&lt;br /&gt;&lt;br /&gt;Outro fator fundamental foi que a equipe cresceu para a enorme quantidade de 4000 programadores e 4000 testadores. Este número cresceu devido a um fator condenado há vários anos na engenharia de software no clássico livro “The Mythical Man-Month” de Frederick Brooks, engenheiro de software da IBM, responsável pelo sistema operacional OS-360, na segunda metade da década de 60 (Brooks, 1975). Em seu livro de 1975, Fred Brooks aponta que quando uma empresa está com prazos apertados, o aumento no número de pessoas na equipe de desenvolvimento, o que teoricamente poderia reduzir os prazos de entrega, não necessariamente causa o aumento de produtividade. Quando o número de pessoas em uma equipe aumenta, os canais de comunicação aumentam de forma exponencial e a gerência do projeto torna-se extremamente complexa. Quanto mais gente, mais atrasos.&lt;br /&gt;&lt;br /&gt;A Microsoft tornou-se a mais poderosa indústria de software por uma boa estratégia política e de marketing – algumas das quais levou a empresa a responder a processos judiciais – e também pela produção de produtos de qualidade. Produtos como o Office são um sucesso pela forma como foram projetados e como o seu processo foi conduzido. A  Microsoft conduziu este processo numa estratégia conhecido como “sincronizar-e-estabilizar”(Cusumano, 1997).  Neste processo são definidos marcos a partir da divisão do produto em pequenas partes. As partes são entregues a times pequenos de jovens programadores, recém saídos das universidades, que trabalham no estilo “hacking” em salas que lembram alojamentos universitários, movidos a junk food (Coupland, 1995). No processo de sincronizar e estabilizar da Microsoft, builds (código compilado) são produzidos diariamente e em reuniões de sincronização são testados e corrigidos de forma a produzir versões estáveis. Esta estratégia, na década de 90, era bastante diferente daquelas conduzidas pela IBM nas quais milhares de engenheiros eram recrutados para o desenvolvimento de seus produtos de software. Na Microsoft, a equipe que desenvolveu o NT tinha algo em torno de 400 pessoas, na época a maior da empresa.&lt;br /&gt;&lt;br /&gt;No entanto, mesmo com o seu bem sucedido processo de software de “sincronizar e estabilizar”, a Microsoft teve bastante dificuldade de realizar sincronização diária com uma equipe de 8000 pessoas e consertar defeitos em um código mal arquitetado com 50 milhões de linhas de código.&lt;br /&gt;&lt;br /&gt;A versão beta do Windows Vista ficou pronta em agosto de 2005. Um ano e meio de foi reservado para testes e em janeiro de 2007 foi colocada à venda no mercado mundial. O projeto total levou 6 anos e consumiu 2 bilhões de dólares de investimento em programação e testes (Cusumano, 2006).&lt;br /&gt;&lt;br /&gt;O que ocorreu com o desenvolvimento do Vista mostra que mesmo as poderosas empresas ainda cometem erros básicos de engenharia de software. O Windows 95 tinha cerca de 11 milhões de linhas de código e foi construído por um time de 200 pessoas. O Windows 98 tinha cerca de 15 milhões de código e o Windows XP cresceu para 25 milhões, construídos por uma equipe de 2000 pessoas. Terá a próxima versão do sistema operacional da Microsoft a astronômica quantidade de 100 milhões de linhas de código fonte? A empresa será capaz de desenhar uma arquitetura para este código e de gerenciar um time com 16 mil pessoas?&lt;br /&gt;&lt;br /&gt;Referências&lt;br /&gt;&lt;br /&gt;Brooks, Jr., F.P. The Mythical Man-Month: Essays on Software Engineering, 20th Anniversary Edition. Reading, MA: Addison-Wesley, 1995, 322 pages.&lt;br /&gt;&lt;br /&gt;Brechner, Eric. "Journey of Enlightenment: The Evolution of Development at Microsoft" - ICSE’05 May 15–21, 2005, St. Louis, Missouri, USA.&lt;br /&gt;&lt;br /&gt;Coupland, D. Microserfs. HarperCollins, 1995.&lt;br /&gt;Cusumano, M &amp;amp; Selby, R. How Microsoft Builds Software - Communications of the ACM, jun1997, vol. 40, no. 6&lt;br /&gt;&lt;br /&gt;Cusumano, M. ""What road ahead for Microsoft and Windows? Communications of the ACM archive, Volume 49 , Issue 7 (July 2006)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-5561335663444827500?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/5561335663444827500/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=5561335663444827500&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/5561335663444827500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/5561335663444827500'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/03/por-que-o-windows-vista-atrasou.html' title='Por que o Windows Vista atrasou?'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-9043398024116522729</id><published>2007-03-11T11:54:00.000-03:00</published><updated>2007-03-11T12:10:06.465-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processo'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='programação extrema'/><title type='text'>Programação Extrema (XP)</title><content type='html'>O método &lt;span style="font-style: italic;"&gt;Programação eXtrema&lt;/span&gt; (XP, do inglês &lt;span style="font-style: italic;"&gt;eXtreming Programming&lt;/span&gt;) é uma proposta de desenvolvimento ágil e iterativa. O método XP propõe um processo leve, centrado no desenvolvimento iterativo e com a entrega constante de pequenas partes da funcionalidade do software. As partes devem ser incrementadas e requerem a melhoria constante do código (re-trabalho).&lt;br /&gt;&lt;br /&gt;A possibilidade de entrega rápida do código é um dos fatores de sucesso do XP. Isto no entanto, apenas pode ser feito com o envolvimento constante do cliente que se torna um membro ativo da equipe de desenvolvimento. Esta é uma das características importantes para o método funcionar bem. No entanto, nem sempre o cliente está disponível para a participação ativa.&lt;br /&gt;&lt;br /&gt;Uma das características importantes do XP é que não existe um processo de design tradicional com a elaboração de modelos da arquitetura do software. O sistema é concebido a partir de uma &lt;span style="font-style: italic;"&gt;metáfora &lt;/span&gt;e são descritos em &lt;span style="font-style: italic;"&gt;estórias do usuário&lt;/span&gt;. Uma metáfora é a transposição de uma conceitualização do mundo real para o sistema a ser desenvolvido. Por exemplo, os programas de correio eletrônico foram construídos utilizando os conceitos de mensagem, caixa de entrada e caixa de saída. Cada mensagem possui remetente, destinatário, assunto e cópias carbono (cc). Este modelo conceitual reflete a forma como correspondências são enviadas nos escritórios e pelo sistema de correio dos Estados Unidos. A metáfora passa a ser fundamental para a elaboração das estórias de usuários.&lt;br /&gt;&lt;br /&gt;O uso de cartões CRC (Classes, Responsabilidades e Colaborações) é recomendado de forma a permitir o design em equipe. Cartões CRC permitem a descrição dos conceitos identificados na metáfora na forma de classes. Responsabilidades são identificadas para cada classe. As colaborações determinam as interações entre classes. Os cartões permitem que o todo o time possa colaborar com o design.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Estórias de Usuários&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A elaboração de estórias de usuário é uma das atividades fundamentais no XP. As estórias de usuário descrevem cenários com situações de utilização que os envolvidos gostariam que o sistema em desenvolvimento viesse a oferecer. Elas deve devem ser escritas pelos próprios usuários. As estórias de usuário são semelhantes aos casos de uso da UML, mas não são a mesma coisa. A diferença é que elas não se limitam a descrever o processo de interação do usuário com o sistema.&lt;br /&gt;&lt;br /&gt;No XP, as estórias de usuário ocupam o lugar dos longos documentos de requisitos nos métodos tradicionais. Cada estória deve ser um texto escrito com aproximadamente 3 sentenças.&lt;br /&gt;&lt;br /&gt;As estórias de usuário são a base para a criação de estimativas de tempo que serão utilizadas nas reuniões de planejamento de entregas (releases). O plano de entregas direciona todo o planejamento do desenvolvimento e do plano de iterações para cada iteração individual. Cada estória deve levar de 2 a 3 semanas para ser implementada em uma iteração individual. Se levar mais do que isso, a estória precisa ser dividida em duas. Um número de 80 estórias aproximadamente é suficiente para definir um plano de entregas.&lt;br /&gt;&lt;br /&gt;As estórias de usuário são também a base para a elaboração dos testes de aceitação. Um ou mais testes de aceitação automatizados deve ser criados para verificar se o programa implementa a estória corretamente.&lt;br /&gt;&lt;br /&gt;O envolvimento do usuário, portanto, como autor das estórias, é fundamental para a elaboração do plano de entregas e dos testes de aceitação em cada iteração de desenvolvimento.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Práticas de programação&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O processo de programação tem como características a programação em pares e a propriedade coletiva do código.&lt;br /&gt;&lt;br /&gt;Na programação em pares, dois programadores ocupam um único computador. Embora, a princípio, isto possa ser visto como um desperdício de esforços, várias vantagens podem ser obtidas. Esta estratégia aumenta a qualidade do código e não altera o tempo de entrega, uma vez que haverá um ganho posterior nas etapas de retirada de erros (defeitos). Os dois programadores atuam de forma colaborativa. Enquanto o que está com o teclado e mouse está pensando diretamente na codificação (sintaxe, variáveis, fluxos de controle, etc.), o outro pode pensar estrategicamente em como o código irá interagir como outras partes do programa. Além disso, um atua com uma visão mais crítica corrigindo erros dos companheiros e pode pensar nas futuras mudanças e etapas posteriores. Isto permite que a tradicionalmente prática do codifica-e-conserta, criticada nas origens do desenvolvimento de software, possa ser realiza sem perda da qualidade do software.&lt;br /&gt;&lt;br /&gt;A propriedade coletiva do código é outra característica fundamental do método XP, com a rotatividade do código entre os programadores e reuniões freqüentes para estabilizar o código. A propriedade coletiva encoraja o time todo a contribuir com novas idéias. Qualquer membro do time pode adicionar funcionalidade, corrigir erros ou re-fabricar o código. Não existe a figura do arquiteto chefe. Todos são responsáveis pelo código inteiro. Não existe alguém para aprovar as mudanças. Reuniões freqüentes devem ser definidas como parte do processo iterativo de programação. Estas reuniões devem ser curtas e são realizadas com todos de pé.&lt;br /&gt;&lt;br /&gt;A prática do codifica-e-conserta também requer um processo constante de teste de unidade e integração. Para isto funcionar bem, os desenvolvedores devem trabalhar com uma ferramenta de testes automático e um repositório coletivo do código fonte. Os desenvolvedores devem criar testes de unidades e liberar o código apenas quando estiver 100% testado. Uma vez no repositório, qualquer um pode fazer alterações e adicionar novas funcionalidades. Uma ferramenta de controle de versões é fundamental.&lt;br /&gt;&lt;br /&gt;O re-trabalho ou re-fabricação é uma atividade fundamental e necessária para o XP funcionar. Mesmo que o código esteja 100% testado, para viabilizar reuso, ele precisa ser revisto para remover redundâncias, retirar funcionalidades desnecessárias e modificar arquitetura obsoletas. O re-trabalho do código ao longo de todo o ciclo de vida reduz o tempo total de entrega do código e aumenta a qualidade do software produzido.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Regras e Práticas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Planejando&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Estórias do usuário&lt;/li&gt;&lt;li&gt;Planejando liberações (releases) e pequenas liberações&lt;/li&gt;&lt;li&gt;Dividir projetos em iterações (ciclos)&lt;/li&gt;&lt;li&gt;Medindo velocidade do projeto&lt;/li&gt;&lt;li&gt;Dinâmica de pessoal&lt;/li&gt;&lt;li&gt;Reuniões diárias em pé&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Projetando (designing)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simplicidade (não adicione funcionalidades antes do tempo)&lt;/li&gt;&lt;li&gt;Metáfora&lt;/li&gt;&lt;li&gt;Cartões CRC (Classes, Responsabilidades e Colaboração)&lt;/li&gt;&lt;li&gt;Re-fabricar (refactor)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Codificando&lt;br /&gt;&lt;ul&gt;&lt;li&gt;O cliente deve estar sempre disponível.&lt;/li&gt;&lt;li&gt;Programação em pares.&lt;/li&gt;&lt;li&gt;Codificar de acordo com padrões acordados.&lt;/li&gt;&lt;li&gt;Codificar testes de unidade primeiro.&lt;/li&gt;&lt;li&gt;Integrar com freqüência.&lt;/li&gt;&lt;li&gt;O código é propriedade coletiva.&lt;/li&gt;&lt;li&gt;Não atrase.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Testando&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Todo código deve ter os testes de unidade.&lt;/li&gt;&lt;li&gt;Cada unidade deve ser testada antes de liberada.&lt;/li&gt;&lt;li&gt;Quando um erro é encontrado, testes devem ser realizados.&lt;/li&gt;&lt;li&gt;Testes de aceitação devem ser freqüentes.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A programação extrema tem sido bem sucedida em projetos pequenos com times pequenos. Relatos mostram que para projetos grandes o método XP não é recomendado.&lt;br /&gt;&lt;br /&gt;Para saber mais, consulte &lt;a href="http://www.extremeprogramming.org"&gt;www.extremeprogramming.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-9043398024116522729?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/9043398024116522729/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=9043398024116522729&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/9043398024116522729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/9043398024116522729'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/03/programao-extrema-xp.html' title='Programação Extrema (XP)'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-6376277173054428944</id><published>2007-03-02T22:49:00.001-03:00</published><updated>2008-03-06T21:09:56.150-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modelo espiral'/><title type='text'>O Modelo Espiral</title><content type='html'>&lt;p class="MsoNormal"&gt;O objetivo do modelo espiral é prover um &lt;i&gt;metamodelo&lt;/i&gt; que pode acomodar diversos processos específicos. Isto significa que podemos encaixar nele as principais características dos modelos vistos anteriormente, adaptando-os a necessidades específicas de desenvolvedores ou às particularidades do software a ser desenvolvido. Este modelo prevê prototipação, desenvolvimento evolutivo e cíclico, e as principais atividades do modelo cascata. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Sua principal inovação é guiar o processo de desenvolvimento gerado a partir deste metamodelo com base em &lt;b&gt;análise de riscos&lt;/b&gt; e &lt;b&gt;planejamento&lt;/b&gt; que é realizado durante toda a evolução do desenvolvimento. &lt;i&gt;Riscos &lt;/i&gt;são circunstâncias adversas que podem surgir durante o desenvolvimento de software impedindo o processo ou diminuindo a qualidade do produto. São exemplos de riscos: pessoas que abandonam a equipe de desenvolvimento, ferramentas que não podem ser utilizadas, falha em equipamentos usados no desenvolvimento ou que serão utilizados no produto final, etc. A identificação e o gerenciamento de riscos é hoje uma atividade importantíssima no desenvolvimento de software devido à imaturidade da área e à falta de conhecimento, técnicas e ferramentas adequadas. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;O modelo espiral descreve um fluxo de atividades cíclico e evolutivo constituído de quatro estágios. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;No estágio 1 devem ser      determinados objetivos, soluções alternativas e restrições.&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;No estágio 2, devem ser      analisados os riscos das decisões do estágio anterior. Durante este      estágio podem ser construídos protótipos ou realizar-se simulações do      software.&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;O estágio 3 consiste nas      atividades da fase de desenvolvimento, incluindo design, especificação,      codificação e verificação. A principal característica é que a cada      especificação que vai surgindo a cada ciclo  - especificação de requisitos,      do software, da arquitetura, da interface de usuário e dos algoritmos e      dados - deve ser feita a verificação apropriadamente.&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;O estágio 4 compreende a      revisão das etapas anteriores e o planejamento da próxima fase. Neste      planejamento, dependendo dos resultados obtidos nos estágios anteriores -      decisões, análise de riscos e verificação, pode-se optar por seguir o      desenvolvimento num modelo Cascata (linear), Evolutivo ou       Transformação. Por exemplo, se já no primeiro ciclo, os requisitos forem completamente      especificados e validados pode-se optar por seguir o modelo Cascata. Caso      contrário, pode-se optar pela construção de novos protótipos,      incrementando-o, avaliando novos riscos e replanejando o processo.&lt;/li&gt;&lt;/ul&gt;Para saber mais:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Boehm, B.  "A Spiral Model of Software Development and Enhancement"  - IEEE Computer, vol.21, 5, May 1988, pp 61-72&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-6376277173054428944?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/6376277173054428944/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=6376277173054428944&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/6376277173054428944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/6376277173054428944'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/03/o-modelo-espiral.html' title='O Modelo Espiral'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-994657769962838018</id><published>2007-03-02T22:38:00.000-03:00</published><updated>2007-03-02T23:32:02.099-03:00</updated><title type='text'>O Modelo Transformação</title><content type='html'>&lt;p class="MsoNormal"&gt;Um programa é uma descrição formal, isto é, ele é descrito por uma linguagem de programação cuja sintaxe e semântica são definidos formalmente. Apenas desta forma é que temos a garantia de que o programa será sempre executado da mesma forma pelo computador. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;O modelo Tranformação tem suas raízes na abordagem de métodos formais para o desenvolvimento de software. A idéia é que o desenvolvimento deve ser visto como uma seqüência de passos que gradualmente transforma uma especificação formal num programa. O passo inicial é transformar os requisitos informais numa especificação funcional formal. Esta descrição  formal é então transformada numa outra descrição formal mais detalhada, e assim, sucessivamente, até chegar-se a programas que satisfaçam a especificação. Durante este processo de transformações sucessivas - chamado de &lt;i&gt;otimização &lt;/i&gt;- as especificação formais produzidas podem ser executadas por um processador abstrato, permitindo uma verificação formal da sua validação antes mesmo que o programa venha a ser implementado. Antes de serem transformadas cada especificação formal deve ser verificada em relação às expectativas dos clientes e usuários. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;As transformações devem ser realizadas pelo engenheiro de software. A natureza formal da transformação possibilita a aplicação de verificações matemáticas como prova, consistência e completude da especificação. As transformações podem ser realizadas de maneira automática por ferramentas que traduzem especificações formais mais abstratas em especificações mais detalhadas. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Este modelo prevê que o engenheiro de software deve ter a sua disposição uma biblioteca de componentes reutilizáveis que satisfaça especificações formais. Na &lt;i&gt;otimização&lt;/i&gt;, à medida que as especificações de mais baixo nível vão sendo obtidas verifica-se quais componentes da biblioteca implementam parte desta especificação. Um ambiente automatizado de desenvolvimento (uma ferramenta CASE - Computer Aided Software Engineering) pode auxiliar este processo armazenando o histórico de decisões dos engenheiros de software.&lt;/p&gt;&lt;p&gt;Para se aprofundar, leia:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Helmut A. Partsch, Specification and transformation of programs: a formal approach to software development, Springer-Verlag New York, Inc.   New York, NY, USA&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-994657769962838018?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/994657769962838018/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=994657769962838018&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/994657769962838018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/994657769962838018'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/03/o-modelo-transformao.html' title='O Modelo Transformação'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-2061853073815675623</id><published>2007-03-02T22:35:00.001-03:00</published><updated>2008-03-06T21:10:36.179-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cascata'/><title type='text'>O Modelo Cascata</title><content type='html'>O modelo cascata (waterfall) tornou-se conhecido na década de 70 e é referenciado na maioria dos livros de engenharia de software ou manuais de padrões de software. Nele as atividades do processo de desenvolvimento são estruturadas numa cascata onde a saída de uma é a entrada para a próxima. As suas principais atividades são: &lt;ul&gt;&lt;li&gt; estudo de viabilidade&lt;/li&gt;&lt;li&gt; análise e especificação de requisitos&lt;/li&gt;&lt;li&gt; design da arquitetura&lt;/li&gt;&lt;li&gt;Design detalhado&lt;br /&gt;&lt;/li&gt;&lt;li&gt; codificação e testes de unidades&lt;/li&gt;&lt;li&gt;integração e teste do sistema&lt;br /&gt;&lt;/li&gt;&lt;li&gt; entrega e instalação&lt;/li&gt;&lt;li&gt; manutenção&lt;/li&gt;&lt;/ul&gt; Existem muitas variantes deste modelo propostas por diferentes pesquisadores ou empresas de desenvolvimento e adaptadas a diferentes tipos de software. A característica comum é um fluxo linear e seqüencial de atividades semelhantes a descritas anteriormente.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Este modelo, quando proposto, introduziu importantes qualidades ao desenvolvimento. A primeira chama a atenção de que o processo de desenvolvimento deve ser conduzido de forma disciplinada, com atividades claramente definidas, determinada a partir de um planejamento e sujeitas a gerenciamento durante a realização. Outra qualidade define de maneira clara quais são estas atividades e quais os requisitos para desempenhá-las. Por fim, o modelo introduz a separação das atividades da definição e design da atividade de programação que era o centro das atenções no desenvolvimento de software. &lt;/p&gt;&lt;p&gt;O modelo Cascata também é criticado por ser linear, rígido e monolítico. Inspirados em modelos de outras atividades de engenharia, este modelo argumenta que cada atividade apenas deve ser iniciada quando a outra estiver terminada e verificada. Ele é considerado monolítico por não introduzir a participação de clientes e usuário durante as atividades do desenvolvimento, mas apenas o software ter sido implementado e entregue. Não existe como o cliente verificar antecipadamente qual o produto final para detectar eventuais problemas. &lt;/p&gt;&lt;p&gt;Características particulares do software (ser conceitual, por exemplo) e a falta de modelos teóricos, técnicas e ferramentas adequadas mostram que é necessário haver maior flexibilidade neste fluxo seqüencial, permitindo volta atrás para eventuais modificações. Veremos mais adiante modelos que propõem maior flexibilidade no fluxo de execução. &lt;/p&gt;&lt;p&gt;As métricas utilizadas nas estimativas de prazos e recursos humanos são ainda bastante imprecisas e quase sempre o planejamento de atividades precisa ser revisto. Normalmente, os prazos não são cumpridos, pois o planejamento, neste modelo, é feito unicamente nas etapas iniciais do desenvolvimento. A estrutura seqüencial e rígida também não permite que o planejamento seja refeito para corrigir falhas nas atividades de desenvolvimento. &lt;/p&gt;Para saber mais, recomendo os seguintes artigos (em inglês):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://web.archive.org/web/20050310133243/http://asd-www.larc.nasa.gov/barkstrom/public/The_Standard_Waterfall_Model_For_Systems_Development.htm" class="external text" title="http://web.archive.org/web/20050310133243/http://asd-www.larc.nasa.gov/barkstrom/public/The_Standard_Waterfall_Model_For_Systems_Development.htm" rel="nofollow"&gt;The standard waterfall model for systems development&lt;/a&gt; NASA webpage, archived on &lt;a href="http://en.wikipedia.org/wiki/Internet_Archive" title="Internet Archive"&gt;Internet Archive&lt;/a&gt; March 10, 2005.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/David_Parnas" title="David Parnas"&gt;Parnas, David&lt;/a&gt;, &lt;a href="http://www.ece.utexas.edu/%7Eperry/education/360F/fakeit.pdf" class="external text" title="http://www.ece.utexas.edu/~perry/education/360F/fakeit.pdf" rel="nofollow"&gt;A rational design process and how to fake it (PDF)&lt;/a&gt; .&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-2061853073815675623?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/2061853073815675623/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=2061853073815675623&amp;isPopup=true' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2061853073815675623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/2061853073815675623'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/03/o-modelo-cascata.html' title='O Modelo Cascata'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-4568423781608377394</id><published>2007-03-02T22:25:00.001-03:00</published><updated>2008-03-06T21:13:31.491-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='evolucionario'/><category scheme='http://www.blogger.com/atom/ns#' term='evolutivo'/><title type='text'>O Modelo Evolutivo</title><content type='html'>O modelo evolutivo descreve um processo na qual o software deve ser desenvolvido de forma a evoluir a partir de protótipos iniciais. Para entender melhor este modelo é importante entender o que é prototipação (ou prototipagem).&lt;br /&gt;&lt;br /&gt;Prototipação é uma abordagem baseada numa visão evolutiva do desenvolvimento de software, afetando o processo como um todo. Esta abordagem envolve a produção de versões iniciais - "protótipos" - de um sistema futuro com o qual pode-se realizar verificações e experimentações para se avaliar algumas de suas qualidades antes que o sistema venha realmente a ser construído.&lt;br /&gt;&lt;h4&gt; Objetivos da Prototipação&lt;/h4&gt;  Num projeto de software várias questões podem ser respondida com a construcão de protótipos. Nas situações típicas de desenvolvimento podemos distinguir entre diferentes objetivos na prototipação: &lt;ul&gt;&lt;li&gt; &lt;b&gt;Exploratória &lt;/b&gt;- é quando o protótipo é usado para ajudar a esclarecer requisitos dos usuários com respeito ao sistema futuro. Uma prototipação também é exploratória quando se busca examinar uma variedade de opções de design de maneira a  evitar a escolha de uma abordagem específica não adequada. Com esses objetivos os desenvolvedores adquirem informações sobre o domínio, os usuário e tarefas. Os usuários podem emitir informações e sugestões mais precisas, tornando-se parceiro das decisões que envolvem o desenvolvimento.&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;&lt;li&gt; &lt;b&gt;Experimental &lt;/b&gt;- é quando a prototipação foca aspectos técnicos do desenvolvimento, oferecendo aos desenvolvedores resultados experimentais para tomada de decisões de design e implementação. Um aspecto essencial é a viabilização de uma base de comunicação entre os usuários e desenvolvedores para soluções de problemas técnicos de viabilidade e usabilidade, dentre outros. As principais vantagens para os desenvolvedores são a verificação e validação das decisões tomadas e soluções apresentadas.&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;&lt;li&gt; &lt;b&gt;Evolutiva &lt;/b&gt;- A prototipação pode ser aplicada de maneira bastante proveitosa num processo de reengenharia em organizações, para avaliar o impacto que a introdução de novas tecnologias pode trazer. Nesse caso o protótipo não é visto apenas como uma ferramenta em projetos individuais, mas como parte de um processo contínuo de evolução dos processos organizacionais. Os desenvolvedores não são mais os protagonistas da prototipação, mas consultores que trabalham em cooperação com os usuários no processo de reengenharia.&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt; Tipos de Protótipos&lt;/h4&gt; O relacionamento entre um protótipo e as atividades do processo de desenvolvimento - início do projeto e análise de requisitos, design da interface e da aplicação, e implementação - permite a identificação de quatro  tipos de protótipos: &lt;ul&gt;&lt;li&gt; &lt;b&gt;Protótipo de Apresentação &lt;/b&gt;- oferece suporte ao início do projeto e é usado para convencer o cliente de que o futuro sistema é viável e que a interface do usuário se adequa aos requisitos. Na maioria dos casos é usado para mostrar visão que o usuário têm do sistema e revelar aspectos importantes da interface.&lt;/li&gt;&lt;li&gt; &lt;b&gt;Protótipo Autêntico &lt;/b&gt;- é um sistema de software provisório e funcional, geralmente projetado para ilustrar aspectos específicos da interface de usuários ou parte da funcionalidade, ajudando na compreensão dos problemas envolvidos.&lt;/li&gt;&lt;li&gt; &lt;b&gt;Protótipo Funcional &lt;/b&gt;-- é derivado do modelo do domínio do problema ou da especificação do software e serve para ajudar à equipe de desenvolvimento compreender questões relacionadas com a construção do sistema. Esse protótipo não interessa aos usuários.&lt;/li&gt;&lt;li&gt; &lt;b&gt;Sistema Piloto &lt;/b&gt;- é usado não apenas com propósitos ilustrativos, mas como um núcleo básico operacional do sistema. Esse sistema deve ser instalado no ambiente de aplicação e experimentado com os usuários.&lt;/li&gt;&lt;/ul&gt;O fluxo de atividades do modelo evolutivo caracteriza-se por ser cíclico ou iterativo. Ele começa com o design e desenvolvimento de um protótipo inicial, que deve ser mostrado aos usuários e avaliado. Durante a avaliação novos requisitos são definidos e alterações e incrementos ao protótipo inicial devem ser feitas. Este ciclo deve ser repetido em direção ao produto final. &lt;o:p&gt;&lt;/o:p&gt;  &lt;p&gt;A grande vantagem deste modelo está em permitir a verificação antecipada do produto final por engenheiros, clientes e usuários, permitindo a correção dos problemas detectados. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;A extrema flexibilidade deste modelo e a sua falta de rigor leva a software que embora satisfaça aos requisitos dos usuários têm deficiências de desempenho, portabilidade, manutenção e outras qualidades internas.  &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p&gt;Embora a prototipação tenha enormes vantagens e deva ser incentivada, basear o desenvolvimento no incremento de protótipos pode levar a software mal documentados e com arquiteturas mal definidas. Como os requisitos estão sempre sendo revistos a cada ciclo de desenvolvimento, torna-se praticamente impossível estimar custos e prazos e planejar as atividades de desenvolvimento.&lt;/p&gt;&lt;p&gt;Leituras recomendadas:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Alan M. Davis: Operational Prototyping: A new Development Approach. IEEE Software, September 1992. Page 71.&lt;/li&gt;&lt;li&gt;&lt;cite id="endnote_7" style="font-style: normal;"&gt;&lt;/cite&gt; John Crinnion: Evolutionary Systems Development, a practical guide to the use of prototyping within a structured systems methodology. Plenum Press, New York, 1991. Page 17.&lt;/li&gt;&lt;li&gt;&lt;cite id="endnote_8" style="font-style: normal;"&gt;&lt;/cite&gt; S. P. Overmyer: Revolutionary vs. Evolutionary Rapid Prototyping: Balancing Software Productivity and HCI Design Concerns. Center of Excellence in Command, Control, Communications and Intelligence (C3I), George Mason University, 4400 University Drive, Fairfax, Virginia.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;span style=""&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-4568423781608377394?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/4568423781608377394/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=4568423781608377394&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/4568423781608377394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/4568423781608377394'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/03/o-modelo-evolutivo.html' title='O Modelo Evolutivo'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-3803266275394500046</id><published>2007-03-02T21:52:00.001-03:00</published><updated>2008-03-06T21:15:22.689-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processo de software'/><title type='text'>Processo de Software</title><content type='html'>Vimos que a engenharia de software requer  que as atividades para desenvolver o software sejam feitas de forma planejada,  gerenciada, com pessoal capacitado, custos e prazos estimados e utilizando  teorias, métodos, técnicas e ferramentas adequadas.  &lt;p&gt;Elaborar um &lt;b&gt;processo de software&lt;/b&gt; significa  determinar de forma precisa e detalhada &lt;span style="font-style: italic;"&gt;quem &lt;/span&gt;faz o &lt;span style="font-style: italic;"&gt;que&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;quando &lt;/span&gt;e &lt;span style="font-style: italic;"&gt;como&lt;/span&gt;. Um  processo pode ser visto como uma instância de um &lt;span style="font-style: italic;"&gt;modelo de processo &lt;/span&gt;ou &lt;span style="font-style: italic;"&gt;método &lt;/span&gt;com suas técnicas e  ferramentas associadas. O processo é definido durante a etapa de planejamento, no qual as  atividades que o compõem foram alocadas aos membros da equipe de  desenvolvimento, com prazos definidos e métricas para se avaliar como elas estão  sendo realizadas.   &lt;/p&gt;&lt;p&gt;Enquanto um método é algo teórico, o processo deve determinar ações práticas  a serem realizadas pela equipe como prazos definidos. O processo é o resultado  do planejamento e precisa ser gerenciado no decorrer de sua execução.  &lt;/p&gt;&lt;p&gt;Não é objetivo deste texto a elaboração de processos de desenvolvimento.  Apenas podemos fazê-lo após estudarmos técnicas de planejamento e gerenciamento.  Neste capítulo vamos nos limitar a estudar alguns modelos de processo que nos  indique como as diversas etapas e atividades do desenvolvimento podem ser  estruturadas.&lt;/p&gt;&lt;p&gt;Conceitos importantes&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Um processo é organizado em atividades.&lt;/li&gt;&lt;li&gt;Atividades são de responsabilidade de um membro da equipe (trabalhador).&lt;/li&gt;&lt;li&gt;Atividades devem gerar um artefato de saída, que possa ser verificado, e podem requisitar um artefato de  entrada.&lt;/li&gt;&lt;li&gt;Um artefato é um modelo, documento ou código produzido por uma atividade.&lt;/li&gt;&lt;li&gt;Uma entrega (liberação) é um artefato entregue ao cliente&lt;/li&gt;&lt;li&gt;Um processo deve estabelecer uma série de marcos.&lt;/li&gt;&lt;li&gt;Um marco é um ponto final de uma atividade de processo.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-weight: bold;"&gt;Modelos de Processo&lt;/p&gt;&lt;p&gt;Um modelo para um processo de desenvolvimento é uma proposta teórica que junto  com o planejamento deve determinar quais atividades devem ser realizadas,  quando, como e por quem. Nesta seção vamos apresentar alguns dos mais conhecidos  modelos do processo de desenvolvimento. Eles são o modelo &lt;b&gt;Cascata&lt;/b&gt;, o  modelo &lt;b&gt;Evolutivo, &lt;/b&gt;o modelo &lt;span style="font-weight: bold;"&gt;Incremental, &lt;/span&gt;o modelo &lt;b&gt;Espiral,&lt;/b&gt; o modelo  &lt;b&gt;Transformação&lt;/b&gt;, o modelo &lt;span style="font-weight: bold;"&gt;XP &lt;/span&gt;(eXtreme Programming), e &lt;span style="font-weight: bold;"&gt;RUP &lt;/span&gt;(Processo Unificado da Rational).  &lt;/p&gt;&lt;p&gt;A escolha de um destes modelos envolve diversos fatores. Um deles é o  tipo  de software - se é um software de banco de dados, um software de tempo-real, um  software embutido, um sistema especialista. Outro fator importante é se a equipe  de desenvolvimento é uma empresa de desenvolvimento (software house), uma fábrica de software (desenvolvimento em linha de produção) ou se é a  equipe de engenheiros da própria organização que utilizará o produto. A maneira  como o produto será vendido e instalado é um outro fator importante - se o  software é para ser vendido para um público amplo (software genérico) ou se será instalado em uma  única empresa, sob encomenda.  &lt;/p&gt;&lt;p&gt;Um conjunto de modelos de processo ou métodos, as técnicas de desenvolvimento é uma &lt;b&gt;metodologia &lt;/b&gt;de desenvolvimento.&lt;/p&gt;&lt;p&gt;Para saber mais, recomendo os artigos:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Fuggetta, A. Software       process: a roadmap, in Finkelstein, A. (ed.) &lt;i&gt;       The Future of Software Engineering&lt;/i&gt;, ACM Press, 2002&lt;/li&gt;&lt;li&gt;Sommervile, I.&lt;em&gt;Software         Process Models&lt;/em&gt;, ACM Computing Surveys, Vol.28, no.1,         March 1996.&lt;/li&gt;&lt;/ol&gt;Veja os &lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/Processo.pdf"&gt;slides em PDF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-3803266275394500046?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/3803266275394500046/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=3803266275394500046&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/3803266275394500046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/3803266275394500046'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/03/processo-de-software.html' title='Processo de Software'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-770131228072844836</id><published>2007-02-23T22:23:00.000-03:00</published><updated>2007-02-24T13:36:29.118-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planejamento'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='viabilidade'/><category scheme='http://www.blogger.com/atom/ns#' term='ciclo de vida'/><category scheme='http://www.blogger.com/atom/ns#' term='retirada'/><title type='text'>Ciclo de Vida do Software</title><content type='html'>O ciclo de vida de um software descreve as fases pelas quais o software passa desde a sua concepção até ficar sem uso algum.&lt;br /&gt;&lt;br /&gt;O conceito de ciclo de vida de um software é muitas vezes confundido com o de modelo de processo (assunto do próximo artigo).&lt;br /&gt;&lt;br /&gt;Existem várias propostas e denominações para as fases do ciclo de vida de um software. Nossa proposta identifica 4 fases que são delimitadas por eventos típicos em diversos ciclos de vida. Cada fase inclui um conjunto de atividades ou disciplinas que devem ser realizadas pelas partes envolvidas. Essas fases são:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Definição&lt;/li&gt;&lt;li&gt;Desenvolvimento&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Operação&lt;/li&gt;&lt;li&gt;Retirada&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Fase de Definição&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A fase de definição do software ocorre em conjunto com outras atividades como a &lt;span style="font-style: italic;"&gt;modelagem de processos de negócios&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;análise de sistemas&lt;/span&gt;. Nesta atividade, diversos profissionais buscam o  conhecimento da situação atual e a identificação de problemas para que possam elaborar propostas de solução de sistemas computacionais que resolvam tais problemas. Dentre as propostas apresentadas, deve-se fazer um &lt;span style="font-style: italic;"&gt;estudo de viabilidade&lt;/span&gt;, incluindo &lt;span style="font-style: italic;"&gt;análise custo-benefício,&lt;/span&gt; para se decidir qual solução será a escolhida.&lt;br /&gt;&lt;br /&gt;O resultado desta atividade deve incluir a decisão da aquisição ou desenvolvimento do sistema, indicando informações sobre hardware, software, pessoal, procedimentos, informação e documentação.&lt;br /&gt;&lt;br /&gt;Caso seja decidido pelo desenvolvimento do sistema, no escopo da engenharia de software, é necessário elaborar o documento de &lt;span style="font-style: italic;"&gt;proposta de desenvolvimento de software. &lt;/span&gt;Esse documento pode ser a base de um &lt;span style="font-style: italic;"&gt;contrato de desenvolvimento&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Profissionais de engenharia de software atuam nesta atividade com o objetivo de identificar os &lt;span style="font-style: italic;"&gt;requisitos de software&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;modelos de domínio&lt;/span&gt; que serão utilizados na fase de desenvolvimento. Os requisitos são também fundamentais para que o engenheiro possa elaborar um &lt;span style="font-style: italic;"&gt;plano de desenvolvimento de software&lt;/span&gt;, indicando em detalhes os recursos necessários (humanos e materiais), bem como as estimativas de prazos e custos (cronograma e orçamento).&lt;br /&gt;&lt;br /&gt;Não existe um consenso sobre o caracteriza o final da fase de definição. Isto varia de acordo com o modelo de processo adotado. Em algumas propostas, a fase de definição é considerada concluída com a apresentação da proposta de desenvolvimento apenas. Outros modelos de processo, considera que o software apenas está completamente definido com a &lt;span style="font-style: italic;"&gt;especificação de requisitos&lt;/span&gt; e com a elaboração do &lt;span style="font-style: italic;"&gt;plano de desenvolvimento de software&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;De acordo com o modelo de processo adotado, pode-se iniciar atividades da fase de desenvolvimento mesmo que a fase de definição não esteja completamente concluída.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Fase de Desenvolvimento&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A fase de desenvolvimento ou de produção do software inclui todas as atividades que tem por objetivo a construção do produto. Ela inclui principalmente o design, a implementação e a verificação e validação do software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Design&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A atividade de design compreende todo o esforço de concepção e modelagem que têm por objetivo descrever como o software será implementado. O design inclui:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Design conceitual&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Design da interface de usuário&lt;/li&gt;&lt;li&gt;Design da arquitetura do software&lt;/li&gt;&lt;li&gt;Design dos algoritmos e estruturas de dados&lt;/li&gt;&lt;/ul&gt;O &lt;span style="font-weight: bold;"&gt;design conceitual&lt;/span&gt; envolve a elaboração das idéias e conceitos básicos que determinam os elementos fundamentais do software em questão. Por exemplo, um software de correio eletrônico tradicional inclui os conceitos: &lt;span style="font-style: italic;"&gt;mensagem, caixa de entrada, caixa de saída&lt;/span&gt;, etc. A mensagem, por sua vez, inclui os conceitos de &lt;span style="font-style: italic;"&gt;para, cc, bcc, assunto, corpo, etc&lt;/span&gt;. Embora seja um design adotado pela maioria dos software, novos modelos conceituais podem vir a ser adotados. O conceito de &lt;span style="font-style: italic;"&gt;conversação &lt;/span&gt;do Gmail é um exemplo.&lt;br /&gt;&lt;br /&gt;O design conceitual exerce influência na interface de usuário e na arquitetura do software.&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-weight: bold;"&gt;design da interface de usuário &lt;/span&gt;envolve a elaboração da maneira como o usuário pode interagir para realizar suas tarefas, a escolha dos objetos de interfaces (botões, menus, caixas de texto, etc.), o &lt;span style="font-style: italic;"&gt;layout &lt;/span&gt;de janelas e telas, etc. A interface deve garantir a boa &lt;span style="font-style: italic;"&gt;usabilidade &lt;/span&gt;do software e é um fundamental fator de sucesso do software.&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-weight: bold;"&gt;design de arquitetura de software&lt;/span&gt; deve elaborar uma visão macroscópica do software em termos de componentes que interagem entre si. O conceito de componente em arquitetura varia de acordo com a visão arquitetônica adotada. São exemplos de visões arquitetônicas, a visão conceitual, visão de módulos, visão de código e visão de execução.&lt;br /&gt;&lt;br /&gt;Na &lt;span style="font-style: italic;"&gt;visão conceitual&lt;/span&gt;, os componentes de software são derivados do design conceitual. Estes componentes são abstrações que devem definir outros elementos menos abstratos.  Exemplos são arquiteturas cliente-servidor e arquitetura em camadas. Na &lt;span style="font-style: italic;"&gt;visão de código&lt;/span&gt;, deve-se determinar como as classes e/ou funções estão organizadas e interagindo entre si. Estas classes implementam os componentes abstratos ou conceituais. Na&lt;span style="font-style: italic;"&gt; visão de módulos&lt;/span&gt;, deve-se determinar quais são os módulos que serão utilizados na implementação e como eles organizam as classes e/ou funções. Na &lt;span style="font-style: italic;"&gt;visão de execução&lt;/span&gt;, a arquitetura deve descrever os diferentes processos que são ativados durante a execução do software e como eles interagem entre si. Enquanto as anteriores oferecem uma visão estática, esta é uma visão dinâmica do software.&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-weight: bold;"&gt;design de algoritmos e estrutura de dados&lt;/span&gt;, também conhecido como design detalhado, visa determinar, de maneira independente da linguagem de programação adotada, as soluções algorítmicas e as estruturas de dados associados. Deve-se decidir, por exemplo, como as informações podem ser ordenadas (algoritmo de bolha ou quicksort) e em qual tipo de estrutura de dados (array, lista encadeada) elas vão ser armazenados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementação &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A &lt;span style="font-weight: bold;"&gt;implementação &lt;/span&gt;envolve as atividades de codificação, compilação, integração e testes.  A codificação visa traduzir o design num programa, utilizando linguagens e ferramentas adequadas. A codificação deve refletir a estrutura e o comportamento descrito no design. Os componentes arquiteturais devem ser codificados de forma independente e depois integrados. Os testes podem ser iniciados durante a fase de implementação. A depuração de erros ocorre durante a programação utilizando algumas técnicas e ferramentas. É fundamental um controle e gerenciamento de versões para que se tenha um controle correto de tudo o que está sendo codificado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Verificação e validação&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Verificação e validação&lt;/span&gt; destinam-se a mostrar que o sistema está de acordo com a especificação e que ele atende às expectativas de clientes e usuários. A validação visa assegurar se o programa está fazendo aquilo que foi definido na sua especificação (fazendo a coisa certa). A verificação visa verificar se o programa está correto, isto é, não possui erros de execução (fazendo certo a coisa). Existem diferentes formas de verificação e validação. Inspeção analítica e revisão de modelos, documentos e código fonte são formas que podem ser usadas antes mesmo que o programa seja completamente codificado. Os testes de correção, desempenho, confiabilidade, robustez, usabilidade, dentre outros, visam avaliar diversos fatores de qualidade a partir da execução do software. Diferentes técnicas de testes podem ser aplicadas para cada um destes fatores&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Fase de Operação&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A fase de operação envolve diferentes tipos de atividades:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Distribuição e entrega&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Instalação e configuração&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Utilização&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Manutenção&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;A distribuição e entrega pode ser feita diretamente pelo desenvolvedor (em caso de software personalizado), ou em um pacote a ser vendido em prateleiras de lojas ou para ser baixado pela Internet (em caso de software genéricos).&lt;br /&gt;&lt;br /&gt;O processo de instalação e configuração, normalmente, pode ser feito com a ajuda de software de instalação disponibilizados pelos fabricantes dos ambientes operacionais.&lt;br /&gt;&lt;br /&gt;A atividade de utilização é o objeto do desenvolvimento do software. A qualidade da utilização é a usabilidade do software.&lt;br /&gt;&lt;br /&gt;A manutenção normalmente ocorre de duas formas: corretiva e evolutiva. A manutenção corretiva visa a resolução de problemas referentes a qualidade do software (falhas, baixo desempenho, baixa usabilidade, falta de confiabilidade, etc.). A manutenção evolutiva ou adaptativa visa a produção de novas versões do software de forma a atender a novos requisitos dos clientes, ou adaptar-se às novas tecnologias que surgem (hardware, plataformas operacionais, linguagens, etc). &lt;/span&gt;&lt;span&gt;Mudanças no domínio de aplicação implicam em novos requisitos e i&lt;/span&gt;&lt;span&gt;ncorporação de novas funcionalidades. &lt;/span&gt;&lt;span&gt;Surgimento de novas tecnologias de software e hardware e mudanças para uma plataforma mais avançada também requerem evolução.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Fase de retirada&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;A fase retirada é um grande desafio para os tempos atuais. Diversos software que estão em funcionamento em empresas possuem excelente níveis de confiabilidade e de correção. No entanto, eles precisam evoluir para novas plataformas operacionais ou para a incorporação de novos requisitos. A retirada desses &lt;span style="font-style: italic;"&gt;software legados&lt;/span&gt; em uma empresa é sempre uma decisão difícil: como abrir mão daquilo que é confiável e ao qual os funcionários estão acostumados, após anos de treinamento e utilização?&lt;br /&gt;&lt;br /&gt;Processos de &lt;span style="font-style: italic;"&gt;reengenharia &lt;/span&gt;podem ser aplicados para viabilizar a transição ou &lt;span style="font-style: italic;"&gt;migração &lt;/span&gt;de um software legado para um novo software de forma a proporcionar uma retirada mais suave.&lt;br /&gt;&lt;br /&gt;O material de aula pode ser baixado aqui (&lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/CiclodeVida.pdf"&gt;arquivo em PDF&lt;/a&gt;).&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-770131228072844836?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/770131228072844836/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=770131228072844836&amp;isPopup=true' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/770131228072844836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/770131228072844836'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/02/ciclo-de-vida-do-software-parte-1.html' title='Ciclo de Vida do Software'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-7422796278821206979</id><published>2007-02-22T16:08:00.001-03:00</published><updated>2008-03-06T21:15:52.923-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='engenharia de software'/><title type='text'>O que é Engenharia de Software?</title><content type='html'>&lt;strong&gt;O que é Engenharia?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Vejamos duas definções:&lt;br /&gt;&lt;blockquote&gt;Engenharia é a atividade em que os conhecimentos científicos e técnicos e a experiência prática são aplicados para exploração dos recursos naturais, para o projeto, construção e operação de objetos úteis (Origem: Wikipédia, a enciclopédia livre).&lt;/blockquote&gt;&lt;blockquote&gt;Engenharia é a aplicação de métodos científicos ou empíricos à utilização dos recursos da natureza em benefício do ser humano (Dicionário Houaiss)&lt;/blockquote&gt;Essas definições não são suficientes para designar tudo aquilo que envolve engenharia. Para entender melhor o que é engenharia, propomos que você faça uma pesquisa para responder as seguintes questões:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Qual a diferença entre o desenvolvimento de um produto de forma artesanal e o desenvolvimento seguindo os princípios de engenharia? Em outras palavras, qual a diferença entre o trabalho de um artesão e o de um engenheiro?&lt;/li&gt;&lt;li&gt;Qual a diferença entre cozinhar e fazer engenharia de alimentos?&lt;/li&gt;&lt;li&gt;O que as diferentes engenharias (civil, mecânica, elétrica/eletrônica, química, ambiental, etc.) têm em comum?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Uma engenharia não é uma atividade específica. Um engenheiro é aquele que tem o conhecimento científico e a experiência para desempenhar uma ou mais das diversas atividades da engenharia.&lt;/p&gt;&lt;p&gt;Além disso, a atividade de engenharia não pode prescindir da garantia da qualidade do produto, da conformidade às normas, e do planejamento e gerenciamento de custos e prazos.&lt;/p&gt;&lt;strong&gt;Objetivos da Engenharia de Software &lt;/strong&gt;&lt;br /&gt;&lt;p&gt;A engenharia de software tem por objetivos a aplicação de teoria, modelos, formalismos e técnicas e ferramentas da ciência da computação e áreas afins para a &lt;strong&gt;produção&lt;/strong&gt; (ou desenvolvimento) sistemática de software. &lt;/p&gt;&lt;p&gt;Associado ao desenvolvimento, é preciso também aplicar métodos, técnicas e ferramentas para o &lt;strong&gt;gerenciamento&lt;/strong&gt; do processo de produção.  Isto envolve planejamento de custos e prazos, montagem da equipe e garantia de qualidade do produto e do processo.&lt;/p&gt;&lt;p&gt;Finalmente, a engenharia de software visa a produção da documentação formal do produto, do processo, dos critérios qualidade e dos manuais de usuários finais. &lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Definições de Engenharia de Software&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Os autores apresentam diversas definições para engenharia de software. Vamos apresentar três que consideramos complementares.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A engenharia de software é a disciplina envolvida com a produção e manutenção sistemática de software que são desenvolvidos com custos e prazos estimados. &lt;/li&gt;&lt;li&gt;Disciplina que aborda a construção de software complexo - com muitas partes interconectadas e diferentes versões - por uma equipe de analistas, projetistas, programadores, gerentes, "testadores", etc. &lt;/li&gt;&lt;li&gt;O estabelecimento e uso de princípios de engenharia para a produção economicamente viável de software de qualidade que funcione em máquinas reais. &lt;/li&gt;&lt;/ul&gt;A primeira destas definições enfatiza que a engenharia visa não apenas o desenvolvimento, mas também a manutenção do produto. Além disso, ela ressalta a importância da estimativa de custos e prazos de desenvolvimento.&lt;br /&gt;&lt;br /&gt;A segunda definição enfatiza a complexidade do produto e do processo. O software é formado por diversos componentes interconectados e o seu desenvolvimento é realizado por uma equipe com diferentes funções e especialidades, cujo trabalho precisa ser gerenciado.&lt;br /&gt;&lt;br /&gt;A terceira ressalta que o desenvolvimento de software deve seguir os princípios comuns a todas as engenharias e deve visar a qualidade.&lt;br /&gt;&lt;br /&gt;Veja o material apresentado em aula (&lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/EngenhariaDeSoftware.pdf"&gt; arquivo em PDF&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Para saber mais:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;James D. Herbsleb. Beyond computer science.  &lt;a href="http://www.acm.org/dl/"&gt;Proceedings of the 27th international conference on Software engineering 2005, Pages: 23 - 27.&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Boehm, B. &lt;a href="http://portal.acm.org/citation.cfm?id=1134285.1134288&amp;amp;coll=portal&amp;amp;dl=ACM&amp;amp;type=series&amp;amp;idx=SERIES402&amp;amp;part=series&amp;amp;WantType=series&amp;amp;title=ICSE%3A%20International%20Conference%20on%20Software%20Engineering&amp;amp;CFID=485551544&amp;amp;CFTOKEN=485551544"&gt; "A view of 20th and 21st century software engineering", &lt;/a&gt;Proceeding of the 28th international conference on Software engineering 2006,  Shanghai, China    May 20 - 28, 2006.&lt;/li&gt;&lt;li&gt;Brooks, Jr., Frederick P. &lt;i&gt;  No Silver Bullet - Essence and Accidents of Software Engineering,       &lt;/i&gt;in &lt;i&gt;The Mythical Man-Month.Essays on Software Engineering, Twentieth       Anniversary Edition,&lt;/i&gt; Reading, MA: Addison-Wesley1995&lt;/li&gt;&lt;li&gt;Finkelstein, A. Kramer, J. "Software engineering: a roadmap", in Finkelstein, A. (ed.) &lt;i&gt;The Future of Software Engineering&lt;/i&gt;, ACM Press, 2002&lt;/li&gt;&lt;li&gt;Shaw, M. Software Engineering Education: a roadmap.in Finkelstein, A. (ed.) &lt;i&gt;       The Future of Software Engineering&lt;/i&gt;, ACM Press, 2002&lt;/li&gt;&lt;li&gt;Shaw, M. What Makes Good Research in Software Engineering. ETAPS, Grenoble, 2002.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-7422796278821206979?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/7422796278821206979/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=7422796278821206979&amp;isPopup=true' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/7422796278821206979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/7422796278821206979'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/02/o-que-engenharia-de-software.html' title='O que é Engenharia de Software?'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-8291214579923909955</id><published>2007-02-15T23:18:00.000-03:00</published><updated>2007-02-22T22:25:44.131-03:00</updated><title type='text'>Sistemas Computacionais</title><content type='html'>Um &lt;b&gt;sistema computacional (ou baseado em computador)  &lt;/b&gt;é aquele que automatiza ou apóia a  realização de atividades humanas através do processamento de informações.  &lt;p&gt;Um sistema baseado em computador é caracterizado por alguns elementos  fundamentais.  &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Hardware  &lt;/li&gt;&lt;li&gt;Software  &lt;/li&gt;&lt;li&gt;Informações  &lt;/li&gt;&lt;li&gt;Usuários  &lt;/li&gt;&lt;li&gt;Procedimentos ou Tarefas  &lt;/li&gt;&lt;li&gt;Documentação &lt;/li&gt;&lt;/ul&gt;O &lt;b&gt;hardware &lt;/b&gt;corresponde às partes eletrônicas e  mecânicas (rígidas) que possibilitam a existência do software, o armazenamento  de informações e a interação com o usuário. A CPU, as memórias primária e  secundária, os periféricos, os componentes de redes de computadores, são  exemplos de elementos de hardware. Um único computador pode possibilitar a  existência de diversos sistemas e um sistema pode requisitar diversos  computadores.  &lt;p&gt;O &lt;b&gt;software &lt;/b&gt;é a parte abstrata do sistema computacional que funciona  num hardware a partir de instruções codificadas numa linguagem de programação.  Estas instruções permitem o processamento e armazenamento de informações na  forma de dados codificados e podem ser controladas pelo usuário. Este controle,  bem como a troca de informações entre o usuário e o sistema é feita através da  interface de usuário, composta por hardware e software.  &lt;/p&gt;&lt;p&gt;A &lt;span style="font-weight: bold;"&gt;informação &lt;/span&gt;é um componente fundamental nos sistemas baseados em computador.  Por isto eles podem também ser chamados de sistemas baseados em  informação. Sistemas processam e armazenam dados que são interpretados  como informações pelos usuários através da interface. São os dados que  representam elementos do domínio que tornam o sistema útil para os usuários.  &lt;/p&gt;&lt;p&gt;Os &lt;b&gt;usuários &lt;/b&gt;são também elementos centrais no desenvolvimento de um  sistema baseado em computador. As metas de cada usuário, de acordo com o papel  que cada um desempenha no domínio, devem poder ser satisfeita pelo sistema.  &lt;/p&gt;&lt;p&gt;As &lt;b&gt;tarefas &lt;/b&gt;ou &lt;span style="font-weight: bold;"&gt;procedimentos &lt;/span&gt;compreendem as atividades que o sistema  realiza ou permite realizar. As tarefas caracterizam a funcionalidade do sistema  e devem permitir aos usuários satisfazer as suas metas. Elas devem estar de acordo com os &lt;span style="font-style: italic;"&gt;processos da organização&lt;/span&gt; (ou do negócio).  &lt;/p&gt;&lt;p&gt;A &lt;b&gt;documentação &lt;/b&gt;do sistema envolve os &lt;i&gt;manuais de usuário&lt;/i&gt;, que  contém informações para o usuário utilizar o sistema (&lt;i&gt;documentação do  sistema&lt;/i&gt;) que descrevem a sua estrutura e o funcionamento. Estes últimos são  fundamentais durante o desenvolvimento do sistema para a comunicação entre a  equipe de desenvolvimento e para a transição entre as suas diversas etapas e  durante a manutenção de um sistema em sua fase operacional.  &lt;/p&gt;&lt;p&gt;Um sistema baseado em computador funciona num determinado &lt;i&gt;domínio de  aplicação&lt;/i&gt; que corresponde a um tipo de ambiente ou organização onde o  sistema é utilizado.  &lt;/p&gt;&lt;h4&gt;Exemplos de sistemas baseados em computador&lt;/h4&gt; &lt;ul&gt;&lt;li&gt;Sistema de Automação Bancária  &lt;/li&gt;&lt;li&gt;Sistema de Folha de Pagamento  &lt;/li&gt;&lt;li&gt;Sistema de Controle Acadêmico  &lt;/li&gt;&lt;li&gt;Sistema de Biblioteca  &lt;/li&gt;&lt;li&gt;Sistema de Controle de Tráfego Urbano  &lt;/li&gt;&lt;li&gt;Sistema de Controle de Elevadores  &lt;/li&gt;&lt;li&gt;Sistema de Editoração de Jornais e Revistas &lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Engenharia de Sistemas Computacionais&lt;/h4&gt;O desenvolvimento do  sistema deve ser pensado como um todo. Os problemas que o sistema deve resolver  devem ser analisados e uma solução envolvendo todos os componentes deve ser  proposta. O desenvolvimento de cada componente do sistema pode ser conduzido  utilizando um "engenharia" específica. É importante ressaltar que o termo  engenharia está sendo utilizado de forma imprecisa.&lt;br /&gt;&lt;br /&gt;Inicialmente é necessário realizar a análise do sistema. A &lt;span style="font-weight: bold;"&gt;análise de sistemas &lt;/span&gt;tem por objetivo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a identificação necessidades dos usuários e dos problemas que o sistema deve vir a resolver na organização;&lt;/li&gt;&lt;li&gt;Definição dos requisitos do sistema;&lt;/li&gt;&lt;li&gt;O estudo de viabilidade técnica, econômica (análise custo-benefício) e jurídica de possíveis soluções;&lt;/li&gt;&lt;li&gt;Apresentação das possíveis soluções;&lt;/li&gt;&lt;li&gt;Planejamento do desenvolvimento (custos e cronograma);&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Após ter sido escolhida a solução mais viável, parte para a engenharia propriamente dita.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Engenharia de Hardware &lt;/b&gt;- construção dos diversos equipamento de  hardware, engenharia de redes, etc.  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Engenharia de Software &lt;/b&gt;- desenvolvimento dos diversos componentes de  software que compõe o sistema.  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Engenharia de Informações &lt;/b&gt;- modelagem e estruturação das informações  para que possam ser processadas e armazenadas.  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Engenharia de Fatores Humanos ou Usuário &lt;/b&gt;- É necessário definir os papeis e os perfis das pessoas que irão utilizar o novo sistema. Os fatores  humanos devem ser analisados para que as atividades humanas sejam desempenhada  com qualidade.  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Engenharia de Procedimentos ou Métodos &lt;/b&gt;- Novas tarefas dos usuários  devem surgir e outras podem ser extintas. Outras atividades podem ser  automatizadas pelo sistema.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Engenharia de Documentação &lt;/span&gt;- Toda a documentação do sistema precisa estar claramente descrita, organizada e catalogada. Técnicas da ciência da informação e biblioteconomia, aliada à novas ferramentas para documentação devem ser utilizadas.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Todas estas "engenharias" devem ser  concebidas de forma integrada uma vez que o seus elementos estão bastante  relacionados entre si. A ênfase em apenas um dos aspectos pode levar a  deficiências do sistema em alguns outros componentes. &lt;p&gt;Na construção de um sistema não podemos nos concentrar apenas na engenharia  de software. É preciso considerar que o hardware, bem como as informações e os  procedimentos do domínio precisam ser analisados e construídos de forma  integrada ao sistema.&lt;/p&gt;&lt;p&gt;Para maiores informações, consulte o &lt;a href="http://www.dimap.ufrn.br/%7Ejair/ES/slides/Sistemas.pdf"&gt;material de aula (em PDF)&lt;/a&gt;. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-8291214579923909955?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/8291214579923909955/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=8291214579923909955&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/8291214579923909955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/8291214579923909955'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/02/sistemas-computacionais.html' title='Sistemas Computacionais'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6983429712622116184.post-7570022508631747013</id><published>2007-02-15T22:11:00.001-03:00</published><updated>2008-03-06T21:16:20.883-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>O que é software?</title><content type='html'>&lt;p&gt;Nesta aula você vai saber o que é software, conhecendo também uma perspectiva não convencional.&lt;/p&gt;&lt;p&gt;Um &lt;span style="FONT-STYLE: italic"&gt;software&lt;/span&gt; é um conjunto de programas de computadores, em suas diversas formas (código fonte, objeto, executável, APIs, scripts, etc.) e toda a sua documentação associada.&lt;/p&gt;Um &lt;span style="FONT-STYLE: italic"&gt;programa &lt;/span&gt;é um conjunto de soluções algorítmicas, codificadas numa linguagem de programação, executado numa máquina real.&lt;br /&gt;&lt;p&gt;Os produtos de software podem ser desenvolvidos para um cliente em particular (Software personalizado, sob encomenda) ou para o mercado geral (Software genérico ou COTS – Commercial Off-The Shelf).&lt;/p&gt;&lt;p&gt;O software é um produto &lt;span style="FONT-STYLE: italic"&gt;conceitual e lógico&lt;/span&gt;. Isto significa que o software não é um produto material, ele um produto ou &lt;span style="FONT-WEIGHT: bold"&gt;artefato virtual&lt;/span&gt;. Ele apenas existe na mente das pessoas envolvidas com o seu desenvolvimento e utilização.&lt;/p&gt;&lt;h4&gt;Exemplo&lt;br /&gt;&lt;/h4&gt;Para exemplificar esta perspectiva de software como artefato, vejamos o exemplo exemplo de um programa trivial que, com pequenas alterações no programa, mas sem alterar a essência do algoritmo, pode ser visto como aplicações de software de distintas. &lt;p&gt;Vejamos o seguinte trecho de interação entre o usuário (U) e o sistema (S). &lt;/p&gt;&lt;pre&gt;S: &lt;i&gt;Forneça um número:&lt;/i&gt;&lt;br /&gt;U: &lt;i&gt;5.3&lt;/i&gt;&lt;br /&gt;S: &lt;i&gt;Você deve digitar apenas números inteiros:&lt;/i&gt;&lt;br /&gt;U: &lt;i&gt;5&lt;/i&gt;&lt;br /&gt;S: &lt;i&gt;Forneça outro número&lt;/i&gt;:&lt;br /&gt;U: &lt;i&gt;8&lt;/i&gt;&lt;br /&gt;S: &lt;i&gt;O resultado é -3&lt;/i&gt; &lt;/pre&gt;&lt;p&gt;Observando a interação do usuário com o sistema podemos concluir que o software realizou uma subtração. Assim, a funcionalidade deste software é realizar subtrações de dois números inteiros. Vejamos, agora o algoritmo que está por trás deste software. &lt;/p&gt;&lt;pre&gt;escreva("&lt;i&gt;Forneça um Número&lt;/i&gt;:");&lt;br /&gt;leia A;&lt;br /&gt;enquanto A não for inteiro faça&lt;br /&gt;escreva(&lt;i&gt;Você deve digitar apenas números inteiros:&lt;/i&gt;)&lt;br /&gt;leia A;&lt;br /&gt;escreva("&lt;i&gt;Forneça outro Número&lt;/i&gt;:");&lt;br /&gt;leia B;&lt;br /&gt;C = A - B;&lt;br /&gt;escreva("&lt;i&gt;O resultado é &lt;/i&gt;", C);&lt;br /&gt;&lt;/pre&gt;Vejamos agora o que acontece se modificarmos as linhas 1, 6 e 9 deste algoritmo para &lt;pre&gt;escreva("Forneça o valor de venda");&lt;br /&gt;escreva("Forneça o valor de compra");&lt;br /&gt;escreva("O lucro é",C);&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Para o programador muito pouca coisa mudou, mas para o usuário deste sistema este software agora é visto como uma aplicação de cálculo de lucros de vendas. As alterações no programa foram bastante pequenas, mas produziu um efeito significativo. A perspectiva de software como artefato deve considerar como o usuário vê a aplicação. Os modelos conceituais da funcionalidade do software são distintos. Desta forma, temos software distintos com aplicações em domínios distintos. O programa nos fornece uma visão de funcionamento. O usuário possui apenas a visão de funcionalidade. &lt;/p&gt;&lt;p&gt;Podemos modificar as mesmas linhas do programa para: &lt;/p&gt;&lt;pre&gt;escreva("Salário Bruto");&lt;br /&gt;escreva("Descontos");&lt;br /&gt;escreva("Salário líquido,C);&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;que produz um novo software. &lt;/p&gt;&lt;p&gt;Como este exemplo podemos entender melhor que embora o software seja um programa, ele precisa ser considerado como um artefato. Nestes exemplos, temos artefatos virtuais diferentes para programas com um mesmo algoritmo.&lt;/p&gt;&lt;p&gt;Para maiores informações, consulte o &lt;a href="http://www.dimap.ufrn.br/~jair/ES/slides/Software.pdf"&gt;material de aula (em PDF)&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6983429712622116184-7570022508631747013?l=engenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://engenhariadesoftware.blogspot.com/feeds/7570022508631747013/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6983429712622116184&amp;postID=7570022508631747013&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/7570022508631747013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6983429712622116184/posts/default/7570022508631747013'/><link rel='alternate' type='text/html' href='http://engenhariadesoftware.blogspot.com/2007/02/o-que-software.html' title='O que é software?'/><author><name>Jair C Leite</name><uri>http://www.blogger.com/profile/12313418294134299072</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-XF_wIXRypw0/TuAjC9wSLFI/AAAAAAAAHyM/UdnsgwIDBJk/s1600/jair.jpg'/></author><thr:total>0</thr:total></entry></feed>
