LinguÁgil 2010 e Etc

Semana boa. Daquelas corridas e que não sobra muito tempo para pensar. Primeiro, uma ida ao Rio de Janeiro para participar de um workshop sobre reuso do Serpro. Durante a estadia lá, fiquei sabendo que meu artigo de Workflows no iMasters foi publicado. E como fiquei sabendo? Da forma mais inusitada possível: através de uma twittada da própria BonitaSoft. Vamos ver se consigo algum contato lá para ajudar na divulgação do Bonita aqui no Brasil. 😛 O Serpro deve adotar esta engine como padrão para desenvolvimento de aplicativos de Workflow. Minha intenção é publicar uma série de artigos no iMasters sobre a utilização de Workflows em Java usando a engine Bonita. Quer ver o artigo? Clica aqui!. Dá uma sacada na imagem aí embaixo com a tuitada dos caras da BonitaSoft!

De volta a Salvador, já cheguei indo para o LinguÁgil. Tivemos excelentes cursos, sem contar nos ótimos palestrantes. O Fabio Akita esteve no evento e acredito que fez uma das melhores palestras. Conheci também a Plataforma de Desenvolvedores da Vivo em um Coding Dojo que fizemos na quinta-feira. Criamos um aplicativo Android para envio de SMS usando o MotorDev. Boa iniciativa da Vivo. Na quinta-feira, ajudei @zyc no curso sobre J2EE, pois o moço sabe J2EE6 pacaraio e eu ainda estou engatinhando. Fui lá mais para ajudar no Coding Dojo mesmo. 😛 No sábado, lá estávamos nós apresentando uma rápida palestra sobre o Demoiselle. Olha eu aí embaixo todo lindo falando na palestra! Para ver os registros do Coding Dojo, acesse o site do Dojo Bahia.

Conclusão, o evento foi ótimo. Parabéns a todos os organizadores e à estrutura da Unijorge que é excelente. E que venha o LinguÁgil 2011.

Você precisa treinar programação!

Praticar programação parece estranho. A primeira vez em que ouvi isto, não levei muita fé. Oras, eu programo todos os dias no trabalho, não preciso de treino. Então, me perguntei: eu uso sistemas de produção para treinar? De certa forma, sim. Eu pratico nos sistemas reais aquilo que aprendi na teoria. Aquilo que vi e achei legal em outro sistema, eu replico no que estou fazendo. Bom, o mundo deve ser assim. Todos programadores devem fazer isto, afinal. E eles estão certos? Agora eu realmente acredito que não.

E eu já vou explicar. Antes, eu quero apenas desmistificar uma ideia sem sentido que ainda hoje ouço ou percebo em algumas pessoas. Programador é peão. Esta ideia parece-me que surgiu quando as tais Fábricas de Software eram o hype. A solução para todos os problemas. Bastava fazer um monte de diagramas de sequência e passar para o tapado do programador digitar. Este mundo ruiu. Não existe. Não deu certo. Programar é uma atividade que requer muitos conhecimentos. Requer inteligência e coragem. Criar código com qualidade é uma arte para poucos. Não basta fazer funcionar, tem que ser uma obra de arte.

Eu não consigo imaginar um bom arquiteto ou projetista de software que deixou de programar na vida ou, pior, que nunca programou. Isto me soa sobrenatural e acredito que não exista ninguém assim no mundo. Para mim, refletem-se em uma única atividade. Não vejo elas sem associação. Então, expurgue de sua mente a ideia de que ser um bom programador é ser um bom peão.

Voltando ao assunto do tópico. Não é de hoje que vemos notícias sobre pesquisas que indicam que o nosso cérebro modifica-se conforme praticamos uma determinada atividade. Os neurônios tendem a desenvolver-se mais nas áreas que são responsáveis por aquela tarefa praticada. Na música é assim. Nos esportes também. Até mesmo os grandes mestres do xadrez treinam diariamente suas técnicas. E, incrivelmente, ainda dizem que se pararem, ficam para trás. Em todas as demais atividades que citei, apenas talento não basta. É necessário treinar para ser bom. Então, será que treinar a arte de programar é um absurdo?

