quarta-feira, 26 de agosto de 2009

Mudando de Endereço

Olá a todos que visitam este blog. Venho avisar que estou mudando de endereço virtual, todos os meus textos vão agora para www.felipejrvieira.com.br

Sejam bem vindos!

sexta-feira, 8 de maio de 2009

Importância de um processo de software

Há algum tempo não posto nada. Provas, trabalhos e um pouco de preguiça são os responsáveis por isto, mas farei o possível para mudar esta situação. Neste texto de hoje reunir a resposta de duas questões da prova de engenharia de software que fiz. A primeira trata-se do que é um processo de software e suas vantangens, e a segunda, das características em comum dos processos de desenvolvimento ágeis.

Importância de um processo de software

Para desenvolver software de qualidade, temos que responder algumas questões: o que queremos fazer, como iremos fazer e quando iremos fazer, só após responder estas perguntas é que estamos prontos para colocar "a mão na massa", partir para a implementação e depois implantar e manter este software. E como faremos isto? O processo de software é a solução, ele que define como estas etapas devem ser realizadas, descrevendo-as, sendo um guia para o desenvolvimento do software.

Numa empresa nós possuímos pessoas, ferramentas e processos, as duas primeiras podem ser substituídas por motivos diversos, no entanto se não tivermos processos, podemos ocasionar a ruína desta organização nestas substituições.

Os processos trazem a padronização da forma como a empresa faz software, retira o conhecimento do sistema do analista, desenvolvedor, entre outros e o disponibiliza para a empresa de forma geral, facilitando o aprendizado de novos membros na equipe, a localização de falhas, entre outros casos.

Para o desenvolvimento dos processos existem modelos, frameworks que facilitam toda fase de produção, um desses é o modelo evolucionário espiral, que tem como um de seus representantes os modelos ágeis.

Os processos ágeis são focados no desenvolvimento, na entrega do software, para isto sacrificam um pouco da documentação, documenta-se o necessário. São projetos para grupos de poucas pessoas e privilegiam ao máximo a comunicação, a interação entre os envolvidos no projeto, reuniões diárias e o conhecimento de todas as etapas do software por todos é regra nos processos ágeis. Temos também a integração do cliente no desenvolvimento do software e a entrega de código funcional em iterações de tempo fixo. As dificuldades que eles apresentam estão na dimensão de prazos e custos da aplicação como um todo.

Desenvolver um processo de software é fundamental, tanto para uma grande organização, quanto para uma pequena empresa, e até mesmo para a utilização em projetos individuais que nos dedicamos a realizar por diversão. Evidentemente que neste último caso, não necessitamos de padrões muito rígidos, cheio de etapas e artefatos. A escolha por uma metodologia mais flúida é a opção mais interessante. Acostumar-se a isso faz com que estranhemos menos na hora de sermos contratados por uma empresa ou quando aceitamos desenvolver sistemas para outras pessoas.

domingo, 29 de março de 2009

Características do RUP

E vamos lá a mais um post sobre engenharia de software, desta vez nos adentraremos nas características do RUP. A cada aula que tenho de engenharia de software me interesso mais e percebo a importância desta área, tidas por muito como chata e desnecessária, mas fundamental para o progresso da informática.


Características do RUP

Muito se é debatido sobre como desenvolver software de qualidade e quais seriam as melhores práticas para se atingir este objetivo. Para isto muitas metodologias foram criadas, entre elas o RUP, Rational Unified Process, que, como seu nome diz é um processo unificado, conjunto das melhores práticas no desenvolvimento de software para uma grande faixa de projetos e organizações. Suas principais características estão em desenvolver de forma iterativa e incremental, desenvolver centrado na arquitetura, direcionar à solução de riscos, orientar por caso de uso, buscar o engajamento dos usuários, gerenciar cuidadosamente requisitos, controlar as mudanças, modelar o software visualmente, verificar continuamente a qualidade e ser configurável. Neste texto serão apresentadas as vantagens do RUP, proporcionadas por suas principais características.

