Archive for October, 2007

Programadores Profissionais Escrevem Testes, Ponto Final.

Wednesday, October 31st, 2007

O tópico já tem oito páginas. Acho que chega à 10. Por mais que minha mão coce para comentar lá eu não vou, simplesmente porque já tive problemas demais com o pessoal do Mentawai.

De qualquer forma sempre me preocupa a possibilidade de algum desenvolvedor ler o tópico e pensar “Poxa, se esses caras que fazem todos estes frameworks não usam testes por que eu vou usar?”.

Desenvolvedores profissionais escrevem testes. Simples assim.

Uma pessoa que não ganha milhões de dólares mas escreveu uma das obras mais clássicas deste ramo deixa bem claro em sua primeira aula que programar é gerenciar complexidade. Nós precisamos gerenciar complexidade o tempo todo, por isso criamos funções, objetos e tudo mais. Não adianta, mesmo Einstein teve que provar que suas fórmulas e execuções estavam corretas, que poderiam ser verificadas. Na faculdade aprende-se isso desde as cadeiras básicas (e o fato de ser esquecido como “coisa teórica inútil” me faz novamente perguntar sobre o valor do ensino formal).

Existe uma grande diferença entre fazer Test-Driven Development e testar. TDD é sobre modelagem de objetos e especificações, não sobre testes (tanto que Behaviour Driven Development está se consolidando como algo mais eficiente que TDD) apesar de que no final você acaba ganhando uma suíte de testes de graça.

É muito difícil achar um projeto open-source relevante que não tenha testes. Na verdade os projetos decentes só aceitam um relatório de bug ou um patch se vier acompanhando por um caso de testes. Imagine uma aplicação feita colaborativamente por diversas pessoas, como saber que o que eu acabei de fazer commit não vai quebrar o que você modificou ontem? Boas práticas de orientação a Objetos? Não se iludam, OO não foi feita para este tipo de verificação! Com boas práticas você consegue minimizar o impacto de mudanças diminuindo dependências mas você não vai ter certeza disso.

Eu sinceramente não sei que técnica é essa que faz programação defensiva evitar testes. Eu já li bastante sobre Orientação a Objetos e programação defensiva e não vi nada deste tipo, pelo menos não vindo de uma fonte com um mínimo de credibilidade. Um exemplo simples, imagine que o framework web imaginário Pagai possui um código parecido com este:


Acao acaoSendoExecutada = controladorPrincipal.acao(requisicao.acaoDesejada());

Simples, não? Agora imaginemos que o código do método acao(String) seja algo assim:


public Acao acao(String pathInvocado){
//verifica se acao possui o formato desejado, deve ter uma barra e deve ter dois itens separados por barra apenas
if((pathInvocado.indexOf("/") == -1) || (pathInvocado.split("/").size < 2)) throw new IllegalArgumentException("Path invocado ["+pathInvocado+"] nao possui o formato adequado (consulte a documentacao XYZ)");
//lógica...
}

Isso é programação defensiva: eu não estou aceitando o que me passam, eu verifico se é o que deveria e se for eu continuo, se não eu paro ali mesmo e deixo alguém tomar conta do problema, seja a classe em questão ou alguma outra mais acima.

Imagine que eu por engano commitei um código que utilize “” em vez de “/” nesta requisição. Se for numa parte central do código é bem possível que uns testezinhos peguem mas imagine que é utilizado apenas em um caso específico e que, por um acaso, eu baseei meu sistema de controle de jatinhos particulares 9meu chefe tem muitos jatinhos) nele. Quando eu fiz o comit não alertou. Quando eu fiz o build não alertou. Quando eu fiz meus testezinhos não alertou. Quando foi para a produção eu tive erro.

Ok, acontece. Programadores de qualquer tipo cometem erros. Eu vejo o problema muito rapidamente e o corrijo, temos uma versão beta em 15 minutos no ar, fantástico. Aí daqui há um mês outro programador comete o mesmo erro. Quando fizer o build não vai alertar. Quando fizer seus testezinhos não vai alertar. Quando for para a produção… Isso não é profissionalismo.

O que eu preciso é de uma suite de testes, unitários e de integração, que me digam que o sistema está incorreto já no processo de build, sem lançar jars beta, alfa ou gama.

Mas se tem um argumento nessa história toda que realmente me irrita é quando as pessoas dizem que “num mundo capitalizado não há tempo para testes” ou que “o cliente não quer saber como é feito, ele quer que funcione”. O cliente realmente não quer saber como funciona, ele quer que funcione. Mas ele também não vai querer saber que você alterou uma classe que usava barra para barra invertida e tudo parou de funcionar, ele quer que o problema não aconteça e se acontecer que seja corrigido rapidamente. Se seu sistema não tem qualidade -e testes fazem parte de qualidade- você não consegue isso. TI gasta fortuna das empresas reescrevendo sistemas simplesmente porque não foram feitos por profissionais, e profissionais se preocupam com a qualidade do que fazem. E isso inclui testes.


