Onde achar seus “heróis” e como pagar por eles de forma ótima

Outro dia, eu estava falando aqui sobre o mito do “herói” nas empresas, e sobre a importância de levantar um pouco o nível de quem está na parte mais longa da curva de pareto.

Hoje eu vou falar sobre a parte mais curta e alta da curva de pareto, e como levantar mais o nível desta faixa.

O grande problema do “herói” é descobrir onde ele está. O segundo problema é você poder pagar o que ele sabe (ou acha) que vale. E o terceiro é como mensurar se o que você está pagando (caro) por ele, vale a pena.

Raramente, uma empresa é feita só de heróis, como o Google, e quando é o caso, são talentos mais difíceis de reter. Como conciliar todas estas dificuldades?

Uma das soluções é colocar os heróis para brigar entre si. Aviso: muitos não irão topar, afinal, existe uma demanda para eles no mercado. Mas vale lembrar que alguns são muito competitivos e podem gostar do recado, sobretudo se houver uma regra de avaliação justa e imparcial, e se o prêmio compensar.

Foi com este pensamento que foi criada uma interessante variante de outsoucing chamada TopCoder, citada no meu post da ESPN. Funciona assim: uma empresa quer o desenvolvimento de um determinado componente, geralmente, de alto valor agregado, seja devido à complexidade, seja devido ao desempenho ou ao prazo. O jeito mais prático de resolver o problema é jogar na rede e dar um bom prêmio para a melhor solução, num esquema de competição com regras claras.

Claro que você não vai pedir, num esquema destes, o desenvolvimento de um sistema grande e complexo, porque a própria natureza do desenvolvimento destas coisas é interativa, variável e um tanto sujeita a imprevisibilidades. É outsourcing pura e simples. Só que outsourcing direcionado para os “all stars”.

Um interessante efeito colateral deste site é que algumas empresas usam o site para deixar pequenos projetos e propectar mão-de-obra. Afinal, uma experiência fala mais que currículos bonitos não é mesmo?

Desenvolvimento, Uncategorized 0 Comentários

Agile e UX (user experience)

Trocando idéias com a Karine Drumond, descobri mais um caso de metodologias ágeis aplicadas a áreas que não sáo de desenvolvimento de TI. Neste post anterior, falei rapidamente da agilidade para editoras, e agora temos um caso aplicado para Usabilidade.

(…)Outra questão é iterar o mais cedo, prototipar em papel e validar, seja conversando com um amigo que se encaixe no perfil do usuário. A comunicação é o mais importante. O objetivo é sempre o de alinhar o pensamento. Para isso tentamos fazer um trabalho em equipe mais alinhado, definir em conjunto o cronograma, as técnicas que vamos usar. Para geração de idéias, tentamos fazer seções de brainstorm em conjunto com cardsorting interno, o que agiliza o processo de discussão e alinhamento de idéias. Toda solução rascunhada é iterada. O processo fica mais leve e nosso pensamento mais alinhado durante o projeto, como consequência, a produtividade aumenta. É basicamente isso.

A gente pegou emprestado o termo que veio da área de TI e adaptamos à nossa metodologia. Mas, isso não veio exclusivamente da gente. O que a gente tem estudado é como adaptar nosso processo de UX ao processo de desenvolvimento de softwares, por isso temos experimentado empregar os princípios e temos aprendido boas lições.(…)

Achei muito interessante porque contrasta um pouco com a noção que se tem, por exemplo, do trabalho com agências de publicidade por exemplo. O processo de criação e ajustes em artes gráficas geralmente é dispendioso. Há até quem advogue que agências de publicidade deveriam cobrar a cada revisão de peça (que o cliente faça o briefing mais bem feito…).

Não tem como não comparar com as velhas metodologias dos grandes documentos de especificação em que o vai e volta de especificação e produto custa tempo e dinheiro de ambos os lados.

Por outro lado, nem todo tipo de serviço permite que o cliente seja tão interativo. Para muitos clientes, o tempo gasto ajudando a desenvolver o sistema (ou a experiência de usuário, ou o livro, etc) não é nada irrelevante. Um dos desafios das metodologias Agile é justamente que o cliente perceba o ganho global em termos de tempo de desenvolvimento (e nem sempre isso é possível) através da interatividade.

Quem implementa as metodologias ágeis lembra-se de colocar na conta o valor que o cliente dispende explicando o que quer que seja implementado?

Desenvolvimento, Usabilidade 2 Comentários

Software livre no seu carro: “Veneno” open source

