Guia para melhoria contínua, à prova de erros e padronização. Use esta skill quando o usuário quiser melhorar a qualidade do código, refatorar ou discutir melhorias de processo.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add artubss/SKILLS-CLAUDE-CODE --skill kaizen --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Kaizen?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/artubss-kaizen)More formats (shields.io, HTML) on the badges page.
---
name: kaizen
description: Guia para melhoria contínua, à prova de erros e padronização. Use esta skill quando o usuário quiser melhorar a qualidade do código, refatorar ou discutir melhorias de processo.
---
# Kaizen: Melhoria Contínua
## Visão Geral
Pequenas melhorias, continuamente. À prova de erros por design. Siga o que funciona. Construa apenas o necessário.
**Princípio central:** Muitas pequenas melhorias superam uma grande mudança. Previna erros no tempo de design, não com correções.
## Quando Usar
**Sempre aplicado para:**
- Implementação e refatoração de código
- Decisões de arquitetura e design
- Melhorias de processo e workflow
- Tratamento de erros e validação
**Filosofia:** Qualidade através de progresso incremental e prevenção, não perfeição através de esforço massivo.
## Os Quatro Pilares
### 1. Melhoria Contínua (Kaizen)
Pequenas melhorias frequentes se acumulam em ganhos significativos.
#### Princípios
**Incremental sobre revolucionário:**
- Faça a menor mudança viável que melhora a qualidade
- Uma melhoria por vez
- Verifique cada mudança antes da próxima
- Construa momentum através de pequenas vitórias
**Sempre deixe o código melhor:**
- Corrija pequenos problemas conforme encontrar
- Refatore enquanto trabalha (dentro do escopo)
- Atualize comentários desatualizados
- Remova código morto quando vir
**Refinamento iterativo:**
- Primeira versão: faça funcionar
- Segunda passagem: torne claro
- Terceira passagem: torne eficiente
- Não tente fazer os três de uma vez
<Good>
```typescript
// Iteração 1: Faça funcionar
const calculateTotal = (items: Item[]) => {
let total = 0;
for (let i = 0; i < items.length; i++) {
total += items[i].price * items[i].quantity;
}
return total;
};
// Iteração 2: Torne claro (refatore)
const calculateTotal = (items: Item[]): number => {
return items.reduce((total, item) => {
return total + (item.price * item.quantity);
}, 0);
};
// Iteração 3: Torne robusto (adicione validação)
const calculateTotal = (items: Item[]): number => {
if (!items?.length) return 0;
return items.reduce((total, item) => {
if (item.price < 0 || item.quantity < 0) {
throw new Error('Price and quantity must be non-negative');
}
return total + (item.price * item.quantity);
}, 0);
};
```
Cada passo está completo, testado e funcionando
</Good>
<Bad>
```typescript
// Tentando fazer tudo de uma vez
const calculateTotal = (items: Item[]): number => {
// Valide, otimize, adicione recursos, trate casos extremos tudo junto
if (!items?.length) return 0;
const validItems = items.filter(item => {
if (item.price < 0) throw new Error('Negative price');
if (item.quantity < 0) throw new Error('Negative quantity');
return item.quantity > 0; // Também filtrando quantidades zero
});
// Mais caching, mais logging, mais conversão de moeda...
return validItems.reduce(...); // Muitas responsabilidades de uma vez
};
```
Avassalador, propenso a erros, difícil de verificar
</Bad>
#### Na Prática
**Ao implementar recursos:**
1. Comece com a versão mais simples que funciona
2. Adicione uma melhoria (tratamento de erros, validação, etc.)
3. Teste e verifique
4. Repita se tempo permitir
5. Não tente tornar perfeito imediatamente
**Ao refatorar:**
- Corrija um smell de cada vez
- Faça commit após cada melhoria
- Mantenha testes passando o tempo todo
- Pare quando "bom o suficiente" (retornos decrescentes)
**Ao revisar código:**
- Sugira melhorias incrementais (não reescritas)
- Priorize: crítico → importante → bom ter
- Foque nas mudanças de maior impacto primeiro
- Aceite "melhor que antes" mesmo que não perfeito
### 2. Poka-Yoke (À Prova de Erros)
Projete sistemas que previnem erros no tempo de compilação/design, não em tempo de execução.
#### Princípios
**Torne erros impossíveis:**
- Sistema de tipos captura erros
- Compilador executa contratos
- Estados inválidos irrepresentáveis
- Erros capturados cedo (esquerda da produção)
**Projete para segurança:**
- Falhe rápido e alto
- Forneça mensagens de erro úteis
- Torne o caminho correto óbvio
- Torne o caminho incorreto difícil
**Defesa em camadas:**
1. Sistema de tipos (tempo de compilação)
2. Validação (tempo de execução, cedo)
3. Guards (pré-condições)
4. Error boundaries (degradação graciosa)
#### À Prova de Erros com Sistema de Tipos
<Good>
```typescript
// Erro: status string pode ser qualquer valor
type OrderBad = {
status: string; // Pode ser "pending", "PENDING", "pnding", qualquer coisa!
total: number;
};
// Bom: Apenas estados válidos possíveis
type OrderStatus = 'pending' | 'processing' | 'shipped' | 'delivered';
type Order = {
status: OrderStatus;
total: number;
};
// Melhor: Estados com dados associados
type Order =
| { status: 'pending'; createdAt: Date }
| { status: 'processing'; startedAt: Date; estimatedCompletion: Date }
| { status: 'shipped'; trackingNumber: string; shippedAt: Date }
| { status: 'delivered'; deliveredAt: Date; signature: string };
// Agora é impossível ter shipped sem trackingNumber
```
Sistema de tipos previne classes inteiras de erros
</Good>
<Good>
```typescript
// Torne estados inválidos irrepresentáveis
type NonEmptyArray<T> = [T, ...T[]];
const firstItem = <T>(items: NonEmptyArray<T>): T => {
return items[0]; // Sempre seguro, nunca undefined!
};
// Chamador deve provar que array não está vazio
const items: number[] = [1, 2, 3];
if (items.length > 0) {
firstItem(items as NonEmptyArray<number>); // Seguro
}
```
Assinatura de função garante segurança
</Good>
#### À Prova de Erros com Validação
<Good>
```typescript
// Erro: Validação após uso
const processPayment = (amount: number) => {
const fee = amount * 0.03; // Usado antes de validação!
if (amount <= 0) throw new Error('Invalid amount');
// ...
};
// Bom: Valide imediatamente
const processPayment = (amount: number) => {
if (amount <= 0) {
throw new Error('Payment amount must be positive');
}
if (amount > 10000) {
throw new Error('Payment exceeds maximum allowed');
}
const fee = amount * 0.03;
// ... agora seguro usar
};
// Melhor: Validação no boundary com tipo marcado
type PositiveNumber = number & { readonly __brand: 'PositiveNumber' };
const validatePositive = (n: number): PositiveNumber => {
if (n <= 0) throw new Error('Must be positive');
return n as PositiveNumber;
};
const processPayment = (amount: PositiveNumber) => {
// amount é garantido positivo, não precisa verificar
const fee = amount * 0.03;
};
// Valide no boundary do sistema
const handlePaymentRequest = (req: Request) => {
const amount = validatePositive(req.body.amount); // Valide uma vez
processPayment(amount); // Use em todo lugar com segurança
};
```
Valide uma vez no boundary, seguro em todo lugar
</Good>
#### Guards e Pré-condições
<Good>
```typescript
// Early returns evitam código profundamente aninhado
const processUser = (user: User | null) => {
if (!user) {
logger.error('User not found');
return;
}
if (!user.email) {
logger.error('User email missing');
return;
}
if (!user.isActive) {
logger.info('User inactive, skipping');
return;
}
// Lógica principal aqui, user garantido válido e ativo
sendEmail(user.email, 'Welcome!');
};
```
Guards tornam suposições explícitas e enforçadas
</Good>
#### À Prova de Erros com Configuração
<Good>
```typescript
// Erro: Config opcional com padrões inseguros
type ConfigBad = {
apiKey?: string;
timeout?: number;
};
const client = new APIClient({ timeout: 5000 }); // apiKey faltando!
// Bom: Config requerida, falha cedo
type Config = {
apiKey: string;
timeout: number;
};
const loadConfig = (): Config => {
const apiKey = process.env.API_KEY;
if (!apiKey) {
throw new Error('API_KEY environment variable required');
}
return {
apiKey,
timeout: 5000,
};
};
// App falha ao iniciar se config inválida, não durante request
const config = loadConfig();
const client = new APIClient(config);
```
Falhe ao iniciar, não em produção
</Good>
#### Na Prática
**Ao projetar APIs:**
- Use tipos para restringir inputs
- Torne estados inválidos irrepresentáveis
- Retorne Result<T, E> em vez de jogar exceção
- Documente pré-condições em tipos
**Ao tratar erros:**
- Valide em boundaries do sistema
- Use guards para pré-condições
- Falhe rápido com mensagens claras
- Registre contexto para debugging
**Ao configurar:**
- Requerido sobre opcional com padrões
- Valide toda config ao iniciar
- Falhe no deployment se config inválida
- Não permita configurações parciais
### 3. Trabalho Padronizado
Siga padrões estabelecidos. Documente o que funciona. Torne boas práticas fáceis de seguir.
#### Princípios
**Consistência sobre criatividade:**
- Siga padrões de codebase existentes
- Não reinvente problemas resolvidos
- Novo padrão apenas se significativamente melhor
- Acordo em equipe sobre novos padrões
**Documentação vive com código:**
- README para setup e arquitetura
- CLAUDE.md para convenções de codificação IA
- Comentários para "por quê", não "o quê"
- Exemplos para padrões complexos
**Automatize padrões:**
- Linters enforcement de estilo
- Type checks enforcement de contratos
- Testes verificam comportamento
- CI/CD enforcement de quality gates
#### Seguindo Padrões
<Good>
```typescript
// Padrão de codebase existente para API clients
class UserAPIClient {
async getUser(id: string): Promise<User> {
return this.fetch(`/users/${id}`);
}
}
// Novo código segue o mesmo padrão
class OrderAPIClient {
async getOrder(id: string): Promise<Order> {
return this.fetch(`/orders/${id}`);
}
}
```
Consistência torna codebase previsível
</Good>
<Bad>
```typescript
// Padrão existente usa classes
class UserAPIClient { /* ... */ }
// Novo código introduz padrão diferente sem discussão
const getOrder = async (id: string): Promise<Order> => {
// Quebrando consistência "porque prefiro funções"
};
```
Inconsistência cria confusão
</Bad>
#### Padrões de Tratamento de Erros
<Good>
```typescript
// Padrão do projeto: Tipo Result para erros recuperáveis
type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };
// Todos os serviços seguem este padrão
const fetchUser = async (id: string): Promise<Result<User, Error>> => {
try {
const user = await db.users.findById(id);
if (!user) {
return { ok: false, error: new Error('User not found') };
}
return { ok: true, value: user };
} catch (err) {
return { ok: false, error: err as Error };
}
};
// Chamadores usam padrão consistente
const result = await fetchUser('123');
if (!result.ok) {
logger.error('Failed to fetch user', result.error);
return;
}
const user = result.value; // Type-safe!
```
Padrão padrão através de codebase
</Good>
#### Padrões de Documentação
<Good>
```typescript
/**
* Retenta uma operação assíncrona com backoff exponencial.
*
* Por quê: Requests de rede falham temporariamente; retentativas melhoram confiabilidade
* Quando usar: Chamadas de API externa, operações de banco de dados
* Quando não usar: Validação de entrada de usuário, chamadas de função interna
*
* @example
* const result = await retry(
* () => fetch('https://api.example.com/data'),
* { maxAttempts: 3, baseDelay: 1000 }
* );
*/
const retry = async <T>(
operation: () => Promise<T>,
options: RetryOptions
): Promise<T> => {
// Implementação...
};
```
Documenta por quê, quando e como
</Good>
#### Na Prática
**Antes de adicionar novos padrões:**
- Procure no codebase por problemas similares resolvidos
- Verifique CLAUDE.md para convenções do projeto
- Discuta com a equipe se quebrando padrão
- Atualize docs ao introduzir novo padrão
**Ao escrever código:**
- Combine estrutura de arquivo existente
- Use mesmas convenções de nomenclatura
- Siga mesma abordagem de tratamento de erros
- Importe de mesmos locais
**Ao revisar:**
- Verifique consistência com código existente
- Aponte para exemplos no codebase
- Sugira alinhar com padrões
- Atualize CLAUDE.md se novo padrão emergir
### 4. Just-In-Time (JIT)
Construa o que é necessário agora. Nem mais, nem menos. Evite otimização prematura e over-engineering.
#### Princípios
**YAGNI (Você Não Vai Precisar Disso):**
- Implemente apenas requisitos atuais
- Sem recursos "só em caso"
- Sem código "podemos precisar depois"
- Delete especulação
**Coisa mais simples que funciona:**
- Comece com solução direta
- Adicione complexidade apenas quando necessário
- Refatore quando requisitos mudam
- Não antecipe necessidades futuras
**Otimize quando mensurado:**
- Sem otimização prematura
- Profile antes de otimizar
- Meça impacto de mudanças
- Aceite performance "bom o suficiente"
#### YAGNI em Ação
<Good>
```typescript
// Requisito atual: Registre erros no console
const logError = (error: Error) => {
console.error(error.message);
};
```
Simples, atende necessidade atual
</Good>
<Bad>
```typescript
// Over-engineered para "necessidades futuras"
interface LogTransport {
write(level: LogLevel, message: string, meta?: LogMetadata): Promise<void>;
}
class ConsoleTransport implements LogTransport { /* ... */ }
class FileTransport implements LogTransport { /* ... */ }
class RemoteTransport implements LogTransport { /* ... */ }
class Logger {
private transports: LogTransport[] = [];
private queue: LogEntry[] = [];
private rateLimiter: RateLimiter;
private formatter: LogFormatter;
// 200 linhas de código para "talvez precisemos"
}
const logError = (error: Error) => {
Logger.getInstance().log('error', error.message);
};
```
Construindo para requisitos imaginários
</Bad>
**Quando adicionar complexidade:**
- Requisito atual exige
- Pontos de dor identificados através de uso
- Problemas de performance mensurados
- Múltiplos casos de uso emergiram
<Good>
```typescript
// Comece simples
const formatCurrency = (amount: number): string => {
return `$${amount.toFixed(2)}`;
};
// Requisito evolui: suporte múltiplas moedas
const formatCurrency = (amount: number, currency: string): string => {
const symbols = { USD: '$', EUR: '€', GBP: '£' };
return `${symbols[currency]}${amount.toFixed(2)}`;
};
// Requisito evolui: suporte localização
const formatCurrency = (amount: number, locale: string): string => {
return new Intl.NumberFormat(locale, {
style: 'currency',
currency: locale === 'en-US' ? 'USD' : 'EUR',
}).format(amount);
};
```
Complexidade adicionada apenas quando necessária
</Good>
#### Abstração Prematura
<Bad>
```typescript
// Um caso de uso, mas construindo framework genérico
abstract class BaseCRUDService<T> {
abstract getAll(): Promise<T[]>;
abstract getById(id: string): Promise<T>;
abstract create(data: Partial<T>): Promise<T>;
abstract update(id: string, data: Partial<T>): Promise<T>;
abstract delete(id: string): Promise<void>;
}
class GenericRepository<T> { /* 300 linhas */ }
class QueryBuilder<T> { /* 200 linhas */ }
// ... construindo ORM inteiro para uma tabela
```
Abstração massiva para futuro incerto
</Bad>
<Good>
```typescript
// Funções simples para necessidades atuais
const getUsers = async (): Promise<User[]> => {
return db.query('SELECT * FROM users');
};
const getUserById = async (id: string): Promise<User | null> => {
return db.query('SELECT * FROM users WHERE id = $1', [id]);
};
// Quando padrão emerge entre múltiplas entidades, então abstraia
```
Abstraia apenas quando padrão comprovado em 3+ casos
</Good>
#### Otimização de Performance
<Good>
```typescript
// Atual: Abordagem simples
const filterActiveUsers = (users: User[]): User[] => {
return users.filter(user => user.isActive);
};
// Benchmark mostra: 50ms para 1000 usuários (aceitável)
// ✓ Entregue, nenhuma otimização necessária
// Depois: Após profiling mostra que isto é gargalo
// Então otimize com lookup indexado ou caching
```
Otimize baseado em medição, não suposições
</Good>
<Bad>
```typescript
// Otimização prematura
const filterActiveUsers = (users: User[]): User[] => {
// "Isto pode ser lento, então vamos fazer cache e indexar"
const cache = new WeakMap();
const indexed = buildBTreeIndex(users, 'isActive');
// 100 linhas de código de otimização
// Adiciona complexidade, mais difícil de manter
// Nenhuma evidência de que era necessário
};
```
Solução complexa para problema não-medido
</Bad>
#### Na Prática
**Ao implementar:**
- Resolva o problema imediato
- Use abordagem direta
- Resista pensamento "e se"
- Delete código especulativo
**Ao otimizar:**
- Profile primeiro, otimize segundo
- Meça antes e depois
- Documente por que otimização necessária
- Mantenha versão simples nos testes
**Ao abstrair:**
- Espere 3+ casos similares (Rule of Three)
- Torne abstração tão simples quanto possível
- Prefira duplicação sobre abstração errada
- Refatore quando padrão claro
## Integração com Comandos
A skill Kaizen guia como você trabalha. Os comandos fornecem análise estruturada:
- **`/why`**: Análise de causa raiz (5 Porquês)
- **`/cause-and-effect`**: Análise multifatorial (Espinha de Peixe)
- **`/plan-do-check-act`**: Ciclos de melhoria iterativos
- **`/analyse-problem`**: Documentação abrangente (A3)
- **`/analyse`**: Seleção inteligente de método (Gemba/VSM/Muda)
Use comandos para resolução estruturada de problemas. Aplique skill para desenvolvimento dia-a-dia.
## Bandeiras Vermelhas
**Violando Melhoria Contínua:**
- "Vou refatorar depois" (nunca acontece)
- Deixar código pior que encontrou
- Big bang rewrites em vez de incremental
**Violando Poka-Yoke:**
- "Usuários devem apenas ter cuidado"
- Validação após uso em vez de antes
- Config opcional sem validação
**Violando Trabalho Padronizado:**
- "Prefiro fazer à minha maneira"
- Não verificar padrões existentes
- Ignorar convenções do projeto
**Violando Just-In-Time:**
- "Podemos precisar disso algum dia"
- Construindo frameworks antes de usá-los
- Otimizando sem medir
## Lembre-se
**Kaizen é sobre:**
- Pequenas melhorias continuamente
- Prevenir erros por design
- Seguir padrões comprovados
- Construir apenas o necessário
**Não é sobre:**
- Perfeição na primeira tentativa
- Projetos de refatoração massivos
- Abstrações criativas
- Otimização prematura
**Mentalidade:** Bom o suficiente hoje, melhor amanhã. Repita.Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!