🎨 User Experience (UX) para Desenvolvedores

3º Técnico DS | Desenvolvimento de Sistemas II
Professor: Ricardo Pires | Aula 06
Criando sistemas que os usuários adoram usar


🚀 Roteiro da Aula (105 min)

  • 25 min: Conceitos fundamentais de UX
  • 25 min: UX no Backend e APIs
  • 25 min: UX no Frontend e Interfaces
  • 20 min: Implementação prática - Refatoração
  • 10 min: Monitoramento e métricas de UX

Foco: UX aplicada a decisões técnicas de desenvolvimento


🤔 Pergunta Inicial

Vocês já abandonaram um cadastro ou app por não conseguir entender como usar?

Situação real:

  • Site de e-commerce perde 23% dos clientes por checkout complicado
  • Apps móveis: 25% são usados apenas 1 vez após download
  • Desenvolvedores impactam diretamente essas estatísticas!

🧠 O Mito: “UX é só Design Bonito”

❌ UX NÃO é apenas:

  • Interface visualmente atrativa
  • Responsabilidade só do designer
  • Aplicado apenas no frontend

✅ UX É na verdade:

  • Utilidade: resolve um problema real do usuário
  • Usabilidade: fluxo simples e previsível
  • Confiança: feedback claro e comportamento estável

📐 A Fórmula do UX

🔍 Aplicando na Prática:

  • Utilidade: “Isso resolve meu problema?”
  • Usabilidade: “Consigo usar facilmente?”
  • Confiança: “Posso confiar que vai funcionar?”

Desenvolvedores influenciam os 3 fatores!


🏗️ UX no Backend: Primeira Impressão

😱 Erro Ruim (comum):

{
  "error": "Bad Request",
  "status": 400
}

😊 Erro Bom (user-friendly):

{
  "codigo": "USUARIO_EMAIL_INVALIDO",
  "mensagem": "E-mail inválido",
  "detalhe": "Use o formato nome@dominio.com",
  "campo": "email"
}

🔧 API que Ajuda o Usuário

Estrutura de Resposta UX-Friendly:

public record ApiError(
    String codigo,      // Identificador único do erro
    String mensagem,    // Texto para exibir ao usuário
    String detalhe,     // Explicação específica
    String acao         // O que o usuário pode fazer
) {}
public record ApiSucesso(
    String mensagem,
    Object dados,
    String proximoPassso  // Guia para próxima ação
) {}

📊 Status HTTP com Significado

✅ Use códigos que fazem sentido:

  • 200: “Sucesso, dados prontos para usar”
  • 201: “Criado com sucesso, novo recurso disponível”
  • 400: “Erro nos dados enviados, verifique e tente novamente”
  • 401: “Você precisa fazer login para continuar”
  • 403: “Você não tem permissão para esta ação”
  • 404: “O que você procura não foi encontrado”
  • 500: “Erro interno, nossa equipe foi notificada”

🎯 Heurísticas Práticas para Devs

1. Feedback Imediato

// ❌ Ruim: sem feedback
submitButton.onclick = () => processForm();
 
// ✅ Bom: com feedback
submitButton.onclick = () => {
  showLoading();
  processForm().then(showSuccess).catch(showError);
};

💡 Heurística 2: Mensagens Acionáveis

❌ Não acionável:

"Erro ao processar solicitação"

✅ Acionável:

"CPF inválido. Verifique os números e tente novamente.
Exemplo: 123.456.789-10"

Princípio: Todo erro deve dizer o que fazer para resolver.


🔄 Heurística 3: Consistência

Padronizar em todo o sistema:

  • Botões: sempre no mesmo local (ex: salvar sempre à direita)
  • Cores: verde = sucesso, vermelho = erro, amarelo = atenção
  • Linguagem: “Excluir” ou “Deletar”? Escolha um e mantenha
  • Comportamento: Ctrl+S sempre salva, ESC sempre cancela

♿ Heurística 4: Acessibilidade Básica