Não preciso nem dizer que o Brasil tem tradição em automobilismo - nem que for pra lembrar das incontáveis manhãs de domingo com Fórmula 1. O que acho mais interessante é que nosso tesão por motorsports independe de suporte formal: apesar de alguns esforços heróicos não temos grandes equipes em categorias de ponta.

Mas isso nunca é problema quando se tem alguma criatividade. O extremo mais precário é um dos meus exemplos preferidos: são comuns em cidadezinhas do interior os “jericos” - carros inteiros construídos a partir de sucata, usando motores estacionários (feitos para serrarias, máquinas agrícolas pequenas, etc.). Daí para competições rústicas envolvendo esses carros, jipes e fuscas é um passo.

(Foto: Marco Antonio Teixeira)

(Foto: Marco Antônio Teixeira)

Algumas soluções técnicas pouco convencionais (gambiarras mesmo) fizeram história no automobilismo brasileiro. Em 1969, os jovens Emerson e Wilson Fittipaldi disputaram os Mil Quilômetros da Guanabara ao lado de lendas como Ford GT40 e Alfa P33, a bordo de um Fusca de 400 cavalos, vindos de dois motores acoplados por uma junta elástica de borracha!

(Foto: obvio.ind.br)

Nos anos 1970 e 1980, qualquer um que pensasse em esportivo no Brasil tinha que falar do Opala, e necessariamente do “veneno” - modificações no motor como troca de carburador, bicos injetores e comando de válvulas para deixar o motor seis cilindros do que hoje é um dos maiores clássicos brasileiros ainda mais bravo e, obviamente, divertido.

Opalão SS 9 Silver Star

(Foto: Opala Club de Bragança Paulista)

A chegada da injeção eletrônica ao Brasil com o Gol GTI, em 1989, foi o início de uma grande mudança: agora um programa de computador, sensores e atuadores eletrônicos passariam a ditar o comportamento (e o consumo) do motor, e a era do veneno clássico, dos carburadores Quadrijet e de tantos outros truques começava a terminar.

Só que a história não acaba aqui! No início dos 1990 tomava força também, no mundo todo, uma outra revolução: a do software livre e aberto. Programadores de computador, cientistas da computação, hobbyistas e entusiastas chegavam à conclusão de que o código-fonte dos programas não devia ser trancafiado a sete chaves numa catedral, mas sim compartilhado e melhorado de forma cooperativa e distribuída.

Essa cooperação e o livre fluxo de informação levava ao desenvolvimento de programas e sistemas mais robustos, seguros e eficientes. E o que isso tem a ver com carros esportivos ? A resposta é simples: já que o software domina o seu carro, domine o software e você vai conseguir um “veneno” que de virtual não tem nada!

Provavelmente o exemplo mais famoso disso é a MegaSquirt, um sistema completo de injeção eletrônica, com todos os sensores e um microprocessador de 8 ou 16 bits que controla os bicos injetores e ignição das velas, baseado em software livre. A Mega Squirt é comprada pelo correio, aos pouquinhos, montada nos mais diferentes tipos de carros, e configurada de diversas formas conforme os objetivos da preparação, na melhor tradição DIY (Do It Yourself, “faça você mesmo”):

Componentes da MegaSquirt

(Foto: Marcelo Garcia)

Para “conversar” com a MegaSquirt e fornecer uma interface para o piloto / mecânico / programador / usuário, usa-se um outro software livre, o MegaTunix, originalmente desenvolvido para o Linux e hoje disponível em diversos sistemas operacionais, incluindo o Windows.

Uma das funções mais divertidas do MegaTunix é emular os caríssimos “relógios autometer” (mostradores incluindo conta-giros, termômetros, razão ar/combustível, etc.): tudo é mostrado no monitor de um notebook ou palmtop, e o usuário pode definir exatamente qual o visual ele quer.

MegaTunix / MegaSquirt

MegaTunix rodando em notebook conectado à MegaSquirt

(Foto: Marcelo Garcia)

E é a flexibilidade do código aberto que permite que sistemas assim sejam tão interessantes. O Marcelo Garcia, que forneceu fotos e consultoria para esse artigo, dá um exemplo da liberdade a que se tem acesso: ele conta que é possível, usando bastante engenhosidade, um fogão, multímetro e outros truques, atualizar o firmware da MegaSquirt para que ela usasse sensores de temperatura de qualquer carro em qualquer motor. Uma mão na roda para quem tem carros antigos (dos quais não se encontram mais peças originais) ou exóticos (cujas peças custam uma fortuna).

Calibrando sensores de temperatura no fogão

Calibrando sensores de temperatura no fogão

(Foto: Marcelo Garcia)

