Fedora instalado NO pendrive

You can see this post in english too.

“Long time no see, blog” 😉

Daniel Faraday - Long time no see
Daniel Faraday - Long time no see

Por um tempo tentei utilizar o XFCE Spin do Fedora como uma alternativa para continuar no GNU/Linux e manter o laptop corporativo sem alterar qualquer configuração padrão. Chateado com a performance, resolvi realizar a instalação do SO diretamente no pendrive.

A diferença de performance impressiona. Se como eu, pretende ter uma distro mais ou menos pronta para permtir a continuidade de seu trabalho mesmo em um PC que não o seu, esqueça as versões LIVE e faça a instalação do SO no pendrive. Funciona como uma luva, vai causar melhor impressão e proporcionar uma experiência de uso bem melhor do que a opção anterior.

O único problema que tive foi que durante este processo descobri o que pode ser um bug nos modelos Latitude E6420 da Dell: Se você desabilitar o HD na BIOS seu drive de CD/DVD não vai ser capaz de realizar boot algum, ou seja, só será possível a partir da USB. O estranho é que o simples fato de ligar o HD novamente torna o drive de CD/DVD capaz disso. Nessas situações eu desligo o HD para prevenir qualquer alteração indesejada durante o processo de instalação.Fedora USB Stick

A instalação foi finalmente possível com dois pendrives: Instalei a versão LIVE em um, realizei o boot com os dois pendrives ligados e ao término do boot utilizei o ícone “Install on Hard Disk” para instalar o SO no segundo pendrive. Com tudo funcionando, liguei o HD na BIOS de novo.

O laptop permanecerá com seus programas e configurações dentro do padrão corporativo e eu poderei trabalhar feliz num SO onde sou mais produtivo.

 

Até! :-).

10 dicas estúpidas para o MySQL

You are able to see this post in english too.

Olá!

O post deste mês traz 10 dicas estúpidas para o dia-a-dia com o MySQL. Lá vão elas:

  1. Utilize um arquivo .my.cnf em sua homedir com dados de user/senha:
    [client]
    user=root
    password=mi-nha_s3nha
  2. Termine os comandos com G ao invés de “;”: Isso lhe dará uma visão “form” ao invés de tabular. Necessário muitas vezes;
  3. Visões materializadas: Quando as Views não oferecerem a performance esperada, utilize triggers para alimentar tabelas que lhe servirão como views. Utilizando este recurso com cuidado, teste e documentação, ajuda bastante!
  4. Cuide do parâmetro ENGINE de seus bancos e tabelas: Escolha o melhor considerando a relação de R/W entre elas;
  5. Personalize o prompt do MySQL no arquivo .my.cnf de sua homedir. O exemplo abaixo mostrará "MySQL:db_exemplo>". Existem também os parâmetros u para o user e h para o host:
    prompt='mysql:d>'
  6. Uma vez no prompt do MySQL, CTRL+A te leverá ao início da linha, CTRL+E ao final.
  7. Para criar uma tabela t2 com a mesma estrutura da tabela t1:
    CREATE TABLE t2 LIKE t1;
  8. Para criar um usuário e dar acesso numa única linha:
    GRANT ALL ON db_name.* TO 'username'@'host' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
  9. Gerar um arquivo CSV a partir do shell (melhor que OUTFILE pois leva o nome das colunas também):
    mysql -AD dbname -e "Seu SELECT aqui;" | tr "t" ";" > resultset.csv
  10. Agora a última, mas não menos estúpida. Exibir as queries em execução (o parâmetro FULL é opcional):
    SHOW [FULL] PROCESSLIST;

Memorizá-las tornará seu dia-a-dia com o MySQL mais fácil.

Até a próxima!!

Benchmark de métodos de atribuição do PHP

You are able to see this post in english too.

Olá!

Este post mostrará um benchmarking entre as formas de atribuição suportadas pelo PHP:
a) Atribuição simples (ex.: $j = $j + 1);
b) Atribuição com associação à direita (ex.: $j += 1);
c) Atribuição não associativa (ex.: $j++);

