Archive

Portuguese

For the Brazilian crowd (or anyone who wants to be part of it), between the 25th and 26th of April will take place in Porto Alegre (my home town : ) ), the 2009 Agile Weekend, which has my friend Daniel Wildt as part of the organizing team.

This will be hopefully the first of many Agile conferences happening in South Brazil, and will serve to boost even more Agile adoption in the region.

portoalegreagileweekend2009_banner_468x60

Needless to say, I really wanted to go, but London is not close enough to Brazil yet…

Angels Oprhanage

Esse post sai um pouco dos assuntos habituais do blog, mas nem por isso trata de algo menos importante. Pelo contrário, trata de um assunto muito mais relevante do que como desenvolver software.

Contextualizando, eu estou atualmente participando da ThoughtWorks University, em Bangalore, na Índia. Ontem, devido à inspiração fornecida pelo Roy, que é o dono da empresa (e tambem um cara excepcional), e devido a organização realizada por alguns outros colegas (aos quais eu sou extremamente agradecido :-) ), nós fomos visitar o Angels Orphanage, um orfanato aqui da cidade, onde 70 crianças vivem em um espaço que deve ser um pouco maior do que os quartos onde nós costumamos dormir.

Essa foi a minha primeira visita a um orfanato, e também foi a primeira vez que eu percebi a alegria que pode ser proporcionada a essas crianças somente dando pequenos presentes, como uma bola de futebol, ou oferecendo um pouco de tempo e atenção durante uma tarde, como fizemos ontem.

De certa forma fiquei um pouco pra baixo por essa ter sido a minha primeira vez, principalmente pq eu venho do Brasil, um lugar onde também existem milhares de crianças nessa situação que eu poderia ter ajudado de alguma forma. Mas por outro, também fiquei contente por ter finalmente feito isso, e espero que consiga continuar e não ter que esperar outros 25 anos por uma nova oportunidade.

E se eu tiver sorte, espero poder influenciar alguma pessoa que venha a ler esse post, para que ela também possa vir a ajudar.

Um abraço.

A fagulha necessária para a criação de um post surgiu na leitura de alguns posts por aí (como esse), que me fizeram lembrar de um assunto sobre o qual eu tenho vontade de escrever a algum tempo: programação em pares.

Uma das razões para eu escrever sobre isso é o fato de eu já ter experimentado a programação em pares em duas oportunidades, a primeira na minha empresa no Brasil, e a segunda agora na ThoughtWorks University, e nesses dois períodos eu tenho percebido muito mais vantagens do que desvantagens nessa prática.

Programar em duplas, embora possa parecer anti-econômico à primeira vista, resulta em código muito melhor, aumenta a produtividade dos desenvolvedores (que não tem tempo para ficar lendo e-mails e falando no msn) e, principalmente, propicia o compartilhamento de informações e habilidades entre todos os membros da equipe, um dos problemas abordados nesse outro post.

Por sinal, o compartilhamento de informações é auxiliado por uma outra prática, que é a troca freqüente de pares, o que é detalhado no artigo Promiscuos Pair Programming, de Arlo Belshee, que também incentiva uma terceira prática, que é de o driver da dupla (o desenvolvedor que está efetivamente teclando) , seja aquele que possui menos experiência no que está sendo feito, para que assim este aprenda novos conceitos o mais rápido possível. Citando o artigo acima:

Promiscuity, it turns out, is a good way to spread a lot of information through a group quickly. Rapid partner swapping ensures that a good idea, once envisioned, is soon practiced by every pair. Replacing individual accountability with team accountability empowers each person to do those tasks at which he excels – and allow someone else to take over for his weaknesses.

E colocando o chapéu de desenvolvedor, para mim o principal benefício da programação em pares é um ambiente de trabalho muito melhor, e uma maior integração entre todos os membros da equipe. Faz diferença trabalhar ao lado de alguém, podendo conversar, trocar idéias e criar um relacionamento, ao invés de simplesmente chegar na empresa, sentar na frente de um computador e ficar lá até a hora de sair, sem falar com ninguém, como eu já vi em alguns ambientes onde eu trabalhei.

É claro que podem também surgir problemas na programação em pares, como é ressaltado nesse post, onde a troca excessiva de pares pode ser um problema. No entanto, ainda acho que esse e outros problemas podem ser resolvidos com bom senso, e os benefícios da prática são muito maiores.