Eu acho que não. Como você aprendeu a programar? Com exemplos básicos, certo? Fazendo um jogo bobo. Resolvendo listas de exercícios dos professores. Mas, você saiu da faculdade e… caiu em código de produção. E lá você tem que mostrar seu valor. Sem treino. Nada. De cara, um código de uma aplicação que tem prazos curtos e requer qualidade. Comigo foi assim. As vezes sinto um pouco de vergonha do primeiro código que fiz para o sistema do site Pida!. Era feio, pode acreditar. E fui fazendo vários sistemas de produção feios até conseguir um grau de maturidade que me permitiu criar sistemas melhores, mais elegantes.

E precisava ser assim? Não! Então, pratique sim a programação. Como? Coding Dojo é uma das formas. Programar com outras pessoas lhe ajuda a encontrar seus erros. Nas artes marciais treinamos com dezenas de outras pessoas. Na música, sempre temos um “professor”, nem que seja em uma vídeo aula. Nos esportes temos técnicos. Na programação temos nossos colegas e aqueles que tem mais experiência para nos ajudar. Aqui, a humildade é fundamental. Permita-se acreditar que você não é o melhor programador do mundo e que tem muito a aprender com os outros.

O programador ainda tem alguns comportamentos que acho muito infantis. Primeiro, tem vergonha de mostrar seu código para que os outros avaliem. Segundo, não gosta quando mudam “seu” código. É como se o código fosse só seu. Não, é da empresa para a qual você trabalha. E isto lhe dá grandes responsabilidades. É como um pintor que é contratado para fazer a pintura que servirá de enfeite para a sala do presidente da empresa. Ele não pode fazer de qualquer jeito. Em uma seção de Coding Dojo você deixará todos estes comportamentos de lado. Aprenderá que o código é coletivo. Que trabalhar em grupo é melhor. Que ajudar os outros é bom para todos. E que as pessoas tem muito a agregar à sua carreira.

Torne-se um grande programador! E comece desde já a treinar.

Dados Abertos

Enquanto escrevia o Alfred, me deparei com alguns problemas para criar determinados utilitários. O primeiro foi o utilitário de Correios. Para minha completa tristeza, e até mesmo estranheza, os dados não são abertos. Pior, os Correios tentam proteger as informações de CEP para evitar que outras pessoas o obtenham através de “outros métodos”. Tudo bem, pensei, talvez seja apenas esta empresa a fazer isto.

Que engano! Praticamente todas as esferas do governo não fornecem meios padronizados, ou pelo menos práticos, para se obter os dados que deveriam ser públicos. E quando digo práticos e acessíveis, não quero dizer uma página HTML formatada com os dados. Estou falando de Webservices, XML, JSON e coisas do tipo. Consultar o endereço por CEP é só um exemplo bem simples. Mas imagine se todas as informações passíveis de se tornarem públicas estivessem acessíveis aos desenvolvedores! Imagine o cruzamento fenomenal de informações que poderia ser feito. Porque não publicar de forma acessível os dados sobre roubos de carros na Internet? Em conjunto com as informações de CEP cada desenvolvedor poderia criar uma aplicação própria para monitorar como andam as condições nas ruas.

E se os Correios liberassem as informações onde se encontram todas as caixas postais de forma mais fácil? Você poderia combinar esta informação com o Google Maps e fazer um aplicativo simples que apenas diria ao usuário de um iPhone se no lugar onde ele está tem alguma caixa postal próxima. Imagine nas infinitas possibilidades se os dados dos censos realizados pelo IBGE (aqueles passíveis de serem publicados) estivessem acessíveis através da internet por um Webservice livre e aberto. E todas são informações que não colocam em risco a segurança nacional. Não ferem a privacidade de ninguém. São apenas informações que deveriam estar disponíveis de forma acessível e “legível” para um computador.

Mas, eu vou além. As empresas em geral, não vou dizer apenas as brasileiras, também deveriam aderir a esta onda. Porque o Submarino não fornece um WebService que me permita apresentar seus produtos da forma como eu quiser? Eu detesto aqueles banners ridículos que eles disponibilizam. As montadoras de carros também poderiam aderir de alguma forma. Todas as empresas de comércio eletrônico também. Perceba que a Submarino precisou fazer seu próprio aplicativo iPhone. Para mim, bastaria para eles disponibilizar uma API de acesso aos dados de seus produtos. Muitos aplicativos para iPhone, Android e Windows Mobile surgiriam naturalmente.