O material de teste:

  • Máquina: Dell Optiplex 755;
  • Ambiente: Bash, sem X. Sistema de arquivos Ext4;
  • uname -a:
    Linux optiplex755 2.6.34.8-68.fc13.x86_64 #1 SMP Thu Feb 17 15:03:58 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

  • php -v:
    PHP 5.3.5 (cli) (built: Jan 7 2011 18:46:32)
    Copyright (c) 1997-2010 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

Todos os arquivos do teste podem ser baixados aqui. A metodologia aplicada foi:
1) Desligar a máquina por 1 minuto;
2) No bash: for i in `seq 1 100`; do echo $i && php t1.php >> t1_output01.log; done;
3) Desligar a máquina por mais 1 minuto;
4) No bash: for i in `seq 1 100`; do echo $i && php t1.php >> t1_output02.log; done;
5) Desligar a máquina novamente, por mais 1 minuto;
6) No bash: for i in `seq 1 100`; do echo $i && php t1.php >> t1_output03.log; done;

Repetiu-se as ações acima para os arquivos t2.php e t3.php.

Os arquivos t1.php, t2.php e t3.php possuem cada um três arquivos de log com seus tempos de execução. Os 300 resultados de cada script foram então ordenados de forma ascendente pelo tempo de execução e descartou-se os 100 melhores e os 100 piores resultados de cada um, ficando então somente com os 100 melhores tempos médios de execução.

O resultado:

Gráfico - Comparando os tempos de execução
Gráfico - Comparando os tempos de execução

O gráfico mostra que utilizar o método “($j += 1)” ou o método “($j++)” pode lhe render até 0.02 segundo de vantagem, em média.

Alteraremos nosso documento de Coding Standards para que se prefira sempre um dos métodos que levaram vantagem na comparação, economizando ainda mais tempo de processamento.

Férias!!

You are able to see this post in english too.

A todos que acompanham este blog,

Fevereiro foi um mês que tirei para me dedicar totalmente à família e às férias. Por isso, sem posts.

E devem saber o que acontece com a quantidade de trabalho quando ficamos 25 dias fora 🙂

Em breve, mais um artigo sobre PHP. Vejo vocês no próximo post. Estou querendo re-organizar o blog e meu site em geral.

Até 😉

Cuidado com flags!!

You are able to see this post in english too.

Olá!

O primeiro artigo do ano é sobre modelagem de dados.

Algo que me incomoda há muitos anos em qualquer modelagem de dados são atributos que funcionam como indicadores (ou flags) em tabelas.

Pense duas ou três vezes antes de criá-las pois na maioria dos casos, são desnecessárias. E porquê? Criamos flags para sinalizar a situação de um registro numa tabela, que pode ser muitas vezes verificada em outros atributos, gerando situações de dicotomia (bem problemáticas, por sinal). Vamos aos exemplos:

mysql> SELECT * FROM tb_pedidos LIMIT 5;
+------------ ... +--------------+------------ ... +----------------+
| cod_pedido  ... | metodo_envio | data_envio  ... | pedido_enviado |
+------------ ... +--------------+------------ ... +----------------+
| 986565      ... | 1            | 2010-11-18  ... | S              |
| 659813      ... | NULL         | NULL        ... | N              |
| 986542      ... | 2            | 2010-11-13  ... | S              |
| 321598      ... | 1            | 2010-01-14  ... | S              |
| 112982      ... | NULL         | NULL        ... | N              |
+------------ ... +--------------+------------ ... +----------------+
5 rows in set (0.00 sec)
mysql>

Acima vemos algo bem comum: um flag para indicar algo que uma outra tupla já indica. Além de redundante, isso pode facilmente quebrar a integridade dos dados. Um erro de código ou um mero esquecimento no momento de um insert/update pode resultar na situação abaixo:

mysql> SELECT * FROM tb_pedidos LIMIT 5;
+------------ ... +--------------+------------ ... +----------------+
| cod_pedido  ... | metodo_envio | data_envio  ... | pedido_enviado |
+------------ ... +--------------+------------ ... +----------------+
| 986565      ... | 1            | 2010-11-18  ... | S              |
| 659813      ... | NULL         | NULL        ... | S              |
| 986542      ... | 2            | 2010-11-13  ... | S              |
| 321598      ... | 1            | 2010-01-14  ... | S              |
| 112982      ... | NULL         | NULL        ... | N              |
+------------ ... +--------------+------------ ... +----------------+
5 rows in set (0.00 sec)
mysql>

Ou ainda:

mysql> SELECT * FROM tb_pedidos LIMIT 5;
+------------ ... +--------------+------------ ... +----------------+
| cod_pedido  ... | metodo_envio | data_envio  ... | pedido_enviado |
+------------ ... +--------------+------------ ... +----------------+
| 986565      ... | 1            | 2010-11-18  ... | S              |
| 659813      ... | 1            | 2010-05-12  ... | N              |
| 986542      ... | 2            | 2010-11-13  ... | S              |
| 321598      ... | 1            | 2010-01-14  ... | S              |
| 112982      ... | NULL         | NULL        ... | N              |
+------------ ... +--------------+------------ ... +----------------+
5 rows in set (0.00 sec)
mysql>

Como proceder para tratar este tipo de caso? A resposta é analisar cada flag conforme abaixo:

  • Verifique cuidadosamente cada uma delas. Há outro atributo (ou um conjunto deles, mesmo em outras tabelas) que seja capaz de mostrar a situação requerida? Se sim, talvez esta flag seja inútil, e você pode realizar uma das ações abaixo:
    • Crie-a como campo calculado na tabela em questão;
    • Crie views, e nelas crie a flag como campo calculado;
    • Em último caso, use triggers para alimentar as flags com base no atributo/tupla que pode mostrar a situação.

Claro, há situações em que a flag é necessária, e neste caso sou a favor delas (vide atributos “sexo” e “registro_ativo” abaixo):

mysql> SELECT * FROM tb_pessoas LIMIT 5;
+------------ ... +------ ... +------------+ ... +-----------------+ ...
| nome_pessoa ... | sexo  ... | data_cad   | ... | registro_ativo  | ...
+------------ ... +------ ... +------------+ ... +-----------------+ ...
| Carlos      ... | M     ... | 2006-01-18 | ... | S               | ...
| Sandro      ... | M     ... | 2005-01-12 | ... | S               | ...
| Henrique    ... | M     ... | 2008-02-13 | ... | S               | ...
| Luiza       ... | F     ... | 2006-01-14 | ... | S               | ...
| Antonio     ... | M     ... | 2008-01-14 | ... | N               | ...
+------------ ... +------ ... +------------+ ... +-----------------+ ...
5 rows in set (0.00 sec)
mysql>

Uma boa dica seria fazer a seguinte pergunta a si mesmo antes de criar um atributo indicador/flag: “Este atributo serve para indicar uma situação cujo estado pode alterar durante a vida do registro?” Se a resposta tende para SIM, então imagine o farol no mínimo, na cor amarela. Então vá com cuidado e analise se pode, ao invés de criar mais um atributo físico, criar um campo calculado, uma view ou uma trigger para alimentá-lo de forma automática.

Concorda/Discorda/Algo a acrescentar? Comente!!

Até! 😉

Seu ambiente de trabalho em 7 itens

Olá!

Este post é um meme que continuará a cadeia iniciada pelo Augusto Pascutti & Anderson Casimiro, na qual o Rafael Dohms fez uma contribuição e me adicionou.

Qual é a idéia?

  1. Escreva sobre 7 itens de seu ambiente de trabalho (fale sobre qualquer ponto que quiser);
  2. Indique de 3 a 5 pessoas para que possivelmente façam um artigo sobre seu ambiente.