Mas o que me incomoda um pouco (e também é uma das razões desse post), é que no Brasil pouco se tem falado sobre a utilização de programação em duplas. Em todas as listas e blogs que eu acompanho, essa prática era ressaltada a algum tempo atrás, mas parece que foi perdendo força aos poucos e hoje quase não é citada. Além disso, não tenho ouvido muitas notícias de empresas no Brasil adotando essa prática, ao contrário do que acontece no exterior.

Espero que eu esteja errado, e que as empresas estejam percebendo as vantagens de programar em duplas, e de como essa prática pode ser fundamental na formação de uma boa equipe de desenvolvimento de software.

Então, o que vcs acham, duas cabeças pensam melhor do que uma?

Abraços.

Para os que não sabem, atualmente eu estou em Bangalore, na Índia, participando do treinamento que a Thoughtworks oferece aos seus novos graduates, a ThoughtWorks University.

Bom, ontem, depois de assistir a uma sessão opcional do curso, apresentada pela Liz Keogh, eu finalmente posso dizer que entendo o que é Behaviour Driven Development, o famoso BDD. Essa é uma das buzzwords do mundo do software que circula ha algum tempo, mas devo confessar que nunca consegui parar para verificar o que era, e sempre imaginei que fosse mais uma metodologia ágil, tipo o FDD.

Acontece que o Behaviour Driven Development é algo talvez até mais simples, mas nao por isso menos interessante :-) .

BDD nada mais é do que uma “otimização” do desenvolvimento orientado a testes, que tem como sua principal característica, e ainda mais importante, benefício, o fato de codificar as aplicações em uma linguagem voltada para o que é mais importante e muitas vezes esquecido, o resultado que a aplicação tem para o cliente.

Olhando por aí, uma justificativa interessante que eu achei foi a seguinte, no blog do Dan North:

As a final thought, while I was thinking about this I realised the term “behaviour-driven” contrasts with “test-driven” in a similar way. My goal as a developer is to deliver a system that behaves in a particular way. Whether or not it has tests is an interesting metric, but not the core purpose. “Test-driven” development will cause me to have lots of tests, but it won’t necessarily get me nearer the goal of delivering business value through software. So you can use goal-oriented vocabulary in your development process as well as your code to help maintain perspective on what you are trying to achieve.

Já que todos (todos?) concordamos que entregar valor de negócio para o que cliente é o que realmente importa no desenvolvimento de uma aplicação, porque não desenvolver essa aplicação de acordo com a linguagem do cliente, de forma que até ele possa entender (mesmo que em um nível básico) o que a aplicação está fazendo, e para que serve aquele código.

É claro que não é só esse o benefício, já que muitos de vcs devem estar pensando: para que diabos o meu cliente que ver o código-fonte do software?

Mas desenvolver código-fonte de acordo com a linguagem do negócio também auxilia o desenvolvedor a entender e discutir as funcionalidades que ele está desenvolvendo, e realmente saber qual é o objetivo de ele sentar na frente do computador 8 horas por dia, o que invariavelmente resulta em código de melhor qualidade.

Comentários?

Um abraço.

O post de hoje surgiu de uma discussão que está havendo em uma das listas em que eu participo (round 1), onde o assunto principal é como as empresas devem lidar com a questão do conhecimento, ou seja, como fazer com que o funcionário (que pode ir embora a qualquer momento) não seja detentor de tudo o que uma empresa de tecnologia tem de maior valor: seu capital intelectual.

Como a lista é de métodos ágeis, vcs podem imaginar que o tópico esteja girando em torno da documentação, e de como ela é (é mesmo?) necessária para que a empresa não seja refém (esse é o termo sendo utilizado…) dos seus funcionários.

Essa discussão já gerou um outro post (round 2), onde o Flávio comenta como isso é ainda mais preocupante em pequenas (ou micro) empresas, que realmente não têm todo esse fôlego para pensar em grandes alternativas. Citando o Flávio:

Vejam, falamos de situação em que micro-pequenas empresas precisam sobreviver dia-a-dia ao mercado burocrático e sufocante que o governo provê… são raríssimas as empresas que conseguem parar, respirar, organizar e seguir adiante. É tudo feito sob-demanda.

