惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
G
Google Developers Blog
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
F
Full Disclosure
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
Help Net Security
Help Net Security
The Hacker News
The Hacker News
IT之家
IT之家
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
V
Visual Studio Blog
博客园 - 聂微东
Hacker News: Ask HN
Hacker News: Ask HN
H
Hacker News: Front Page
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
Security Archives - TechRepublic
Security Archives - TechRepublic
Simon Willison's Weblog
Simon Willison's Weblog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Last Week in AI
Last Week in AI
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
博客园 - 【当耐特】
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
Google DeepMind News
Google DeepMind News
Cloudbric
Cloudbric
N
News | PayPal Newsroom
A
About on SuperTechFans
S
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
雷峰网
雷峰网
T
The Exploit Database - CXSecurity.com
罗磊的独立博客
K
Kaspersky official blog
The Cloudflare Blog
I
Intezer

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Por que as Skills Fracassam (e Como Não Fracassar)
eugenio tava · 2026-05-03 · via DEV Community

Uma skill ruim gera código ruim em escala. Uma skill boa gera código bom em escala. A diferença entre as duas não está na ferramenta, está em como a skill foi construída. Quando uma skill é criada sem contexto suficiente, a IA passa a alucinar sistematicamente: gera código tecnicamente válido, mas semanticamente errado. E faz isso toda vez que a skill é chamada, para todo mundo que a usa.

Percebi esse padrão nos times que comecei a acompanhar. Quando alguém pedia "cria uma skill para automatizar X", a IA gerava algo que tecnicamente tinha instruções, mas faltava... tudo. Faltavam exemplos. Faltavam templates. Faltavam os gotchas, aqueles detalhinhos que só quem já fez o trabalho conhece. O resultado era uma skill genérica que, quando testada em produção, alucinava.

O Padrão que Observei

Isso começou a fazer sentido quando comecei a notar os sinais de uma skill ruim:

  • Falta exemplos na instrução. A skill descreve o que deveria acontecer em prosa, mas não mostra nenhum exemplo de entrada/saída real.
  • Falta templates e scripts. Tarefas repetitivas que deveriam ter um template pronto aparecem como descrições genéricas tipo "execute o comando apropriado".
  • Alucinações semânticas. O que a skill gera é tecnicamente válido, roda sem erro, mas viola regras de negócio que ninguém formalizou.

A questão que comecei a fazer era: por que isso acontece? A IA não é burra. A ferramenta não é fraca. Qual é o problema de verdade?

A resposta que fui encontrando é tão simples que quase passa despercebida: skills fracassam porque são criadas fora de contexto.

Quando você pede pra IA "cria uma skill para X", ela não tem:

  • Os steps que funcionaram (porque esse trabalho ainda não foi feito)
  • As correções necessárias (porque ninguém descobriu ainda onde as coisas erram)
  • Os edge cases específicos (porque ninguém os encontrou ainda)
  • O padrão reutilizável (porque ele só emerge depois de executar a tarefa de verdade)

A IA, sem esse contexto, gera uma skill sem propósito definido. E skill sem propósito não é inofensiva: é uma fonte consistente de novos problemas.

Fui ajustando minha forma de trabalhar conforme esses problemas apareciam. Hoje sigo três pilares quando preciso construir uma skill que funcione de verdade. Não são regras fixas, são princípios que emergiram da prática e do estudo de boas práticas da área. Compartilho aqui na esperança de que sirvam de atalho pra quem está passando pelos mesmos erros.

Pilar 1: Contexto é Descoberta (não criação)

A descoberta vem primeiro. A skill vem depois.

E aqui é onde a virada é interessante: você não precisa descobrir sozinho. Você descobre junto com a IA, na mesma sessão onde o trabalho acontece.

Imagine que você precisa atualizar descrições de PRs em escala: adicionar tags, reestruturar o formato. A forma errada é abrir uma conversa e pedir "cria uma skill que atualiza PRs". A forma certa é fazer o trabalho de verdade primeiro, deixar a descoberta acontecer, e só então pedir a skill.

Na prática, o fluxo que funciona é esse:

Primeiro, compartilhe o contexto que você já tem. Antes de começar, traga pra conversa o que existe: documentação, runbooks, style guides, comentários de code review, trechos do git history onde isso foi feito antes. Isso não substitui a fase exploratória, mas reduz o tempo de descoberta. A IA começa com menos suposições.