Não seja um amador.

Tudo Novo de Novo

Tuesday, October 30th, 2007

Alguns já sabem, outros fingem não saber, outros entenderam errado, outros não entenderam e tem os dois ou três que de fato não sabem, mas o fato é que estamos, minha esposa e eu, deixando o país. FAQ abaixo.

Mas por quê?

Mudar de país é uma decisão complicada mas é algo que sempre quisemos. Não sei se vou de vez, se volto, se vou ficar na Austrália, se vou para outro país depois… é uma experiência nova e enriquecedora e não quero ter planos para tão longo prazo. Meu objetivo imediato é abrir meus horizontes tanto culturais, morando na Oceania, quanto profissionais, trabalhando na ThoughtWorks.

Quando vocês vão?

Espero ir logo após o ConexãoJava.

Mas por que a ThoughtWorks? Que houve na Globo.com?

A Globo.com é certamente o lugar mais interessante onde já trabalhei até hoje. É uma empresa onde existe um ambiente exatamente igual ao de qualquer grande empresa conservadora mas é um lugar onde tem gente querendo resultados, e estas pessoas estão geralmente em posições de decisão e isso permite aos interessados realizar um bom trabalho. Tive sorte de estar numa equipe onde não há escolha: ou se é eficiente ou não se é nada; e desta forma conseguimos introduzir muita coisa legal. Em breve deve estar visível para o público nosso primeiro projeto feito com técnicas de Scrum e devo blogar mais sobre a experiência.

Tenho certeza que o Guilherme Chapiewski, que assume minha posição, vai conseguir ainda mais resultados e continuar com o trabalho de mostrar que desenvolver software não é construir prédio.

Basicamente é uma empresa de onde dificilmente eu sairia se não fosse mudar de país, e onde minha saída foi completamente apoiada -basicamente fico na Globo.com até o dia da minha viagem ou quase.

A ThoughtWorks é também certamente uma empresa peculiar. A quantidade de pessoas interessantes, o foco em qualidade e métodos eficientes para gerenciar projetos são um fator que dificilmente se encontra em uma empresa tão grande. No mais a empresa vem investindo muito no meu mais novo interessa, Language-Oriented Programming e Domain-Specific Languages.

Mas por que Austrália?

Inicialmente eu havia sido chamado para aplicar para uma vaga em Londres mas desisti. Surgiu então a oportunidade de ir para Sydney, lugar com clima e cultura mais semelhantes aos nossos e com as típicas vantagens de primeiro mundo. Além disso a ThoughtWorks Australia é sede de iniciativas importantes como a ThoughtWorks Studios.

E o que você vai fazer lá?

Minha posição é como consultor, na ThoughtWorks não existem muitos níveis -mesmo numa empresa com mais de mil funcionários entre você e o dono da empresa ficam menos de cinco pessoas.

Como foi a seleção?

Não há porque mentir: Longa, cansativa e trabalhosa. A ThoughtWorks se orgulha de fazer todos os seus consultores passar pelo mesmo processo, que é bem rígido. Fowler já falou sobre isso e a maioria das lendas é verdade. No entanto não é difícil. Basta você ter uma base razoável sobre desenvolvimento de software.

Como fica o blog? E o RioJUG? E a IASA? E o GUJ? E os artigos? E as listas?

Minhas atividades no Brasil continuam as mesmas, feitas remotamente é claro.

No mais eu queria agradecer à todo o apoio dado por tantos amigos que nem teria como listar. Vocês sabem que são. Obrigado!

Arquiteturas Simples Duram Mais

Wednesday, October 24th, 2007

Um amigo outro dia me perguntou que tipo de arquitetura eu usaria num caso bem peculiar. Basicamente ele foi encarregado de definir a arquitetura corporativa de um grande banco, ou seja: definir hoje a forma como aplicações serão construídas pelas próximas décadas. Basicamente ele vai se ro cara que vai ser xingado por algumas centenas de programadores nos próximos tempos, não importa que arquitetura escolha.

Há poucos dias atrás falamos aqui sobre arquiteturas de referência e seu efeito danoso. Geralmente quando alguém tem à frente um desafio desse ele logo pensa em um modelinho que mostra obriga o uso de uma meia dúzia de frameworks e padrões (clássico moderno: Struts/JSF e JPA, clássico vintage: Struts 1.1 e EJB/DAO). Para melhorar ainda é incorporado um conjunto de classes “utilitárias” feitas com práticas que talvez tenham servido para um projetinho piloto mas hoje em dia só atrapalham.

Ainda assim uma arquitetura corporativa é algo interessante. Quando empresas grandes não possuem uma macro-arquitetura acabam crescendo de maneira desordenada e criando dezenas de aplicações redundantes e gambiarras de integração entre sistemas. Note no entanto que uma arquitetura corporativa não é uma arquitetura de referência, a arquitetura corporativa não fala sobre como implementar aplicações mas sim provê guias sobre como integrá-las, define as relações previstas em no ecossistema que é uma grande empresa.

Quais são as melhores macro-arquiteturas que você conhece? Eu consigo pensar em algumas: Apache, UNIX, World Wide Web… Nestes ecossistemas aplicações novas surgem, são alteradas e morrem todos os dias há décadas, um sistema criado com a tecnologia mais recente de 2007 vai rodar tranqüilamente neste ambiente. Por quê?

Porque estas arquiteturas se baseiam em primitivas e contratos, não em especificações rígidas. Criar um módulo para o Apache , um programa para rodar em UNIX ou uma site é basicamente criar um programa de computador em uma das plataformas suportadas que obedeça a um contrato.

Uma boa arquitetura corporativa vai definir algumas políticas e contratos para a aplicação se relacionar com o meio-ambiente e só isso. No caso do banco, poderíamos definir que uma aplicação deve disponibilizar via uma interface POX/REST seus WebServices, que ela deve utilizar a API do Mogile FS para guardar dados em disco, que cache deve ser feito utilizando a API do memcached.

E se o arquiteto quiser sair do padrão? Ótimo, saia, mas ele deve oferecer compatibilidade com o ambiente.

E se eu já tiver comprado um sistema que faz WebServices via SOAP? Eu preciso criar um meio de disponibilizar estes serviços via POX/REST também. Pode ser uma adaptador simples, um ESB, o que quer que seja. É como quando você compra um equipamento eletrônico com tomada americana, você não vai mudar uma tomada na sua casa para o padrão exótico, vai é comprar o adaptador necessário para plugar ele nas tomadas do seu ambiente.

Mas e se não precisarmos de filesystem distribuído? E se já estivermos utilizando uma solução de cache que faz mais sentido nesta aplicação?

Ótimo, use. O uso de filesystem X, cache Y, banco de dados Z deve ser um guia. Toda vez que alguém precisar de uma solução de cache, filesystem, etc. ele olha o guia da empresa, se não servir ele usa algo que sirva. O que importa é que o uso fique encapsulado no sistema. Imagine que ao invés do Oracle 10g eu resolva usar um MySQL na minha aplicação. Está ótimo mas eu devo manter essa peculiaridade interna à minha aplicação. Os outros sistemas que vierem a se comunicar com o meu não devem precisar saber sobre a existência deste banco, eu não posso usar este banco para comunicação entre aplicações (o que já é uma coisa péssima para se fazer de qualquer forma).

O que importa é:

  1. O arquiteto tem liberdade para resolver seu problema da maneira mais adequada
  2. O novo sistema é compatível com o meio-ambiente

Para ser um bom arquiteto não é necessário ter tanta experiência assim, basta saber olhar os casos de sucesso e aproveitar o que funciona. Geralmente as técnicas utilizadas nestas arquiteturas são também catalogadas como Padrões Arquiteturais em livros. Um bom arquiteto tem que ser um ávido leitor de livros e de código.

Conexão Java 2007

Tuesday, October 23rd, 2007

Mais um ano vai, outro ano vem e o Conexão Java está aí. Este é certamente o evento mais descolado da comunidade Java do Brasil.

O CJ é um grande encontro entre as pessoas que participam em fóruns como o GUJ, o PortalJava e o RioJUG. O foco do evento são os mini-cursos que agem na formação de novos profissionais. Bem, formação não exatamente, ninguém sai de um curso de meioa dúzia de horas especialista em nada mas é uma boa oportunidade de ter contato mão-na-massa com algumas tecnologias e técnicas.

Este ano a estrela do evento é ninguém menos que Carlos Villela. Radicado em Londres pela ThoughtWorks há… bem, há alguns anos… o cv vem falar de algo bem atual: o declínio dos arquitetos monoglotas.

Também teremos algo um pouco diferente. Possivelmente deve haver um repeteco da minha palestra sobre arquitetura do JustJava 2007 (infelizmente sem o Paulo que vai estar de férias) mas enquanto isso é confirmado ficamos com mais uma atração: Oficina do Arquiteto.

Essa é uma idéia meio maluca que acabamos de fechar, vai funcionar mais ou menos assim: alguém traz uma arquitetura -seja de um projeto existente, livre ou de uma empresa, ou desenhado na hora- e nós debatemos esta. Na conversa vão sobrar padrões arquiteturais, guidelines e uma boa dose de bate-papo sobre o que nós, arquitetos, estamos fazendo por aí. Se você já tiver alguma idéia me adiante por email para organizar melhor as coisas, eu vou preparar algumas arquiteturas clássicas para usarmos quando não houver nenhuma na roda. A idéia é bem simples: debate, informação e diversão.

Aldo Dórea vs Fred Brooks

Tuesday, October 23rd, 2007

Eu não tenho nada contra a maioria dos gerentes de projetos mas se tem alguma coisa que me irrita é alguém que acha que gerenciar projeto de software e levantar um prédio é a mesma coisa. Veja bem: eu tenho uns bons dez anos de experiência com projetos e recomendo fortemente uma abordagem ágil, iterativa e incremental para eles, mas estou falando de projetos de software, não de projetos em geral. Eu não tenho a menor idéia se isso funcionaria para levantar um prédio, sei que funciona para software e por isso você não vai encontrar neste blog ou em alguma publicação minha qualquer dica para gerenciar a reforma do seu banheiro. Na verdade eu até evito comparações com outras engenharias porque elas sempre são danosas (o próprio conceito por trás do nome ‘engenharia de software’ é danoso).

Neste cenário temos o número atual da Mundo PM e um artigo de Aldo Dórea Mattos, M. Sc.. Aldo é um profissional com bastante experiência no mundo da construção civil. Segundo seu mini-curriculum na revista ele é engenheiro, advogado, mestre, já trabalhou em projetos em 4 países e é autor do livro “Como Preparar Orçamento de Obras”. Aldo escreveu um artigo com o título muito interessante de “Por que os cronogramas ‘furam’?”.

Em seu artigo Aldo foca em um relatório apresentado num grande congresso do PMI com este tema. O relatório foca… construção civil. Eu realmente achei que era uma leitura interessante até porque eu sempre tenho a dúvida se só nós sofremos com tantos problemas quando alguém cisma de usar técnicas de waterfall e controle total nos nossos projetos, mas o autor faz questão de citar este infeliz exemplo:

[...]O desenvolvimento de um cronograma é feito a partir de premissas de planejamento, que são pressupostos assumidos pelo GP e sua equipe. As premissas de planejamento estão na definição das produtividades que geram as durações das atividades - por exemplo produtividade do pedreiro no levantamento de uma parede de alvenaria (em m² /h), produtividade de um programador no desenvolvimento de linhas de programação (linhas/dia), produtividade de uma máquina na fabricação de componentes industriais (un/h)[...]

-Mundo PM #17, Pg 34

O que está errado na frase acima? Eu imagino que Aldo tenha muito conhecimento sobre construção civil, não imagino quanto de conhecimento ele tem sobre indústrias mas definitivamente não creio que ele saiba muito sobre programas de computador e quem os escreve.

Veja bem: ele compara o levantamento de uma parede -algo que é feito por um profissional com conhecimento meramente operacional- ou a produtividade de uma máquina à de um programador. Enquanto ainda não faz tal comparação infeliz o texto diz:

[...]A quantidade de recursos pode definir a duração da atividade ou, ao revés, ser determinada por ela. É só pensar numa tarefa alvenaria, cujo quantitativo seja de 600m² e cujo recurso prioritário seja pedreiro, com uma produtividade de 10m²/dia. Pode-se proceder de duas maneiras[...]fazer a parede em 15 dias, são requeridos 4 pedreiros; ou[...]com uma equipe de 5 pedreiros levanta-se a alvenaria em 12 dias[...]

-Mundo PM #17, Pg 33

Posso tirar pelo trecho seguinte, mostrado acima neste post, que o autor não faz distinção entre o tal pedreiro e sua parede do programador e seu código.

Como vocês estão carecas de saber eu já fui consultor, tanto autônomo quanto associado à uma empresa, incluindo empresas de três letras. Já entrei em muitos enormes clientes ansiosos por uma resposta aos seus problemas: por que eles não conseguem sequer prever o prejuízo num projeto de software? E sei que um artigo deste tipo cai como uma bala de prata.

Ops, bala de prata? Já que estamos neste tema vamos chamar ao diálogo Frederick Brooks, autor do paper seminal chamado “No Silver Bullet”. Fred também é uma pessoa importante no seu meio. Hoje dá aulas na Universidade da Carolina do Norte -onde fundou o departamento de Ciência da Computação- mas é mais conhecido como “o pai do Operating System/360″, um dos maiores projetos de software já realizados. Por este trabalho ele ganhou a medalha nacional de tecnologia dos EUA em 1985. Seu livro “Mythical Man-Month, The: Essays on Software Engineering” ganhou um dos prêmios mais importantes do mundo da computação, o Turing Award.

E lá vem Brooks discordar:

Finally, there is the delight of working in such a tractable medium. The programmer, like the poet, works only slightly removed from pure thought-stuff. He builds his castles in the air, from air, creating by exertion of the imagination. Few media of creation are so flexible, so easy to polish and rework, so readily capable of realizing grand conceptual structures. (As we shall see later, this very tractability has its own problems.)

Yet the program construct, unlike the poet’s words, is real in the sense that it moves and works, producing visible outputs separate from the construct itself. It prints results, draws pictures, produces sounds, moves arms. The magic of myth and legend has come true in our time. One types the correct incantation on a keyboard, and a display screen comes to life, showing things that never were nor could be.