Então, a solução, é claro, é fazer as “vontades” dos funcionários. Tornar a empresa atrativa para que estes se sintam satisfeitos e reconhecidos, e assim, permaneçam na empresa.

Realmente, eu tenho que concordar com o Flávio. Já tive a minha micro empresa e sei como é esse cenário que ele está descrevendo. No entanto, eu acho que a solução para esse caso é o mesmo do que para as grandes empresas (claro que um pouco mais difícil… :-) )

No meu ponto de vista, realmente a empresa não deve se preocupar em se tornar “refém” dos seus funcionários, simplesmente pelo fato de que ela sempre o é. Eu não tenho dúvidas de que qualquer grande, média ou pequena empresa (de tecnologia), se perder grande parte dos seus funcionários, não terá mais como seguir competindo no mercado. Eu acho que a preocupação que cada empresa deve ter é de não ser refém de um ou poucos funcionários, porque nesse caso sim, a perda de um funcionário específico (o que pode acontecer com certa freqüência), é um grande problema para a empresa.

É claro que o primeiro passo para que isso não aconteça, assim como alguns participantes da discussão levantaram, é fornecer um bom ambiente de trabalho para todos que estão na empresa. Não acho que se deva ser refém do funcionário, nem fazer todas as vontades dele, mas sim respeitá-lo e valorizar o trabalho que ele está fazendo, e isso não passa apenas pelo seu salário, como alguns podem entender. Se dermos uma olhada na Pirâmide de Maslow , que lista as necessidades que as pessoas desejam satisfazer, pode-se notar que a renda (ou segurança de recursos, como está na pirâmide) está apenas no segundo nível de necessidades, e que existem outros três níveis acima, sendo que esses também devem ser providos pela empresa onde essa pessoa está trabalhando (ok, intimidade sexual talvez não…).

Agora alguém deve estar pensando:

Ok, estou fazendo tudo isso, mas nada impede de alguma empresa vir aqui e oferecer um cargo muito melhor para meu funcionário, certo?

Certo. Nada impede isso, e daí que entramos no segundo ponto que eu considero importante. Conforme eu li em algum livro (não me lembro qual), há uns tempos atrás, o dono da empresa (ou gerente da equipe, como era o exemplo do livro) deve sempre saber qual é o Truck Number de sua empresa, ou seja, quantas pessoas devem ser atingidas por um caminhão para que a empresa afunde.

Se esse é um número pequeno, realmente a sua empresa tem problemas. E para resolver isso, nada melhor do que espalhar o conhecimento entre seus funcionários, ou seja, criar uma cultura de troca de conhecimento, e também exigir que os funcionários mais capacitados (os seqüestradores, seguindo a analogia.. :-) ) passem o seu conhecimento para os demais membros da equipe.

E nesse ponto eu discordo de alguma opiniões que eu li durante a discussão, onde se afirmou que deve-se então criar documentos e documentos para armazenar o conhecimento das pessoas. É claro que talvez sejam necessários documentos, mas deve-se ter uma grande atenção na quantidade e também no tipo de documentação que se está criando, já que, assim como em projetos, escrever documentos para ficarem no armário não serve para nada.

O principal é não ter um ambiente (como alguns onde eu já trabalhei), onde cada funcionário é dono do seu nariz, detentor do seu conhecimento e não faz a mínima questão de passar isso adiante, com medo de que se torne substituível por outro. Na minha opinião não serve ter uma pessoa extremamente capacitada se ela não estiver pronta para compartilhar isso com outros.

O mais importante, é realmente criar um ambiente onde o conhecimento seja compartilhado entre os funcionários, seja através de programação em pares, seja através de reuniôes freqüentes, mini-workshops internos ou um wiki da empresa, ou qualquer outro método que se considere interessante, mas ao mesmo tempo não atrapalhe demais o andamento do trabalho, e que realmente seja útil quando aquele funcionário for embora.

Acho que era isso o que eu tinha a dizer, espero que vcs tenham opiniões a respeito!

Um abraço.

Bom, como eu faço ocasionalmente, esse post na verdade pode ser considerado mais um comentário sobre esse outro, do Guilherme Chapiewski. Na verdade eu estava escrevendo um comentário, mas como estava ficando muito grande, achei melhor promovê-lo para um post aqui. :-)