E eu pensava que eu era louco por ter estas ideias. Mas, para minha completa felicidade, descobri que não sou o único. Na minha recente presença no Consegi 2010 conheci o @alegomes, gente fina e que, após saber que faço “parsing” de HTML para obter dados dos Correios, me informou que já existe uma iniciativa semelhante mundo à fora. Então, para aqueles que se interessam pelo assunto, vejam este link e acessem o documento que está disponível lá. Mais legal ainda, veja que na Inglaterra já existe algo assim, trata-se do http://data.gov.uk/. Fica, então, mais um pensamento: será que o Governo de um País não poderia se beneficiar fortemente desta prática? Será que o próprio governo do país não poderia tirar proveito desta rede de desenvolvedores que iriam lhe auxiliar com diversos tipos de aplicativos? E também da análise dos dados!

Será que eu estou sonhando? Qual sua opinião a respeito? Deixa nos comentários aí!

Conhecimento Livre

Já tem algum tempo eu venho comentando com colegas próximos uma mudança na direção dos ventos. Não sei se apenas na área de informática, mas como é nesta que atuo, posso falar com propriedade apenas dela. Vamos lembrar um pouco como eram os ventos um tempo atrás. Com meus 33 anos de idade e um pouco mais de 10 anos atuando em desenvolvimento de sistemas, posso emitir alguma opinião de valor. Eu acho.

Lembro o quanto era importante ler livros, atualizar-se com relação às novas tecnologias, ter uma pós-graduação, um mestrado… e algo mudou com relação a isto? Claro que não. O conhecimento sempre será necessário. Nunca será dispensável. Contudo, havia um comportamento com relação a como este conhecimento era, não sei se esta é a palavra correta, gerenciado: simplesmente, o conhecimento era seu. Para repassá-lo a outra pessoa, era preciso receber diretamente desta pessoa algo em troca. Dinheiro? Sim. Favores? Também. E o quê mais? Sei lá. Qualquer coisa. O importante era o escambo. Eu lhe repasso meu conhecimento e você me dá algo em troca.

Você vai me dizer: “e isto mudou, seu maluco? Desde quando eu vou perder meu tempo estudando para simplesmente lhe repassar isto que estudei para você de graça? Lá vem você com ideias comunistas. Vivemos em um mundo capitalista!“. Mas, será? Será que a corrente do software livre já não nos trouxe algum ensinamento quanto a isto? Acredito que você deve mudar sua forma de pensar e eu quero lhe explicar os motivos pelos quais eu acredito firmemente nisto.

Primeiro, minha crença principal. Eu diria que até mesmo um dos meus ideais de vida: o que eu sei eu quero compartilhar com todos. Não tenho o mínimo interesse em reter conhecimento. E, para minha felicidade, vejo que o mundo caminha nesta direção. Você já pensou que o seu diferencial competitivo no mundo atual não seja reter conhecimento mas compartilhá-lo com o maior número de pessoas possíveis? Quanto mais pessoas você abranger, quanto mais você for conhecido por disseminar ideias, maior será sua reputação. Eis, talvez, conforme me foi sugerido por Serge Rehem, a sua moeda de troca no mercado atual. Contudo, não quero me ater apenas às questões de competitividade no mercado. É uma área abrangente e não me sinto com conhecimentos suficientes para ter uma opinião bem fundamentada nesta área.

Mas, isto não me impede de poder arriscar o palpite acima. Talvez você ser um disseminador de conhecimentos seja realmente seu diferencial. Será que isto faz algum sentido? Vamos pensar um pouco juntos. A maioria das revistas especializadas na área não lhe pagam para você publicar seu artigo nelas. O retorno é a reputação. A maioria dos congressos em que você pode ser chamado a palestrar não lhe pagam por isto. O retorno é a reputação. Publicar suas ideias em seu blog não lhe dá dinheiro. Mas reputação, sim. Tuitar suas ideias muito menos. Publicar em sites especializados também. Manter sites especializados então, só dá trabalho, diria você. A algum tempo atrás você se perguntaria para quê fazer tudo isto se não terei nada em troca? É perder tempo.

