Where ideas percolate and thoughts brew

The Consistency Myth

About This Sketch

Visualizing burst work vs consistent work Top half: consistent daily work (regular small blocks) Bottom half: burst work pattern (intense periods separated by rest)

This sketch accompanies the blog post "The Consistency Myth" and visualizes its core concepts through generative art.

Algorithm

Visualizing burst work vs consistent work Top half: consistent daily work (regular small blocks) Bottom half: burst work pattern (intense periods separated by rest) This sketch was originally created as a visual companion to the blog post "The Consistency Myth" and explores its themes through generative art.

Pseudocode

SETUP:
  Initialize canvas (400x300)
  Set up drawing parameters

DRAW (every frame):
  Get current theme colors
  Clear background
  Draw generative visualization
  Update animation state

Source Code

let sketch = function(p) {

    // Visualizing burst work vs consistent work
    // Top half: consistent daily work (regular small blocks)
    // Bottom half: burst work pattern (intense periods separated by rest)

    let time = 0;
    let consistentBlocks = [];
    let burstPhases = [];
    let burstIntensity = 0;
    let burstCycle = 0;

    class ConsistentBlock {
        constructor(index) {
            this.x = 20 + (index % 15) * 24;
            this.baseY = 60;
            this.width = 20;
            this.height = 30;
            this.index = index;
            this.delay = index * 3; // Stagger the animation
        }

        display(colors) {
            // Each block appears at its scheduled time
            let age = time - this.delay;
            if (age < 0) return;

            let alpha = p.min(age * 10, 150);
            p.fill(...colors.accent3, alpha);
            p.noStroke();

            // All blocks are the same size - representing consistent moderate effort
            p.rect(this.x, this.baseY, this.width, this.height, 2);
        }
    }

    class BurstPhase {
        constructor(startTime, duration, intensity) {
            this.startTime = startTime;
            this.duration = duration;
            this.intensity = intensity;
            this.baseY = 180;
        }

        display(colors) {
            let elapsed = time - this.startTime;
            if (elapsed < 0 || elapsed > this.duration) return;

            // During burst: tall intense bars
            // Height varies with intensity and position in burst
            let progress = elapsed / this.duration;
            let middleBoost = p.sin(progress * p.PI) * 0.3 + 1; // Peak in middle

            // Create multiple bars during the burst period
            for (let i = 0; i < this.duration / 10; i++) {
                let barTime = i * 10;
                if (elapsed >= barTime) {
                    let x = 20 + i * 24;
                    let heightMultiplier = this.intensity * middleBoost;
                    let barHeight = 40 + heightMultiplier * 30;

                    // Color intensity varies with work intensity
                    let colorMix = p.map(heightMultiplier, 1, 2, 0, 1);
                    let r = p.lerp(colors.accent1[0], colors.accent2[0], colorMix);
                    let g = p.lerp(colors.accent1[1], colors.accent2[1], colorMix);
                    let b = p.lerp(colors.accent1[2], colors.accent2[2], colorMix);

                    let alpha = p.min((elapsed - barTime) * 20, 220);
                    p.fill(r, g, b, alpha);
                    p.noStroke();
                    p.rect(x, this.baseY - barHeight + 40, 20, barHeight, 2);

                    // Add glow for intensity
                    if (heightMultiplier > 1.3) {
                        p.fill(r, g, b, alpha * 0.3);
                        p.rect(x - 2, this.baseY - barHeight + 38, 24, barHeight + 4, 3);
                    }
                }
            }
        }
    }

    p.setup = function() {
        p.createCanvas(400, 300);
        p.colorMode(p.RGB);

        // Create consistent daily blocks
        for (let i = 0; i < 60; i++) {
            consistentBlocks.push(new ConsistentBlock(i));
        }

        // Create burst phases with rest periods between
        // Burst 1: medium intensity
        burstPhases.push(new BurstPhase(20, 60, 1.2));
        // Rest period: 60 frames
        // Burst 2: high intensity
        burstPhases.push(new BurstPhase(140, 80, 1.6));
        // Rest period: 40 frames
        // Burst 3: medium intensity
        burstPhases.push(new BurstPhase(260, 50, 1.3));
    };

    p.draw = function() {
        const colors = getThemeColors();
        p.background(...colors.bg);

        // Section divider
        p.stroke(...colors.accent3, 80);
        p.strokeWeight(1);
        p.line(0, 145, 400, 145);

        // Labels
        p.noStroke();
        p.fill(...colors.accent3, 200);
        p.textAlign(p.LEFT, p.TOP);
        p.textSize(11);
        p.text("Consistent Daily Work", 10, 15);
        p.text("Burst Work Pattern", 10, 160);

        // Descriptions
        p.textSize(8);
        p.fill(...colors.accent3, 150);
        p.text("Same effort every day, moderate results", 10, 32);
        p.text("Intense sprints + rest periods, breakthrough results", 10, 177);

        // Work output counter (simplified)
        p.textAlign(p.RIGHT, p.BOTTOM);
        p.textSize(9);

        // Count visible blocks for each pattern
        let consistentOutput = consistentBlocks.filter(b => time - b.delay > 0).length;
        let burstOutput = 0;
        for (let burst of burstPhases) {
            let elapsed = time - burst.startTime;
            if (elapsed > 0 && elapsed < burst.duration) {
                burstOutput += p.floor(elapsed / 10) * burst.intensity;
            } else if (elapsed >= burst.duration) {
                burstOutput += p.floor(burst.duration / 10) * burst.intensity;
            }
        }

        p.fill(...colors.accent3, 180);
        p.text("Units: " + consistentOutput, 390, 135);
        p.text("Impact: " + p.floor(burstOutput * 10), 390, 290);

        // Bottom note
        p.textAlign(p.CENTER, p.BOTTOM);
        p.textSize(8);
        p.fill(...colors.accent3, 130);
        p.text("Optimize for output, not consistency", 200, 290);

        // Display consistent blocks
        for (let block of consistentBlocks) {
            block.display(colors);
        }

        // Display burst phases
        for (let burst of burstPhases) {
            burst.display(colors);
        }

        time++;

        // Loop animation
        if (time > 400) {
            time = 0;
        }
    };
};