Archive for março, 2013

Análise e Projeto de Sistemas Orientados a Objetos

sábado, março 30th, 2013

No ano de 2006 elaborei meu trabalho de conclusão de curso sobre este tópico de Análise e Projeto de Sistemas Orientado a Objetos, pode ser acessado aqui ( a partir do capítulo 5 é que se inicia a parte de engenharia de software) . É um assunto pouco comentado, e até mesmo um pouco polêmico, pois é muitas vezes confundido com uma parte de documentação chata no desenvolvimento de software.

Mas muito pelo contrário, é uma fase fundamental para o sucesso na entrega do software. Pois é neste momentos que como já diz no título, analisamos e projetamos o futuro software, tentamos mapear o máximo possível das possibilidades nas regras é onde o usuário já tem uma ideia da carinha do sistema e também tudo que ele vai abranger nesta primeira entrega do software, ou seja, a importantíssima definição do escopo do projeto.

Neste ano de 2006, pesquisei bastante, li vários livros para ter um bom embasamento teórico na escrita do TCC e consequentemente aprendi várias técnicas para a análise e a elaboração de um bom projeto de software. É muito melhor pensar antes de executar, dominar um pouco, não tudo da linguagem UML também é fundamental para documentar esta fase de estudo, análise, reuniões, prototipagem e entendimento do negócio e suas regras que o futuro software irá atender.

A metodologia RUP (Rational Unified Process), também chamado de UP (Unified Process), Processo Unificado, que está fortemente associado à notação UML, é um processo de engenharia de software que oferece uma abordagem baseada em disciplinas para atribuir tarefas e responsabilidades dentro de uma organização de desenvolvimento. Sua meta é garantir a produção de software de alta qualidade que atenda às necessidades dos usuários dentro de um cronograma e de um orçamento previsível. A figura 1 exibi uma visão geral dos processos envolvido no RUP.

Figura 1 – RUP, visão geral (RUP, 2003)

Figura 1 – RUP, visão geral (RUP, 2003).

O RUP comporta, em suas recomendações, as antigas fases de estudo de viabilidade, análise de requisitos, análise de domínio, e o projeto em múltiplas camadas (WAZLAWICK, 2004).

O ciclo de vida de software do RUP é dividido em quatro fases sequenciais (Figura 2), cada uma concluída por um marco principal, ou seja, cada fase é basicamente um intervalo de tempo entre dois marcos principais.

Figura 2 – As fases e os marcos de um projeto RUP (RUP, 2003)

Figura 2 – As fases e os marcos de um projeto RUP (RUP, 2003)

 

WAZLAWICK, 2004 defini da seguinte forma as seguintes etapas.

– A fase de iniciação ou concepção incorpora o estudo de viabili­dade e uma parte da análise de requisitos.

– A fase de elaboração incorpora a maior parte da análise de requisitos, a análise de domínio e projeto.

– A fase de construção corresponde à programação e testes,

– e a fase de transição consiste na instalação e manutenção do sistema

A seguir defino melhor cada etapa do processo:

Fase de Iniciação ou Concepção

A fase de concepção, (inception), deve ser a primeira do pro­cesso de desenvolvimento de software, na qual se procura levantar os princi­pais requisitos e compreender o sistema de forma abrangente (WAZLAWICK, 2004).

Esta fase inicial indica o nascimento da idéia sobre um novo software. Pode consistir da discussão sobre um problema que ocorre na em­presa ou nos clientes e que eventualmente poderia ser resolvido ou minimizado com o desenvolvimento de um sistema informatizado (QUADROS, 2002).

Nesta etapa, não é realizado nenhum tipo de estudo aprofun­dado sobre o sistema, no entanto, podem ser feitas algumas projeções grossei­ras que permitam inferir, ainda que com pouca precisão QUADROS (2002): Quanto tempo o software levaria para ser desenvolvido? Quanto o software custaria para ser desenvolvido? Quais benefícios o projeto traria para a em­presa ou para o cliente?

Segundo RUP (2003)  os principais objetivos da fase de concepção incluem:

a)    Estabelecer o escopo do software do projeto e as condições limite, incluindo uma visão operacional, critérios de aceitação e o que deve ou não estar no produto.

b)    Discriminar os casos de uso críticos do sistema, os principais cenários de operação e o que direcionará as principais trocas de design.

c)    Exibir, e talvez demonstrar, pelo menos uma opção de arquitetura para alguns cenários básicos.

d)    Estimar o custo geral e a programação para o projeto inteiro (e estimativas detalhadas para a fase de elaboração imediatamente a seguir).

e)    Estimar riscos em potencial (as origens de imprevistos).

f)  Preparar o ambiente de suporte para o projeto.

 

A fase de concepção é onde se buscam as primeiras informações sobre o sistema a ser desenvolvido e contem as seguintes atividades:

  • Levantamento de requisitos
  • Organização dos requisitos.

A etapa de levantamento de requisitos corresponde a buscar junto ao usuário, seus sistemas e documentos, todas as informações possíveis sobre as funções que o sistema deve executar e as restrições sob as quais o sistema deve operar. O produto desta etapa será o documento de requisitos, primeiro componente do anteprojeto de software (WAZLAWICK, 2004).

A etapa de organização dos requisitos serve para estruturar os requisitos para que possam ser abordados nos ciclos de desenvolvimento. Grande parte dos requisitos será acomodada em processos de negócio conhecidos como casos de uso. Outros requisitos poderão ser associados a operações simples (como cadastros), outros ainda serão meramente consultas. Os casos de uso, cadastros e consultas serão abordados nos diferentes ciclos, priorizando-se os elementos mais críticos (normalmente casos de uso), e deixando-se para o final os mais elementares (cadastros e consultas) (WAZLAWICK, 2004).

 

Esta etapa é a de definição do escopo do projeto. Ao final desta, tem-se o primeiro Marco (milestone), o Lifecycle Objective Milestone, onde os seguintes resultados devem ser apresentados (QUADROS, 2002):

  • Sumário Executivo ou Documento de Visão Geral do Sistema, incluindo requerimento, recursos principais e restrições.
  • Glossário do projeto, explicando os termos peculiares ao desenvolvimento do mesmo (opcional).
  • Caso de uso inicial (descrito utilizando a UML).
  • Levantamento dos requisitos.
  • Um ou mais protótipos.

 

Fase de Elaboração

No início da elaboração, o profissional tem uma vaga idéia dos requisitos que o software deverá atender. Nesta fase, o profissional deverá investigar a fundo os obstáculos (riscos) que o projeto pode encontrar. Tais riscos como: Riscos de requisitos, riscos tecnológicos, riscos de habilidades, riscos políticos (QUADROS, 2002).

Além da análise dos riscos, a elaboração é marcada pela definição detalhada do escopo e dos requerimentos do software a ser desenvolvido. Esta definição dos requerimentos deve ser formalizada por escrito através de um documento denominado Documento de Levantamento e Especificação de Requerimentos de Usuário (DLERU). O DLERU deve ser submetido ao usuário/cliente sempre que possível para que ele seja avaliado (QUADROS, 2002).

A meta da fase de elaboração é criar a baseline (a base de sustentação) para a arquitetura do sistema a fim de fornecer uma base estável para o esforço da fase de construção. A arquitetura se desenvolve a partir de um exame dos requisitos mais significativos (aqueles que têm grande impacto na arquitetura do sistema) e de uma avaliação de risco. A estabilidade da arquitetura é avaliada através de um ou mais protótipos de arquitetura (RUP, 2003).

 

A fase de elaboração se inicia com uma sub-fase análise e prossegue com uma sub-fase de projeto. A sub-fase de análise em si comporta três atividades distintas realizadas na seguinte ordem (WAZLAWICK, 2004):

  • Expansão dos casos de uso e determinação dos eventos de sistema.
  • Construção do modelo conceitual.
  • Elaboração dos contratos de operações de sistema.

 

A expansão dos casos de uso corresponde ao aprofundamento da análise de requisitos. Já a modelagem conceitual corresponde à análise de domínio em seus aspectos estáticos. Por fim, a elaboração dos contratos corresponde à especificação funcional dos aspectos dinâmicos da análise de domínio (WAZLAWICK, 2004).

A subfase de projeto pode se dividir em diversas tarefas com objetivos distintos WAZLAWICK (2004). As tarefas serão:

  • Projeto da camada de domínio.
  • Projeto da camada de interface.
  • Projeto da camada de persistência.

 

O projeto da camada de domínio compõe-se basicamente de duas atividades: definir os diagramas de colaboração e elaborar o diagrama de classes de projeto (WAZLAWICK, 2004).

O projeto da camada de interface mostra como manter a independência entre a camada de domínio e a interface do software. O projeto da camada de persistência mostra como implementar um sistema de persistência que automatiza o salvamento e a recuperação de dados em disco (WAZLAWICK, 2004).

 

O objetivo dessa etapa é analisar o domínio do problema, estabelecer uma fundação, desenvolver o plano de projeto e eliminar os elementos de maior risco do projeto. Ao final dela, tem-se o segundo Marco (milestone), o Lifecycle Architecture Milestone, onde os seguintes resultados devem ser apresentados (QUADROS, 2002):

  • Um caso de uso praticamente pronto com uma descrição completa dos atores e cenários de uso.
  • Descrição das operações e consultas de sistema.
  • Modelagem Conceitual
  • Os Contratos de operações e consultas de sistema.

 

Fase de Construção

A construção é a fase do processo cujo final é marcado pela disponibilização do produto de software (um arquivo executável ou uma página Web, por exemplo) para os clientes ou usuários (QUADROS, 2002).

Durante essa etapa, os profissionais estarão primeiramente modelando o software utilizando alguma notação, tais como a definida pela UML. Após a modelagem, a fase de construção é marcada pela codificação do software, onde os desenvolvedores estarão fazendo uso de alguma ferramenta de programação, bem como criando as estruturas de apoio, tais como o banco de dados com suas tabelas e outros elementos (QUADROS, 2002).

A fase de construção é também composta pela homologação que consiste na realização de testes de garantia de qualidade como o produto antes do envio para o cliente. A documentação do produto encerra essa fase do processo de desenvolvimento, juntamente com a disponibilização de todo o conjunto do produto para o cliente (software, manuais de treinamento e referência). A vantagem desta abordagem está em se permitir definir deadlines (limites) intermediários pra os vários subprojetos, impedindo que os problemas e os atrasos se evidenciem apenas no final do projeto (QUADROS, 2002).

A meta da etapa de construção é esclarecer os requisitos restantes e concluir o desenvolvimento do sistema com base na arquitetura da baseline. A fase de construção é de certa forma um processo de manufatura, em que a ênfase está no gerenciamento de recursos e controle de operações para otimizar custos, programações e qualidade. Nesse sentido, a mentalidade do gerenciamento passa por uma transição do desenvolvimento da propriedade intelectual durante a iniciação e elaboração, para o desenvolvimento dos produtos que podem ser implantados durante a construção e transição (RUP, 2003).

Ao final desta etapa, temos o terceiro Marco (milestone), o Initial Operational Capability Milestone, onde os seguintes resultados devem ser apresentados (QUADROS, 2002):

  • O produto (software) completamente operacional.
  • Os manuais do produto.

O marco Capacidade Operacional Inicial determina se o produto está pronto para ser implantado em um ambiente de teste beta (RUP, 2003).

 

Fase de Transição

Nesta fase, o produto já foi entregue e são feitas as manutenções corretivas e as otimizações de pequeno porte (que não envolvam uma completa reconstrução do software) (QUADROS, 2002).