–Mythical Man-Month, The: Essays on Software Engineering, Anniversary Edition, Capítulo 1

Não faz muito sentido comparar isso com um muro de tijolos, faz? E quem será que entende mais de software? E sobre recursos em um projeto?

The second fallacious thought mode is expressed in the very unit of effort used in estimating and scheduling: the man-month. Cost does indeed vary as the product of the number of men and the number of months. Progress does not. Hence the man-month as a unit for measuring the size of a job is a dangerous and deceptive myth. It implies that men and months are interchangeable.

Men and months are interchangeable commodities only when a task can be partitioned among many workers with no communication among them (Fig. 2.1). This is true of reaping wheat or picking cotton; it is not even approximately true of systems programming.
[...]
When a task cannot be partitioned because of sequential constraints, the application of more effort has no effect on the schedule [...]. The bearing of a child takes nine months, no matter how many women are assigned. Many software tasks have this characteristic because of the sequential nature of debugging.

–Mythical Man-Month, The: Essays on Software Engineering, Anniversary Edition, Capítulo 2

Não adianta você adicionar mais mulheres ao processo, a gestação dura quase sempre nove meses. Você não pode calcular progresso apenas pelo número de pessoas dividido pelo número de tarefas, isso é cálculo de padaria inútil no caso de software.

O problema não é nem a confusão feita pelo autor com relação à o que é um trabalhador relativamente operacional -pedreiro-, o que é uma máquina industrial e o que é um trabalhador de criatividade como um programador. O deslize de um é o de menos. O problema é que esse tipo de informação publicado numa revista que atinge a um mercado tão seleto quanto aos gerentes de projeto do Brasil (e que custa a bagatela de R$23,90) vai influenciar negativamente todo o mercado.

Eu tive que copiar trechos da SafariBookshelf (serviço que uso e recomendo) para fazer este post. Eu tenho o livro do Brooks, ou pelo menos tinha. Em algum momento de 2004 eu emprestei o livro para meu então Gerente de Projetos e ele nunca mais devolveu. Dia desses estive com ele e perguntei do livro, ele ficou de me devolver. Perguntei se ele leu e ele disse que não. O livro está na mesa dele há 3 anos e ele não leu, mas sei que ele assina a Mundo PM. A literatura ‘fácil’ ganha da literatura adequada, eu diria.

Eu continuo sem saber se construção civil e construção de software são parecidos o suficiente para utilizarem as mesmas técnicas de gerenciamento de projetos. O exemplo infeliz da revista me faz acreditar que não são, mas tem algo curioso nele: O artigo em si é sobre diversos problemas que resultam em atraso, problemas presentes em construção civil no caso mas que também acontecem em construção de software. As soluções que o autor propõe talvez funcionem em engenharia civil mas eu já as vi aplicadas à construção de software e… bem, não funcionam. Algo que tem funcionado com relativo sucesso para desenvolvimento de software, entretanto, é inverter os conceitos do artigo e tentar algo mais simples: metodologias ágeis. Se a construção civil sofre tanto de atrasos talvez, só talvez, seja a hora de uma das mais antigas engenharias aprender algo com uma das mais novas. Mas só talvez.

Se você quer saber como não fazer seus cronogramas ‘furarem’ em vez de gastar R$23,90 fiquem com uma frase de alguém que realmente entende de ciência da computação:

1. Estimates of the length of an activity, made and revised carefully every two weeks before the activity starts, do not significantly change as the start time draws near, no matter how wrong they ultimately turn out to be.

–Mythical Man-Month, The: Essays on Software Engineering, Anniversary Edition, Capítulo 14

E pensem em como sua metodologia apóia este tipo de revisão de estimativa, como seu cronograma pode se adaptar a isso. Se não achou nada no seu cenário atual, mude.

Sobre Entrevistas

Monday, October 22nd, 2007

Há mais de dois anos que entrevistar candidatos faz parte do meu dia-a-dia. Neste período eu aprendi bastante sobre como entrevistar e ser entrevistado, acho que é um bom momento para compartilhar… não estou dizendo que o texto abaixo é ótimo, é aplicável ao seu caso, ou sequer que você deva usar. É apenas uma descrição sobre o que eu tenho de experiência nesta área.

Lição 1: Seja Claro no que Procura

Não são só arquiteturas que sofrem com padronização desnecessária, entrevistas também devem ser desenhadas de acordo a situação, especialmente com o que se espera encontrar.