Eu não penso desta forma. Os ventos mudaram de direção. Será que hoje poderei alçar voos maiores em minha carreira se eu adotar esta nova postura? E eu lhe pergunto: se você fosse um empregador e tivesse em suas mãos dois currículos. Um de 3 páginas, contendo dezenas de participações como ouvinte em palestras, pós-graduação e afins. Outro com uma linha. Um nome apenas. Um nome que você vê todos os dias em sites especializados. Um nome que certa vez lhe ajudou a tirar uma grande dúvida com um artigo em uma revista especializada. Um nome que está na lista de blogs que você acompanha. Um nome que você segue no twitter. Eu não teria dúvidas. Este seria o cara para trabalhar comigo. Sua reputação diria tudo para mim.

Mas, conforme eu já comentei, não me sinto tão à vontade para tratar estas questões de mercado. Talvez eu tenha falado um monte de bobagem logo acima. Mas foi só meu ponto de vista e espero que você entenda isto. O importante para mim com este post é lhe fazer um apelo que vai além de questões de mercado: seja um disseminador de ideias. Compartilhe constantemente seu conhecimento. Retê-lo não lhe trará grandes vantagens. E acredito firmemente que o mundo caminha em uma direção contrária a isto. Utilize-se das melhores ferramentas disponíveis para isto e o faça da melhor forma que você conseguir. Não sabe palestrar? Mas talvez saiba escrever artigos para revistas. Não tem o dom da escrita? Talvez saiba fazer vídeos explicativos. Sempre existirá uma forma de você aparecer para o mundo. E, acredite ou não, é apenas compartilhando suas ideias e seus conhecimentos que você poderá mudar o mundo. Para melhor, eu espero.

E você? O que acha sobre tudo isto? Escrevi só bobagens? Concorda? Deixe seu comentário e compartilhe suas ideias! 🙂

Comunidades ou Terceirização ?

Utilizarei meu indicador direito para tocar em um assunto delicado: como vejo a participação e o entendimento de uma boa quantidade de brasileiros, e aí incluo principalmente as empresas brasileiras, com o software livre e suas comunidades. Antes gostaria de reforçar uma diferença conceitual que enxergo, apesar de minha miopia. A visão de comunidade, e a ajuda a esta comunidade em prol de um bem em comum, e uma visão particular sobre um princípio específico que está incluído no software livre, e que citarei nas próximas linhas para tentar que vocês leiam mais um pouco deste (des)interessante post.

Vou lhes explicar. A questão é que Richard Stallman e os idealizadores do software livre não condenam, conforme meu minguado conhecimento sobre o assunto, que um software seja copiado, seguindo as regras da licença GPL (ou similares), e modificado. É o fork. O fork não é condenável nesta visão. Ao contrário, é até, de certa forma, motivado. A ideia de comunidade, embora seja no software livre onde mais se destaca na nossa área, enseja um comportamento diferente. Você tem uma necessidade que já é parcialmente atendida por um software sustentado por uma comunidade? Então, não faça um fork. Ajude! Seja agregador. Não seja apenas um cliente do software livre, seja um colaborador. Não faça um fork, pois você poderia estar ajudando a solução atual a se tornar ainda melhor.

Mas, vou voltar mais incisivamente ao assunto do tópico. Uma questão está mais do que clara para mim. Mais até do que Michael Jackson quando lançou o clipe Black and White. Nossas empresas estão pouco se importando para a ideia de comunidades. A verdade é clara e, neste caso, não está lá fora: as comunidades de softwares livre servem apenas como uma forma de terceirizar um serviço do qual a empresa não se vê com competência ou fôlego para fazer. Vou mais além, se há fôlego para fazer, o faz sem ajudar os criadores da ideia inicial, mas criando sua própria solução a partir da ideia dos outros. Fork!