É claro que há limites para o que é possível fazer com software; nem o hacker mais brilhante do mundo vai fazer seu Uninho 1.0 rodar 25 km/l ou andar junto com o Opalão seis cilindros do seu tio. Mas saber que o “veneno” feito-em-casa ainda existe apesar de todas as inovações tecnológicas das últimas décadas é muito, muito bacana - e dá um outro sentido à expressão computador de bordo!

Automação, Desenvolvimento, Inovação, Processamento de Sinais 2 Comentários

O (mito?) do herói no desenvolvimento de software

Vou continuar aqui um papo que eu comecei num fórum do mundo.it. (vc tem que se cadastrar para acessar. É chato, mas é de graça, e até bem rápido prá dizer a verdade)

Existe uma prática, ou crença, mais ou menos disseminada na gestão de projetos de TI, que é a figura do herói.

Prá quem nunca desenvolveu em equipe, o herói é aquele desenvolvedor bem acima da média, cujo esforço e talento individuais são fundamentais para “salvar” aquele projeto que estava atrasado, ou quase batendo os prazos, ou no caso mais comum, quando o prazo já está estourado e estamos falando de minimizar os danos.

Em inglês, o herói é o que chamamos de “big guns”. Quando a coisa está feia no front, traga os maiores canhões que puder para vencer a batalha.

Em alguns casos, a indústria vende a promessa que o herói será recompensado, mas você também vai ouvir vozes dissonantes dizendo que é bobagem tentar ser o herói.

Como é de se esperar, existem poucos heróis por aí. As empresas de TI disputam estes caras a tapa, e muitas vezes o passe deles se eleva (ou não, também é comum o excelente profissional de TI ralar do mesmo jeito por uma variação a mais no salário que não é proporcional ao seu talento).

Mas o fato é que existe um pouco dessa cultura da “equipe de gente normal com um cara muito bom liderando”. Até aí, nada de novo, afinal, nada melhor que trabalhar com gente boa de serviço que saiba compartilhar o conhecimento para elevar o nível geral do time e incutir algum pequeno senso saudável de “competição” ou de “não quero ficar muito prá trás”.

O problema vem quando as empresas montam esquemas de incentivos em que o jogo perde a graça, se por exemplo for o time da Albânia com o Ronaldinho no ataque. Quando as empresas privilegiam ou premiam apenas os heróis, o resto da equipe pode simplesmente chegar à conclusão que a meta do prêmio é inalcançável, e aí começa-se a “montar” no trabalho de quem se sobressai, ou assumir sempre que ele vai solucionar tudo.

Isso fica ainda um pouco mais complicado se você pensar numa indústria onde a caça aos talentos é intensa. Qual o impacto para um projeto se o seu herói é comprado pela concorrência? Quanto tempo você leva para achar outro herói?

É interessante pq muito se vê por aí sobre profissionais da área de TI que reclamam da falta de investimento no profissional por parte das empresas. Muito disto vem da idéia dos empresários que “eu posso estar gastando para capacitar o profissional para a concorrência, pq não estou disposto a pagar por uma pessoa mais capacitada“. E aí vira aquele jogo de empurra, das empresas reclamando do ensino e etc. Mas quais são as políticas destas empresas para incentivar seu corpo técnico?

Outro dia ouvi um exemplo interessante aplicado a uma equipe de vendas de um produto que não tem nada a ver com tecnologia, mas como se sabe, desenvolvimento de software não é feito com tecnologia, mas sim com seres humanos.

O exemplo era o seguinte, muito simples: é muito comum premiar os melhores vendedores como forma de incentivo. O problema aqui é o mesmo do herói. O bom vendedor é bom sempre, é um talento inerente. Então os prêmios vão sempre para as mesmas pessoas.

Pois bem, propuseram um modelo de incentivos baseado em metas que eram alcançáveis por qualquer um da equipe. E sem sorteio.

Mais especificamente, fizeram um acordo com um fabricante de artigos de couro, e compraram em grande quantidade de pastas bacanas, que todos os vendedores adoravam. E fizeram a seguinte proposta: vamos supor que cada vendedor venda em média 10 unidades do produto, e que o bom vendedor venda 60 unidades. Quem vendesse 20 unidades ganharia, sem sorteio, as pastas.

O resultado, como você pode imaginar, é que a grande massa de vendedores que vendia 10 unidades, pensou ao mesmo tempo que mais 10 unidades não era uma meta fácil, mas era bastante factível. Não só isso, mas os que vendiam 30 unidades, “passavam” as 10 unidades restantes para outros e negociavam uma parte da pasta… bem, histórias de varejo são quase sempre divertidas :-).