Depois, execute o trabalho passo a passo com a IA. Não peça "faz tudo". Peça "me ajuda a atualizar esse PR conforme os padrões". O ciclo é simples:

  • A IA tenta
  • Você revisa o resultado
  • Onde errou, você corrige e pede pra ajustar
  • Repete até o resultado estar bom

Nesse processo, um padrão começa a emergir: os steps que funcionaram, as correções que você fez, os formatos reais de entrada e saída, as coisas específicas do projeto que você teve que explicar.

Agora, com esse contexto da sessão ainda vivo, peça a skill. "Com base no que acabamos de fazer aqui, cria uma skill que automatiza isso."

Esse é o ponto que muda tudo. Naquele momento, a IA sabe exatamente o que funcionou. Sabe onde errou e foi corrigida. Sabe qual é o padrão real, não o padrão genérico que ela inferiria do zero. A skill que sai daí carrega toda aquela aprendizagem da sessão.

Por último, teste a skill em casos reais e itere. A primeira versão quase sempre precisa de ajuste. Rode alguns casos, observe os traces de execução (não só o output final, veja se a IA está gastando tempo em passos improdutivos), e volte pra skill com o que aprendeu.

A mudança de perspectiva é essa: você e a IA descobrem juntos, em modo conversacional, com contexto compartilhado. Skills não nascem prontas do nada. Elas nascem do trabalho exploratório que precede a criação.

Pilar 2: Exemplos e Padrões (reduzem alucinações)

Uma skill é um prompt no final. E prompts bons têm estrutura, não só descrição em prosa.

Conforme examinei skills que funcionavam bem, percebi o que tinham em comum: estrutura concreta. Não "faça isso de forma apropriada". Era "faça exatamente assim, com esse padrão, e se encontrar isso, faça aquilo".

Abaixo estão os padrões que descobri que fazem diferença. Nem toda skill precisa de todos eles; use o que fizer sentido para o que a sua skill precisa resolver.

Seção de Gotchas

A seção mais valiosa de uma skill. Não são boas práticas genéricas tipo "sempre valide o input". São fatos específicos da skill que desafiam suposições razoáveis: correções concretas para erros que o agente comete naturalmente sem ser avisado.

Para uma skill de atualizar descrição de PR, os gotchas seriam completamente diferentes:

## Gotchas

- Use `gh pr edit` para atualizar a descrição — não `git commit --amend`.
- O corpo do PR aceita markdown, mas a linha de título não — evite
  caracteres especiais como `**` ou `#` no título.
- Verifique autenticação com `gh auth status` antes de qualquer operação.
  Tokens expirados retornam erro silencioso em alguns ambientes.

Enter fullscreen mode Exit fullscreen mode

Quando o agente errar durante o uso da skill e você corrigir, adicione a correção aqui. Essa é uma das formas mais diretas de melhorar uma skill iterativamente.

Templates para o Formato de Saída

Estruturas concretas funcionam melhor do que descrição em prosa. Agentes fazem bom pattern-matching contra templates.

## Estrutura do Relatório

Use este template, adaptando as seções conforme necessário:

# [Título da Análise]

## Resumo Executivo
[Um parágrafo com os principais achados]

## Achados Principais
- Achado 1 com dado que sustenta
- Achado 2 com dado que sustenta

## Recomendações
1. Recomendação acionável e específica
2. Recomendação acionável e específica

Enter fullscreen mode Exit fullscreen mode

Muito melhor que "escreva um relatório bem estruturado com resumo e achados".

Checklists para Workflows com Múltiplos Passos

Ajuda o agente a não pular etapas, especialmente quando existem dependências entre elas.

## Workflow de Processamento

- [ ] Passo 1: Analisa o formulário (`scripts/analyze_form.py`)
- [ ] Passo 2: Cria o mapeamento de campos (`fields.json`)
- [ ] Passo 3: Valida o mapeamento (`scripts/validate_fields.py`)
- [ ] Passo 4: Preenche o formulário (`scripts/fill_form.py`)
- [ ] Passo 5: Verifica o output (`scripts/verify_output.py`)

Enter fullscreen mode Exit fullscreen mode