É preciso saber o que se procura. Geralmente alguém decide que a equipe precisa de mais um ou mais membros para ter melhor performance mas a primeira coisa a fazer -como sempre- é fugir do senso comum e se perguntar: é isso mesmo? Será que estamos fazendo as coisas certas? Será que não podemos melhorar nosso desempenho simplesmente mudando a forma de trabalho? Empresas de três letras ensinaram ao mercado que quando um projeto vai mal devemos enfiar pessoas nele (e cobrar por homem/hora, não se esqueça) mas isso é simplesmente contra tudo que sabemos sobre projetos de software. Enfiar mais pessoas em um projeto só o faz atrasar mais (leia Fred Brooks).

Se a resposta for realmente mais pessoas, então que tipo de profissional precisamos contratar? Seja lá o que for deixe bem claro no anúncio, você não vai evitar que panfletadores de curriculum encham sua caixa de email (aliás, crie uma caixa só para isso e desative-a quando não existirem mais vagas) mas vai melhorar as chances que alguém realmente interessante e interessado responda. Também não coloque em qualquer lugar seu anúncio, divulgue em listas especializadas e em grupos de pessoas que confie. Aliás, grupos de pessoas são ótimos porque você pode verificar o histórico da pessoa que enviar o curriculum.

Lição 2: Capriche na Triagem

Se você for bem específico como sugeri na lição acima dificilmente vai ter uma chuva de curriculums, mas caso tenha uma técnica de triagem se faz necessária. Se você tem tempo faça a primeira entrevista por telefone. Se você não tem muito tempo sequer para entrevistas presenciais faça o seguinte: crie uma lista com alguns problemas e peça para o cara resolver e te mandar a resposta.

Os problemas precisam ser diferentes, crie um problema sobre concorrência, um sobre otimização, um sobre modelagem, eles precisam ter o mesmo nível de dificuldade também. O problema que a pessoa escolher (só deve escolher um) te diz sobre o perfil dela. Depois faça uma revisão via telefone do código com a pessoa, é mais para evitar fraude mas ainda assim é uma ótima oportunidade para perguntar alguns aspectos técnicos, porque tomou a decisão X e não fez Y, como refatorar a solução para que fique mais XYZ, etc.

Lição 3: Nada de Perguntas McDonald’s

Para entrar numa grande empresa fui entrevistado pelo meu futuro gerente. Ele tinha na mão uma lista com umas 10 páginas de perguntas variadas sobre Java e SQL, basicamente. Após a segunda página nós já havíamos abolido a folha e partido para um fluxo mais aberto de conhecimento mútuo. Dessa experiência eu tirei um fluxo de entrevista um pouco diferente do que costumo ver.

Quando seleciono um curriculum eu geralmente monto um estereótipo para aquela pessoa: “Arquiteto”, “junior”, “pleno”, “especialista em XXX”, “enrolão”, etc. Deste estereótipo eu penso em algumas primeiras perguntas.

Quando a pessoa chega eu geralmente peço a ela que se apresente, conte um pouco da sua história. Desta o estereótipo inicial pode ser alterado ou não, geralmente após isso eu já tenho uma boa noção do perfil profissional da pessoa. Aí começam as perguntas reais.

Se eu penso que o cara é junior eu começo com algumas perguntas pedindo para ele descrever conceitos. Eu dificilmente pergunto pelo conceito diretamente mas sim algo que indiretamente vai requisitar dele que o faça, como comparações. Continuando com conceitos eu vejo se possui boas bases ou é apenas apertador de parafusos. Eu continuo perguntando, seguindo os perfis de pleno, arquiteto e especialista até ver que o cara não sabe mais. Muitas vezes encontrei juniores que sabiam mais que arquitetos.

Para “desenvolvedor pleno” a coisa começa relativamente ao contrário. Eu peço para ele descrever alguma coisa em que tenha trabalhado e depois para ele dissecar a arquitetura. No meio do caminho surgem diversos pontos interessantes para explorar como Domain Models, BO/VO, programação concorrente, técnicas de performance, etc. Sempre que possível eu faço perguntas baseadas em um cenário real que eu já tenha vivido, até para a pessoa sentir o tamanho do desafio (é difícil fazer alguns entenderem o tamanho da encrenca). Muita gente morre aqui simplesmente porque não entende nada do que trabalha. O cara está há anos desenvolvendo aplicações e não tem idéia do porque usa um padrão ou outro. Todo mundo sabe responder “um design pattern é uma solução para um problema comum blablabla” mas ninguém sabe dizer que problema o tal do BO/VO soluciona.

Tenho que admitir que para arquitetos o buraco é way over mais embaixo. A coisa começa com descrições sobre arquiteturas que ele já tenha trabalhado e, principalmente, desenhado. Geralmente nestas descrições vai haver uma menção um pouco mais interessante que o usual, como conectores JCA, filas, caches ou clusters. Aí é que está o pulo do gato: um arquiteto tem que saber como isso funciona num projeto. Não importa se na época ele não se entitulava arquiteto, não é admissível alguém que nunca parou para saber como aquilo funcionava! Algumas perguntas sobre arquitetura da JVM são sempre boas também. Você consegue descrever como o Garbage Collector funciona com muita e com pouca memória disponível? Identificar erros mais simples de parametrização da JVM?

