[Pesquisar este blog]

terça-feira, 18 de abril de 2017

C++ em 200 minutos

A veterana linguagem de programação C++ continua surpreendendo. É (ainda) uma das mais utilizadas, mesmo mais de 20 anos após sua proposta e padronização. Pelo menos é o aponta o TIOBE Index de abril de 2017.

Então, pode ser uma boa ideia conhecer os fundamentos desta linguagem. Esta é a proposta do minicurso C++200 (algo como C++ em 200 minutos) que fez parte da programação da  III Jornada de Pesquisa, Extensão e Cultura, realizada na FATEC Jundiaí  no período de 17 a 20 de abril de 2017.
Os slides da apresentação estão abaixo!
Aproveitem!

segunda-feira, 3 de abril de 2017

Os Princípios SOLID (parte I)

Parte I | Parte II | Parte III | Parte IV | Parte V | Parte VI
O que esperamos de um software? Com certeza, valor. Neste artigo vou falar um pouco sobre a importância do projeto de software, de como esta atividade agrega valor, e também sobre alguns critérios que podem ser utilizados para a avaliação do projeto, finalizando com uma visão geral sobre princípios importantes no uso da orientação a objetos, denominados SOLID (os quais pretendo retomar com detalhe nos próximos posts).
 

O que esperar do software

Os usuários sempre esperam obter alguma espécie de valor do software em uso. Esta noção de valor é determinada pela capacidade do software em: auxiliar o usuário a fazer algo melhor ou mais rápido ou ambos; o que significa aumentar a produtividade do usuário e, com isso, aumentar ganhos (de tempo, de qualidade ou financeiros) e reduzir também retrabalho e desperdícios (que representa reduzir custos, que também é outra forma de aumentar os ganhos).
Assim, o valor do software decorre dos ganhos que seu uso pode proporcionar. Para que o software possa, de fato, possibilitar ganhos, as necessidades do cliente, vistas em seu contexto, devem ser entendidas com clareza. Mas isto não basta.

Projeto de software

Dado um problema para o qual se pretende obter uma solução por meio de um software, é necessário realizar sua análise e, depois, o projeto da solução desejadas.
A análise se ocupa do entendimento do (domínio do) problema e pretende determinar o que deve ser feito para solucioná-lo. Para tanto a etapa de análise constrói um modelo conceitual da solução determinada.
O propósito do projeto é determinar como construir uma solução para o modelo definido pela análise, ou seja, seu objetivo é definir como tal modelo pode ser construído (ou programado, no caso do desenvolvimento de software).
A principal diferença entre a análise e o projeto é que a primeira envolve contato e a discussão com o cliente sobre a construção da solução conceitual. Já o projeto engloba detalhes relativos ao trabalho do programador, que em geral, não são de interesse do cliente.
Deve ficar claro que precisamos tanto de um trabalho de análise, como de projeto, bem feitos. É bastante típico que seja desejado que a análise e o projeto de software sejam realizados de maneira rápida, produzindo um software que atenda plenamente as necessidades de seus clientes, além de ser robusto, seguro e interoperável.
Outra maneira de observar a questão é procurar as características indesejáveis de um projeto de software, ou seja, aquilo que identifica um projeto ruim. Um projeto ruim é algo que, inevitavelmente leva ao software rot.

Software ROT

A expressão software rot, algo como "software podre", é semelhante aos termos code rot, bit rot, software erosion, software decay. Todas as expressões mencionadas descrevem a percepção do usuário sobre a deterioração da performance ou da funcionalidade do software ao longo do tempo, que progressivamente reduz sua utilidade, até que este se torne obsoleto ou inutilizável. Mas como isso pode ser verdade se um programa de computador não sofre qualquer tipo de envelhecimento físico? A questão aqui não é física, mas contextual.
Uma das principais causas do envelhecimento de um software é a evolução do seu contexto de utilização. Um programa pode ser bem projetado e implementado, atendendo plenamente as necessidades de seus usuários no momento em que é introduzido no mercado. A percepção nesta situação é o programa atende ou excede as expectativas existentes. Mas à medida que em que é usado, é bastante natural que os usuários percebam novas possibilidades para sua utilização, nem todas sendo atendidas pelo projeto inicial. Agora a percepção do usuário é que o software, mesmo que ainda bom e útil, poderia ser melhor. Esta piora da percepção é um sinal de envelhecimento.
Quanto maior o tempo, maior será a deterioração percebida em função da evolução das condições de uso do software. Produtos concorrentes que exibam diferenciais, além de defeitos observados no produto, acelerarão o processo de percepção de deterioração, quando, de fato, o software continua exatamente o mesmo.
A manutenção contínua do software, no sentido de corrigir-se os defeitos percebidos e, principalmente, incorporação de novas funcionalidades evolutivas, possibilitarão restaurar, no todo ou em parte, a percepção inicial de qualidade.
Sendo assim, a ausência ou insuficiência de manutenção causa a degradação do software, não em decorrência de envelhecimento real, mas sim da alterações nos requisitos de uso deste software.
Outro sentido de software rot, e das expressões semelhantes, se refere a implementação de aplicações que, por conta de deficiências no projeto, na documentação e na própria manutenção, se tornam uma massa desorganizada de código improvisado que os desenvolvedores tem dificuldade crescente em manter.