Loops de Validação

Instrui o agente a validar o próprio trabalho antes de seguir em frente. Cria um feedback loop que corrige erros antes de propagarem.

## Workflow de Edição

1. Faça as edições
2. Rode a validação: `python scripts/validate.py output/`
3. Se falhar:
   - Leia a mensagem de erro
   - Corrija os problemas
   - Rode a validação de novo
4. Só avança quando a validação passar

Enter fullscreen mode Exit fullscreen mode

Planejar → Validar → Executar

Para operações destrutivas ou irreversíveis, o agente cria um plano intermediário, valida contra source of truth, e só então executa. A mágica está no passo de validação: erros claros permitem que o agente se autocorrija antes de causar dano.

Scripts Reutilizáveis

Se você percebe que o agente reinventa a mesma lógica toda vez (parsing, geração de relatórios, validação de output), escreva o script testado uma vez e empacote em scripts/. O agente usa o script em vez de reinventar.

Tudo isso junto reduz a necessidade do agente adivinhar. Templates eliminam interpretação. Scripts reutilizáveis evitam reinvenção. Loops de validação corrigem antes de propagar.

Pilar 3: Progressive Disclosure (reutilização sem reescrita)

Uma skill bem-feita é reutilizável. Não porque hardcoda tudo, mas porque separa o que sempre carrega do que carrega só quando precisa.

O princípio é simples: mantenha o SKILL.md pequeno, abaixo de 500 linhas e 5k tokens. Só as instruções core que o agente precisa em toda execução. Conteúdo detalhado vai para arquivos separados em references/, assets/, scripts/, e só é carregado sob demanda.

O que faz a diferença não é ter os arquivos separados, é saber dizer ao agente quando carregar cada um:

## Tratamento de Erros da API

Se a API retornar status diferente de 200, leia `references/api-errors.md`
para os passos de troubleshooting específicos de cada código de erro.

Enter fullscreen mode Exit fullscreen mode

Em vez de:

## Tratamento de Erros da API

Aqui estão todos os erros possíveis: [lista de 50 erros]

Enter fullscreen mode Exit fullscreen mode

O segundo gasta tokens com informação irrelevante na maioria das execuções. O primeiro carrega só quando o cenário ocorre. Menos ruído, mais atenção no que importa agora.

Configuração por contexto

Quando uma skill precisa se adaptar a diferentes times ou projetos (qual board do Jira, qual projeto, qual ambiente), use arquivos de config em vez de hardcodar valores. Similar ao appsettings.json do .NET: a skill lê o arquivo uma vez e usa para toda a execução.

# jira.config
board_id: "PROJ-123"
team: "backend"
project_key: "PROJ"

Enter fullscreen mode Exit fullscreen mode

Muda o contexto? Muda o config. A lógica da skill não é tocada. E o arquivo pode ficar versionado no projeto, sem precisar editar a skill em si.

Uma abordagem que funciona bem é incluir um passo de setup na própria skill: se o arquivo de config não existir, a skill faz as perguntas necessárias, cria o arquivo com as respostas e segue a execução. Na próxima vez que for chamada, o arquivo já existe e ela vai direto ao trabalho, sem perguntar nada.

Calibrando a Especificidade

Nem toda instrução numa skill precisa do mesmo nível de rigidez. E essa calibração faz diferença.

O que percebi: quando a operação é frágil ou precisa ser exatamente de um jeito, ser prescritivo ajuda: "rode exatamente esse comando", "não modifique as flags". Quando múltiplas abordagens são válidas, dar liberdade e explicar o porquê em vez de só o o quê tende a funcionar melhor. Um agente que entende a intenção por trás da instrução toma decisões melhores em contexto.

Dê um default com escape hatch, em vez de uma lista de opções.

Quando a skill apresenta muitas alternativas equivalentes, o agente pode gastar tempo escolhendo em vez de executando. Apontar um caminho padrão e mencionar brevemente quando usar outro tende a funcionar melhor:

Evite:

Você pode usar pdfplumber, pypdf, PyMuPDF, ou pdf2image...

Enter fullscreen mode Exit fullscreen mode

Prefira:

Use pdfplumber para extração de texto.
Para documentos escaneados que precisam de OCR, use pdf2image com pytesseract.