Desenvolvedores e vendedores são espécies muito diferentes entre si. Mas é certo que seres humanos respondem a incentivos.

A conta não é difícil de fazer. Se vc tem um “herói”, ele vai ganhar a pasta de qualquer jeito mesmo, mas qual o valor do incremento de produtividade na grande massa de vendedores “normais”?

O processo de desenvolvimento de software se torna cada vez mais organizado e mensurável a cada dia que passa, com o uso de processos mais organizados de desenvolvimento. Mas o que os gerentes de projeto fazem com estes números, além de levantar alertas a cada prazo perdido, pressionando e aliviando os desenvolvedores?

Quantos destes gerentes saem da rotina diária de monitoramento e pensam estrategicamente o que fazer com estes dados? Qual a vantagem para o seu projeto se você conseguir criar um incentivo que melhore a produtividade do seu time em 10% ou 15% por exemplo?

Talvez seu “prêmio” possa até ser bem legal… mas você precisa saber o que mexe com o coração e o ego do seu time. São pessoas, como todas as outras. Ninguém sacrifica família e vida pessoal por um pendrive. Bons funcionários demandam reconhecimento.

O cínico vai dizer que é “a cenoura na frente do burro”, mas para mim, me parece um trato razoável. Cumpra o prazo e você está fazendo a sua parte. Faça melhor dentro da sua capacidade e você é premiado pelo esforço extra. Mas só funciona com prazos que não são artificiais. Não se consegue incentivar ninguém sem ser justo.

Quantos gerentes vêem as pessoas atrás dos números? Pessoas devidamente motivadas são capazes das coisas mais geniais. Às vezes, o que falta, é saber dar a devida chance. Bolar o incentivo correto, claro, é uma das grandes questões aqui.

Outras questões são “qual a política da sua empresa para melhorar o desempenho da camada média de desenvolvedores” e “como não transformar a política de incentivos num cabo de guerra na estimativa de prazos”…

Será que existe um jeito? O RH da sua empresa sabe quais cordas puxar para incentivar a produtividade das pessoas? Ou o estímulo é aquela espada pendendo sobre a cabeça de cada um, chamado “desemprego”?

Desenvolvimento 0 Comentários

Criatividade e Design Patterns

Ninguém pode negar que os Design Patterns, ou “padrões de projeto” ou “padrões de desenho”, formalizados no famoso livro do GoF (gang of four - a turma dos quatro, ou Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides) foi uma mudança muito significativa em toda a indústria de software.

A proposta era simples: uma vez estudadas diversas práticas de programação de “bons programadores”, eram identificadas algumas técnicas de design inteligentes que sempre apareciam mais ou menos de forma parecida para resolver problemas parecidos. Cada padrão era estudado e, voilá, junte vários destes e classifique-os e você tem um manual de “boas maneiras” para o desenvolvimento de software.

O benefício imediato, óbvio, é que ao se deparar com um problema de design, o desenvolvedor não precisa pensar numa solução do zero. Basta ir no compêndio de design patterns e procurar qual design resolve que tipo de problema.

Outro benefício indireto, mas igualmente importante, é trazer uma série de nomes para determinadas estruturas mentais, que facilitam a comunicação entre desenvolvedores. Ninguém precisa ficar explicando o que é um singleton se todo mundo já sabe o que é. Ganha-se tempo e leva-se a discussão um nível acima.

E daí você pode ter ferramentas que automatizam a geração destes códigos, discussões acerca das vantagens e desvantagens de cada pattern, e etc. Hoje em dia, existem patterns para praticamente todas as áreas específicas do desenvolvimento de software. É uma forma de reuso do conhecimento.

Mas como tudo na vida, nem tudo é perfeito.

Alguns anos atrás, eu estava conversando com um economista e falando dessa coisa de design patterns, e o cara mostrou uma cara de espanto, e falou: “que engraçado… em algumas situações na economia, pedimos para o aluno nunca procurar as soluções prontas, mas sempre tentar encontrar a solução por ele mesmo primeiro, para só depois recorrer à literatura… assim incentivamos a criatividade dos alunos e forçamos eles a pensarem…”

Pode parecer improdutivo, e de fato, na engenharia de software, é uma bela vantagem ter na manga uma série de soluções prontas que “funcionam comprovadamente” e não perder tempo reinventando a roda. Mas do ponto de vista criativo, assumir que os design patterns estão sempre certos, ou que são sempre a solução, também é uma faca de dois legumes.

A postura do inovador deve ser sempre questionadora. Haveria maneira melhor de resolver este problema? Este design pattern é realmente o mais adequado para a minha demanda? Quais são os fatores que poderiam levar este design a uma possível desvantagem? Quais tipos de problema poderiam advir do uso desta solução?