Interessante notar que não é preciso responder certo as perguntas. Aliás, eu nem espero que sejam respondidas. As respostas ideais, da melhor para a pior:

  1. Resposta certa
  2. Caminho certo (não chegou na resposta mas elaborou bem)
  3. Resposta errada por uma bobeira qualquer
  4. Dizer que não sabe

Nessa lista não está a resposta errada. Se um candidato não assume que não conhece a resposta (e algumas perguntas não supõem que você conheça a resposta!) e chuta ele perde muitos pontos numa entrevista dessa. Mentir sobre projetos e empresas é sempre engraçado, no Rio de Janeiro eu conheço muita gente em muitas empresas e sempre consigo lembrar de alguém que teoricamente teria trabalhado com o candidato no tal projeto.

Eu sempre insisto para a pessoa tentar chegar na resposta ao menos. Na sala sempre vai haver papel e caneta ou um quadro-branco, o ato de seguir por um caminho lógico para tentar chegar à resposta é muito importante. Uma das coisas que consigo verificar assim é escalabilidade, dificilmente aparece alguém que sabe como criar um site que suporte um fluxo muito grande de acessos mas geralmente as pessoas têm pelo menos uma idéia sobre conceitos que podem usar enste caso.

Tem gente que fica muito nervosa neste ponto então é melhor criar o ambiente mais descontraído possível. Aqui isso não é problema, geralmente eu converso com a pessoa com meu jeans e camiseta usual, muitas vezes com o pé na cadeira. Não é para impressionar, é assim que as coisas são e é bom a pessoa saber disso. Eu não quero saber se a pessoa é boa ou ruim, quero apenas saber se ela é quem eu estou procurando neste momento ou não.

Lição 4: Explique o Cenário

Após a entrevista em si eu explico o cenário. Descrevo como as coisas funcionam na equipe, a hierarquia, os tipos de projeto, tecnologias e o que espero da vaga. No final respondo dúvidas.

Por que não antes? Porque pode influenciar a pessoa. Ao ouvir que nós plantamos bananas ele vai se vender como o melhor bananeiro desde Jorge Ben Jor.

Lição 5: Racionalize o Candidato

As vezes você procura um semi-deus e aparecem apenas juniores, as vezes você procura juniores e o próprio Zahl aparece. Hoje em dia um gestor tem que saber flexibilizar seu quadro de pessoal.

Se você tem vaga de senior e arrumou um junior muito interessante que tal dividir a grana do senior em dois? Ou que tal pagar o salário do junior e com o resto do orçamento investir na equipe para que todo mundo suba de nível técnico?

O tipo de entrevista acima não dispensa ninguém. Se na segunda pergunta você já viu que o cara não serve para a vaga continue, descubra quem o cara é. Num mercado como esse no mínimo você pode indicá-lo a outro gestor precisando de pessoas ou guardar na manga para outra oportunidade. Claro que se o cara for ruim ele é ruim e pronto.

Eu sei bem que não é o ideal, mas este modelo de entrevista já me fez boas contratações e, sinceramente, nenhuma ruim. Um dos efeitos ruins é que as vagas demoram bons meses para serem preenchidas mas atualmente isso é “menos pior” do que ficar meses com um desenvolvedor não-qualificado.

Adaptação de Linguagens

Thursday, October 18th, 2007

Mais um texto no philcalcado.com, desta vez algo mais genérico sobre modificações em linguagens. Eu ando lendo bastante sobre linguagens embutidas em outras (DSLs Internas) e outras formas de modificação de linguagem como Fluent Interfaces. É bem complicado chegar à qualquer conclusão em temas tão abstratos mas a experiência no uso destas técncias no dia-a-dia e no laboratório me mostraram que existem diferenças entre as formas de alterar uma linguagem. Em Language-Oriented Programming você cria linguagens, com Fluent Interfaces não.

Bom, mais sobre isso em Language Adaption.

Arquitetos McDonald’s

Monday, October 15th, 2007

Estava eu lendo sobre um novo framework criado por alguma agência governamental de um estado qualquer. Geralmente eu não resisto e faço algum comentário sobre a utilidade de um framework que não traz nada de novo ou de bom e gasta dinheiro público (dinheiro público o caramba, seu dinheiro!) para isso mas desta vez me contive só em olhar os tutoriais da ferramenta, que sempre resulta em bons anti-exemplos para postar aqui.

Não me entendam mal, eu já trabalhei para empresas públicas e aquelas que andam na zona cinza entre empresas públicas e privadas e já vi muita coisa boa sendo feita lá. O problema de empresa pública hoje é o concurseiro profissional, esta praga que assola os cofres públicos atrás de cargos que pagam bem (quem nunca viu algum informata aprendendo direito para passar em provinha?) e depois pulam para outro que paga melhor. Enfim, o problema não é ser um órgão público, poderia ser numa empresa privada (a diferença é que se você considerar como uma empresa privada tem que considerar que você é acionista que investe muitos-% do seu salário nela e deveria ter algum resultado).

