usabilidade de ferramentas
DESCRIPTION
Erros bizarros, documentação ilógica, conceitos obscuros… Você já passou por isso ao tentar usar uma ferramenta de desenvolvimento nova, seja ela uma biblioteca, framework ou ferramenta de automação de build? Você já quebrou a cabeça por horas até perceber a falta da vírgula no arquivo de configuração? Você já googlou por horas até finalmente encontrar no StackOverflow o bendito nome da variável de ambiente? Em maior ou menor grau, todos passamos por isso. E acabamos nos acostumando… Mas será que deveríamos? Antigamente, os celulares eram complicados e vinham com manuais enormes. Hoje, muitos deles são óbvios e até tataravós conseguem usá-los. Se já somos capazes de fazer produtos finais com excelente usabilidade, por que ainda estamos patinando quando o assunto são ferramentas de desenvolvimento? Nesta palestra, discutiremos exatamente esse problema e buscaremos soluções. Como quebrar o tabu do manual gigante? Como conciliar funcionalidades poderosas com utilização simples? Como proporcionar satisfação e bons resultados ao desenvolvedor em pouco tempo de uso e estudo? A resposta curta é: coloque-se no lugar do seu usuário! A resposta longa é: assista à palestra e veja como empatia, agilidade, didática e encapsulamento podem trabalhar juntos a seu favor, tornando mais usável e atrativa a ferramenta que você desenvolve. Demonstração e exemplos práticos inclusos! Público-alvo: desenvolvedores de ferramentas de código aberto, desenvolvedores de ferramentas de código fechado, desenvolvedores de não-ferramentas de código aberto ou fechado.TRANSCRIPT
Ferramentas de Desenvolvimento com
Boa Usabilidade:
É POSSÍVEL?
André Willik Valenti
DevCamp 2013 | Campinas-SPDevInSampa 2013 | São Paulo-SP
Sobre mim
● UFSCar○ Bacharelado em Ciência da Computação○ 2003-2007
● UNICAMP○ Mestrado em Ciência da Computação○ 2008-2011
Sobre mim
● Histórico profissional recente
○ 2013: SIn - UFSCar (São Carlos)
○ 2012: Daitan Group (Campinas)
○ 2010-2012: Dextra (Campinas)
Sobre mim
● Experiências recentes○ Groovy / Grails
○ PostgreSQL
○ Jogos HTML5
○ JavaScript / Node.js / CoffeeScript
Por que esta palestra?
● Bibliotecas, frameworks, automação de build...
● Você já passou por algum destes problemas ao tentar usar uma ferramenta de desenvolvimento nova?○ Erros bizarros○ Documentação ilógica○ Conceitos obscuros
Por que esta palestra?
● Anos e anos de frustração com falta de usabilidade em ferramentas
● Sonho de mudar esse cenário
iPhone & Galaxy
● Satisfação○ Uso o produto porque fico feliz com o resultado
● Produtividade○ Resolvo rápido o que eu preciso resolver
● Confiabilidade○ Boto fé que o produto continuará funcionando bem
● Fidelidade○ Voltarei a ter outro produto desses ou produtos
similares da mesma marca
Siemens CF62
● Frustração○ Só uso porque sou obrigado
● Improdutividade○ Demoro uma vida para fazer qualquer coisa
● Desconfiança○ A qualquer momento, posso ficar na mão
● Aversão○ Na primeira oportunidade, tchau!
Ferramenta de desenvolvimento
● Bibliotecas● Frameworks● Automação de build
● Utilitários em linha de comando?● Linguagens de programação?● Sistemas operacionais?
Ferramenta de desenvolvimento
● No contexto desta palestra:○ QUALQUER software que seja usado para
desenvolver software
Exemplo 1
● Joãozinho está trabalhando em um projeto Java para web, de compras online
● Ele precisa gerar emails para os clientes do site quando alguém faz uma compra
● Como ele vai implementar isso?
Exemplo 1
● Precisa ficar mais ou menos assim:
<html>
<body>
<p>Olá, Maria</p>
<p>Pedido de número 1234 enviado!</p>
</body>
</html>
Exemplo 1
● Joãozinho disse:○ Legal! Vou usar esse tal de Velocity aí...
● Será que foi uma boa ideia?○ Vamos descobrir...
Quais foram os problemas?
● Site complicado● Documentação prolixa● API complexa● Configuração difícil
Usabilidade ruim
● Frustração○ Só uso porque sou obrigado
● Improdutividade○ Demoro uma vida para fazer qualquer coisa
● Desconfiança○ A qualquer momento, posso ficar na mão
● Aversão○ Na primeira oportunidade, tchau!
Site oficial
● O que é?○ Primeiro e principal meio de comunicação○ Visto por 99% dos usuários○ Cartão de visitas da ferramenta
● Qual o objetivo?○ Fornecer todas as informações básicas do projeto
■ Quais?
Site oficial
● MINIMAMENTE, precisa deixar claro:○ Que problemas a ferramenta resolve○ Como instala○ Como roda um exemplo básico ("Hello, World")
● Altamente desejável incluir também:○ Por quê vale a pena usá-la○ Quando vale a pena usá-la○ Quando NÃO vale (melhor usar outra ou nenhuma)
Site oficial
● Para refletir:○ "Propaganda eu vejo na televisão. Fala logo o que a
ferramenta faz e deixa que eu decido se uso ou não!" (Andrei Tognolo)
Configuração
● O que é?○ Mecanismo de ajuste para que a ferramenta faça
exatamente o que se quer
● Qual o objetivo?○ Adequar a ferramenta às necessidades do usuário
■ Ou seja: configs devem fazer sentido para ele■ (encapsulamento? serviços?)
Configuração
● Tipos de configuração:○ Mínima
■ O estritamente necessário para a ferramenta funcionar
○ Padrão■ Aquela que vem de fábrica com a ferramenta, ou
que pode ser gerada com um comando óbvio
Configuração
● Mínima○ A exigida para um "Hello, World"○ Deve ser óbvia de achar ("Getting Started")○ Idealmente, é vazia (faz o básico sem configuração)
● Padrão○ A que já vem embutida no pacote da ferramenta
■ Ou gerada por comando que venha embutido (rails new app, grails create-app app)
○ Idealmente, é a mínima + recursos úteis (logging, cores, atalhos de teclado etc.)■ "Usável, por padrão"
Configuração
● Padrão ⊇ Mínima (contém)○ É só baixar e já pode brincar○ :)
● Padrão ⊉ Mínima (não contém)○ Só pode brincar depois de fazer a lição○ :(
Configuração
● Padrão ⊇ Mínima (contém)○ Evita decoreba○ Evita trabalho repetitivo do desenvolvedor○ (alguma relação com encapsulamento?)
● Padrão ⊉ Mínima (não contém)○ Obriga o desenvolvedor a escrever sempre a
mesma coisa quando for usar a ferramenta○ É o tal do boilerplate○ Exemplos:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type"
content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
</body>
</html>
Configuração
● Por que é bom a padrão oferecer recursos úteis já configurados (logging, cores, atalhos de teclado etc.)?
○ Ninguém sabe da existência de todas as funcionalidades ao começar a usar algo
○ Muitas funcionalidades, porém, são úteis para todos
○ Não espere que alguém procure-as. Exponha-as!
○ Entregue a ferramenta "Usável, por padrão"
Configuração
Configuração
● Para refletir:○ "Se você não consegue decorar a configuração
mínima, está complicada demais." (André Valenti)
○ "A configuração padrão é a que será usada por 90% dos usuários." (André Valenti)■ Duvida?
Configuração
● Você sabia disso?
● Mais importante:○ Você PRECISAVA saber disso?
● Mais importante ainda:○ Você saberia da existência dessa funcionalidade se
ela não viesse ativa por padrão?
○ Alguém já pensou nisso e entregou-nos o Bash "Usável, por padrão"
Configuração
● E como é que faz isso?○ git config --global color.ui auto
● Como eu descobri isso?○ Eu usava Windows + Git Bash (MSYS modificado)
■ Git Bash já vinha colorido de fábrica■ Ao mudar pro Linux, não vi cores no git■ Googlei "git colors" e descobri o comando acima
○ Pergunta pra mim se eu teria imaginado sozinho que o git tinha o recurso de cores
Documentação
● O que é○ Detalhamento da ferramenta e de suas partes
● Quais os objetivos?○ Ensinar a ir além do básico○ Indicar soluções para problemas mais específicos○ Explicar detalhes da API
Documentação
● Minimamente, deve ser:○ Óbvia de encontrar○ Fácil de pesquisar
● Idealmente, deve:○ Possuir seções autocontidas
Documentação
● Para refletir:○ "A melhor documentação é a ausência de
[necessidade de] documentação." (André Valenti)■ Duvida?
Committer: André Willik Valenti
<fi@deskdofi.(none)>
Your name and email address were configured automatically based on your username and hostname. Please check that they are accurate. You can suppress this message by setting them explicitly:
git config --global user.name "Your Name"
git config --global user.email [email protected]
After doing this, you may fix the identity used for this commit with:
git commit --amend --reset-author
Documentação / Configuração
fi@deskdofi:~$ sudo apt-get install postgresql
...
fi@deskdofi:~$ psql
psql: FATAL: role "fi" does not exist
(Hein?)
Documentação / Configuração
(Procura no Google... Procura no Google...)
(Ah, tá! Não existe ainda o meu usuário no banco.)
(Ah tá! Já vem um usuário chamado postgres. Tenho que logar como ele.)
Documentação / Configuração
fi@deskdofi:~$ psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
(Hein?)
(Procura no Google... Procura no Google...)
Documentação / Configuração
(Ah tá! Preciso pôr a senha, que é postgres também!)
fi@deskdofi:~$ psql -U postgres -W
Password for user postgres: ********
(Agora vai!!)
Documentação / Configuração
● Penamos um pouquinho, mas conseguimos entrar no console do Postgres!
● Só que...○ ...não○ Esse desfecho não é o verdadeiro!○ O verdadeiro foi assim:
Documentação / Configuração
fi@deskdofi:~$ psql -U postgres -W
Password for user postgres: ********
psql: FATAL: Peer authentication failed for user "postgres"
Mustache
● http://mustache.github.io/
● Processador de templates● Similar ao Velocity
● Implementações em diversas linguagens● Demonstração no próprio site
Jasmine
● http://pivotal.github.io/jasmine/
● Framework de BDD (Behavior-driven Development) para JavaScript
● Documentação○ A própria ferramenta especificando a si mesma
Flyway
● http://flywaydb.org/
● Framework de migração de banco de dados para Java
● Tem seções explicando:○ O que é migração de banco de dados○ Como a ferramenta funciona○ Como começar a usar
Ideologia
● Merecemos ferramentas da hora!● Merecemos satisfação e produtividade!● Merecemos soluções intuitivas!
Ideologia
● Software○ Feito por seres humanos para seres humanos
● Comunicação é falha○ Lide com isso○ Esclareça, repita, frise
● Erro é inevitável○ Verifique suas premissas (Pragmatic Programmer)○ Avise o que deu errado○ Sugira maneiras de corrigir
Ideologia
● Pessoas têm diferentes níveis de conhecimento
○ Presuma o mínimo de conhecimento prévio
○ Explique brevemente os conceitos básicos■ Ex: Flyway
○ Ou referencie páginas que os expliquem
Ideologia
● Desenvolvedores querem:○ Soluções simples e intuitivas○ Resolver um problema de cada vez○ Ler manuais quando realmente necessário
Ideologia
● Dê exemplos!○ De preferência, do mundo real
○ Exemplo: Jasmine■ Especifica a si mesmo usando a si mesmo
Ideologia
● Evite exemplos bobos e batidos:
○ OO: classe Ponto■ { private x; private y; getX, getY, setX, setY }
○ TDD: soma■ { assert soma(a, b) == a + b }
○ BDD: pilha■ { when i push('x') then pop().should_equal 'x' }
Ideologia
● Prefira exemplos concretos e úteis:
○ OO: nós de uma árvore (p. ex., sintática)■ { public abstract String gerarCodigo(); }
○ TDD: teste um algoritmo complicado■ { arvore.inserir(nóEsquisito);
assert arvore.indiceDeBalanceamento == 7 }
○ BDD: teste uma regra de negócio■ { when i buy(product) from seller then
seller.points.should_have increased_by 100and buyer.notifications.should_include confirmationEmail }
Ideologia
● DEAE:
○ Didática: saiba explicar, saiba ensinar
○ Empatia: coloque-se no lugar do usuário
○ Agilidade: entregue uma funcionalidade por vez
○ Encapsulamento: somente informação relevante
Conclusão
● A resposta longa é DEAE:
○ Didática: saiba explicar, saiba ensinar
○ Empatia: coloque-se no lugar do usuário
○ Agilidade: entregue uma funcionalidade por vez
○ Encapsulamento: somente informação relevante
Conclusão
● Vários desafios envolvidos:
○ Alcançar simplicidade■ Dá trabalho!
○ Escrever documentação objetiva e completa■ Dá trabalho!
○ Conciliar boa curva de aprendizado com evolução de funcionalidades■ Dá trabalho!
Conclusão
● Grande fonte de inspiração:○ Inventing on Principle (Bret Victor)
■ http://vimeo.com/36579366
○ "Creators need an immediate connection to what they are creating"