Skip to content

Instantly share code, notes, and snippets.

@GlauberF
Last active August 7, 2025 14:43
Show Gist options
  • Save GlauberF/234fb9a3acbeafbebaefd241907e05fb to your computer and use it in GitHub Desktop.
Save GlauberF/234fb9a3acbeafbebaefd241907e05fb to your computer and use it in GitHub Desktop.
// --- PARÂMETROS DA SIMULAÇÃO ---
// 1. Definimos os valores padrão (default)
const VALORES_PADRAO = {
tarefas: 15,
vazaoMin: 3,
vazaoMax: 8,
simulacoes: 10000,
};
// 2. Capturamos os argumentos da linha de comando
const args = process.argv.slice(2); // Pega apenas os argumentos do usuário
// Exibe ajuda se o usuário pedir
if (args[0] === '--help' || args[0] === '-h') {
console.log(`
Uso: node previsao_cli.js [tarefas] [vazao_min] [vazao_max]
Argumentos:
[tarefas] - (Opcional) O número de tarefas restantes. Padrão: ${VALORES_PADRAO.tarefas}
[vazao_min] - (Opcional) A menor quantidade de tarefas feitas em uma semana. Padrão: ${VALORES_PADRAO.vazaoMin}
[vazao_max] - (Opcional) A maior quantidade de tarefas feitas em uma semana. Padrão: ${VALORES_PADRAO.vazaoMax}
Exemplos:
- Usar valores padrão:
node previsao_cli.js
- Simular para 50 tarefas restantes:
node previsao_cli.js 50
- Simular para 50 tarefas com vazão entre 5 e 12:
node previsao_cli.js 50 5 12
`);
process.exit(0); // Encerra o script
}
// 3. Substituímos os padrões pelos argumentos informados, se existirem
const TAREFAS_RESTANTES = parseInt(args[0], 10) || VALORES_PADRAO.tarefas;
const VAZAO_MINIMA_SEMANAL = parseInt(args[1], 10) || VALORES_PADRAO.vazaoMin;
const VAZAO_MAXIMA_SEMANAL = parseInt(args[2], 10) || VALORES_PADRAO.vazaoMax;
const NUMERO_DE_SIMULACOES = VALORES_PADRAO.simulacoes;
// Validação simples para garantir que min <= max
if (VAZAO_MINIMA_SEMANAL > VAZAO_MAXIMA_SEMANAL) {
console.error("\x1b[31mErro: A vazão mínima não pode ser maior que a vazão máxima.\x1b[0m");
process.exit(1); // Encerra com código de erro
}
// --- LÓGICA DA SIMULAÇÃO (Permanece a mesma) ---
function sortearVazao(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function executarUmaSimulacao() {
let semanas = 0;
let tarefasConcluidas = 0;
while (tarefasConcluidas < TAREFAS_RESTANTES) {
semanas++;
tarefasConcluidas += sortearVazao(VAZAO_MINIMA_SEMANAL, VAZAO_MAXIMA_SEMANAL);
}
return semanas;
}
function analisarResultados(resultados) {
resultados.sort((a, b) => a - b);
const calcularPercentil = (percentil) => {
const index = Math.ceil(percentil / 100 * resultados.length) - 1;
return resultados[index];
};
const p50 = calcularPercentil(50);
const p70 = calcularPercentil(70);
const p85 = calcularPercentil(85);
const p95 = calcularPercentil(95);
console.log("--- Previsão de Entrega (Simulação de Monte Carlo) ---");
console.log(`\nBaseado em ${NUMERO_DE_SIMULACOES.toLocaleString('pt-BR')} simulações para completar ${TAREFAS_RESTANTES} tarefas:`);
console.log(`Vazão semanal estimada entre ${VAZAO_MINIMA_SEMANAL} e ${VAZAO_MAXIMA_SEMANAL} tarefas.`);
console.log("\nResultados Probabilísticos:");
console.log(`\x1b[33m%s\x1b[0m`, ` -> 50% de chance de terminar em ${p50} semanas ou menos. (Resultado mais provável)`);
console.log(`\x1b[32m%s\x1b[0m`, ` -> 70% de chance de terminar em ${p70} semanas ou menos.`);
console.log(`\x1b[32m%s\x1b[0m`, ` -> 85% de chance de terminar em ${p85} semanas ou menos. (Previsão com alta confiança)`);
console.log(`\x1b[32m%s\x1b[0m`, ` -> 95% de chance de terminar em ${p95} semanas ou menos. (Previsão com confiança muito alta)`);
}
// --- EXECUÇÃO PRINCIPAL ---
const todosOsResultados = [];
for (let i = 0; i < NUMERO_DE_SIMULACOES; i++) {
todosOsResultados.push(executarUmaSimulacao());
}
analisarResultados(todosOsResultados);
@GlauberF
Copy link
Author

GlauberF commented Aug 7, 2025

1 - Usando os valores padrão.
Simplesmente execute o script sem argumentos.
node previsao_cli.js

2 - Alterando apenas o número de tarefas (ex: 50 tarefas)
Passe o primeiro argumento. Os outros usarão o padrão.
node previsao_cli.js 50

3 - Alterando todos os parâmetros
Imagine que um projeto maior tem 90 tarefas restantes e a equipe foi reforçada, então a vazão agora varia entre 8 e 15 tarefas por semana.
node previsao_cli.js 90 8 15

4 - Pedindo ajuda
Se você esquecer a ordem ou o que cada parâmetro faz, pode pedir ajuda.
node previsao_cli.js --help

@GlauberF
Copy link
Author

GlauberF commented Aug 7, 2025

Exemplo de saída(usando dados padrão e fictícios)

`
node previsao_cli.js
--- Previsão de Entrega (Simulação de Monte Carlo) ---

Baseado em 10.000 simulações para completar 15 tarefas:
Vazão semanal estimada entre 3 e 8 tarefas.

Resultados Probabilísticos:
-> 50% de chance de terminar em 3 semanas ou menos. (Resultado mais provável)
-> 70% de chance de terminar em 3 semanas ou menos.
-> 85% de chance de terminar em 4 semanas ou menos. (Previsão com alta confiança)
-> 95% de chance de terminar em 4 semanas ou menos. (Previsão com confiança muito alta)
`

Explicação:

A saída de cada uma das 10.000 simulações é um número inteiro de semanas. O projeto pode terminar em 2 semanas, 3 semanas, 4 semanas, etc. Ele não pode terminar em 3.5 semanas, pois a nossa unidade de medida é a "semana" (a cada semana sorteamos uma nova quantidade de tarefas feitas).

Quando a simulação termina, temos uma lista com 10.000 números inteiros, por exemplo: [3, 2, 4, 3, 3, 4, 2, 5, 3, 3, 4, ...]

Para calcular os percentis, o script ordena essa lista do menor para o maior:
[2, 2, ..., 3, 3, 3, 3, 3, ..., 4, 4, 4, ..., 5, ...]

Agora, vamos analisar o que a sua saída significa olhando para essa lista ordenada de 10.000 resultados:

1 - 50% de chance de terminar em 3 semanas ou menos
Isso significa que o resultado na posição 5.000 da lista ordenada (a metade) é o número 3. Ou seja, pelo menos 5.000 das 10.000 simulações terminaram em 3 semanas ou menos.

2 - 70% de chance de terminar em 3 semanas ou menos
Isso significa que se você avançar na lista até a posição 7.000, o resultado que está lá ainda é 3. Isso revela algo crucial: o resultado "3 semanas" é muito comum! Um grande "bloco" de resultados na sua lista ordenada, indo da posição ~5.000 até a ~7.000 (e provavelmente antes e depois), é composto pelo número 3.

3 - 85% de chance de terminar em 4 semanas ou menos
Aqui está o "pulo"! Quando você avança para a posição 8.500 na lista, o número finalmente muda para 4. Isso indica que entre o percentil 70 e o 85, os cenários que levavam 3 semanas se esgotaram e agora estamos na faixa de cenários que levaram 4 semanas.

4 - 95% de chance de terminar em 4 semanas ou menos
Da mesma forma que antes, ao avançar da posição 8.500 para a 9.500, o valor ainda é 4. Isso mostra que o resultado "4 semanas" também é bastante comum, cobrindo essa fatia de 10% das simulações.

O que isso significa na prática?
Essa repetição de valores lhe dá um mapa claro dos riscos.

1 - Alta Probabilidade de 3 Semanas: Existe uma chance muito grande (até 70%) de o projeto terminar em 3 semanas. Esse é o seu cenário mais provável e otimista-realista.

2 - Um "Degrau" de Risco: A simulação está alertando que existe um "degrau" ou "salto" de risco. Se as coisas não saírem como na maioria dos cenários (que terminam em 3 semanas), o próximo resultado mais provável não é 3.1 ou 3.2, mas sim 4 semanas.

3 - Planejamento de Alta Confiança: Se você precisa comunicar um prazo com alta confiança (85% ou mais), você não pode prometer 3 semanas. A simulação mostra claramente que para atingir esse nível de certeza, você precisa se planejar para 4 semanas.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment