Uncertainty

Project Uncertainty PrincipleThis came to my mind when I was watching this lecture, given by Ricardo Semler at the MIT Sloan School of Management, in 2005.

At some point in the lecture, Ricardo talks about intuition, and how intuition is very useful to solve problems, but still is not accepted in the corporate world.

In his words, talking about the chess match between Kasparov and Deep Blue:

How is it possible, at all, for something with 4 moves (Kasparov) to play something with 4.000.000 moves (Deep Blue)?

…. There is only one thing that he has that the machine has not, and that  is intuition.

…. Where are we putting intuition to play in the corporate world?

And this thought stayed in my head. Why the majority of people find it so difficult to accept intuition and to deal with uncertainty? In Ricardo’s words, why are we willing to trick ourselves and everybody else into thinking that we have control?

And why is this topic relevant to software development?

Because that’s one of the reasons that make agile methods so difficult to be accepted. Most people are not prepared to accept that the project duration can’t be precisely measured. Or that the scope should be flexible, because we still don’t know (oh my God!) what is important and what isn’t. And that the decisions we make should not be based on a complex function point calculation, but in simply in the team’s intuition?

Instead, they prefer to develop software in ways that have failed for many and many years, but still thinking on having control over all the project. They find easier to believe in an excel-calculated estimate for the total project of 170.1234hs than in an estimate that says “roughly 1 month”, and they hope to deliver software within fixed budget, size, scope and quality (good luck with that).

As Ricardo cited, it doesn’t matter if you are wrong, but you have to be precisely wrong.

Cheers

“Tell me how you’ll measure me…” (2)

Coincidence or not, after writing the last post, I’ve just received the InfoQ newsletter, which contains this article, about bonus distribution within agile teams. And what does it have to do with measures and incentives?

Well, if you want to have some great individuals, reward them based on individual performance, if you want a great team, don’t try to establish some weird criteria, and measure everyone’s performance based on the team result.

Like Mary Poppendieck cited on her book, distribution of bonus to an Agile team is like playing with dynamite.

“Tell me how you’ll measure me…”

Reading some posts on the web, I’ve found this one, written by Liz Keogh, which talks about perverse incentives, i.e. , situations when an incentive is given to reach some goal, but instead of helping, it works against the objectives of the people who proposed the incentive.

I agree with all Liz has said on the post, and while reading the post, I couldn’t help but thinking about something that was written in The Goal, a book I’ve read a while ago:

“Tell me how [and when] you’ll measure me, and I’ll tell you how I’ll behave”

I think this sentence says it all. People should be very careful when proposing ways to measure and (especially) evaluate persons. What they don’t realize is that the metric that is used will define how the persons will behave when trying to perform their jobs.

If you measure tests written, you’ll have lots of tests , if you measure number of bugs found, guess what you’ll have?

So what I should measure? How should I rate my employees? Well, that’s easy. The only metric you should use is the ultimate goal of your company or team, as broad as it can be. And that’s one of the reasons why I believe agile projects work, because the main metric that is always used, is the business value delivered to the client (ultimate goal, remember?).

I’m not saying that people can not use all kinds of metrics, like code coverage or any other, to develop software. I’m just trying to explain that all the other metrics, besides the goal of the project, have to be used as secondary way to see if the project is going fine. There is no benefit in having a 100% tested code, if you can not deliver any business value to the customer. What is he paying for?

So, as a last thought, when you are thinking about incentives, think with care, and make sure the incentives you are giving aren’t going to be perverse!

Duas Cabeças Pensam Melhor Que Uma?

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.

Lean no MIT

Pra quem ainda não conhece Lean, ou acha que não é serio, tem uma lista legal de artigos nesse post, que são alguns dos que fazem parte do MIT Lean Advancement Initiative (LAI).

Entrevistas… dois lados complicados de uma mesma moeda

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! :-)