[{"content":"","date":null,"permalink":"https://adau.to/pt-br/","section":"Adauto Meira","summary":"","title":"Adauto Meira"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/tags/estimativa/","section":"Tags","summary":"","title":"Estimativa"},{"content":"Eu tinha um repositório no GitHub chamado fp-control que originalmente era uma API Flask publicada no AWS Lambda. Não estava fazendo muita coisa. Decidi reaproveitá-lo por completo e transformá-lo em algo que eu realmente queria usar: uma skill de IA agnóstica de plataforma para planejar sistemas de software usando Análise de Pontos de Função.\nO fato de ter começado como uma aplicação dedicada vale ser destacado. Uma skill bem estruturada pode substituir um número surpreendente de ferramentas leves — a contrapartida é que você passa a depender do custo de uma assinatura de agente, ou do esforço maior de rodar um LLM local com capacidade suficiente para seguir instruções complexas com consistência. Um modelo local dá mais controle e, talvez, mais espaço para ideias não convencionais, já que você não está dentro dos limites de um serviço comercial. Mas para a maioria dos casos de uso, um agente hospedado com um bom arquivo de skill é o caminho mais direto.\nO que é uma skill, exatamente? #No contexto dos assistentes de programação com IA, uma skill é um arquivo Markdown que um agente lê e segue como um conjunto de instruções. O Claude Code chama de commands; o Cursor chama de rules; o Windsurf chama de memories. O formato varia um pouco, mas a ideia é a mesma — você escreve as instruções uma vez e o agente sabe como se comportar para aquela tarefa em todas as sessões futuras.\nO desafio das skills é a distribuição. Se eu escrever uma para o Claude Code, ela só funciona lá. Eu queria algo que qualquer agente pudesse usar.\nO padrão de auto-instalação #A primeira decisão de design foi fazer a skill se instalar sozinha. Quando um agente lê o fp-control.md pela primeira vez, as próprias instruções do arquivo dizem a ele para detectar em qual plataforma está rodando e copiar o arquivo para o diretório de configuração global correspondente. O Claude Code recebe ~/.claude/commands/fp-control.md. O Cursor recebe ~/.cursor/rules/fp-control.mdc. O Windsurf tem seu próprio caminho. Qualquer outro agente recebe a instrução de usar o equivalente da sua plataforma.\nO usuário não precisa mais pensar em configuração depois da primeira leitura. Se confiar no agente para fazer automaticamente, funciona. Se preferir fazer manualmente, o README tem uma tabela com o comando exato para cada plataforma.\nO fluxo de Análise de Pontos de Função #Uma vez instalada, invocar /fp-control inicia uma sessão de Análise de Pontos de Função seguindo o método IFPUG. A skill guia o usuário por oito etapas:\nDefinir a fronteira do sistema — o que está dentro, o que está fora Identificar Arquivos Lógicos Internos (ILF) — dados que o sistema mantém Identificar Arquivos de Interface Externa (EIF) — dados externos que o sistema lê mas não mantém Contar Entradas Externas (EI) — operações de escrita que criam, atualizam ou excluem dados internos Contar Saídas Externas (EO) — relatórios e resultados calculados enviados para fora da fronteira Contar Consultas Externas (EIQ) — consultas somente leitura sem processamento derivado Calcular os Pontos de Função Não Ajustados e produzir um resumo de planejamento Opcionalmente salvar a análise como arquivo Markdown estruturado e gerar um relatório HTML A skill faz uma pergunta por vez, raciocina sobre as contagens de RET, DET e FTR a partir das descrições do usuário quando ele tem dúvidas, e mantém o total acumulado visível ao longo de toda a sessão. Ela também detecta o idioma em que o usuário escreve e conduz toda a sessão — incluindo o HTML gerado — nesse idioma.\nTestando com um sistema real #Para testar a skill, rodei uma sessão completa de APF para uma plataforma multi-empresa com controle de acesso baseado em papéis e modelo de atribuição de profissionais. O tipo de sistema que, no papel, parece simples mas revela sua profundidade quando você começa a contar o que ele realmente faz.\nA análise produziu 329 Pontos de Função Não Ajustados em 74 itens: 13 Arquivos Lógicos Internos (91 PF), nenhum Arquivo de Interface Externa, 33 Entradas Externas (111 PF), 12 Saídas Externas (62 PF) e 16 Consultas Externas (65 PF). Usando benchmarks típicos da indústria, isso se traduz em aproximadamente 4.600 horas de esforço de desenvolvimento — uma linha de base concreta antes de uma única linha de código ser escrita.\nO relatório HTML #Ao final da sessão, a skill gera um arquivo HTML autocontido sem nenhuma dependência externa. Tudo — CSS, JavaScript, dados — está embutido no arquivo. O relatório é organizado como uma interface com abas: uma aba de Visão Geral com a fronteira do sistema, um gráfico de barras e o resumo de UFP, seguida por uma aba para cada tipo de função (ILF, EIF, EI, EO, EIQ) e uma aba final de Esforço e Riscos.\nCada aba de tipo de função inclui um cartão de referência de complexidade com a matriz IFPUG correspondente, e uma tabela completa de itens com uma coluna \u0026ldquo;Regra aplicada\u0026rdquo; que torna o raciocínio transparente — por exemplo, FTR 2, DET 5–15 → Médio. Qualquer pessoa que leia o relatório pode rastrear exatamente como cada item foi classificado.\nO relatório também tem um toggle de modo claro/escuro e dois botões de impressão: um que imprime o relatório completo sempre em modo claro, independentemente do tema atual, e um segundo que imprime um resumo simplificado mostrando apenas a aba de Visão Geral.\nContinuidade de sessão com .fpa.md #Uma limitação de trabalhar com agentes de IA é que as sessões terminam. A compactação de contexto trunca o histórico. Uma sessão completa de APF para um sistema moderadamente complexo envolve dezenas de itens em cinco tipos de função — não é algo que se queira reconstruir de memória.\nA skill resolve isso salvando a análise como um arquivo .fpa.md. O arquivo tem duas partes: um bloco de frontmatter YAML com todos os dados estruturados (cada item, suas contagens, complexidade e valor em PF), e um corpo em Markdown com o resumo de planejamento legível por humanos logo abaixo. Quando o usuário abre uma nova sessão e referencia o arquivo, o agente lê o frontmatter e oferece retomar exatamente de onde parou — apresentar o resumo, atualizar itens específicos ou ir direto para a geração do HTML.\nUm único arquivo serve a dois propósitos: legível por máquina o suficiente para um agente restaurar o estado, e legível por humano o suficiente para abrir em qualquer editor e entender de imediato.\nPor que Pontos de Função ainda importam #Há uma pergunta razoável sobre se medir o tamanho funcional ainda é relevante quando a IA pode gerar código mais rápido do que nunca. Minha visão é que importa mais, não menos. A IA acelera a implementação, mas não reduz os requisitos. Um sistema com 300 Pontos de Função tem a mesma complexidade funcional independentemente de ser construído por uma equipe de dez pessoas em três meses ou por um desenvolvedor solo com um assistente de IA em duas semanas. O escopo é o mesmo; apenas a produtividade mudou.\nPontos de Função oferecem uma linha de base agnóstica de tecnologia para esse escopo — comparável entre projetos, defensável em contratos e útil para recalibrar benchmarks à medida que dados de produtividade com desenvolvimento assistido por IA se acumulam. Saber o que você está pedindo para a IA construir, e quanto disso, ainda é o primeiro passo antes de pedir para ela construir qualquer coisa.\nO repositório está em github.com/adautomeira/fp-control e é distribuído sob a licença MIT.\n","date":"4 de junho de 2026","permalink":"https://adau.to/pt-br/posts/fp-control-analise-de-pontos-de-funcao-como-skill-de-ia/","section":"Posts","summary":"Como substituí uma API Flask por uma skill de IA agnóstica de plataforma que guia qualquer agente pela Análise de Pontos de Função do IFPUG — incluindo relatório HTML, modo escuro e continuidade de sessão.","title":"fp-control: Análise de Pontos de Função como Skill de IA, Não como Aplicação"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/tags/ia/","section":"Tags","summary":"","title":"Ia"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/tags/planejamento/","section":"Tags","summary":"","title":"Planejamento"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/tags/pontos-de-funcao/","section":"Tags","summary":"","title":"Pontos-De-Funcao"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/posts/","section":"Posts","summary":"","title":"Posts"},{"content":"Sou um Analista de Dados Sênior com mais de 8 anos de experiência em análise de dados, administração de dados e engenharia de dados. Utilizo meu MBA em Gestão da Informação e Business Intelligence para organizar fluxos de dados, criar visualizações e apoiar a tomada de decisões. Meu objetivo é usar dados para resolver problemas complexos, otimizar processos e gerar insights que impulsionem o crescimento do negócio e a satisfação do cliente.\nAlguns destaques da minha carreira:\nReduzi o tempo de geração de leads de 3 horas para 20 minutos em cenários de alto impacto Liderei migrações de dados de bancos relacionais e KV para o BigQuery, garantindo escalabilidade e integração sem interrupções Desenvolvi dashboards no Tableau e Looker Studio para acompanhar interações de usuários, taxas de conversão e detecção de erros Ajudei um time de risco a migrar de transferências diárias para quase em tempo real, dentro dos requisitos de conformidade PCI-DSS Defini soluções de armazenamento para aplicações em produção e escrevi scripts de ETL para pipelines de múltiplas fontes Monitorei e otimizei a performance de consultas, índices e partições em diferentes engines de banco de dados Trabalhei em fintechs, na área da saúde e no setor público, lidando com dados críticos em larga escala.\nFerramentas e tecnologias: BigQuery, SQL, Tableau, Looker Studio, Power BI, GCP, Azure, AWS, PostgreSQL, Oracle, Cassandra, MongoDB, REDIS\n","date":"4 de junho de 2026","permalink":"https://adau.to/pt-br/about/","section":"Adauto Meira","summary":"","title":"Sobre"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/tags/","section":"Tags","summary":"","title":"Tags"},{"content":"Imagine que você tem uma estante com muitos livros. Em um determinado momento, você precisa fazer a mudança desses livros para uma prateleira. A estante e a prateleira têm estruturas diferentes e você precisa organizar os livros para que eles caibam no novo espaço.\nEntão, diante desse cenário, você terá que selecionar o que irá de fato para a nova prateleira, respeitando os limites dela e a organização final dos livros de acordo com a nova estrutura.\nEsse exemplo é uma forma de ilustrar os passos necessários para migrar dados entre bancos de dados distintos.\nOs tópicos aqui apresentados são resultado de um trabalho de migração de dados entre bancos de dados de tecnologias diferentes, com estruturas diferentes, com regras de negócio distintas e um prazo curto para desenvolvimento e teste. A intenção é mostrar um fluxo \u0026ldquo;simples\u0026rdquo;, sem depender de alguma tecnologia específica além do próprio SQL. Não considero os passos apresentados como a melhor estratégia, e sim aquilo que eu pude fazer com o que tinha disponível.\nConsiderações #Itens a serem observados antes de começar a executar a migração:\nEntender as limitações do SGBD (Origem e Destino) #Entender como funciona o SGBD e as ferramentas que ele possui ajudará a prever os problemas que podem acontecer durante a execução da migração. Alguns scripts, a depender de como o banco e o negócio estão estruturados, podem conter mais de 1 milhão de registros e nem toda ferramenta ou SGBD conseguirá executá-los. Alguns clients têm desempenho melhor que outros e alguns podem apresentar um desempenho melhor a depender do SGBD de destino. Outros clients podem apresentar problemas com a configuração do locale do script, podendo pular algumas instruções.\nAlém das ferramentas, o SGBD pode ser um fator limitador na migração. Um dos problemas pode ser a forma como ele processa os scripts, chegando ao ponto de travar o servidor.\nIdentificar as particularidades nas estruturas dos bancos #Cada tabela pode possuir uma ou mais dependências (chaves-estrangeiras ou FK). Essas dependências influenciam na ordem como os dados serão importados. Além disso, tabelas contendo enums e code data deverão ser listadas e tratadas antes dos dados principais. Será necessário observar se há dados duplicados ou semelhantes nessas tabelas entre as diversas origens para evitar redundâncias.\nÍndices nos bancos de origem podem acelerar a leitura e criação dos arquivos intermediários. Já nos bancos de destino, os índices poderão limitar a quantidade de registros inseridos/alterados por segundo. Em ambos os casos, será necessário avaliar a necessidade e o impacto de criação ou remoção deles.\nEvitar sub-selects com argumentos inline #Em alguns momentos os subselects serão necessários. A questão é ter de usar alguma linha da coluna para realizar novas pesquisas. Isso aumenta o tempo de execução consideravelmente. A solução é transformar essa pesquisa em um conjunto de dados a ser usado como argumento em um IN. Por exemplo:\n-- Evitar: SELECT * FROM TABELA T WHERE id \u0026lt;\u0026gt; (SELECT id FROM TABELA2 T2 WHERE T.valor = T2.valor) -- Preferir: SELECT * FROM TABELA T WHERE id IN (SELECT id FROM TABELA2 T2 WHERE T2.valor = argumento) -- Melhor ainda: SELECT * FROM TABELA T WHERE EXISTS (SELECT id FROM TABELA2 T2 WHERE T2.valor = id) Processo #Criar um arquivo \u0026ldquo;Composer\u0026rdquo; #Normalmente um script SQL possui a seguinte estrutura:\nSELECT coluna1, coluna2 FROM tabela WHERE coluna3 = argumento O Composer é uma estrutura de script que permite a extração dos dados do banco de origem, formatando a saída em um padrão esperado para o banco de destino. Por exemplo:\nSELECT \u0026#39;INSERT INTO tabela (coluna1, coluna2) VALUES (\u0026#39;\u0026#39;\u0026#39; + coluna_origem1 + \u0026#39;\u0026#39;\u0026#39;, \u0026#39;\u0026#39;\u0026#39; + coluna_origem2 + \u0026#39;\u0026#39;\u0026#39;);\u0026#39; AS \u0026#34;-- TABELA\u0026#34; FROM tabela WHERE colunaX = argumentoY O resultado será um arquivo pronto para execução no banco de destino:\n-- TABELA INSERT INTO tabela (coluna1, coluna2) VALUES (\u0026#39;Valor1\u0026#39;, \u0026#39;Valor2\u0026#39;); INSERT INTO tabela (coluna1, coluna2) VALUES (\u0026#39;Valor3\u0026#39;, \u0026#39;Valor4\u0026#39;); Usar funções/procedures para dados críticos #Alguns dados críticos podem ter repetições, ter dados incompletos ou ter a necessidade de atualização por conta de alguma regra de negócio. A partir de funções/procedures é possível controlar esses dados, criando tabelas auxiliares:\nTABELA_SUCESSO: registra dados salvos com sucesso. TABELA_INSUCESSO: identifica registros inconsistentes ou duplicados. SELECT \u0026#39;SELECT funcao(\u0026#39;\u0026#39;\u0026#39; + coluna_origem1 + \u0026#39;\u0026#39;\u0026#39;, \u0026#39;\u0026#39;\u0026#39; + coluna_origem2 + \u0026#39;\u0026#39;\u0026#39;);\u0026#39; AS \u0026#34;-- FUNCAO_TABELA\u0026#34; FROM tabela WHERE colunaX = argumentoY Separar os resultados em arquivos distintos #Para evitar um arquivo único contendo todos os comandos de INSERT, recomenda-se separar os registros por tabela ou pela regra de negócio. Alguns arquivos, ainda separados, chegaram a ter 300MB de tamanho.\nVerificar se todos os registros foram lidos #Houve episódios onde alguns registros não foram inseridos por conta de conflitos de codificação (encoding) da ferramenta e do script executado, fazendo com que alguns registros não fossem atualizados. Verificar a quantidade de registros importados após a execução do script evitará surpresas indesejadas.\nConsiderações finais #Extrações pontuais, com poucos registros, de origens de dados não-convencionais (CSV, Excel, etc.), com modelos de negócio simples, podem se beneficiar com o fluxo apresentado.\nAlgumas situações podem permitir o uso de ferramentas como Pentaho PDI ou Airflow. Em outras, algumas regras corporativas limitarão o acesso aos destinos, exigindo que as alterações sejam feitas por scripts e que os mesmos sejam executados por pessoas credenciadas.\n","date":"1 de dezembro de 2017","permalink":"https://adau.to/pt-br/posts/como-fazer-uma-migracao-de-dados-simples/","section":"Posts","summary":"Um fluxo simples para migração de dados entre bancos de dados distintos, sem depender de tecnologias específicas além do SQL.","title":"Como fazer uma migração \"simples\" de dados"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/tags/engenharia-de-dados/","section":"Tags","summary":"","title":"Engenharia-De-Dados"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/tags/etl/","section":"Tags","summary":"","title":"Etl"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/tags/sql/","section":"Tags","summary":"","title":"Sql"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/categories/","section":"Categories","summary":"","title":"Categories"},{"content":"","date":null,"permalink":"https://adau.to/pt-br/portfolio/","section":"Portfólio","summary":"","title":"Portfólio"}]