Simples assim?! Sim, então vamos lá:

  1. SO: Fedora GNU/Linux. Sou usuário GNU/Linux desde 2001. Comecei a usar o Fedora após a migração natural que ocorreu dos usuários de RedHat 9 para o Fedora 1. No Fedora 7 abandonei e iniciei o uso do ArchLinux, distribuição que comanda meu notebook até hoje :-). Meu desktop no trabalho mantive no Fedora, com a versão 13. O ambiente gráfico é Gnome, com alguns elementos do desktop levemente adaptados às minhas necessidades. Uma frescura minha são os wallpapers, que troco religiosamente, toda sexta-feira. Aliás, meus perfis no AboutMe (preciso melhorar o look), Twitter & Identica refletem o que está no meu desktop.
  2. IDE (?!): GEdit, Vim & NetBeans. O GEdit, com 1/2 dúzia de plugins, fica muito parecido com o TextMate (só parecido!!). E é minha escolha primária para programar. Quando canso, abro o Vim. O NetBeans só uso quando trata-se de projeto com alta dependência de objetos e onde a memória ainda falha sobre a estrutura e relacionamento entre eles.
  3. VCS: Git. Putz, caros, foi amor à primeira vista. Quando o conheci em Jan/2009, troquei todos os repositórios SVN mantidos aqui por repos Git. Junto com uma estratégia de VCS eficiente, torna-se indispensável. O website oficial da ferramenta e o GitRef são leituras indispensáveis. Ah, o utilizo sem clients. Só abro o GitG de vez em quando para ter uma noção visual das source tree’s.
  4. SGBD: MySQL & Oracle. Acho que o MySQL dispensa comentários, embora recentemente precisei construir um cluster com replicação multi-master e dancei (estou estudando uma saída, se tiver alguma idéia, deixe um comentário!). O Oracle é o SGBD oficial dos dados da empresa, o que me faz naturalmente ter de trabalhar com ele.
  5. Shell: Bash. Este aqui é um dos motivos de minha alta produtividade com GNU/Linux. Como seriam nossos dias sem find, grep, tail, top, head, cut & sed?
  6. Web browser: Firefox. Faço parte da resistência. Ele é pesado, sim ele é. Mas só vou para o Chrome quando os add-ons WebDeveloper, ScreenGrab e uns outros aí estiverem disponíveis e 100% funcionais. E é uma verdade que sou mais fã do projeto Mozilla que dos demais. Falando em web browsers, já ouviram falar do RockMelt?
  7. Notetaking: GNote. Eu sou o tipo de pessoa que dependo e sou viciado em listas do tipo ToDo. Se você me pedir alguma coisa e por alguma razão eu deixar de anotar no GNote em meu desktop, eu vou esquecer. Então eu tenho vários Post-It’s prontos, do tipo “Monday tasks”, “1. Day of Month tasks”, e a famosa “ToDo List”.

Sobre linguagens, uso basicamente PHP. Quando possível, tento enriquecer meus conhecimentos em Python e ando fazendo algumas brincadeiras com C.

Aqui utilizamos outras coisas mais, como o Trac. Mas como deve-se parar com 7 itens, fica para um próximo post.

Agora, jogo a bola para o Eminetto. Já chamaram. Gaigalas, Guilherme Blanco… já convidados também.

OK, serei parte da do fim da chain… rs… Se por acaso quiser participar, deixe um comentário!

Até 😉

Como ser um bom profissional de TI

You are able to see this post in english too.