Se seu negócio é prazo, ficar pensando demais é perder tempo. Mas se seu negócio é inovar e criar soluções que sejam vantajosas diante do que é praticado em toda a indústria, nem sempre seguir o que existe pode ser a vantagem.

E no fim das contas, espírito crítico nunca faz mal a ninguém.

Desenvolvimento, Inovação 0 Comentários

Groovy, outro sabor na JVM

(Nota do editor: Ainda na série “try a little help from my friends”, a contribuição do nosso amigo Wilson Freitas)

Desde que comecei a trabalhar com linguagens fortemente tipadas, passei a tratar tipagem estática como um dogma. Simplemente não fazia sentido usar uma linguagem que não verificasse os tipos em tempo de compilação. Com o tempo algumas linguagens começaram a despontar na mídia: Ruby e Python são duas que despertaram minha curiosidade. Mas a enorme inércia de anos e anos trabalhando na plataforma Java tratou de matar minha vontade de aprender (mais) uma linguagem de programação.

Quando falo de anos trabalhando com Java, não estou me referindo apenas à linguagem, mas a todo o mundaréu de frameworks e especificações tais como Hibernate, Struts, Spring, Jakarta*, EJB, JNDI, JMS, e mais trocentas mil coisas que não cabem neste post. É muito difícil para um profissional abrir mão de toda essa parafernália que gastou anos aprendendo pra começar a trabalhar com uma linguagem completamente nova, tendo que descobrir como fazer aquelas coisas que em Java estão “na ponta da língua”.

Então, um belo dia eu vi um artigo qualquer sobre uma tal de Groovy. A princípio achei que era mais uma linguagem: “putz, pra que o povo inventa tanta linguagem!”, mas algumas coisas me chamaram a atenção:

  • Assim como Ruby, Groovy é uma linguagem dinâmica que permite malabarismos impensáveis em Java.
  • Groovy tem um interpretador que gera Java byte code sob demanda, que em seguida é executado por uma JVM comum, o que permite criar scripts que podem ser executados diretamente na linha de comando.
  • Groovy é um “sabor” de Java. A sintaxe é muito parecida, o que a torna muito fácil para quem já está acostumado com o velho Java.
  • Como no final das contas tudo é byte code, classes Java podem ser instanciadas em código Groovy e vice versa, ou seja, todos os milhares de trecos que já foram escritos em Java podem ser usados dentro de código Groovy.

Estas características do Groovy me convenceram que valia a pena estudar a linguagem, que vem sendo a minha porta de entrada para o paradigma de linguagens dinâmicas. Ainda não estou usando o Groovy no desenvolvimento em si, mas como uma ferramenta de apoio a algumas tarefas do dia a dia, como processamento de arquivos em lote por exemplo.

Não vou alongar este post enumerando as features do Groovy, mesmo porque elas podem ser facilmente encontradas no site oficial, vou me limitar a mostrar dois trechos de código, um em Groovy e outro em Java, que executam a mesma tarefa, que é aplicar um filtro uma lista de mapas, gerando uma segunda lista com os itens filtrados.

código JAVA

import java.util.*;

public class ExemploJava {

public static void main(String[] args) {
  new ExemploJava().rodarExemplo();
}

public void rodarExemplo(){
  List<Map<String, Object>> personagensLost =
  new ArrayList<Map<String,Object>>();

  personagensLost.add(obterPersonagem(”Kate”, 28));
  personagensLost.add(obterPersonagem(”Jack”, 38));
  personagensLost.add(obterPersonagem(”Desmond”, 39));
  personagensLost.add(obterPersonagem(”Hurley”, 27));
  personagensLost.add(obterPersonagem(”Locke”, 50));
  personagensLost.add(obterPersonagem(”Walt”, 12));

  List<Map<String, Object>> personagensFitrados =
  new ArrayList<Map<String,Object>>();
  for (Map<String, Object> personagem : personagensLost) {
   Integer idade = (Integer)personagem.get(”idade”);
   if(idade >= 20 && idade <= 30){
    personagensFitrados.add(personagem);
    System.out.println(String.format(
     ”Personagem [%s] filtrado”,
     personagem.get(”nome”)));
   }
  }
 }

private Map<String, Object> obterPersonagem(String nome, Integer idade) {
  Map<String, Object> mapa = new HashMap<String, Object>();
  mapa.put(”nome”, nome);
  mapa.put(”idade”, idade);
  return mapa;
 }
}

e o código equivalente Groovy

