Tag Archives: Java

Professional Scrum Developer Java

Muito tem se falado de Scrum para gestão de projetos de software, de forma que a maioria das empresas estão buscando adotar este framework. Há graus diferentes de adoção no mercado mas todos eles precisam de profissionais qualificados para ajudá-los na sua trajetória.rutoreQuando se adota Scrum em um projeto de software, nunca podemos negligenciar as práticas de engenharia de software, necessárias para assegurar a qualidade e a produtividade da equipe, assim como reduzir o custo de manutenção do software produzido. Essas práticas não são tão difundidas quanto às práticas de gestão do Scrum, mesmo quando todas as empresas que usam Scrum para software devem utilizá-las.

Diante disso, a Crafters traz o curso de Professional Scrum Developer para o Brasil e América Latina. Um curso oficial da Scrum.org, entidade mantida pelo co-criador do Scrum, Ken Schwaber e montado especificamente para a plataforma Java. Este curso oferece ao participante o conhecimento das práticas de engenharia recomendadas pela comunidade Scrum de todo o mundo, baseado na experiência e vivência de seus instrutores e criadores. Os alunos aprenderão:

Read more →

Hello Ioke

Ioke LogoNo dia 23 de Dezembro de 2008 Ola Bini (desenvolvedor do JRuby e vários outros projetos) liberou a primeira versão de uma nova linguagem chamada Ioke.

Ioke já nasceu com certa popularidade devido aos vários posts sobre suas idéias em relação ao ioke. Apesar disso a comunidade de desenvolvedores tem por volta de 7 desenvolvedores ativos e as listas de email estão começando a caminhar. A versão “S” da linguagem acabou de ser liberada.

Ioke é desenvolvida em Java e é uma linguagem concebida para ser executada na JVM, por motivos óbvios de adoção e estabilidade. Qualquer um com bons conhecimentos de Java pode ajudar em seu desenvolvimento. É também baseada em linguagens como Io, Smalltalk, Ruby e Lisp.

Neste post quero apresentar superficialmente alguns dos conceitos básico da linguagem, que tem por objetivo principal, ser mais expressiva.

Ioke é uma linguagem dinâmica porém fortemente tipada. É baseada em protótipos, o que significa que não possui o conceito de classes. Todo e qualquer instância é criada a partir de protótipos (outros objetos) num processo de clonagem, ou imitação (mimic, como é chamado no Ioke) do comportamento e conhecimento de um objeto já existente.

Isso significa que em Ioke, tudo (tudo mesmo) é um objeto. Existem alguns objetos já embutidos na linguagem, que nos possibilitam imitá-los para criar nossos próprios objetos. Por exemplo:

myObj = Origin mimic

O código acima cria um objeto chamado myObj que faz mimic (imita) o objeto Origin que é um dos objetos básicos oferecidos por Ioke.

Instalação

Para instalar Ioke, você deve ter o JDK1.5 ou superior instalado em sua máquina e baixar o pacote binário do Ioke neste link. Depois, basta descompactar o arquivo em algum diretório de sua escolha e incluir a variável de ambiente IOKE_HOME apontando para o diretório de instalação do Ioke. Também acrescente IOKE_HOME/bin à variável de ambiente PATH.

Hello World

Como todo com artigo de programação vamos escrever o hello world em Ioke, passando por algumas características da linguagem. A seguinte linha imprime a famosa mensagem “Hello World!” na tela:

"Hello World from Ioke!" println

No código acima, podemos perceber a primeira grande diferença em relação a outras linguagens. Criamos um objeto que imita Text e ativamos a cell println. Atributos e métodos são chamados de cell em Ioke. Cells podem ser adicionadas ou removidas dinamicamente, permitindo criar objetos únicos em seu sistema. A cell println é definida no objeto Origin e está disponível em nosso Text, simplesmente porque Text imita Origin (Text = Origin mimic).

Outra grande diferença é que as mensagens para acionar uma cell não possuem pontos. Isso quer dizer que para chamar métodos ou acessar atributos não há um ‘.’ entre o objeto e a cell (método ou atributo). Reparem que println é uma cell do objeto "Hello world from Ioke", e para acessá-lo utilizamos apenas um espaço entre o objeto e a cell. Isso tem por meta, tornar a linguagem mais expressiva.

Vamos experimentar um pouco da dinamicidade do Ioke e entender melhor seu conceito de protótipos. Observe o seguinte código:

aObject = Origin mimic

aObject aCell = "Hello world in a cell"

aObject aCell println

Na linha 1 criamos um objeto chamado aObject e dizemos que este objeto deve ser baseado no objeto Origin do Ioke. Origin é um objeto embutido no Ioke, com o objetivo de prover um ponto de início para a maioria dos objetos. “Foi especialmente criado para ser a origem dos objetos” como dito no Ioke Guide. Origin por sua vez, imita Ground (outro objeto) que por sua vez imita Base e DefaultBehavior. Juntos esses objetos definem o comportamento de um objeto comum em Ioke. mimic é uma cell do objeto Base, que retorna uma intância que contém todas as cells do objeto no qual foi chamado (neste caso, Origin) incluindo as cells dos objetos que Origin imita (Ground, Base e DefaultBehavior).

Na segunda linha, adicionamos uma cell chamada aCell no objeto aObject. Na verdade, Ioke procura por uma cell com este nome e caso não encontre, esta cell é criada e adicionada dinamicamente no objeto. Esta cell recebe o valor literal "Hello World in a cell". Acabamos de criar um atributo para nosso objeto. É assim que definimos objetos específicos no Ioke.

A terceira e última linha, obtém o valor da cell aCell do objeto aObject e chama o método println do valor resultante da chamada aObject aCell. O valor contido em aCell apesar de ser literal, também é um objeto que imita Text que por sua vez imita Origin. Isso faz com que a chamada da última linha seja interpretada como "Hello world in a cell" println.