O ponto inicial é que arquiteturas de referência são um conceito falido. Ter guias arquiteturas, modelos, sugestões é uma coisa, impor uma arquitetura única é outra. O Luca já deu diversos motivos para não fazer este tipo de coisa e eu lembro de um projeto que participei há alguns anos atrás em uma grande empresa que utilizava esta técnica.

Toda a parte de logística da empresa, um mega-departamento com seu próprio vice-presidente, utilizava um framework que foi definido por uma equipe arquitetural. Eu conheci o arquiteto em questão e não acho que ele seja um mau profissional, pelo contrário é bem talentoso. O problema é o diálogo:

- Fulano, estamos cansados de gastar dinheiro nesta arquitetura mainframe, precisamos migrar para Java logo.
- Ok, falei com a consultoria XYZ e eles alertaram para o fato de que não existe ‘desenvolvimento Java’, você tem que escolher uma plataforma diferente a cada projeto!
- Mas @#$#! Se eu vou comprar Java eu vou comprar algo que sirva para tudo que venhamos a fazer. Eu quero uma solução, Fulano, se vira!

(…)

- Arquiteto José, precisamos definir a tecnologia utilizada.
- Mas precisamos testar…
- Cara, a gente paga você pra tomar decisão, aprende isso de uma vez. Sabe o projeto da agenda telefônica? Aquele que não tem a menor importância? Então, pega ele pra fazer, junta seus melhores programadores e faz uma prova de conceito de uma arquitetura.

E lá vai o arquiteto fazer um projetinho sem valor nenhum com a tal tecnologia. O projeto invariavelmente é um sucesso mas se falhar ninguém liga. Daí agora todas as aplicações usam o framework.

E esquecemos o que há de mais importante na arquitetura. O engenheiro analisa a obra do ponto de vista técnico, o arquiteto analisa de diversos pontos de vista. Lembro de um caso recente onde um amigo precisou criar um sistema complexo rapidamente. O sistema exigia uma complexidade grande e deveria ser feito em pouquíssimo tempo com uma equipe de desenvolvedores junior. O arquiteto viu o cenário como um problema e traçou um plano: criou uma camada de abstração forte (quase uma DSL) que permitia aos programadores desenvolver rapidamente mesmo sem muito conhecimento sobre Java. Quando o projeto foi bem-sucedido apareceu o gerente de tecnologia maravilhado! Ele queria adotar essa prática em todos os projetos, minimizando drasticamente custos e tendo sistemas prontos na data. Bala de prata.

Este arquiteto em questão se negou a fazer parte do grupo que definira o novo framework. Experiente do jeito que é ele sabia que uma arquitetura que dá certo em um projeto não necessariamente vai dar em outro e ele não apostaria sua carreira e prestígio profissional num projeto furado desses. Como era consultor ele foi remanejado para outro cliente e a última notícia que tive da empresa é que ela criou seu framework com Velocity, Struts e JDBC, com uma versão em EJB 2.1 -nenhum projeto com este framework foi um sucesso até agora.

Ainda que o projeto que originou a arquitetura de referência tenha sido muito complexo e um sucesso absoluto isso não quer dizer que outros com esta arquitetura serão. Não é porque objetos foram feitos para arquiteturas do tipo Domain Model que ela é a mais adequada sempre, não é porque EJBs são o mecanismo padrão de distribuição que ele deve ser utilizado para qualquer RPC.

Existe um paradoxo nas arquiteturas de referência: para se ter uma boa arquitetura (de referência ou não) é necessário um bom arquiteto mas a primeira coisa que um bom arquiteto vai dizer é que arquiteturas de referência são uma péssima idéia.

Anotações sobre Language-Oriented Programming (LOP)

Friday, October 12th, 2007

Como alguns sabem eu tenho um blog em inglês onde o foco é na minha linha de pesquisa atual: Domain-Specific Languages e Language-Oriented Programming. Eu venho psotando sobre minhas experiências brincando com este “novo” paradigma e acabo de postar o rascunho de um primeiro artigo sobre o tema. Comentários são mais que bem-vindos.

.Net: Princípios OO e Alt.Net

Wednesday, October 10th, 2007

Duas rapidinhas sobre Microsoft .Net:

  1. Já está nas bancas a nova edição da Mundo .Net (#5) com mais um artigo meu na coluna sobre arquitetura. Desta vez o foco são princípios de Orientação a Objetos. O artigo é bem genérico eu recomendo que mesmo programadores de outras plataforma dêem uma olhada.
  2. Martin Fowler publicou uma ótima análise do que pode ser o movimento mais interessante dentro da plataforma .Net: o movimento alt.net.