Apesar de eu ter alguns pontos discordantes, sobre os quais falarei daqui a pouco, achei bem legal o post do Guilherme, e também o fato de eles (ele a sua equipe) se preocuparem com a criação de um processo de seleção. Eu tive uma empresa e entao já passei por essa dúvida de como selecionar pessoas, e com certeza a existência de um processo faz toda a diferença.

Além disso, recentemente eu vi o outro lado dessa moeda (ou da mesa de seleção, para ser mais preciso), porque estive procurando emprego, e então participei de diversos processos seletivos (acabei sendo contratado pela ThoughtWorks UK :-) ), e essa maratona de testes me fez criar algumas opiniões.

O ponto que eu discordo do processo descrito pelo Guilherme é a entrevista tecnica com a equipe, etapa 4, mais exatamente no ponto “perguntas cascudas”. Eu acho que o processo apresentado por ele tem um ponto muito interessante que é a questão dos livros, para evidenciar os interesses e capacidade de auto-aprendizado do candidato, mas eu particularmente acho um desperdício não selecionar alguém por causa de requisitos tecnicos.

Quer dizer, eu acho importante os requisitos tecnicos, como o conhecimento de computação, uma boa formação em nivel de graduação, mas conhecer framework X,Y ou Z, ou então saber aplicar o padrão W, são coisas que, no meu ponto de vista, podem ser aprendidas pelo bom candidato (aquele interessado e com capacidade de auto-aprendizado), tanto em livros, como de noite em casa, como durante o dia-a-dia de convivência com os novos colegas de trabalho.

Claro que se tu fizeres várias perguntas técnicas e o candidato souber todas as respostas além de ser um cara fantástico, só vai te dar mais certeza de contratá-lo, mas o que eu acho é que muitas vezes existem excelentes candidatos, que sabem se virar muito bem, mas que por diversas circustâncias da vida nunca trabalharam com Java, e sim com C++, mas que são excelentes desenvolvedores por conhecerem os fundamentos de computação, e vão ter capacidade de aprender qualquer coisa durante o trabalho.

Além disso, é ingenuidade pensar que as tecnologias com quais a empresa trabalha hoje vão ser as mesmas daqui a 2 ou 5 anos, então não adianta se contratar uma ótima pessoa técnica (partindo do princípio de que se quer formar uma equipe duradoura), se ela não vai ser capaz de superar os novos desafios que estão por vir.

Então por que não eliminar essas “perguntas cascudas” e tentar focar em descobrir se o candidato tem capacidade e interesse de sempre estar melhorando e aprendendo novas coisas? Eu digo isso por que em muitas das seleções das quais eu participei eu acabei não indo bem por que eram feitas perguntas técnicas sobre tópicos que eu realmente não me lembrava (como análise combinatorial), mas que se eu tivesse um computador com acesso à Internet eu poderia descobrir na hora. Por outro lado, as seleções das empresas que eu mais queria trabalhar (no qual a TW é uma delas) não passam perto de questões técnicas (ao menos não no momento da entrevista, quando o candidato está tenso e com muitas chances de se esquecer dos detalhes de implementação daquela determinada biblioteca…), mas sim focam em atividades em grupo, apresentações pessoais e questões de raciocínio.

Acho que a regra de ouro sobre seleções para mim é que se o candidato tiver que estudar para vir ser entrevistado, então o processo está avaliando as habilidades erradas.

E acho que além disso, o único ponto que está faltando na minha opinião no processo do Guilherme, que talvez exista mas não tenha sido comentado, é a questão do feedback. Não tem preço para um candidato (e para a impressão que ele tem da empresa) o fornecimento de um bom feedback sobre o processo de avaliação, que passa por dizer se ele passou ou não (o que muitas empresas se esquecem, avisando somente aquele que foi selecionado) e também explicar por que se achou que ele não preenchia o perfil do profissional desejado. Não tem nada pior do que se submeter a um processo de seleção extenso, e depois ficar se sentindo mal por não ter sido escolhido sem saber que, muitas vezes vc ficou de fora não por ser um incompetente, mas por que a vaga exigia um perfil mais ou menos técnico, o que ajuda a pessoa a se preparar para outras seleções.

Acho que era isso. Desculpem por ter ficado tão longo, mas eu considero esse um tópico bastante interessante!

Dêem suas opiniões! :-)

Follow

Get every new post delivered to your Inbox.

Join 836 other followers