Enter fullscreen mode Exit fullscreen mode

Prefira procedimentos a declarações específicas.

Instruções que descrevem um caso concreto só funcionam para aquele caso. Instruções que descrevem um método funcionam para qualquer situação similar:

Evite:

Junte orders com customers em customer_id, filtre por region = 'EMEA',
e some a coluna amount.

Enter fullscreen mode Exit fullscreen mode

Prefira:

1. Leia o schema em `references/schema.yaml` para identificar as tabelas relevantes
2. Faça o join usando a convenção de foreign key `_id`
3. Aplique os filtros do usuário como cláusulas WHERE
4. Agregue colunas numéricas e formate como tabela markdown

Enter fullscreen mode Exit fullscreen mode

No primeiro, o agente resolve exatamente essa query e para qualquer outra precisaria de uma nova instrução. No segundo, ele tem um método que generaliza para qualquer query analítica que aparecer.

O Que a Skill Não Precisa Saber

Toda instrução que você escreve compete por atenção no context window. Tokens gastos com o óbvio são tokens que faltam para o que importa.

A pergunta guia que uso: "O agente erraria isso sem essa instrução?" Se a resposta for não, corta.

Evite (agente já sabe o que é PDF):

PDF (Portable Document Format) é um formato de arquivo comum
que contém texto, imagens e outros conteúdos. Para extrair texto...

Enter fullscreen mode Exit fullscreen mode

Prefira (vai direto ao que o agente não saberia sozinho):

Use pdfplumber para extração de texto.
Para documentos escaneados, use pdf2image com pytesseract.

Enter fullscreen mode Exit fullscreen mode

Quanto mais a skill foca no que é específico: convenções do projeto, edge cases do domínio, padrões não-óbvios, menos espaço sobra para alucinação.

Uma Skill com um Propósito

Uma skill deve encapsular uma unidade coerente de trabalho. Pensa como uma função: faz uma coisa bem, compõe com outras skills, pode ser testada independentemente.

Muito estreita força o agente a carregar múltiplas skills para uma tarefa simples, com risco de instruções conflitantes. Muito ampla é difícil de ativar com precisão e tende a gerar instruções que se contradizem.

Evite (estreita demais, fragmenta o que é uma tarefa só):

Skill: buscar PRs abertos
Skill: formatar descrição de PR
Skill: atualizar PR via CLI

Enter fullscreen mode Exit fullscreen mode

O agente precisaria encadear três skills para fazer uma coisa só. Quanto mais skills envolvidas, maior a chance de instruções conflitantes.

Prefira (coerente, cobre uma unidade de trabalho completa):

Skill: revisar e atualizar descrições de PRs abertos
→ busca, formata e atualiza em um fluxo só

Enter fullscreen mode Exit fullscreen mode

Evite (ampla demais, mistura domínios diferentes):

Skill: gerenciar PRs e configurar repositório
→ atualiza descrições, define branch protection rules,
  configura webhooks, adiciona colaboradores...

Enter fullscreen mode Exit fullscreen mode

Domínios diferentes numa skill só tornam a ativação imprecisa e as instruções tendem a se contradizer conforme a skill cresce.

O Que Isso Muda

Se você leva esses três pilares a sério, muda quando e como skills são criadas.

Não é mais "quando preciso dessa funcionalidade". É "depois que já executei o trabalho com a IA, tenho o contexto da sessão, exemplos concretos, templates e os edge cases que apareceram".

Parece mais lento. Na prática, poupa tempo. Skill criada fora de contexto quase sempre precisa ser reescrita. Skill criada com contexto funciona, e quando precisar de ajuste, você sabe exatamente onde mexer.

E tem uma provocação que fica: se você não consegue identificar um padrão repetível depois de executar uma tarefa algumas vezes com a IA, talvez a tarefa ainda seja ambígua demais para virar skill. Ou o domínio ainda não está suficientemente entendido.

Porque a pergunta que importa não é "conseguimos criar skills?". É "conseguimos criar skills que as pessoas confiem?"

Porque uma skill ruim não erra uma vez, erra toda vez. Gera código ruim em escala, para todo mundo que a usa. Uma skill boa faz o oposto: multiplica o que foi bem descoberto, bem estruturado, bem testado.

Referências