Como podemos observar, Ioke é uma linguagem não muito típica, porém com grandes promessas em termos de expressividade. Mesmo tendo sido mencionada pela primeira vez em Novembro de 2008 já possui duas versões muito capazes que incluem, execução de macros, aspectos, iSpecs (no estilo RSpec do Ruby). Há ainda muitas outras características interessantes no Ioke, porém isso é assunto para um outro post.

Read more →

Dynamic Typing – Capability versus Contract

Há algum tempo tenho sido um pouco mais que um simples curioso sobre a diferença CONCEITUAL entre as tipagem dinâmicas e estáticas.

Cada vez mais as pessoas tem se interessado por linguagens menos restritivas e com tipagem dinâmica. Esse fenômeno tem sido testemunhado por todos nós quando ouvimos falar sobre Ruby, Groovy, Phyton, ActionScript, JavaScript, Erlang, Lisp, Lua, etc.

Esse fenômeno tem se reforçado com a “novidade” que é o suporte a esse tipo de linguagem nas plataformas mais “robustas” ou pelo menos mais consolidadas no mercado corporativo, como a plataforma Java e .Net. Cada vez mais linguagens são suportadas por essas plataformas que são sinônimos de tecnologia nas empresas. Isso faz com que os desenvolvedores sejam atraídos por novos paradigmas e novas práticas de desenvolvimento extremamente baseados em Metaprogramação.

Metaprogramação significa escrever programas que manipulam programas e isso inclui manipular a si próprio. Imagine o poder de adicionar métodos em um objeto quando você bem entender? Não precisar especificar os tipos de variáveis e também ter a certeza de que tudo no seu código é um objeto, incluindo os métodos. Isso seria bom? Vamos analisar essa questão um pouco mais a fundo.

Em linguagens como Java, C, C++, C# etc., temos a segurança da tipagem estática. Podemos saber exatamente o tipo que será passado para um método na sua chamada. Podemos ter a certeza de que determinada variável terá os métodos que esperamos e assim não corremos o risco de pedir que um objeto faça algo que ele não é capaz de fazer. Essas são as vantagens da tipagem estática e são vantagens que não estão presentes nas linguagens que usam tipagem dinâmica. Isso faz com que a tipagem dinâmica exija mais disciplina ao escrever o código.

Por outro lado as linguagens de tipagem dinâmica oferecem recursos interessantes no quesito de metaprogramação. Pense em como podemos realizar metaprogramação em Java. Temos a classe Class que possui uma lista de métodos, porém esses métodos só podem ser definidos em tempo de compilação. O compilador verifica se o contrato definido está sendo cumprido. Aliás, essa questão de contrato é algo importante que devemos ter em mente quando programamos com tipagem estática. Veja um exemplo em Java:

interface Helper{
    public void helping();
    public void helpingALot();
}

Essa interface expressa um contrato a ser cumprido por qualquer objeto que aderir a ela. A partir do momento em que uma classe implementar essa interface, é obrigada a possuir uma implementação desse método como pode ser observado no código a seguir:


public class Man implements Helper {

       public void helping(){

              System.out.println(“I’m a man helping.”);

       }

       public void helpingALot(){

              System.out.println(“I’m a man helping a lot!!!”);

       }

}

 

Vamos ver agora o contrato sendo posto em prática, através da tipagem estática:


public static void helpMe(Helper helper){

       helper.helping();

}

public static void main(String args[]){

       helpMe(new Man());

}

O resultado desse código é I’m a man helping. Repare que deixamos explícito que somente objetos aderentes ao contrato estabelecido por Helper podem ser passados para o método helpMe(). Isso acontece por causa da tipagem estática. Isso é Design by Contract. Orientamos o design do nosso código para que exija um contrato específico e também possua aderência à um contrato também. Apesar de parecer mais seguro isso é bem restritivo e em algumas situações isso pode ser um problema.

Considere o exemplo acima. Estamos restringindo o recebimento de ajuda apenas para objetos do tipo Man (porque somente Man implementa Helper). Porém estamos automaticamente excluindo a opção de receber ajuda de outros objetos que possuam o método helping() sem nem mesmo implementar a interface Helper. Na verdade o que precisamos é de um objeto que possua o método helping e não de um objeto que implemente Helper. Continuando o exemplo, pense que uma Woman pode ser capaz de ajudar tanto quanto um Man, então considere o seguinte código:


public class Woman {

       public void helping(){

              System.out.println(“I’m a Woman helping.”);

       }

}

 

Nesse caso, uma Woman poderia servir para o que precisamos sem problema algum. Veja o código a seguir e pense sobre o resultado:


public static void helpMe(Helper helper){

       helper.helping();

}

public static void main(String args[]){

       helpMe(new Man());

       helpMe(new Woman());

}

 

Bom, nesse caso receberíamos uma InvalidArgumentException porque não podemos passar para o método helpMe() um objeto que não adere ao contrato mesmo sendo capaz de executar a aplicação.

No entanto, mude as extensões de seus arquivos de .java para .groovy e utilize as ferramentas de groovy para compilar e executar o código acima. O resultado será:

I’m a man helping. I’m a Woman helping.

Essa grande diferença fica ainda maior se considerarmos que nas linguagens dinâmicas, como Groovy, podemos adicionar métodos ao objetos em tempo de execução, o que nos termos apresentados significa poder adicionar capacidade de execução dinamicamente e conforme necessário. Isso determina que o design foca em capacidade de execução e não em um contrato pré-estabelecido. Isso tem nome e pode ser considerada um quebra de paradigma em arquitetura de aplicações. Chame de Design by Capability.

Read more →