Checklist do Desenvolvedor:

  • Teclado: sistema navegável apenas com Tab/Enter/Escape?
  • Foco visual: indica claramente onde usuário está?
  • Contraste: textos legíveis (ferramentas: WebAIM, ColorTester)?
  • Alt text: imagens têm descrição alternativa?
  • Labels: campos de formulário têm labels associados?

🚨 Case Real: O Bug de Produção

📉 Problema:

  • Tela de cadastro só exibe “Erro 400
  • API rejeita CPF inválido
  • Usuário não entende o problema
  • 67% de abandono do cadastro!

💰 Impacto:

  • Queda na conversão de 23% para 8%
  • Aumento de 340% em tickets de suporte
  • Usuários frustrados abandonam plataforma

✅ A Solução: API + Frontend UX-Aware

🔧 Backend (Spring Boot):

@RestControllerAdvice
public class UXErrorHandler {
 
    @ExceptionHandler(CPFInvalidoException.class)
    public ResponseEntity<ApiError> cpfInvalido(CPFInvalidoException e) {
        return ResponseEntity.badRequest().body(new ApiError(
            "CPF_INVALIDO",
            "CPF inválido",
            "Digite apenas números ou no formato 999.999.999-99",
            "Corrija o CPF e tente novamente"
        ));
    }
}

✅ A Solução: Frontend User-Friendly

🎨 Frontend (JavaScript):

function showError(apiError) {
  const errorDiv = document.getElementById("error");
  errorDiv.innerHTML = `
        <div class="alert alert-error">
            <h4>🚫 ${apiError.mensagem}</h4>
            <p>${apiError.detalhe}</p>
            <small><strong>Como resolver:</strong> ${apiError.acao}</small>
        </div>
    `;
  errorDiv.scrollIntoView({ behavior: "smooth" });
}

📈 Resultado da Melhorias UX

Métricas Antes vs. Depois:

MétricaAntesDepoisMelhoria
Taxa de conversão8%19%+137%
Abandono por erro67%23%-66%
Tickets de suporte45/dia12/dia-73%
Satisfação usuário2.3/54.1/5+78%

Conclusão: Código user-friendly = resultados de negócio!


🔍 Estados de Interface: Loading

❌ Sem feedback:

// Usuário clica e não acontece nada visível
async function salvarDados() {
  const resultado = await api.salvar(dados);
  showSuccess(resultado);
}

✅ Com feedback adequado:

async function salvarDados() {
  showLoading("Salvando dados...");
  try {
    const resultado = await api.salvar(dados);
    showSuccess("Dados salvos com sucesso!");
  } catch (error) {
    showError("Erro ao salvar. Tente novamente.");
  } finally {
    hideLoading();
  }
}

⚡ Validação: Tempo Real vs. Pós-Submit

🕐 Validação em Tempo Real (bom para):

  • Formatos (email, telefone, CPF)
  • Disponibilidade (username, email único)
  • Força de senha

📤 Validação Pós-Submit (bom para):

  • Regras de negócio complexas
  • Validações que precisam de múltiplos campos
  • Verificações que exigem processamento pesado

Princípio: Validar o mais cedo possível, sem irritar


🧪 Exercício Prático: Refatoração UX

📝 Cenário:

Sistema de login que:

  • Não dá feedback durante autenticação
  • Exibe mensagem genérica “login falhou”
  • Campo senha não mostra se está sendo digitada
  • Usuário não sabe se CAPS LOCK está ativo

🎯 Tarefa:

Implementar melhorias de UX no frontend e backend


💻 Hands-On: Implementando Melhorias

// Backend: Controller com retorno UX-friendly
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest request) {
    try {
        TokenResponse token = authService.authenticate(request);
        return ok(new ApiSucesso(
            "Login realizado com sucesso",
            token,
            "Você será redirecionado para o dashboard"
        ));
    } catch (CredenciaisInvalidasException e) {
        return badRequest(new ApiError(
            "CREDENCIAIS_INVALIDAS",
            "E-mail ou senha incorretos",
            "Verifique seus dados e tente novamente",
            "Esqueceu a senha? Clique em 'Recuperar senha'"
        ));
    }
}