A primeira característica a ser tratada é o desenvolvimento iterativo e incremental. Quando utilizamos modelos cascatas, sofremos o grande risco de atacar o problema de forma equivocada e só perceber isto após muito tempo de desenvolvimento do projeto, isto ocasionaria prejuízos, seriam tempo e dinheiro investidos de forma errada. Já, com uma modelagem iterativa, diminuímos muito este risco, como ocorre sempre contato com o usuário, temos certeza de focarmos o ponto correto, sem contar o fato de conseguirmos reduzir o problema em partes menores e nos centrarmos em resolver um problema de cada vez. É importante lembrar que a cada iteração incrementa-se mais funcionalidades ao produto, agregando valor e mostrando ao cliente o empenho no desenvolvimento do seu software.

A definição de uma arquitetura nas primeiras iterações é fundamental, pois é sobre ela que toda a aplicação será desenvolvida e sua definição possibilita o desenvolvimento em paralelo, reutilização de componentes e maior consistência da aplicação. Após esta definição, devemos nos preocupar com as soluções de maior risco, os pontos mais importantes do sistema, pois observando primeiramente elas, descobrimos necessidades e possíveis inviabilidades do projeto, podendo assim, renegociar funcionalidades se for preciso.

O RUP é orientado a casos de uso, esta é uma das formas pela qual representamos o comportamento executado por um sistema, é por isso que temos um ou mais casos de uso a cada iteração, pois é uma das formas que norteiam o desenvolvimento do software, mostrando o que temos que atender a cada uma das iterações. Para o RUP é fundamental que a cada iteração seja entregue uma versão executável da aplicação, e esta deve estar de acordo com os requisitos apresentados pelos casos de uso, este fundamento faz com que consiguamos um maior engajamento do usuário, já que o motivo do desenvolvimento é solucionar um problema relatado por ele e temos que possuir sempre este feedback, pois ele é o maior interessado no desenvolvimento.

A cada etapa, percebe-se que a maioria das características derivam do desenvolvimento iterativo, a utilização dele nos possibilita outras duas vantagens, a gerencia cuidadosa de requisitos e o controle das mudanças, como o ambiente é altamente mutável, temos que nos previnir em relação a estas mudanças e a cada iteração temos a possibilidade de analisar se os requisitos ainda são válidos. Outros fatores importantes a ser ressaltados são a modelagem visual, normalmente utilizando UML, que possibilita um entendimento mais rápido e menos ambíguo do que se deve ser feito, a qualidade, que é um processo contínuo do desenvolvimento e que os modelos são bases flexíveis para o desenvolvimento, podendo ser configurado para atender as necessidades do ambiente.

Com estas características percebemos as boas práticas proposta pelo RUP, práticas necessárias para o bom desenvolvimento de software, para maior confiabilidade na área pelos usuários que contratam serviços de TIC, para redução de riscos e custos nos projetos de desenvolvimento de software.

quinta-feira, 12 de março de 2009

Engenharia de Software - Primeira atividade

É, as aulas começaram. Já estou com diversas atividades para fazer, isto é bom, aprender coisas novas, vislumbrar novas tecnologias, entender processos e também ter material para postar aqui.
A primeira atividade foi fazer uma ficha de leitura do primeiro capítulo do livro de Engenharia de Software de Sommerville, que colocarei aqui na íntegra.

Ficha de Leitura

Dados Bibliográficos

Sommerville, Ian. Engenharia de Software. São Paulo: Addison Wesley, 2003. 6ª Edição. 1º Capítulo.


Resumo

Engenharia de software é uma disciplina que tem como meta o desenvolvimento de sistemas de software com boa relação custo-benefício. Seu surgimento se deu devido a complexidade que os software começaram a possuir com a melhoria dos recursos computacionais. Havia a necessidade da criação de técnicas e métodos que controlassem a complexidade dos processos de desenvolvimento de software, reduzindo, desta forma, o esforço para sua construção. Pois a utilização de abordagens informais ocasionava certos problemas como: atrasos no desenvolvimento do projeto, custos mal dimensionados, baixo desempenho, difícil manutenção e queda na confiabilidade.

É importante ressaltar que software não é apenas o programa, mas também toda a documentação associada e os dados de configuração necessários para fazer com que esses programas operem corretamente. A engenharia de software se ocupa de todo este material para a produção de software, desde os estágios iniciais de especificação do sistema até a manutenção depois que ele entrou em operação.