Continuarei abaixo este post do Elton Luís Minetto, complementando às idéias dadas por ele tudo que aprendi na área de TI. Vamos lá:

  1. Estude. Conheço pessoas que deixaram a graduação de lado e se deram bem, e posso garantir que este tipo de caso é raríssimo. Diferente do @eminetto, pude ingressar na graduação em 2004 com uma certa bagagem em TI (iniciei em 1997). E ainda assim a graduação expandiu (melhor, me fez experimentar e aplicar) conhecimentos em áreas que nunca tinha ouvido falar, o que foi extremamente válido;
  2. Conheça o negócio. Gaste algumas horas na semana acompanhando o trabalho das pessoas que orbitam seus sistemas. Sim, pare de escovar bits e procure entender o ecossistema à sua volta;
  3. Faça o bom, o ótimo pode ser alcançado mais tarde. Livre-se de gastar tempo (e recursos) para entregar aquele software (ou uma mudança nele, ou aqueles modelos, ou aquela arquitetura, etc.) em grau de detalhe absurdo. Atinja o objetivo requerido. Se conseguiu, entregue. Você pode se organizar para que, de tempos em tempos, revise seu trabalho e adeque-o à realidade atual (ok, admito ainda busco seguir este item 100% do tempo…);
  4. Apaixone-se pelo que faz. Hoje em dia acredito que é a única forma de fazer-nos pensar se podemos fazer algo que já fazemos, melhor. Procure conhecer mais detalhes sobre a linguagem de programação que está usando. Aprenda mais sobre banco de dados. Aprenda sobre padrões (sério, há padrões para muitas coisas em software e ajudam muito!). Aprenda mais sobre o tema ao qual seu software atende;
  5. Sirva ao homem, não às máquinas. Este pequeno trecho do juramento do engenheiro diz muito. Sou usuário GNU/Linux desde 2001, mas já dei muito suporte à MS-Windows, ministrei turmas de de MS-Office, administrei servidores MS-Windows diversos, usei muito MS-Windows. Já programei em Clipper, C, Delphi, C#, ASP.NET, ASP, e hoje estou em PHP. Já trabalhei com Progress, MS-SQL Server, hoje trabalho com Oracle e MySQL. Já integrei sistemas via EDI (aaffff…), hoje a moda é Webservices e REST. O meio (tecnologia) é importante, mas não se esqueça do propósito, dos objetivos e requisitos que precisam ser atendidos. Para o cliente, é o que importa;
  6. Documentação é, definitivamente, importante. No dia em que seu chefe (ou você mesmo) precisar realizar uma apresentação, ou discutir integrações, novas funcionalidades, limites, processos, etc. com pessoas que nada têm a ver com seu código, vai concordar comigo. Infelizmente, e até hoje, a dor é a única forma que eu vejo para fazer alguém entender isso…

OK, é isso. Sugiro, de forma insistente, que leia o post do Elton. Existem idéias ali que tentei manter só ali, evitando repetições.

Até! 😉

Load Balancing com DNS

You’re able to see this post in english too.

Olá!

O artigo deste mês mostrará como é fácil balancear a carga de uma aplicação utilizando seu DNS.

No entanto, você deve ser capaz de realizar as seguintes ações:

  1. Retirar do seu servidor web a responsabilidade de guardar os dados de sessão da aplicação;
  2. Ter acesso ao servidor DNS que realiza os apontamentos de sua aplicação;
  3. Ter mais de um servidor web para processar as requisições da aplicação (óbvio, mas é bom dizer…).

Se a aplicação é escrita em PHP, pode-se tratar o primeiro item acima via função session_set_save_handler. Está fora do escopo deste post mostrar como fazer isso, mas uma visita no website do PHP lhe detalhará o uso.

O grande truque está realmente na configuração realizada no servidor DNS (2º item). Configure, para o mesmo registro do tipo A de sua aplicação, os dois (ou mais) endereços IP que possam processar as requisições web. O trecho de código abaixo foi retirado do arquivo de configuração de zonas do servidor DNS responsável por um domínio fictício qualquer:


ns1 IN A 192.168.0.1
www IN A 192.168.0.2
mta IN A 192.168.0.3
app IN A 192.168.0.4
app IN A 192.168.0.5


Esta característica de balancear as requisições de um host para diferentes endereços IP direto no DNS também pode ser realizada via registros do tipo SRV.

A tela abaixo evidencia (pelos logs do Apache) que ambos servidores estão tratando as requisições.

Load Balancing de aplicação com DNS
Load Balancing de aplicação com DNS

O cenário se complicará caso sua aplicação necessite receber dados via upload, o que implicará na necessidade de um ponto único para armazenamento dos arquivos.

Até 😉

