codinggames

Calculando minhas horas de trabalho em projetos pessoais usando Node.js

Descobrindo da pior maneira que algumas informações não deveriam ser conhecidas

Escrito em 16 de junho de 2024 - 🕒 5 min. de leitura

ilustração de como é trabalhar com foss
ilustração de como é trabalhar com foss

Como um desenvolvedor totalmente ”commitado” (trocadilho intencional, e não vai ser o único) em projetos pessoais de FOSS, muitas vezes perco a noção do tempo. Parece que passei muitas e muitas horas programando, mas quantas exatamente? A curiosidade falou mais alto, então decidi escrever um script em Node.js para descobrir. Spoiler: Imediatamente me arrependi dessa decisão ao ver quanto do meu tempo livre foi gasto programando. Brabo.

Esboçando o plano

Eu queria um script que pudesse calcular minhas horas de trabalho com base nos meus commits do GIT. Como sou um ávido defensor das convenções de commits atômicos, a ideia é simples: quando estou trabalhando em meus projetos pessoais, estou fazendo commits. Se houver um intervalo de mais de 3 horas entre os commits, isso significa que provavelmente estou fazendo alguma outra coisa, como comendo, dormindo ou assistindo vídeos de programação (não, espera).

Escolhendo o pacote certo

Existem muitas bibliotecas GIT para Node.js, mas escolhi simple-git por sua facilidade de uso. É um wrapper em torno dos comandos GIT, tornando-o perfeito para essa tarefa.

Então, depois de instalar o simple-git, e fazer npm init e todas as outras coisas, eu estava pronto para começar a programar.

O código

Ok, vamos primeiro nos familiarizar com simple-git, aqui está um código simples para buscar o log de commits:

const simpleGIT = require('simple-git');
const git = simpleGIT();

async function getCommitLog() {
    try {
        const log = await git.log();
        return log.all;
    } catch (error) {
        console.error('Erro ao buscar o log de commits:', error);
    }
}

getCommitLog().then(commits => console.log(commits));

Com o log de commits em mãos, vamos ”aplicar” nosso plano esboçado no código e calcular as horas de trabalho. A ideia é iterar pelos commits e, sempre que houver um intervalo de mais de 3 horas entre dois commits, considerar o commit anterior como o fim de uma sessão de trabalho.

Por exemplo, se eu começar a trabalhar às 9h e fizer um commit às 10h, depois fizer outro commit às 15h, o script deve considerar a sessão de trabalho das 9h às 10h, então 1 hora.

async function calculateWorkHours() {
    try {
        const commits = await getCommitLog();

        if (commits.length === 0) {
            console.log('Nenhum commit encontrado neste repositório.');
            return;
        }

        let totalWorkTime = 0;
        let currentCommit = commits[0];
        const maxInterval = 3 * (60 * 60 * 1000); // 3 horas em milissegundos

        for (let i = 1; i < commits.length; i++) {
            const nextCommit = commits[i];
            const currentCommitTime = new Date(currentCommit.date).getTime();
            const nextCommitTime = new Date(nextCommit.date).getTime();

            if ((currentCommitTime - nextCommitTime) > maxInterval) {
                totalWorkTime += currentCommitTime - new Date(commits[i - 1].date).getTime();
                currentCommit = nextCommit;
            }
        }

        totalWorkTime += new Date(currentCommit.date).getTime() - new Date(commits[commits.length - 1].date).getTime();
        const totalWorkHours = totalWorkTime / (1000 * 60 * 60);

        console.log(`Total de horas de trabalho: ${totalWorkHours.toFixed(2)} horas`);
    } catch (error) {
        console.error('Erro ao calcular as horas de trabalho:', error);
    }
}

calculateWorkHours();

Basicamente é isso, mas já que estamos aqui, por que não extrair mais algumas informações? Não que saber o total de horas não seja suficiente, mas agora quero saber quanto tempo, em média, estou, uh, “desperdiçando”, quero dizer, tendo algum tempo de qualidade com meu laptop.

Vamos adicionar esse cálculo:

async function calculateWorkHours() {
    try {
        const commits = await getCommitLog();

        if (commits.length === 0) {
            console.log('Nenhum commit encontrado neste repositório.');
            return;
        }

        let totalWorkTime = 0;
        let currentCommit = commits[0];
        const maxInterval = 3 * (60 * 60 * 1000); // 3 horas em milissegundos

        for (let i = 1; i < commits.length; i++) {
            const nextCommit = commits[i];
            const currentCommitTime = new Date(currentCommit.date).getTime();
            const nextCommitTime = new Date(nextCommit.date).getTime();

            if ((currentCommitTime - nextCommitTime) > maxInterval) {
                totalWorkTime += currentCommitTime - new Date(commits[i - 1].date).getTime();
                currentCommit = nextCommit;
            }
        }

        totalWorkTime += new Date(currentCommit.date).getTime() - new Date(commits[commits.length - 1].date).getTime();
        const totalWorkHours = totalWorkTime / (1000 * 60 * 60);

        const firstCommitTime = new Date(commits[commits.length - 1].date).getTime();
        const lastCommitTime = new Date(commits[0].date).getTime();
        const totalDays = (lastCommitTime - firstCommitTime) / (1000 * 60 * 60 * 24);

        const averageHoursPerDay = totalWorkHours / totalDays;

        console.log(`Total de horas de trabalho: ${totalWorkHours.toFixed(2)} horas`);
        console.log(`Média de horas por dia: ${averageHoursPerDay.toFixed(2)} horas`);
    } catch (error) {
        console.error('Erro ao calcular as horas de trabalho:', error);
    }
}

calculateWorkHours();

Vamos colocar em prática

Depois de rodar esse script no meu último projeto pessoal, que talvez eu escreva um post sobre em breve, recebi o seguinte resultado:

$ node scripts/calculateWorkHours.js 
Total de horas de trabalho: 98.77 horas
Média de horas por dia: 3.74 horas

PERA AI, WHAT?? 98,77 horas? Isso é quase 100 horas gastas em um projeto pessoal em um mês. E 3,74 horas por dia? Quero dizer, eu sabia que estava gastando muito tempo nos meus projetos pessoais, mas ver esses números foi realmente um choque.

Se as pessoas me perguntarem, eu digo que sou uma pessoa bastante ativa, afinal faço saltos ornamentais 3 vezes por semana, totalizando 4 horas por semana, além das sessões de academia, que somam cerca de 6 horas por semana. Então, sim, um total de 10 horas por semana, ou 1,42 horas por dia, nem perto das 3,74 horas por dia que estou gastando nos meus projetos pessoais. Punk!

decepcionado mas não surpreso
decepcionado mas não surpreso

Coisas a se considerar

Embora este script seja bem simples, há algumas coisas a se considerar:

  • Pressuposições sobre pausas: Ele assume que qualquer período superior a 3 horas entre commits é uma pausa. Isso pode nem sempre ser verdade, mas é uma aproximação boa o suficiente.
  • Hábitos de commit: Se você é alguém que se esquece de fazer commits frequentemente, a precisão do script cai consideravelmente.
  • Diferenças de fuso horário: Commits feitos em fusos horários diferentes podem atrapalhar os cálculos.
  • Descobrir quanto tempo você realmente está desperdiçando: Esse ponto é um pouco subjetivo, eu acho, mas no meu caso, mermão, eu não estava pronto para esse número.

Conclusão

Escrever este script foi tanto esclarecedor quanto horripilante. Agora tenho provas concretas do absurdo número de horas que gasto em meus projetos pessoais. Se você for curioso (ou louco) o suficiente para ”bisectar” seus hábitos de programação, pode ser um exercício bastante “divertido”.

E lembre-se, embora acompanhar sua produtividade seja ótimo, às vezes a ignorância é uma bênção. Porque, depois de ver minhas horas totais, só queria me encolher e zerar alguns dos jogos do meu backlog para compensar todo esse tempo livre perdido.

Bom, e é isso, pessoal, espero que vocês tenham gostado deste post e vejo vocês no próximo!

Tags:


Publicar um comentário

Comentários

Nenhum comentário.