Projetos de Software::critérios de avaliação

Existem quatro critérios importantes para avaliar a qualidade de um projeto de software:
  • Rigidez;
  • Fragilidade;
  • Imobilidade; e
  • Viscosidade.
Critério da Rigidez
Este critério representa a imprevisibilidade do impacto relativo a uma mudança. Em um projeto rígido, toda e qualquer alteração causa uma sucessão de mudanças em módulos dependentes, produzindo um efeito dominó ou cascata, que representa a propagação indesejada da alteração efetuada. Assim, uma tarefa, em tese, simples, torna-se um trabalho hercúleo e, com isto os custos das alterações são imprevisíveis, bem como o tempo necessário para sua realização.

Critério da Fragilidade
Dizemos que um software é frágil quando tende a apresentar problemas em muitos pontos em cada mudança. Ou seja, as alterações efetuadas em um ponto do software acabam por causar problemas em outros pontos não relacionados conceitualmente. Assim, em cada reparo o software apresenta novos problemas não previstos, novamente com implicações negativas no custo e no tempo da manutenção.

Critério da Imobilidade
Em função de como um software é projetado, pode se tornar muito difícil, ou quase impossível, reutilizar partes do software em outros projetos, caracterizando a imobilidade (as parte de um software não podem ser movidas para outros). Desta maneira, mesmo os módulos úteis exibem muitas dependências com outras partes do software, dificultando ou impedindo seu reuso em outros projetos. Nesta situação, o custo de reescrever (refazer) acaba sendo menor do que o risco de separação das partes em função da imobilidade + rigidez + fragilidade.

Critério da Viscosidade
Também existem situações onde as deficiências no projeto ou em sua documentação, acabam estimulando a realização de pequenos consertos improvisados. Tais remendos (patches) são mais baratos de implementar do que os reparos maiores que proporcionariam soluções mais efetivas no projeto como um todo. Assim, a preservação consistente do projeto vai se tornando cada vez mais difícil de idealizar e implementar, tornando-o viscoso.

A razão central de todos esses problemas é o projeto mal feito, ingênuo, apressado, improvisado ou incompleto.

Bons projetos não são rígidos, possibilitando alteração que não se propagam no código; não são frágeis, garantindo que mudanças em um ponto não façam surgir problemas em módulos não correlatos; nem impõe a imobilidade; pois suas partes podem ser reutilizadas em outros projetos; muito menos viscosos; favorecendo que a manutenção seja realizada de maneira adequada. Então, bons projetos requerem conhecimento técnico, dedicação e, tão importante quanto isso, que práticas ruins sejam evitadas, enquanto práticas boas sejam adotadas.

Projeto de Software::características desejadas

Existem algumas características de são desejadas em qualquer projeto de software, independentemente de seu tamanho ou complexidade. Aqui podemos destacar dois conceitos centrais na construção de software: coesão e acoplamento. Além destes, também se deseja a componibilidade, a independência de contexto e a facilidade para teste.

Projeto de Software::características desejadas::coesão
O termo coesão (cohesion) foi definido por Tom DeMarco em 1979 e afirma que:
Cada módulo deve possuir apenas uma responsabilidade.

Isso implica em dividir as diversas responsabilidades identificadas na análise e no projeto em módulos distintos, de maneira que cada um possua apenas as características e funcionalidades estritamente necessárias à sua responsabilidade.
Num projeto orientado a objetos isto nos faria pensar sobre:
  • Quão bem os métodos e atributos de uma classe se articulam para definir seus propósitos?
  • Como uma classe se articula com as outras, sem descaracterizar seus próprios objetivos?
Assim, idealmente no projeto OO, cada classe deve possuir apenas uma responsabilidade, ficando claro seu próprio papel e propósito.
As implicações da coesão em um projeto são boas, pois:

  •  As alterações necessárias se concentram em módulos específicos;
  •  Torna-se mais fácil reutilizar aquilo que tem funcionalidade claramente delimitada.