TRAC no Fedora em 5 passos

You are able to see this post in english too.

Olá!

O artigo deste mês mostrará como realizar uma instalação limpa e descomplicada do TRAC no Fedora.

O TRAC é a melhor ferramenta de SCM de natureza open source que conheço. O Fedora GNU/Linux é uma distribuição amplamente utilizada em todo mundo.

No fim do artigo há um adendo sobre como utilizá-lo junto com o GIT, transformando-o também num gerenciador de versão de código.

 

Mão na massa!

  1. Instalação dos pacotes:
    • su -
    • yum update
    • yum install wget python python-devel python-setuptools python-genshi python-docutils python-pygments policycoreutils-python
    • yum install httpd httpd-tools mod_python
    • yum install python-offtrac trac trac-accountmanager-plugin trac-customfieldadmin-plugin trac-doxygen-plugin trac-iniadmin-plugin trac-privateticketsplugin trac-ticketdelete-plugin trac-tracnav-plugin trac-xmlrpc-plugin
  2. Criação do ambiente TRAC no filesystem. Chamaremos a base de trabalho de seu projeto de BASE_DIR (que pode ser por exemplo, /var/www/html/nome_projeto/scm). Os comandos semanage e restorecon servem para dar aos arquivos do TRAC o mesmo contexto do Apache no SeLinux. Obviamente, pode ignorá-los se seu SeLinux está desabilitado:
    • trac-admin BASE_DIR initenv
    • chown -R apache.apache BASE_DIR
    • semanage fcontext -at httpd_sys_content_t "BASE_DIR(/.*)?"
    • semanage fcontext -at httpd_sys_content_rw_t "BASE_DIR/attachments(/.*)?"
    • semanage fcontext -at httpd_sys_content_rw_t "BASE_DIR/conf(/.*)?"
    • semanage fcontext -at httpd_sys_content_rw_t "BASE_DIR/db(/.*)?"
    • semanage fcontext -at httpd_sys_content_rw_t "BASE_DIR/log(/.*)?"
    • chown -R apache:apache BASE_DIR
    • restorecon -R BASE_DIR
  3. Criação do usuário que administrará o projeto. Chamaremos este usuário de ADMIN_USER:
    • htpasswd -c BASE_DIR/conf/trac.htpasswd ADMIN_USER
    • trac-admin BASE_DIR
    • permission add ADMIN_USER TRAC_ADMIN
  4. Alterar a configuração do Apache. Primeiro adicionaremos um alias e uma diretiva para o diretório base do TRAC (ScriptAlias e Directory). Depois, configuraremos as diretivas específicas para o ambiente do projeto (Location). Lembrando que estas diretivas, se necessário, podem estar dentro de um container VirtualHost:
    • ScriptAlias /trac/ "BASE_DIR/"
      <Directory "BASE_DIR">
      AllowOverride None
      Options None
      Order allow,deny
      Allow from all
      </Directory>
      
      <Location /trac>
      SetHandler mod_python
      PythonHandler trac.web.modpython_frontend
      PythonOption TracEnv BASE_DIR
      PythonOption TracUriRoot /trac
      SetEnv PYTHON_EGG_CACHE /tmp
      PythonInterpreter trac
      </Location>
      
      <Location /trac/login>
      AuthType Basic
      AuthName "Nome do projeto"
      AuthUserFile BASE_DIR/conf/trac.htpasswd
      Require valid-user
      </Location>
  5. O último passo é reiniciar o Apache:
    • service httpd restart