def personagensLost = [
 [nome:"Kate", idade:28]
 ,[nome:"Jack", idade:38]
 ,[nome:"Desmond", idade:39]
 ,[nome:"Hurley", idade:27]
 ,[nome:"Locke", idade:50]
 ,[nome:"Walt", idade:12]
]

def personagensFiltrados =
 personagensLost.findAll{ (20..30).contains(it.idade) }

personagensFiltrados.each {
  println “Personagem [${it.nome}] filtrado”
}

Ao comparar as duas versões desse programa, o que mais me chama a atenção não é a diferença de linhas de código, mas sim a clareza do Groovy em comparação com o Java. O fato de listas e mapas serem construções nativas da linguagem tornam as tarefas relacionadas a estas estruturas de dados muito mais simples, e o código mais inteligível.

Obviamente eu poderia usar uma lib como commons collections para filtrar os elementos da lista na versão Java, mas minha idéia aqui é comparar as linguagens usando apenas as APIs comuns, incluídas com o development kit padrão. Eu inclusive criei um método privado para reduzir o volume de código Java, mas mesmo assim, a diferença de linhas de código é grande. Não significa que isso vai ocorrer para todos os casos, nem significa que Groovy Rocks e Java Sucks. O que quero mostrar é que o Groovy é uma ferramenta extremamente útil para profissionais proficientes em Java que querem enveredar pelo mundo das linguagens dinâmicas, sem ter que abrir mão do SimpleDateFormat quando ele for necessário.

Wilson Freitas é arquiteto de sistemas com 12 anos de experiência em desenvolvimento de software. Atualmente trabalha na Vetta Technologies. Bacharel em Ciência da Computação pela UFBA.

Desenvolvimento 1 Comentário

“Serve o vinho celeste, Ganymede”

Jupiter: …”Pour forth heaven’s wine, Idaean Ganymede, And let it fill the Daedal cups like fire.” Percy Bysshe Shelley, Prometheus Unbound

Na mitologia grega, Ganimedes era um príncipe troiano, filho de Tros, cuja beleza arrebatou Zeus (ou Júpiter na mitologia romana) de tal forma que ele mandou uma águia (ou se transformou em uma, dependendo da versão) para raptá-lo e levá-lo para o Olimpo. Lá, tornou-se um dos amantes de Zeus e copeiro dos deuses. Ganimedes também é a maior lua de Júpiter e a maior do sistema solar e foi a terceira descoberta por Galileu Galilei.

Agora, além desses significados, Ganymede (Ganimedes em inglês) também denomina a nova versão anual dos projetos da Eclipse Foundation lançada ontem, dia 25 de junho. Precedida por Europa e Callisto, ela é uma coleção de 23 projetos distintos, cujas novas versões são lançadas de forma coordenada, para evitar incompatibilidades entre eles e facilitar a vida dos usuários.

Apesar do Eclipse poder ser usado para o desenvolvimento em C, C++, Ruby e Python, o lançamento dessa nova versão é particularmente relevante para a comunidade de desenvolvimento Java, posto que o Eclipse tornou-se uma das IDEs mais utilizadas pelos desenvolvedores dessa linguagem. Algumas mudanças mais visíveis estão na IDE, como melhorias na área de assistência de contexto (as teclas Ctrl+Espaço), novos tipos de refactoring, uma nova interface para atualização de plugins, dentre outras novidades além de correções de bugs da versão anterior. Porém, há atualizações igualmente interessantes em outras áreas, como as novas versões da ferramenta de relatório BIRT e do Mylyn, um plugin de interface focada em tarefas (task-focused interface) e que faz integração entre a IDE e ferramentas de rastreamento de issues como o Bugzilla e o Trac, e novas adições como o Rich Ajax Platform (RAP), que permite a construção de aplicações Web baseadas em AJAX usando o mesmo modelo de desenvolvimento de aplicações RCP. Porém, nem tudo são flores: o suporte nativo ao sistema de controle de versão Subversion, outra adição bastante esperada, não está totalmente “transparente” como o do CVS. Para ativá-lo, é necessário que o usuário faça o download de componentes localizados em servidores fora da Eclipse Foundation, sendo que um deles possui versão compilada apenas para Win32 (no caso o conector JavaHL).

Para aqueles que querem instalar a nova versão, basta visitar o site do Eclipse Ganymede, onde também se encontra a lista com as mudanças ocorridas. E “deixa-o encher as taças como fogo”. :-D

Paulo Ferreira de Moura Junior, é arquiteto de sistemas com passagem em empresas como a Borland do Brasil e Vetta Technologies. Bacharel em Ciência da Computação pela UFMG, trabalha atualmente na Geolabs.

Desenvolvimento 0 Comentários