Ainda há outra vertente. As pessoas não ajudam. Elas dizem o que está errado. O que já é algo louvável. Mas, mais louvável ainda é propor a solução. Achar o erro e já levar para os autores do software uma proposta para solucionar o problema é o que chamo de “a essência da colaboração em comunidades de software livre“. Infelizmente, é um mundo distante.

Voltando à questão dos forks: isto é condenável? Não há problemas, se você for considerar a ideia inicial de que um fork é algo normal. Mas, da forma como é feito hoje, é condenável, sim. A colaboração entre os membros de uma comunidade só tende a agregar valor para ambas as partes. A ajuda mútua sempre traz mais benefícios para ambos os lados. Quanto mais mãos e cérebros inteligentes atuando por um objetivo em comum, melhor. Só faça um fork se os autores do projeto inicial forem cabeça dura e não aceitarem ajuda externa. Antes, esvazie todas as alternativas disponíveis para você. Não havendo retorno para seus esforços, então fork neles! Mas deixe isto claro para todos, para que entendam sua motivação e não lhe encarem como um desagregador.

E porque as coisas são assim? Ainda nos falta esta cultura. E isto já vem de longe. Muito longe. O brasileiro sempre usou programas piratas e nunca sentiu vergonha disto. E isto é desde o Pentium 1, ou vai me dizer que sua cópia do Windows Workgroups era original? Oitenta por cento de chances de que não era. E o que pirataria tem a ver com isto tudo? Vou ser sincero, eu só quis deixar um gancho para dizer que as empresas brasileiras atuam como os “Piratas do Software Livre”. Você vai me dizer: seu maluco, que frase sem sentido! É, você tem razão, eu acabei de inventá-la.

E a ideia que quero passar com a frase é a seguinte: quando você usa um “aplicativo pirateado”, você está jogando fora todo esforço daqueles que suaram para lhe entregar uma solução para seus problemas. Não concorda que o software seja pago? Não use. Para mim é simples assim. Quando você não colabora com uma comunidade, se tornando apenas cliente dela, literalmente “vampirizando“, você a destrói em sua essência. É um estaca de madeira no coração desta comunidade.

Este post está enorme e vou finalizá-lo com uma resposta que alguns poderiam me fazer: e porque você ainda continua disponibilizando suas aplicações como software livre já que a maioria só quer se aproveitar disto? Uma mera questão filosófica. Eu acredito no Software Livre. O conhecimento deve ser compartilhado. O que eu aprendi, eu quero compartilhar com os outros. Embora minha visão seja, em alguns momentos, pessimista, isto não quer dizer que eu ficarei parado aguardando passivamente que as coisas mudem. E este post é um passo nesta direção.

Concorda comigo? Sim? Mais ou menos? Deixa seu comentário!

Considerações sobre Workflows

O primeiro projeto em que participei no Serpro, assim que fui aprovado no concurso em 2006, era um super Workflow. Documentos que precisavam ser criados, revisados, aprovados, enviados para parecer e outras dezenas de situações. Fora as milhares de regras para definir quem vai executar uma determinada tarefa no documento. E o que dizer da quantidade de perfis e papeis? Era, e ainda é, pois ainda está em desenvolvimento, um mega sistema de Workflow. Até então, eu nunca havia sequer notado a existência de Workflows. E também já havia feito sistemas similares como, por exemplo, um sistema de comércio online e um sistema de notícias. Observando cuidadosamente, percebe-se que estes sistemas tem aspectos em comum: entidades que mudam de situação, pessoas que devem executar tarefas, e-mails que devem ser enviados, sistemas externos que devem ser acionados, etc.

A partir deste momento, fiquei de olhos mais atentos aos sistemas em que eu participava ou ajudava, sempre notando que muitos tinham características de Workflow, mas a equipe pouco percebia este detalhe importante. Para muitos, Workflow é algo mais relacionado aos negócios da empresa em que trabalha e a automatização destes negócios. Parece algo distante. Uma tecnologia meio alienígena e que vai complicar mais do que ajudar em seu projeto. Para piorar, ainda há uma sopa de letrinhas e conceitos que confudem ainda mais o cidadão: BPM, SOA, EBP, Orquestração de Serviços, Coreografia entre Serviços, entre outros.