📊 Monitoramento de UX

📈 Métricas que Desenvolvedores Devem Acompanhar:

  • Time to Interactive (TTI): quanto tempo até página ser usável?
  • Error Rate por Endpoint: qual API está gerando mais erros?
  • Abandono por Tela: onde usuários mais desistem?
  • Tempo para Primeiro Sucesso: quanto tempo para completar ação?

🛠️ Ferramentas:

  • Google Analytics (comportamento)
  • Hotjar/LogRocket (gravação sessões)
  • Sentry (erros em produção)

🎯 Implementando Tracking de UX

📊 Frontend: Tracking Simples

// Rastrear abandonos em formulários
document.getElementById("formCadastro").addEventListener("focusout", (e) => {
  if (e.target.value === "" && e.target.required) {
    analytics.track("form_field_abandoned", {
      campo: e.target.name,
      tela: window.location.pathname,
    });
  }
});
 
// Rastrear erros de API
async function callAPI(endpoint, data) {
  try {
    const response = await fetch(endpoint, data);
    return response.json();
  } catch (error) {
    analytics.track("api_error", {
      endpoint: endpoint,
      erro: error.message,
    });
    throw error;
  }
}

🔄 Ciclo de Melhoria Contínua

📊 Processo:

  1. Medir: coletar dados de uso e erros
  2. Analisar: identificar pontos de fricção
  3. Hipótese: criar teoria sobre melhoria
  4. Implementar: desenvolver solução
  5. Testar: validar impacto com dados
  6. Repetir: processo contínuo

Desenvolvedores são parte fundamental desse ciclo!


🏆 UX como Diferencial do Desenvolvedor

💰 Profissionais com Mindset UX:

  • Salários 15-30% maiores (pesquisa Stack Overflow 2023)
  • Maior demanda em vagas Sênior/Tech Lead
  • Melhor comunicação com Product Managers
  • Código que gera impacto nos resultados de negócio

🚀 Próximos Passos:

  • Sempre pergunte: “Como isso afeta o usuário?”
  • Documente decisões de UX no código
  • Proponha melhorias além do requisito funcional

✅ Checklist UX para Desenvolvedores

🔍 Antes de entregar qualquer feature:

  • API retorna erros com códigos e mensagens claras?
  • Interface dá feedback para todas as ações do usuário?
  • Loading states estão implementados?
  • Mensagens de erro são acionáveis e específicas?
  • Sistema é navegável por teclado?
  • Cores têm contraste adequado?
  • Formulários validam em tempo apropriado?
  • Sucessos são confirmados adequadamente?

🎯 Resumo da Aula

🔑 Conceitos-Chave:

  • UX = Utilidade + Usabilidade + Confiança
  • Desenvolvedores impactam UX tanto quanto designers
  • APIs user-friendly reduzem fricção e suporte
  • Feedback adequado aumenta confiança do usuário
  • Métricas de UX guiam melhorias técnicas

🚀 Aplicação:

Aplicar heurísticas de UX em todos os projetos, desde código backend até interface final.


🏠 Para Casa & Próxima Aula

📚 Atividade:

  1. Analisar 3 apps que vocês usam e identificar:
    • 2 aspectos de boa UX (o que funciona)
    • 2 aspectos de má UX (o que poderia melhorar)
    • Propor melhorias técnicas para os problemas

📖 Leitura:

  • “Don’t Make Me Think” - Steve Krug (Cap. 1-3)
  • Google API Design Guidelines

🔜 Próxima Aula:

Strategies de Testing com foco em UX e acessibilidade


🙋‍♂️ Q&A e Dúvidas

Dúvidas sobre:

  • Implementação de feedback user-friendly?
  • Estruturação de APIs com foco em UX?
  • Ferramentas de monitoramento?
  • Acessibilidade básica?
  • Métricas de UX para desenvolvedores?

Vamos construir experiências que os usuários adoram! 🚀