Alan Turing

Antes de chegarmos ao centésimo post deste blog (será o próximo), não podíamos deixar passar em branco que exatamente ontem, véspera de dia de São João, também foi o aniversário de uma das pessoas mais importantes da ciência da computação, o matemático britânico Alan Turing.

Graças ao Turing, temos o conceito de algoritmo e construções lógico-matemáticas como a máquina de Turing (uma abstração que descreve o funcionamento de uma máquina lógica determinística, exatamente como nossos computadores) e o teste de Turing, que descreve um procedimento que diferenciaria uma pessoa de um programa, com base na inteligência do interlocutor, ou em sua capacidade de mimetizar a inteligência de um ser humano real.

Assim, Alan Turing não só teorizou sobre o funcionamento dos computadores muito antes deles existirem, mas também lançou sementes de discussão sobre a Inteligência Artificial.

Alan Turing também passou maus bocados desde o início da guerra fria por conta de seu homossexualismo que era condenado (mais ainda) na época. Em 1954, Alan Turing morreu por suicídio, comendo uma maçã envenenada, uma referência à Branca de Neve (que alguns atribuem erroneamente à logo colorida da maçã da apple). Um triste fim para um gênio: morrer por causa do preconceito e da intolerância da “moral” do pós-guerra.

A vida de Alan Turing também rendeu um filme feito para a TV em 96 chamado “Breaking the code” (não sei se chegou a sair no Brasil). E no site oficial do Turing, há também uma “oração“, um texto muito legal e crítico do Andrew Hodges, que escreveu o livro “Enigma“, talvez a mais bem conhecida biografia de Turing.

Mas este post não é apenas para homenagear o Alan Turing, mas também para anunciar a parceria do Instituto Turing, o braço de pesquisa e educação do Vetta Labs, com a ETEG, uma empresa que dentre outras atividades, é referência em treinamento de TI em Belo Horizonte. A ETEG disponibiliza, junto com seu rol de cursos (a grande maioria relacionada a JAVA), os cursos de Eclipse RCP e BIRT, AJAX Básico, Toolkits AJAX e Ruby On Rails. Fica a dica.

Biografia, Desenvolvimento, Inteligência Artificial, Teoria da Computação 0 Comentários

Gnuplot e a complexidade de algoritmos

Esta semana, me peguei usando pela primeira vez o gnuplot. E o mais curioso disto, para analisar, a grosso modo, o comportamento de um programa que recebe como entrada uma matriz de dados, no caso, o haploview.

Não vamos entrar em detalhes aqui, mas o haploview é um aplicativo JAVA usado para estudar haplótipos, e a pergunta que eu tinha que responder era “qual o tamanho máximo de um dataset que eu posso usar dado um heap de tamanho X?”. Lógico que a resposta correta inclui “e se seu cliente te perguntar o que muda se você puder usar isso + X?”.

É interessante porque não é o tipo de pergunta que a gente se faz normalmente. Geralmente, você assume que o tamanho da entrada nunca vai ser grande demais, ou se você alocar um heap grande o suficiente, ainda que ao custo de alguma lentidão por conta do trabalho extra do garbage collector, as coisas funcionarão.

O mais comum são as pessoas fazerem o profiling em busca de gargalos, mas eu não ouço falar muito de gente que tenta descobrir até onde o sistema aguenta.

Bem, não é este exatamente o caso do haploview. É um software de terceiros e nem quem fez o software tem idéia de qual a ordem de complexidade (o big “O”) do sistema, muito menos da capacidade máxima.

E se tratando de dados “bioinformáticos”, sempre é fácil que as coisas se tornem rapidamente grandes demais. E a última coisa que se quer é morrer com um doloroso “OutOfMemory”. Você tem que saber os limites.

Basicamente, um dataset é uma grande matriz de dados, e como o haploview é uma caixa preta, podemos considerar que o número de linhas da entrada (no caso, o número de indivíduos) é uma dimensão e o número de colunas (o número de marcadores) é outra dimensão.

Vamos plotar no gráfico valores em 3 direções: [a] variando apenas o número de indivíduos, [b] variando apenas o número de marcadores e [c] variando ambos, proporcionalmente (diagonalmente). Assim podemos ter uma idéia, ainda que não muito refinada, do comportamento do sistema.

De posse destes pontos, você pode observar uma tendência na relação entre o consumo de memória e a entrada de dados. Conforme a “cara” do gráfico, você pode achar mais adequado tentar interpolar com algum tipo de superfície. No meu caso, uma superfície levemente abaulada ficou bem interpolada com uma superfície polinomial do tipo ax^2 + by^2 + cxy + d. Deu complexidade quadrática na veia.