De fato, a visão de que Workflow está relacionado às questões macro da empresa, envolvendo automatização do seu fluxo de trabalho, é verdadeira, mas, isto é só uma vertente. Não pretendo tocar neste assunto, pelo menos não agora. O que me interessa agora são os desenvolvedores de sistemas, aqueles caras que ouvem as necessidades de seu cliente e que precisam tomar a melhor decisão sobre como desenvolver o sistema do dito cujo. Imagine Arthur Dent, o Analista de Sistemas, ouvindo Ford Prefect, o cliente, dizendo para ele:

– Então, o José recebe a notificação de compra e tem que repassar pro seu gerente.
– Sim, continue… – diz o analista.
– Aí o gerente aprova e repassa pra Carla do almoxarifado ver se tem estoque – diz o cliente, imaginando que já disse tudo e que o sistema já pode começar a ser feito.
– Certo, e a Carla faz o quê?
– Ah sim, já ia esquecendo. Ela aí diz pro financeiro que está certo, que é pra creditar o cliente.

O Analista de Sistemas certamente pensou em Casos de Uso. E o projetista? Imaginou usar Java com Spring, persistir com Hibernate em um banco de dados Oracle com uma arquitetura em três camadas na Web, usando Java Server Faces (JSF). E eles estão errados? Sim! E também não! O que eu defendo é que se pode ganhar bastante em produtividade quando se utiliza uma metodologia diferenciada para projetar e implementar sistemas desta natureza. Mas, para isto, é necessário fortalecer nas pessoas as ideias (conceitos) sobre Workflows. Antes de mais nada, o Arthur Dent precisa ter o feeling, aquela sensação estranha em suas espinhas, algo que lhe diz: eu já vi isto antes! É um Workflow, cara!

“Sim, sabichão, então me indique o caminho das pedras!” Perdoe-me, pois eu não tenho a resposta exata para você. Não agora. Mas, eu estou escrevendo um artigo para o ConSerpro, um Congresso para os empregados do Serpro, sobre este problema e pretendo chegar a algo mais concreto. Percebo no Serpro que as equipes de desenvolvimento perdem a oportunidade de usarem técnicas específicas de projeto e programação para sistemas de Workflow. Não digo apenas usar uma engine de Workflow. Mas, como eu posso ganhar em produtividade quando eu sei que meu sistema é absolutamente um Workflow? Devo usar qual engine de Workflow e de que forma? Qual linguagem de definição de processos devo usar? Pronto. Escolhi a Engine e a linguagem de processos, agora como eu documento este fluxo?

As perguntas são muitas. As respostas, poucas. E as coisas pioram quando percebemos que a padronização na área de Workflows não é grandes coisas. Não é incomum ver engines de Workflow que não conversam entre si: um fluxo definido para rodar em uma, não roda, nem à base de marretadas, em outra. As APIs são absolutamente diferentes também! Agora, imagine tudo isto em uma empresa onde trabalham mais de 1000 desenvolvedores e com centenas de sistemas que poderiam usufruir das facilidades que um mero mecanismo de Workflow pode lhe proporcionar.

Contudo, infelizmente, a realidade não é esta. O que vemos são dezenas de diagramas de projeto e documentos de arquitetura que poderiam ser abstraídos favorecendo uma visão mais generalizada. Vemos centenas de linhas de código, como esta aqui:

public class RegraDeNegocioWorkflowSemNecessidade {
   public void aprovar(Documento documento) {
       if ( documento.getSituacao().getId().equals(SITUACAO_AAPROVAR) ) {
           // Enviar e-mail para o gerente.
           // Atualizar o banco de dados com a situação nova.
          // Chamar um Webservice e aguardar a resposta.
          // Processar a resposta do Webservice e decidir se o fluxo vai pra Aprovado ou Reprovado.
          // Enviar e-mail pro cliente dizendo a situação!
          // Fechar a transação.
          E aqui vai um monte de IF THEN ELSE WHILE FOR...
       }
   }
}

E isto tudo poderia ser descartado! E seu programador poderia ter poupado dezenas de linhas de código, pois todos estes tratamentos podem ser feitos com poucas linhas e uma boa engine ajudando! E você? Concorda comigo? Não? Então, deixe seu comentário!