Where ideas percolate and thoughts brew

Feedback Is Overrated

About This Sketch

A visualization of signal versus noise in the feedback process. One clear central waveform represents your internal judgment, while multiple scattered, noisy waveforms represent conflicting feedback from various sources. The sketch demonstrates how your own signal remains coherent even when surrounded by well-intentioned but contradictory input.

Algorithm

This sketch visualizes the signal-to-noise problem in feedback culture. A single clean waveform (your true judgment) runs through the center, while multiple noisy, contradictory waveforms (feedback from various sources) oscillate around it at different frequencies and amplitudes. The central signal remains coherent and traceable despite the surrounding noise. The scattered feedback signals are individually less distinct and often work at cross-purposes, creating visual confusion that mirrors the cognitive burden of processing too many opinions. This sketch accompanies the blog post "Feedback Is Overrated" and explores how constant external input can obscure rather than clarify your own sense of direction.

Pseudocode

SETUP:
  Create central signal (your judgment) with consistent frequency
  Create 8 noisy feedback signals at random positions
  Each noisy signal has randomized frequency, amplitude, opacity

DRAW (every frame):
  Get current theme colors
  Clear background

  For each noisy signal:
    Update vertical position (oscillate with unique frequency)
    Draw scattered waveform with noise variations

  For central signal:
    Update position (smooth, consistent oscillation)
    Draw clean, strong waveform across canvas
    Highlight center point

  Add background noise particles (visual static)
  Display labels

RESULT:
  Central signal remains visible and traceable
  Noisy signals create confusion but don't dominate
  Visual metaphor for finding clarity amid competing input

Source Code

let sketch = function(p) {
    let centerSignal;
    let noisySignals = [];
    let time = 0;

    class Signal {
        constructor(x, y, isCenter) {
            this.x = x;
            this.y = y;
            this.isCenter = isCenter;
            this.phase = p.random(p.TWO_PI);
            this.frequency = isCenter ? 0.03 : p.random(0.05, 0.15);
            this.amplitude = isCenter ? 30 : p.random(10, 25);
            this.baseY = y;
            this.opacity = isCenter ? 255 : p.random(60, 120);
        }

        update() {
            // Oscillate vertically
            this.y = this.baseY + p.sin(time * this.frequency + this.phase) * this.amplitude;
        }

        display(colors) {
            if (this.isCenter) {
                // The true signal - clean and strong
                p.strokeWeight(3);
                p.stroke(...colors.accent2, this.opacity);
                p.noFill();

                p.beginShape();
                for (let x = 0; x < 400; x += 4) {
                    let y = 150 + p.sin((x + time * 2) * 0.03) * 30;
                    p.vertex(x, y);
                }
                p.endShape();

                // Highlight at center
                p.fill(...colors.accent2, 100);
                p.noStroke();
                p.circle(200, this.y, 12);
            } else {
                // Noise masquerading as signal - thin and scattered
                p.strokeWeight(1.5);
                p.stroke(...colors.accent3, this.opacity);
                p.noFill();

                let startX = this.x - 80;
                let endX = this.x + 80;
                p.beginShape();
                for (let x = startX; x < endX; x += 3) {
                    let variation = p.noise(x * 0.02, time * 0.01, this.phase) * 20 - 10;
                    let y = this.y + variation;
                    p.vertex(x, y);
                }
                p.endShape();
            }
        }
    }

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

        // The true signal at center
        centerSignal = new Signal(200, 150, true);

        // Many noisy "feedback" signals
        for (let i = 0; i < 8; i++) {
            let x = p.random(40, 360);
            let y = p.random(60, 240);
            noisySignals.push(new Signal(x, y, false));
        }
    };

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

        time += 1;

        // Draw all noisy signals first (background)
        for (let signal of noisySignals) {
            signal.update();
            signal.display(colors);
        }

        // Draw the true signal on top
        centerSignal.update();
        centerSignal.display(colors);

        // Add visual noise in background
        p.noStroke();
        for (let i = 0; i < 50; i++) {
            let x = p.random(400);
            let y = p.random(300);
            let size = p.random(1, 3);
            p.fill(...colors.accent3, p.random(10, 40));
            p.circle(x, y, size);
        }

        // Labels
        p.fill(...colors.accent3, 180);
        p.textAlign(p.CENTER);
        p.textSize(11);
        p.text('Signal vs. Noise', 200, 20);

        p.textSize(9);
        p.fill(...colors.accent2, 150);
        p.text('(Your judgment is in there somewhere)', 200, 285);

        // Legend
        p.textAlign(p.LEFT);
        p.textSize(9);
        p.fill(...colors.accent2, 200);
        p.text('True signal', 15, 25);
        p.fill(...colors.accent3, 150);
        p.text('Noisy feedback', 15, 40);
    };
};