O foco da Fase de Transição é assegurar que o software esteja disponível para seus usuários finais. A Fase de Transição pode atravessar várias iterações e inclui testar o produto em preparação para release e ajustes pequenos com base no feedback do usuário. Nesse momento do ciclo de vida, o feedback do usuário deve priorizar o ajuste fino do produto, a configuração, a instalação e os problemas de usabilidade; todos os problemas estruturais mais graves devem ter sido trabalhado muito antes no ciclo de vida do projeto (RUP, 2003).

No fim do ciclo de vida da Fase de Transição, os objetivos devem ter sido atendidos e o projeto deve estar em uma posição para fechamento. Em alguns casos, o fim do ciclo de vida atual pode coincidir com o início de outro ciclo de vida no mesmo produto, conduzindo à nova geração ou versão do produto. Para outros projetos, o fim da Transição pode coincidir com uma liberação total dos artefatos a terceiros que poderão ser responsáveis pela operação, manutenção e melhorias no sistema liberado (RUP, 2003).

A Fase de Transição entra quando uma baseline estiver desenvolvida o suficiente para ser implantada no domínio do usuário final. Isso normalmente requer que algum subconjunto usável do sistema tenha sido concluído com nível de qualidade aceitável e documentação do usuário, de modo que a transição para o usuário forneça resultados positivos para todas as partes (RUP, 2003).

Com base na análise feita neste Marco, a empresa poderá decidir finalmente pela disponibilização do produto para os clientes. Ao final do projeto, deve ser feita também uma revisão do cronograma físico-financeiro de forma a avaliar a adequação final do projeto com relação ao planejamento inicial. A fase de transição poderá, dependendo do feedback dos usuários, coincidir com o início de um novo ciclo de desenvolvimento (QUADROS, 2002).

 

Referências

QUADROS, Moacir. Gerência de Projetos de Software. Técnicas e Ferramentas. São Paulo: Visual Books, 2002.

RUP. Rational Unified Process.  2003. Disponível em <http://www.wthreex.com/rup>.Acessado em: 24/04/2006.

WAZLAWICK, Raul Sidnei. Análise e Projeto de Sistemas de Informação Orientados a Objetos. Rio de Janeiro: Ed Campus Ltda, 2004.

 

O mais legal do Java

sábado, março 23rd, 2013

Muitos podem dizer que o mais legal do Java é linguagem de programação, outros a característica de rodar numa máquina virtual e ser multi-plataforma, ou então por ser amplamente utilizada e aberta, ou até mesmo pela riqueza de bibliotecas, APIs e frameworks. Mas eu digo que é outro fator, a sua organização. Quero falar um pouco de algo que pouca gente sabe, principalmente para os iniciantes e para quem não esta muito envolvido com o ambiente Java. Que é comunidade dos desenvolvedores da especificação da tecnologia Java, ou seja, a JCP (Java Community Process).

A JCP é a comunidade que define todo o futuro e evolução da tecnologia Java, no qual não é possível falar dela sem falar da JSR (Java Specification Request). Que nada mais é do que a especificação de uma funcionalidade, característica que plataforma Java deve possuir. Ou seja, a plataforma Java nada mais é do que uma composição de várias JSRs. Por exemplo, a JSR 220 possui toda a especificação da EJB 3.0, ou seja, é um documento contendo tudo o que o EJB 3.0 possui e mais uma implementação de referência. Um paralelo na orientação a objeto seria:  a JSR definiria a interface, a implementação de referência seria uma classe que nós implementaríamos de referência, e todos os servidores de aplicação com EJB 3.0 teriam que implementar esta interface.

E tudo que o Java possui, considero que isto é o mais legal do Java.  Ou seja, é uma comunidade livre, aberta e quem tiver interesse pode participar e até mesmo abrir uma JSR ou liderar uma. E cá entre nós, acredito que esse é o segredo do grande sucesso e da ampla utilização da plataforma Java pelo mundo.