Mesmo a engenharia de software sendo uma área bem delimitada, existem muitas dúvidas entre as diferenças desta com a ciência da computação. A ciência da computação define teorias e os métodos básicos referentes aos computadores e sistemas de software, enquanto a engenharia de software se dedica aos problemas práticos da produção de software. Outra área que deve ser diferenciada é a engenharia de sistemas que se ocupa de todos os aspectos do desenvolvimento e da evolução de sistemas complexos, em que o software desempenha papel principal.

Como já foi trato, o objetivo da engenharia de software é construir um produto de software com boa relação custo-benefício, para isto é necessário um conjunto de atividades e resultados associados, conhecido como processo de software. Há quatro atividades de processo fundamentais comuns a todos os processos de software: especificação, desenvolvimento, validação e evolução do software. Podemos ter uma descrição simplificada de um processo de software, que é apresentada a partir de uma perspectiva específica, chamado de modelo de processo de software, existe diversos modelos gerais de desenvolvimento de software: modelo em cascata, desenvolvimento evoluiconário, transformação formal e desenvolvimento orientado a reuso. O modelo influi muito no custo, por exemplo o modelo em cascata consome maiores recursos na parte de integração e teste, enquanto o desenvolvimento evolucionário o maior custo está na parte de desenvolvimento.

Para facilitar a produção de software de boa qualidade, temos métodos de engenharia de software e ferramentas CASE (engenharia de software com o auxílio de computador). Mas o que seriam software de boa qualidade? Aqueles que refletem seu comportamento quando em funcionamento, a estrutura e a organização do programa fonte e também a documentação associada. Evidentemente que temos outros fatores de acordo com o objetivo da aplicação.

Além do desafio de produzir software de qualidade, os engenheiros de software tem alguns outros obstáculos, como fazer manutenção em software legado, programa antigo que realiza funções muito importantes e foi desenvolvido em uma época em que a utilização da engenharia de software era pouco difundida. A grande heterogeneidade dos ambientes computacionais, tendo a necessidade de construir aplicações bastante flexíveis. E outro problema é o desafio de construir aplicações que se adequem de forma ideal aos ambientes organizacionais extremante mutáveis.

Um ponto importante, que não podemos deixar de esquecer, é a responsabilidade e ética profissional dos engenheiros de software. Para esses profissionais é necessário manter a confidencialidade com empregadores ou clientes, aceitar atividades apenas quando forem competentes para realizá-las, respeitar as leis de propriedade intelectual, não empregar suas habilidades técnicas para o mau uso dos computadores.


Comentários

O primeiro capítulo do livro de Sommerville nos apresenta a importância do desenvolvimento de software de qualidade e de aplicar boas práticas neste desenvolvimento, esclarecendo diversas dúvidas, aparentemente simples, mas que persisti na mente de várias pessoas da área de computação, sem contar que ele mostra o valor que se tem um produto de software, tratando-o como deve ser tratado, como uma ferramenta essencial para a realização de atividades.

Para estudantes “iniciantes” em computação é muito importante para desfazer certas práticas erradas, como a utilização de abordagens informais, o não planejamento das atividades e tirar a visão equivocada de: - vamos desenvolver um “programinha”. Projetar é necessário, tanto para qualidade, quanto para agilidade e eficiência dos software desenvolvidos.

E algo extremantemente imprescindível, é a abordagem sobre responsabilidade profissional e ética. Como vivemos em uma sociedade da informação, onde milhões de dados trafegam a cada segundo, nós, futuros profissionais na área de TIC, temos que nos preocupar com nossa importância para a sociedade e respeitar os princípios éticos existentes.

domingo, 15 de fevereiro de 2009

Uma abordagem usando algoritmos genéticos em Agentes Inteligentes para Jogos

Atividade desenvolvida nas aulas de Tópicos Especiais em Inteligência Artificial, este foi o trabalho final da matéria, e, além disto, foi submetido ao Simpósio Brasileiro de Games [SBGAMES 2008] e aceito na track de computação como Technical Poster, para minha felicidade, primeiro trabalho aceito em um evento, a gente nunca esquece =D. Espero dar continuidade a este projeto e concluir o FightManager.

Até Breve!!!

P.S.: Agradecimentos ao professor Christiano que me apoiou muito e se esforçou para este projeto ser realizado.