Como é provável que a coesão absoluta seja difícil de obter, deseja-se que seja a maior ou mais alta possível, pois mais benefícios trará para o projeto durante sua implementação e também durante sua manutenção.

Projeto de Software::características desejadas::acoplamento
Esta outra característica se relaciona às dependências entre os módulos (classes num projeto OO) de um sistema. Deseja-se que cada módulo possua o menor número possível de dependências com outros módulos, ou seja, que os módulos sejam o mais independentes possíveis e, desta maneira, o acoplamento seja pequeno ou baixo.
As implicações do baixo acoplamento são:
·      Concentração das alterações em módulo específicos;
·      Menor a propagação das alterações efetuadas; e
·      Maior a chance de reaproveitamento (reuso) dos módulos.
No entanto, deve-se observar que o acoplamento não é um mal em si, pois  algum grau de acoplamento é inerente a criação de um sistema. Se um módulo não depende de nenhum outro, temos que seu acoplamento é zero. Mas se todos os módulos são assim, não existe um sistema, mas um amontoado, provavelmente inútil, de classes.
Isto significa que o acoplamento também é a extensão com que duas ou mais partes de um sistema estão relacionadas para criar mais valor do que partes individuais. Um grau adequado de acoplamento permite criar um sistema funcional, compreensível e manutenível.

Projeto::características desejadas::componibilidade
Deseja-se que os módulos de um projeto sejam componíveis, ou seja, que possam ser combinados de maneiras diferentes, produzindo funcionalidades distintas. Esta característica implica em:
·      Acrescentar novos módulos e, com isso, novas funcionalidades;
·      Modificar, no sentido de corrigir ou melhorar, os módulos existentes; e
·      Também facilitar o teste de cada componente.
O grande valor da componibilidade é o reuso das partes elaboradas para um sistema na construção de outros sistemas.

Projeto::características desejadas::contexto
Além do interesse em criar componentes que possam ser rearranjados e reutilizados, também se deseja que tal reuso possa ocorrer em contextos diferentes, ou seja, para auxiliar na solução de problemas existentes em outros domínios.
A independência de contexto possibilita:
·      Reutilizar os componentes do projeto para outros propósitos, em domínios diferentes;
·      Reuso ampliado, o que é um grande benefício.

Projeto de Software::avaliação das características desejadas
Observando-se em conjunto as características boas e ruins dos projetos, nota-se que estão correlacionadas. Muito da rigidez, da fragilidade, da imobilidade e da viscosidade são decorrentes da multiplicidade de papeis dos módulos existentes (i.e., de sua baixa coesão) e também da interdependência excessiva entre suas partes (i.e., de seu alto acoplamento). Tudo decorrência de projetos descuidados nesse sentido.
No projeto orientado a objetos (OO Design) as classes tem papel fundamental, pois são os elementos construtivos dos sistemas. Como modificações no escopo de qualquer sistema são inevitáveis com o passar do tempo, classes bem projetadas permitirão:

  • Codificação mais rápida;
  • Teste mais abrangente; e
  • Manutenção facilitada.
Para projetar boas classes e, com isso, construir bons sistemas, existem aspectos importantes que podem e devem ser observados, como indicam os princípios SOLID.

Princípios SOLID

Em 1995 Robert C. Martin (também conhecido como Uncle Bob) propôs um amplo conjunto de princípios de projeto e programação orientada a objetos que, posteriormente, tornaram-se conhecidos como SOLID, um acrônimo criado por Michael Feathers para designar os primeiros cinco dos princípios propostos.
A intenção destes princípios é orientar o programador na construção de sistemas mais fáceis de manter e ampliar com o passar do tempo, pois sem isso os softwares envelhecem e são percebidos como deteriorados.
Os princípios enunciados por Martin constituem um guia para refatoração do código, e também se enquadram nas estratégias ágeis e na abordagem adaptativa de construção de software.