Nesta hora, o gnuplot se revelou de uma simplicidade franciscana, já que você pode passar para ele uma função e mandar ele fazer o “fit” e achar os valores de a, b, c e d, passando como entrada um arquivo tabular (”data.txt”) com os valores de cada eixo em cada coluna.

set title “Haploview memory usage”
set xlabel “Individuals”
set ylabel “Markers”
set zlabel “Used Memory”
g(x,y) = a*x**2 + b*y**2 + c*x*y + d
fit g(x,y) ‘data.txt’ using 1:2:3:(1) via a, b, c, d
splot ‘data.txt’ using 1:2:3, g(x,y)

Você pode achar útil esta apostila em português sobre o gnuplot, pelo menos até que saia o livro.

Claro que existem uma série de outras boas ferramentas como matlab, R, octave, scilab e etc, mas se você quer algo rápido, gnuplot pode ser uma boa saída. E se for prá gerar coisas bem coloridas e visualmente atrativas prá colocar naquele seu paper, você pode tentar estas opções aqui também, prá ficar com aquela cara de Scientific American ;-) .

Biotecnologia, Desenvolvimento, Visualização Cientifica 2 Comentários

E o anti-iPhone?

E a Apple anunciou o iPhone 3G, baixou o preço de compra (mas a AT&T, que tem exclusividade nos EUA, aumento o preço dos planos, então no balanço ficou mais caro) e diz que fechou com parceiros em 70 países. A Claro vai vender o iPhone 3G no Brasil até o fim do ano. Ainda não se sabe quanto vai custar, se vem com fidelização obrigatória até a terceira geração e outros detalhes. Mas os viciados em gadgets estão em polvorosa. E tem muita gente de olho nas possibilidades de desenvolver software para o iPhone. Não é à toa. É um aparelho com potencial revolucionário, e já tem até fundo de capital de risco dedicado exclusivamente a financiar empresas que desenvolvam para o iPhone. O nome? iFund, claro…

Há quem diga que até o fim do ano que vem a Apple deve vender 15 milhões de iPhones no mundo todo. Não é pouco, mas é menos de 1.5% do número de telefones celulares vendidos por ano no mundo. Em 2007, foram vendidos 1.15 bilhões de telefones. Pode ser revolucionário com 1.5% de market share? Claro que pode, afinal é um produto high end e que atrai early adopters de tecnologia.

Mas esses números mostram uma outra possibilidade. De acordo com a venerável The Economist, ainda esse ano teremos mais de 3.3 bilhões de usuários de telefonia celular no mundo. Ou seja, mais da metade da população do mundo terá um celular. A expectativa da Portio, uma empresa britânica especializada em pesquisa de mercado celular e wireless, é que a penetração chegue a 75% da população mundial até 2011. Sabe aquela história que até servente de pedreiro tem celular hoje em dia? Pois é, daqui a pouco os serventes de pedreiro da África também vão ter.

Claro que a imensa maioria desses usuários está na chamada “base da pirâmide”. Gente pobre, pobre mesmo, com o aparelho mais barato possível e plano pré-pago. A inclusão dessa numerosíssima base da pirâmide no mercado de consumo é um dos grandes desafios de estratégia corporativa e de marketing desse começo de século, e os celulares mostram algumas idéias interessantes de como isso pode acontecer.

Um exemplo que eu adoro é o M-PESA, desenvolvido pela Vodafone e pela Safaricom, uma operadora no Kênia. É um sistema simples de mobile banking, no qual você transfere dinheiro via SMS. Sistemas de pagamento via celular como o Oi Paggo estão se popularizando no Brasil, e o Banco do Brasil já tem uma iniciativa de mobile banking. Mas o potencial transformador do M-PESA é que ele funciona com quem não tem conta no banco. Com quem é pobre e excluído demais pra isso.

Uma combinação óbvia de mobile banking e base da pirâmide é usar mobile banking para microcrédito. Reduz burocracia, permite uma dispersão maior dos fundos, e tem um mecanismo interessante de incentivo ao pagamento — pode-se deduzir uma fração de cada recarga do plano pré-pago feita pelo devedor. Se ele não pagar o empréstimo, o celular é bloqueado.

Essa é só uma possibilidade. Eu acho que, embora o iPhone seja um produto interessante e com grande potencial para inovação, o pessoal que pensa em criar startups devia olhar também pra base da pirâmide. É um mercado grande demais e, finalmente, os estrategistas corporativos estão inventando maneiras para deixar de ignorá-lo.

Desenvolvimento, Inovação, Mobile 4 Comentários

« Previous Entries