Só para você ter uma ideia do poder da JCP, entre os membros do comitê executivo, estes membros são quem votam e escolhem quais são as JSRs que entrarão nas próximas versões e evoluções da tecnologia Java estão gigantes como: HP, IBM, Intel, Nokia, Oracle e SAP.

Aqui tem alguns dos membros da comunidade, e da pra ver que ela é composta por profissionais com muita bagagem, muita experiência e que trabalham em grandes empresas que são fornecedoras de tecnologia. E o mais importante, são de VÁRIAS empresas, é uma comunidade, quem quiser pode abrir uma JSR e várias empresas votam em prol da evolução do Java, o seja, não é algo fechado e definido internamente por uma única empresa.

Enfim, é isso que eu acho o mais legal do Java, ela é aberta, em constante evolução e praticamente formada por um consórcio de empresas e profissionais engajados na sua evolução. E além de tudo isso, É DE GRAÇA!

 

abraços,

Tadeu Gois

Java code conventions

sábado, março 16th, 2013

Meu primeiro post é sobre um tópico não muito valorizado e pouco discutido, pelo menos nas equipes no qual trabalhei, que é sobre convenção do código Java.

Acho que todo desenvolvedor Java, antes mesmo de começar a escrever uma linha de código, deveria ler esta documentação de padronização. O documento em PDF pode ser acessado por http://www.oracle.com/technetwork/java/codeconventions-150003.pdf . e é a convenção que o pessoal da SUN, criadores do Java,  seguiam e recomendavam. Abrange nomes de arquivos, organização de arquivos, recuo, comentários, declarações, espaço em branco, convenções de nomenclatura, as práticas de programação. Além de um exemplo de código.

Como mesmo diz no próprio site da Oracle que fala sobre estes padrões http://www.oracle.com/technetwork/java/codeconv-138413.html ,

– 80% do custo do tempo de vida de uma peça de software vai para manutenção.

– Dificilmente qualquer software é mantido por toda a sua vida pelo autor original.

– Convenções de código melhoram a legibilidade do software, facilitando o entendimento para os desenvolvedores no novo código. Ou seja,  um entendimento mais rápido e completo.

Portanto, não é difícil conhecer estas convenções, pode ser um pouco chato no início, mas com certeza vale a pena. Depois que acostumar a ler um código nesses padrões, quando você encontrar um código que esta fora das convenções você vai achar ele muito bagunçado e até mesmo um pouco sujo. Além do que, o documento esta bem escrito e abrange praticamente todas as situações possíveis e com um exemplo bem completo de código no final do documento.

 

abraços,

Tadeu Gois

 

 

 

 

Meu Início na Informática

segunda-feira, março 11th, 2013

Meu primeiro contato com computador foi por volta de 1996 no computador do meu primo que tinha aquela clássica tela preta doDOS que digitava o comando win para iniciar o windows 3.1 ou 3.11, não lembro exatamente qual versão era. Mais o jogo DOOM e o futebol com FIFA foram inesquecíveis. Lembro que esse micro era um 486 e tinha entrada para o disquete de 5″1/4!!

Minha querida mãe vendo o meu interesse em informática, comprou o meu primeiro computador em 1997. Com MS Windows 95 e o pacote Office completo, com um curso de MS Word em CD-ROM e livro. Em poucos dias dominava o MS Word e aos 14 anos já tinha decidido que curso de graduação iria fazer, era na área de tecnologia da informação sem sombra de dúvidas.

Em 1998 lembro que comprei minha primeira revista INFO buscando por conhecimentos mais avançados em informática. E a linguagem do momento era Delphi, ou seja, vou aprender Delphi! Mas antes pensei, vou fazer graduação numa universidade pública de qualidade, ou seja, UDESC ou UFSC. Ou seja, agora o desafio era passar no vestibular. Mas vale registrar que o meu primeiro contato com programação foi em Python, encontrei um tutorial na internet e embora fazer os programinhas de Hello World, entrada de dados e print da tela, fantástico!! Não via a hora de aprender a programar de verdade!