Resumo

É consenso que a tomada de decisões bem como o comportamento assumido pelos personagens em um jogo é uma das áreas mais discutidas em Inteligência Artificial aplicada a jogos. Este artigo tem como objetivo propor o uso de algoritmos genéticos na criação de agentes inteligentes em jogos, sendo este o passo inicial para aplicações mais complexas, bem como apresentar o FightManager, aplicação desenvolvida durante as pesquisas como estudo de caso.


Poster

Poster apresentado na SBGames 2008 - Uma abordagem usando algoritmos genéticos em Agentes Inteligentes para Jogos

Trabalho Final

sexta-feira, 6 de fevereiro de 2009

Comparação de projetos de algoritmo na resolução do problema de fibonacci

Existem diversas técnicas para a elaboração de projeto de algoritmos, recursivo, tentativa e erro, divisão e conquista, programação dinâmica, entre outros. Para nos mostrar que cada técnica é utilizada para determinados fins, o professor de Estrutura de Dados II pediu que implementássemos a sequência de fibonacci utilizando os seguintes paradigmas, iterativo, recursivo e programação dinâmica, onde deveríamos compará-los e mostrar os dados recolhidos.

Abaixo estará os dados encontrados e as justificativas dadas, não coloquei os códigos , pois ainda não encontrei uma forma legal de exibí-los neste blog.

Gráficos e dados encontrados na execução

Resultado Fibonacci Iterativo
Desempenho Fibonacci Iterativo-----------------------------------------------------------------------------

Resultado Fibonacci Recursivo
Desempenho Fibonacci Recursivo-----------------------------------------------------------------------------

Resultado Fibonacci Programação Dinâmica
Desempenho Fibonacci Programação Dinâmica
Análise de Desempenho

Apesar dos algoritmos recursivos possuírem uma forma mais clara e concisa, existem situações em que seu uso é inviável, não possuindo um bom tempo de resposta, como demonstrado no algoritmo recursivo de Fibonacci, pois recalcula várias vezes o mesmo valor, observe, para achar o quinto termo da sequência de Fibonacci, é necessário calcular uma vez o quarto termo, duas o terceiro, três o segundo e duas o primeiro, isto faz com que um problema simples tenha uma solução de complexidade exponencial, tornando-se inapropriado. Alguns autores recomendam evitar o uso de recursividade quando existe uma solução óbvia por iteração.

Já a utilização do paradigma de programação dinâmica reduz drasticamente o tempo de execução do algoritmo, se comparado a forma recursiva, já que não há a necessidade de recalcular valores já processados. Isto faz com que este, em desempenho, se assemelhe muito a forma iterativa, como podemos observar nos resultados, a diferença se dá abaixo dos milissegundos. Para perceber a vantagem da forma iterativa em relação a esta, foi feito um somatório dos resultados encontrados. O tempo gasto para checar todos os termos na forma iterativa foi de apenas 1 milissegundo, já na dinâmica foram gastos 3 milissegundos.

sexta-feira, 30 de janeiro de 2009

A utilização da Web 2.0 como um diferencial competitivo nas organizações: estudo de caso aplicado ao SENAI-SE.

Dando continuidade a exposição dos trabalhos, será mostrado o que fala sobre Web 2.0, atividade desenvolvida nas aulas de Gestão da Informação. Nesta matéria, além das tradicionais formas de avaliação existentes, tivemos que manter um blog, quem tiver interesse, é só acessar Web 2.0 - Colaboração Acima De Tudo!.

Resumo

A Web 2.0 porporciona a interação entre todos envolvidos no processo de negócio. Este artigo tem o objetivo de apresentar formas de utilizar a Web 2.0 no ambiente corporativo, criando assim um diferencial competitivo. Foi desenvolvido um cenário hipotético através de um estudo de caso a ser aplicado ao Serviço Nacional de Aprendizagem Industrial de Sergipe (SENAI-SE). Para implantação deste cenário foram realizadas pesquisas sobre Gestão do Conhecimento, serviços e aplicações Web 2.0 como Blogs, Wikis, RSS, Mashup, Redes Sociais e Social Bookmarking e tecnologias AJAX, SOA e Família XML.


Apresentação em Slides



Trabalho Final