O acrônimo SOLID é formado por:
  • Single Responsability Principle (Parte II)
  • Open-Closed Principle (Parte III)
  • Liskov`s Substitution Principle (Parte IV)
  • Interface Segregation Principle (Parte V)
  • Dependency Inversion Principle (Parte VI)
Estes cinco princípios podem ser, resumidamente, entendidos como segue.

O Single Responsability Principle ou Princípio da Responsabilidade Única afirma que uma classe deve ter uma, e apenas uma, razão para mudar. Assim, cada classe deve representar apenas um ator ou entidade, devendo ser escrita, modificada e mantida para apenas um propósito específico.

O Open Closed Principle ou Princípio Aberto-Fechado indica que os componentes de um software devem ser abertos para extensão e fechados para modificação. Isto significa que as classes e interfaces devem ser pensadas para permitir que sejam estendidas (pela mecanismo da herança), mas não para modificações nelas próprias.

O Liskov’s Substitution Principle ou Princípio da Substituição de Liskov determina que quaisquer tipos derivados (subclasses ou classes derivadas) devam ser completamente substituíveis por seus tipos base, de modo que tais substituições sejam transparentes e não causem qualquer erro.

O Interface Segregation Principle ou Princípio da Segregação de Interfaces requer que os clientes de módulos de software não devam ser forçados a
implementar métodos desnecessários que não sejam usados, reduzindo a burocracia .

O Dependency Inversion Principle ou Princípio da Inversão de Dependência estabelece a conveniência de um módulo depender de outros módulos mais abstratos, ao invés de elementos concretos (de substituição mais complexa).

A aplicação destes cinco princípios permite melhorar, e muito, a qualidade do software construído para qualquer projeto e, por isso, cada um merece mais atenção. Mas isto fica para os próximos posts!

Para Saber Mais

  • LARMAN, Craig. Utilizando UML e padrões: uma introdução à análise e ao projeto orientados à objetos e ao Processo Unificado. Porto Alegre: Bookman, 2007.
  • MARTIN, R. C.; et. al. Clean Code: a handbook of agile software craftsmanship. Boston: Pearson Education, 2009.
  • MARTIN, R. C. The Clean Coder. Upper Sadle River: Prentice-Hall, 2011.
  • MARTIN, R. C. Principles of OOD. Disponível em http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod, recuperado em 17/02/2017.
  • MARTIN, R. C. Get a SOLID start. Disponível em http://objectmentor.com, recuperado em 17/02/2017.
  • PAGE-JONES, Meilir. Fundamentos do Desenho Orientado a Objetos. São Paulo: Makron Books, 2001.
  • SOMMERVILLE, I. Software Engineering. 9th. Ed. Boston: Addison-Wesley, 2011.

sábado, 25 de fevereiro de 2017

Cursos Gratuitos na FGV

A Fundação Getúlio Vargas, membro do OpenCourseWare Consortium (OCWC) desde 2008, é uma das primeiras instituições de ensino superior brasileiras a oferecer cursos on-line e gratuitos. Isto é, de fato, uma oportunidade a ser aproveitada, principalmente porque existem conteúdos de diversas áreas (Direito, Gestão Financeira, Gestão Empresarial, Tecnologia e várias outras).
http://www5.fgv.br/fgvonline/Cursos/Gratuitos


Segue abaixo uma lista de links para uma seleção dos cursos disponíveis, o que permite obter mais informações e também efetuar as inscrições.

  1. Argumentação Jurídica
  2. Balanced Scorecard
  3. Ciência e Tecnologia
  4. Como fazer investimentos - básico
  5. Conhecimento, Saber e Ciência
  6. Espaço da Universidade na Sociedade
  7. Fundamentos da Gestão de TI
  8. Gerenciamento do Escopo de Projetos
  9. Relevância das Questões Ambientais
  10. Sustentabilidade Aplicada aos Negócios
E existem mais algumas dezenas de cursos além desses. Vale a pena conferir!



quinta-feira, 16 de fevereiro de 2017

MDA::Uma visão geral::Vantagens & Desvantagens (parte III)

Parte I::ApresentaçãoParte II::Desenvolvimento | Parte III::Vantagens&Desvantagens
Como qualquer outra tecnologia, a utilização da Model Driven Architecture (MDA) proporciona uma série de vantagens, mas também possui desvantagens. Conhecer então seus pontos fracos e fortes possibilita explorar todo o seu potencial em favor da solução dos problemas enfrentados.

Benefícios da utilização da MDA

Através do emprego da MDA espera-se obter os seguintes benefícios: produtividade, portabilidade, interoperabilidade, manutenabilidade, teste e validação e documentação.

Produtividade. Na MDA o foco da atividade de desenvolvimento é deslocado para a construção do Platform Independent Model (PIM), pois os Platform Specific Model (PSM) deverão ser obtidos através de transformações automáticas suportadas pelas ferramentas MDA. Embora as transformações envolvidas sejam complexas, requerendo especialistas em sua especificação, depois de definidas podem ser aplicadas em diferentes contextos, possibilitando o retorno do investimento em termos de produtividade. Eventualmente algumas transformações comuns na indústria podem ser adquiridas ou mesmo colocadas em domínio público. Outro ganho possível se relaciona ao fato da construção do PIM não envolver detalhes específicos de implementação, concentrando a atividade na correta definição do sistema. Além disso, a quantidade de código que deverá ser manualmente gerada é reduzida [3].

Portabilidade. Como um mesmo PIM pode ser transformado em diferentes PSMs, possibilitando que um sistema possa operar em diferentes plataformas, então a construção do PIM é portável para qualquer plataforma para a qual exista a definição da transformação PIM para PSM especificamente envolvida [3]. Para plataformas menos populares é possível a definição particular das transformações desejadas, assim como o surgimento de novas plataformas irá requerer apenas a definição do mapeamento específico, o que em tese maximiza a portabilidade de qualquer PIM com relação as tecnologias atuais e futuras [1][8].

Interoperabilidade. Os PSMs dirigidos para plataforma diferentes não são interoperáveis diretamente. Mas para não deixar esta questão em aberto, a MDA também prevê a existência de bridges entre os PSMs e também entre o código de cada plataforma. A própria geração destas bridges pode ser automatizada pois é conhecida a origem de cada elemento do PSM em termos de sua definição no PIM e, por conseguinte, qual o elemento correspondente no outro PSM de interesse sistemas legados podem ser integrados através de adaptadores (wrappers) especificados em termos da MDA [1]. Um PIM baseado em uma máquina virtual não exigirá transformações, mas sim o PIM da máquina virtual, o qual deverá ser mapeado em um PSM destinado a uma plataforma específica, mantendo o sistema independente de plataforma e interoperável naquelas aonde exista uma máquina virtual apropriada [5].

Manutenabilidade. Através de alterações no PIM do sistema é possível a geração de novos PSMs e código correspondente muito rapidamente, agilizando e barateando os procedimentos de manutenção do sistema. Com isto correções, adaptações ou mesmo a adição de novas funcionalidades tornam-se tarefas mais simples de serem realizadas, prolongando a vida útil do sistema [1]. Espera-se que boas ferramentas MDA permitam manter a correspondência adequada entre PIM e PSM nas situações em um ou outro destes modelos sejam modificados.

Teste e Validação. Da mesma forma que os modelos construídos podem ser automaticamente transformados em outros modelos e também em código, é possível que sejam validados segundo critérios pré-definidos e também testados dentro dos parâmetros das plataformas em que deverão operar [5]. Isto também abre algumas possibilidades em termos de simulação, reforçando o grande potencial da MDA na geração de sistemas mais robustos, portáteis e adequados as necessidades identificadas.

Documentação. A MDA é baseada na construção de modelos formais, que sob muitos aspectos correspondem a uma importante documentação do sistema. O PIM é o artefato mais importante, pois corresponde a uma documentação de alto nível [8]. Além disso, como tais modelos podem ser visualizados, armazenados e processados automaticamente, não são abandonados após a finalização do sistema, pois tanto o PIM, no nível de abstração mais alto, quanto o PSM, num nível de abstração intermediário, podem ser reutilizados para a incorporação de alterações no sistema ou mesmo sua migração para outras plataformas. Embora a formalização dos modelos necessários a MDA cumpra o papel de documentação do sistema, outras informações deverão ser adicionadas aos modelos, tais como os problemas e necessidades diagnosticadas bem como o racional das escolhas efetuadas [3].

Tais benefícios se refletem diretamente na redução dos custos de desenvolvimento, redução do tempo de desenvolvimento, aumento da qualidade das aplicações produzidas, aumento do retorno dos investimentos realizados e aceleração do processo de adoção de novas tecnologias, bem como simplificação dos problemas associados com a integração de sistemas [11].

Também se enfatiza o fato  dos modelos da MDA serem exibidos num maior ou menor nível de detalhes, permitindo a análise, conversão e comparação de modelos. Além disso, o mapeamento explícito entre os modelos, que possibilita sua transformação automática, permite a rastreabilidade e controle de versão dos artefatos utilizados [4].

A aplicação de padrões de projeto também é um dos benefícios a serem obtidos com a MDA, pois na transformação PIM para PSM é possível que padrões conhecidos possam ser aplicados no sistema em questão [5], automatizando algumas das etapas de construção dos componentes do sistema na tecnologia escolhida [14].

Booch [8] defende o emprego da MDA afirmando que seus praticantes não necessitam ser profissionais altamente gabaritados em UML, cujo trabalho iterativo em equipe deverá resolver as questões mais sérias das abstrações envolvidas na elaboração do PIM. Também argumenta que o uso de padrões de projeto é favorecido, que os ganhos em portabilidade e interoperabilidade são enormes e que com o desenvolvimento das ferramentas MDA os ganhos serão ainda maiores.

Outros aspectos, menos tangíveis, são: que a modelagem em alto nível favorece as tarefas de validação, pois os detalhes de implementação não estão inclusos no PIM; que a aplicação ou integração de plataformas diferentes tornam-se mais claramente definidas, facilitando a produção de implementações particulares [4].

Dificuldades na aplicação da MDA

A UML é uma linguagem de modelagem, que originalmente se destinava a oferecer uma forma visual de comunicação para representação dos principais conceitos e elementos de um sistema. Embora seja utilizada amplamente pela indústria de desenvolvimento de software, que reconhece suas muitas qualidades, deixa algumas lacunas: não possui uma semântica completamente formalizada, o que deixa brechas para diferentes interpretações e implementações de suas representações; não existe uma implementação de referência cuja semântica permita garantir a correta interpretação e transformação de seus modelos; não possui um formato de intercâmbio definido, o que dificulta o compartilhamento de seus modelos entre as ferramentas que a suportam; e requer o uso de várias outras linguagens de extensão para que sejam expressos elementos que não fazem parte do seu escopo (as restrições de atributos, por exemplo) ou para que seja armazenada e processada [15][9][17].

Apesar dos argumentos da “engenharia de modelagem”, um meta-modelo [9], tal como o PIM, permite a adição de novas funcionalidades com relativa facilidade, mas por si só não garante que tais funcionalidades se articulem de modo coerente. Assim continua nas mãos dos projetistas avaliar e garantir tal consistência, o que continua a exigir a alocação de profissionais experientes, onde percebemos que a MDA não contribui de forma efetiva neste sentido. COOK [18] argumenta que a neutralidade do PIM em termos de plataforma poderá significar, em última instância, perdas em termos de performance, o que poderá comprometer o desenvolvimento de sistemas com alto volume de transações ou em tempo real. Conforme MEDVIDOVIC et al. [19], apenas a UML não é suficiente para “capturar” todos os aspectos necessários a modelagem de uma arquitetura de software completa, necessitando de extensões ADL (Architecture Description Languages). O direcionamento da modelagem para domínios específicos (domain specific modeling) poderia trazer ganhos para MDA [7][18][20] possibilitando a geração de aplicações melhor ajustadas para suas efetivas condições de utilização.

Existem ainda as dificuldades na transformação PIM para PSM, pois além da oferta de uma enorme diversidade de plataformas (CCM, JavaEE, .NET [21], etc.), se tal transformação não for precisa o suficiente, a geração de código não será possível ou não produzirá os ganhos de produtividade esperados. Cada uma destas plataformas possui uma API bastante ampla, complexa e nem sempre bem documentada, é muito difícil a construção dos (standard mapping) para realização das transformações automáticas. Efetivamente só foram demonstrados os mapeamentos para CORBA [22][23] e JavaEE [14][18]. Existem sérias dúvidas quanto a capacidade e interesse da indústria de TI na confecção de UML profiles para todos os domínios específicos [15]. Ainda nesta questão, FOWLER [18] não vê ganhos adicionais da MDA quando comparada com os resultados do desenvolvimento sustentado por padrões, bibliotecas e frameworks.

Observamos também que dentre as diversas ferramentas oferecidas pelos inúmeros fornecedores que “adotaram” a MDA, nenhuma é capaz de realizar completamente as transformações entre PIM e PSM, ou mesmo efetuar a geração de código a partir do PSM, pelo menos não como idealizado pela proposta desta arquitetura. Efetivamente as ferramentas existentes apenas adaptam os métodos de trabalho previamente existentes numa “roupagem” MDA. Este cenário é desconfortável, pois remete a uma situação semelhante durante a década de 80, quando muito foi “prometido” para as ferramentas CASE (Computer Aided Software Engineering) e efetivamente pouco foi implementado e disponibilizado, mesmo que comercialmente [9][17][18].

Percebemos, finalmente, que nos mesmos argumentos que incentivam o uso da MDA residem algumas dúvidas, bastante sérias, quanto aos ganhos que podem ser obtidos.

Conclusões

A proposta da MDA é oferecer meios concretos para melhorar a produtividade, portabilidade, interoperabilidade, manutenabilidade e documentação de sistemas. Para isto esta arquitetura estabelece seu foco na modelagem da funcionalidade e comportamento de aplicações e sistemas distribuídos, separando os aspectos particulares das tecnologias que serão de fato usadas em sua implementação. Desta maneira é necessária a criação de modelos detalhados e representativos dos aspectos funcional-comportamental e tecnológico, onde se posiciona a UML e as demais linguagens que sustentam a MDA.

A UML, elemento central para a construção de modelos MDA, provê uma grande variedade de elementos para o projetista de software, tais como múltiplas visões inter-relacionadas do sistema, uma semântica que permite a expressão de meta-modelos e uma série de linguagens de extensão que permitem suprir outras necessidades. Mas como discutido, além de sua complexidade, a UML ainda não permite a definição semanticamente completa de modelos para qualquer domínio.

Embora seja coerente a proposta da OMG na utilização de outras linguagens complementares para expressão, armazenamento e processamento dos modelos necessários a operacionalização da MDA, isto adiciona uma complexidade indesejável ao processo.

Outro benefício proposto é a automação da tarefas de transformação através do emprego de técnicas de mapeamento dos modelos, mas neste ponto também residem dúvidas sobre a real capacidade das ferramentas oferecidas hoje e nos próximos anos, o que compromete parcialmente os ganhos prometidos.

Considerando este contraponto, concluímos que o principal benefício da MDA é, efetivamente, os ganhos de qualidade e neutralidade proporcionados pelas atividades de modelagem, especialmente quando realizada independente da plataforma. A automatização do processo de transformação destes modelos em outros tecnologicamente particularizados poderá trazer grandes ganhos, justificando os trabalhos de pesquisa realizados nesse sentido. Até lá, vale a pena utilizar os conceitos da “engenharia de modelagem”, mesmo que seus procedimentos sejam efetuados manualmente.

MDA::Uma visão geral

Versão adaptada do artigo de JANDL JUNIOR, P.. Uma análise da OMG Model Driven Architecture. Análise (Jundiaí), v. 11, p. 35­49, 2005. 

Para Saber Mais

(A numeração dos itens não é sequencial, pois só constam os elementos citados.)
  • [1] SOLEY, Richard. & OMG Staff Strategy Group. Model Driven Architecture. Object Management Group White Paper, 2000. Disponível em: http://www.omg.org/mda/mda_files/model_driven_architecture.htm, recuperado em 02/01/2017.
  • [3] KLEPPE, Anneke, WARMER , Jos & BAST, Wim. MDA Explained: The Model Driven Architecture - Practice and Promise. Addison-Wesley, Reading, MA, 2003.
  • [4] MILLER, Joaquin & MUKERJI, Jishnu. Model Driven Architecture (MDA). Object Management Group Architecture Board ORMSC. 2001. Disponível em: https://pdfs.semanticscholar.org/fab3/6d29bd18fe7743ab710caf9faacb495f10d7.pdf, recuperado em 26/10/2004.
  • [5] MILLER, Joaquin & MUKERJI, Jishnu (eds). MDA Guide Version 1.0.1. Objetc Management Group. 2003-05-01. Disponível em: http://www.omg.org/mda/mda_files/MDA_Guide_Version1-0.pdf, recuperado em 02/01/2017.
  • [7] MELLOR, S., SCOTT, K., UHL, A., WEISE, D.. MDA Distilled. Addison-Wesley, Reading, MA, 2004.
  • [8] BOOCH, Grady. MDA: A motivated manifesto IN Dr. Dobb's Magazine. 2004-08-01. Disponível em: http://www.drdobbs.com/architecture-and-design/mda-a-motivated-manifesto/184415169, recuperado em 02/01/2017.
  • [9] THOMAS, D.. MDA: Revenge of the modelers or UML utopia? IN IEEE Software, pages 22–24, May-Jun 2004.
  • [11] OMG. MDA (Model-Driven Architecture) Executive Overview. On-line: http://www.omg.org/mda/executive_overview.htm, recuperado em 02/01/2017. 
  • [14] ALEXANDRE, T.. Using design patterns to build dynamically extensible collaborative virtual environments. IN Proceedings of the 2nd international conference on Principles and practice of programming in Java, pages 21–23. Computer Science Press, Inc., 2003.
  • [15] THOMAS, D.. Unified or universal modeling language? IN Journal of Object Technology, 2(1):7–12, Jan-Feb 2003.
  • [17] FOWLER, Martin. Model Driven Architecture. On-line: http://martinfowler.com/bliki/ModelDrivenArchitecture.html, recuperado em 02/11/2004, 2004.
  • [18] COOK, S.. Domain-Specific Modeling and Model Driven Architecture. On-line: http://www.bptrends.com/publicationfiles/01-04\%20COL\%20Dom\%20Spec\%20Modeling\%20Frankel-Cook.pdf, recuperado em 02/11/2004. MDA Journal, 2004.
  • [19] MEDVIDOVIC, N, RESENBLUM, D. S., REDMILES, D. F., ROBBINS, J. E.. Modeling software architectures in the unified modeling language. IN ACM Transactions on Software Engineering and Methodology (TOSEM), 11(1):2–57, 2002.
  • [20] AGRAWAL, A.. Metamodel based model transformation language. IN Companion of the 18th annual ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, pages 386–387. ACM Press, 2003.
  • [21] MICROSOFT. Microsoft .NET Platform. On-line: http://www.microsoft.com/net/, recuperado em 28/09/2004.
  • [22] OMG. UML Profile for CORBA. Object Management Group White Paper, 2004. On-line: http://www.omg.org/technology/documents/formal/profile_corba.htm, recuperado em 22/10/2004.
  • [23] OMG. Common Object Request Broker Architecture. Object Management Group White Paper, 2004. On-line: http://www.omg.org/technology/documents/formal/corba_iiop.htm, recuperado em 26/10/2004

terça-feira, 14 de fevereiro de 2017

Cursos Gratuitos na USP

A Universidade de São Paulo disponibiliza uma série de cursos on-line, gratuitos, por meio da plataforma VEduca. É uma oportunidade muito interessante para estudar diversos conteúdos (Física, Saúde, Economia, Inovação, Gerenciamento de Projetos...) de maneira confortável e sem custos. Basta um tantinho de organização e alguma dedicação.

Segue a lista. Escolha um curso e ... aprenda!

  1. Física Básica
    http://www.veduca.com.br/cursos/gratuitos/fisica-basica
  2. Gestão de Projetos
    http://www.veduca.com.br/assistir/gestao-de-projetos
  3. Engenharia Econômica
    http://www.veduca.com.br/assistir/engenharia-economica
  4. Princípios de Sustentabilidade e Tecnologias Portadoras de Inovação
    http://www.veduca.com.br/assistir/principios-de-sustentabilidade-e-tecnologias-portadoras-de-inovacao
  5. Gestão do Desenvolvimento de Produtos e Serviços
    http://www.veduca.com.br/assistir/gestao-do-desenvolvimento-de-produtos-e-servicos
  6. Liderança, Gestão de Pessoas e do Conhecimento para Inovação
    http://www.veduca.com.br/assistir/lideranca-gestao-de-pessoas-e-do-conhecimento-para-inovacao
  7. Gestão da Inovação
    http://www.veduca.com.br/assistir/gestao-da-inovacao
  8. Medicina do Sono
    http://www.veduca.com.br/assistir/medicina-do-sono
  9. Oceanografia - Sistema Bentônico
    http://www.veduca.com.br/assistir/oceanografia-sistema-bentonico
  10. Eletromagnetismo
    http://www.veduca.com.br/assistir/eletromagnetismo
  11. Probabilidade & Estatística
    http://www.veduca.com.br/assistir/probabilidade-e-estatistica
  12. Sistemas Terra
    http://www.veduca.com.br/assistir/sistemas-terra
  13. Produção mais Limpa (P+L) e Ecologia Industrial
    http://www.veduca.com.br/assistir/producao-mais-limpa-pl-e-ecologia-industrial
  14. Instrumentos de Política e Sistemas de Gestão Ambiental
    http://www.veduca.com.br/assistir/instrumentos-de-politica-e-sistemas-de-gestao-ambiental
  15. Fundamentos de Administração
    http://www.veduca.com.br/assistir/fundamentos-de-administracao
  16. Visões do Brasil, Século XIX
    http://www.veduca.com.br/assistir/visoes-do-brasil-seculo-xix
  17. Escrita Científica: Produção de Artigos de Alto Impacto
    http://www.veduca.com.br/assistir/escrita-cientifica-producao-de-artigos-de-alto-impacto
  18. Escrita Científica
    http://www.veduca.com.br/cursos/gratuitos/escrita-cientifica
  19. Tópicos de Epistemologia e Didática
    http://www.veduca.com.br/assistir/topicos-de-epistemologia-e-didatica
  20. Atualidade de Sérgio Buarque de Holanda
    http://www.veduca.com.br/assistir/atualidade-de-sergio-buarque-de-holanda
  21. Economia Monetária - Moeda e Bancos
    http://www.veduca.com.br/assistir/economia-monetaria-moeda-e-bancos
  22. Empirismo e Pragmatismo Contemporâneos
    http://www.veduca.com.br/assistir/empirismo-e-pragmatismo-contemporaneos
  23. Filosofia e Intuição Poética na Modernidade
    http://www.veduca.com.br/assistir/filosofia-e-intuicao-poetica-na-modernidade
  24. Ciência Política: Qualidade da Democracia
    http://www.veduca.com.br/assistir/ciencia-politica-qualidade-da-democracia
  25. História do Brasil Colonial II
    http://www.veduca.com.br/assistir/historia-do-brasil-colonial-ii
  26. Enunciação
    http://www.veduca.com.br/assistir/enunciacao
  27. Libras
    http://www.veduca.com.br/cursos/gratuitos/libras

Além destes cursos, existem outros. Basta explorar a plataforma VEduca!