Em 2001 foi um ano fundamental na minha vida. Como terminei o 2º grau em 2000 e não passei nos vestibulares da UDESC e UFSC, 2001 foi o ano de pré-vestibular. Muito estudo, muitas madrugadas estudando, mas valeu muito a pena! Final de 2001 passei em 1ª chamada para UDESC em Ciência da Computação e 8ª ou 9ª chamada na opção 1-A na UFSC que era Sistemas de informação. Ou seja, vamos para Joinville estudar Ciência da Computação na UDESC.

Então em 2002 começou a brincadeira… Aprender algoritmos em portugol e depois a programar em Linguagem C foi muito legal! Os trabalhos eram entregues num disquete e rodar os programas feitos por você mesmo em C eram a realização de um sonho. Em apenas 1 semestre era bastante conteúdo, além de aprender a resolver problemas e pensar como algoritmos, (quem não lembra da sequência de Fibonacci e do fatorial) a linguagem C era vista num bom nível. Além de resolver problemas relativamente complexos em C terminamos trabalhando com struct e geração e leitura de arquivos binários. Ponteiros em C? Isso era ainda algo muito misterioso, o melhor ainda esta por vir no 2º semestre com AED (algoritmos e estrutura de dados). Aprender TDA (Tipo de Dados Abstratos) foi algo que muda a cabe&ccdil;a do programador, e linguagem C com ponteiros e alocação dinâmica de memória, tava tudo dominado.

Mas o que me ajudou muito a entrar de cabeça mesmo na área de desenvolvimento de softwares foi em 2003 quando me tornei monitor na disciplina de AED, ajudar os colegas a resolver os BUGs dos programas em C me fez aprender muito. Quero agradecer muito aos professores Gerson, meu primeiro professor de programação na disciplina de LPG-1, e ao Gilmário de AED. Que depois foi por mais 1 ano meu professor orientador na monitoria de AED. E este ano foi fundamental para minha carreira e meu crescimento como desenvolvedor de software. Também quero deixar um agradecimento a todos os professores que fizeram parte da minha formação tanto na graduação como na especialização, muito obrigado aos mestres!

Meu primeiro contato com a linguagem Java foi em 2004, até lá, pouco sabia a respeito do Java, o meu negócio era C. O que sabia era apenas que era uma linguagem orientada a objetos, não precisava se preocupar com alocação de memória e rodava multi-plataforma pela sua máquina virtual. Mas o primeiro trabalho nesta linguagem foi inesquecível. Era em sistemas distribuídos e era para desenvolver um sistema cliente-servidor se comunicando por RMI, e o cliente tinha interface com o usuário em Swing. Consegui fazer, mas foram algumas madrugadas acordadas e aprendi muito.

O ano de 2006 concluí o curso de graduação e meu TCC foi sobre análise e projeto de sistemas orientado a objetos. Que tem uma ótima abordagem do assunto baseando se muito no livro de WAZLAWICK, Raul Sidnei. Análise e Projeto de Sistemas de Informação Orientados a Objetos. Rio de Janeiro: Ed Campus Ltda, 2004.

A minha experiência profissional em Java começou em 2007, me lembro que era uma customização com Apache WebDav, e ai percebi o tamanho da plataforma Java, tudo que ela oferece, todas as ferramentas, APIS, etc… Era algo gigantesco para um programador que conhecia o C, um pouco de C++ e também PHP. Mas decidi que iria dominar esta linguagem e plataforma, sabia que não era algo rápido e que levaria anos, mas teria que ter um começo. E assim começou minha carreira como desenvolvedor em JAVA. Com muita dedicação, estudo e leitura de livros com forte embasamento teórico e prático, estudo para obtenção de certificações, pós-graduação com especialização em tecnologias Web com foco na linguagem Java, cursos por webcast e principalmente desenvolvendo programas com qualidade que ajudem e resolvam problemas para os usuários. E assim contínuo apredendo e evoluíndo para me tornar um profissional cada vez melhor.