Aponte seu browser para a instalação do TRAC (pode ser http://localhost/trac/) e divirta-se.

 

Git

Caso queira utilizar o GIT junto com o TRAC, faça também os passos abaixo:

  • Instale o GIT e seu plugin para o TRAC:
    • yum install git GitPython
    • yum install trac-git-plugin
  • Altere o arquivo BASE_DIR/conf/trac.ini da seguinte forma:
    • A linha repository_dir para o local do arquivo HEAD de seu repositório (normalmente REPO_DIR/.git);
    • Adicione as linhas abaixo ao fim do arquivo:
      • [components]
      • tracext.git.* = enabled
  • O diretório dos fontes deve ter suas permissões de leitura e escrita atribuídas ao Apache.

Os 5 passos acima lhe darão um ambiente TRAC pronto para uso. Para melhorá-lo e adaptá-lo às suas necessidades, visite o website TracHacks onde há muitos plugins para download.

Até 😉

Priorização de demandas por voto

You are able to see this post in english too.

Nossa área de desenvolvimento realizou uma experiência interessante para eleger as demandas mais críticas, aquelas que precisavam ser construídas primeiro. Para isso, criamos uma planilha que, apesar de ser nossa criação, pegou idéias de outras planilhas que vimos “voando” por aqui na empresa.

Aproveitamos um fórum que aconteceu entre cerca de 30 pessoas, todas heavy-users do software mantido por nós. Nele, nossa principal ferramenta foi uma planilha eletrônica (link no fim do artigo), cujas abas seguem descritas abaixo:

  • DEMANDAS: Uma listagem simples das demandas de melhorias requisitadas pelos usuários. Ela é fruto de meses de conversas informais, e-mails, telefonemas, etc. Possui uma coluna ID para facilitar o lookup, um título e uma descrição breve. Esta planilha foi impressa uma única vez, e ficou comigo durante todo o trabalho;
  • FICHA_VOTO: Uma ficha como à da planilha DEMANDAS, mas com uma coluna vazia onde cada participante preencherá seu voto. Foi impressa em quantidade suficiente para ter uma para cada participante;
  • VOTOS: As linhas, novamente, são as demandas. Cada coluna representa uma pessoa presente. A intersecção é o voto de cada um para a demanda. Solicitamos aos participantes uma nota de 1 a 10, respectiva ao tamanho do benefício que ela trará para sua área, caso venha a ser implementada. A última coluna desta planilha é uma média simples dos votos entre 1 e 10. Assim, se a demanda está fora do escopo de trabalho do participante, ele pode votar 0 (zero) para que seu voto seja desconsiderado na média;
  • CÁLCULO: Aqui está o “pulo do gato”. Dias antes deste fórum, fizemos o mesmo trabalho acima mas com os desenvolvedores. Nesta planilha está computada somente as médias dadas por eles a cada demanda. Só que os desenvolvedores deram notas de 1 a 10 respectiva ao tamanho do esforço que a demanda teria para ser desenvolvida. Então, aplicamos uma minúscula parte de IA (fuzz/defuzz) para qualificar o esforço entre “Baixo” e “Alto”. As outras duas colunas fazem o mesmo com o atributo votado pelos participantes do fórum. A primeira só replica a média calculada na planilha VOTOS e a segunda qualifica a média em “Pouco” e “Muito”;
  • GRÁFICO: É um quadrante que por fórmulas simples agrupa as demandas de acordo com seu benefício e esforço, como abaixo:

Gráfico exemplo

Para preencher a planilha de votos, pausamos a apresentação por uma hora, dando tempo para que outra apresentação fosse realizada.

O resultado deste trabalho é o melhor possível. É o cruzamento do que seus usuários mais querem/precisam, com aquilo que seus desenvolvedores dizem ser mais fácil de construir primeiro. Ou seja, nos quadrantes da planilha, você observará claramente quais demandas trazem muito benefício com pouco esforço, por exemplo. Adicionará valor ao desenvolvimento, ao relacionamento com o cliente, e aqui, trouxe mais ânimo e satisfação aos desenvolvedores.

Agora procuro opiniões sobre em que fase do processo esta planilha traria mais valor. Aqui a utilizamos já em fase de manutenção. Acredito que em novos projetos, o maior ganho viria na fase de transição do produto, ponto onde há um certo nivelamento de conhecimento entre fornecedor e cliente.

A planilha está publicada em formato XLS e funcionará normalmente no OpenOffice Calc. Está hospedada no GitHub, e pode obtê-la clicando aqui.

Até 😉