惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
V
Visual Studio Blog
Jina AI
Jina AI
博客园 - 司徒正美
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
小众软件
小众软件
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
WordPress大学
WordPress大学
爱范儿
爱范儿
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Pattern Recognition: The Secret Weapon of Top Coders
Timevolt · 2026-05-31 · via DEV Community

Pattern Recognition: The Secret Weapon of Top Coders

Introduction

Staring at a wall of if‑else statements that seem to grow every sprint is a familiar frustration. You know the logic is correct, yet each new requirement forces you to add another branch, making the code harder to test and harder to change. What if there was a way to look at that same mess and instantly see a familiar structure—a state machine, a strategy, a graph traversal—so you could replace the tangle with a clean, reusable solution? Top coders don’t rely on memorizing every algorithm; they train their eyes to spot the underlying patterns that repeat across domains. This article walks through a practical mental framework for pattern recognition, shows a concrete refactor from chaotic conditionals to the Strategy pattern, and then applies the same thinking to a payment‑retry workflow modeled as a state machine. By the end you’ll have a repeatable process you can apply to any codebase, turning instinctive guessing into deliberate design.

A Reusable Mental Framework for Pattern Recognition

Pattern recognition in software is less about recall and more about abstraction. The first step is to strip away incidental details—variable names, specific data types, UI concerns—and focus on the relationship that remains constant. Ask yourself: what does this code do irrespective of how it does it? If you can answer that, you start to see invariants such as “each step depends only on the previous step’s output” or “a set of objects is visited until a condition is met.”

Next, catalog the invariant in a concise statement. For example, a loop that retries an operation until success or a maximum attempt count expresses the invariant “attempt number increments monotonically and termination occurs on success or exhaustion.” Naming the invariant gives you a hook to search your mental library of known patterns.

Finally, match the invariant to a pattern template. Common templates include:

  • State Machine – distinct modes with transitions triggered by events.
  • Strategy – interchangeable algorithms selected at runtime.
  • Observer – objects subscribe to changes and react automatically.
  • Graph Traversal – nodes explored via edges until a goal is found.

When you recognize that a piece of code fits one of these templates, you can replace ad‑hoc logic with the corresponding, well‑understood solution. This three‑step loop—abstract, invariant, match—becomes a mental muscle you can flex whenever you encounter confusing code.

From Tangled Conditionals to Clean Strategy

Consider a service that calculates shipping costs based on destination, package weight, and delivery speed. A naïve implementation might look like this:

def calculate_shipping(destination, weight, speed):
    # destination: str, weight: float (kg), speed: str ("standard","express","overnight")
    if destination == "US":
        if speed == "standard":
            return 5.0 + weight * 0.5
        elif speed == "express":
            return 10.0 + weight * 0.7
        else:  # overnight
            return 20.0 + weight * 1.0
    elif destination == "EU":
        if speed == "standard":
            return 7.0 + weight * 0.6
        elif speed == "express":
            return 12.0 + weight * 0.8
        else:
            return 25.0 + weight * 1.2
    else:  # fallback for other regions
        if speed == "standard":
            return 10.0 + weight * 0.9
        elif speed == "express":
            return 18.0 + weight * 1.1
        else:
            return 35.0 + weight * 1.5

Enter fullscreen mode Exit fullscreen mode

The nesting makes it hard to see that the core algorithm is the same for every region: a base fee plus a per‑kilogram multiplier that varies only by destination and speed. The invariant here is “cost = base + weight * factor.”

Applying the framework:

  1. Abstract – ignore the concrete numbers and focus on the formula shape.
  2. Identify invariant – the calculation always follows base + weight * factor.
  3. Match – this matches the Strategy pattern, where each combination of destination and speed provides a concrete strategy for computing the fee.

We can now extract the strategy interface and concrete implementations:

from abc import ABC, abstractmethod

class ShippingStrategy(ABC):
    @abstractmethod
    def cost_for(self, weight: float) -> float:
        """Return shipping cost for the given weight."""
        pass

class USStandard(ShippingStrategy):
    BASE = 5.0
    FACTOR = 0.5
    def cost_for(self, weight):
        return self.BASE + weight * self.FACTOR

class USExpress(ShippingStrategy):
    BASE = 10.0
    FACTOR = 0.7
    def cost_for(self, weight):
        return self.BASE + weight * self.FACTOR

class USOvernight(ShippingStrategy):
    BASE = 20.0
    FACTOR = 1.0
    def cost_for(self, weight):
        return self.BASE + weight * self.FACTOR

# … similarly for EUStandard, EUExpress, etc.

Enter fullscreen mode Exit fullscreen mode

The client code becomes trivial:

STRATEGY_MAP = {
    ("US", "standard"): USStandard(),
    ("US", "express"): USExpress(),
    ("US", "overnight"): USOvernight(),
    # … fill remaining entries
}

def calculate_shipping(destination, weight, speed):
    strategy = STRATEGY_MAP[(destination, speed)]
    return strategy.cost_for(weight)

Enter fullscreen mode Exit fullscreen mode

Benefits emerge immediately:

  • Adding a new region or speed merely requires a new strategy class and an entry in the map—no deep nesting to modify.
  • Each strategy can be unit‑tested in isolation, verifying the base fee and factor without worrying about other branches.
  • The intent is explicit: the function now reads “pick a strategy and compute cost,” which self‑documents the variability.

This refactor illustrates how recognizing the “base + weight * factor” invariant allowed us to replace a brittle conditional maze with a composable, extensible design.

Applying the Framework Step‑by‑Step: Payment Retry as a State Machine

Imagine a payment processing subsystem that must attempt a charge, wait a back‑off interval on failure, and give up after a configurable number of tries. A first pass might embed the retry logic directly in the service method:

def process_payment(amount, card_token, max_attempts=3):
    attempt = 0
    while attempt < max_attempts:
        try:
            charge = gateway.charge(amount, card_token)
            if charge.succeeded:
                return charge
        except GatewayError as exc:
            # log, maybe notify
            pass
        attempt += 1
        time.sleep(2 ** attempt)  # naive exponential back‑off
    raise PaymentFailed("All attempts exhausted")

Enter fullscreen mode Exit fullscreen mode

While functional, this version mixes control flow (loop, attempt counting, sleeping) with business rules (what constitutes a retryable error, how back‑off is calculated). If the product team later wants to add a “manual review” state after two failures, or to switch to a fixed‑interval back‑off, the loop becomes a tangled mess.

Step 1: Abstract the problem

Ignore the concrete gateway.charge call and focus on what the system does over time: it moves through a series of situations (attempt 0, attempt 1, …, success, failure) and transitions based on outcomes (charge succeeded, charge failed with retryable error, max attempts reached).

Step 2: Identify the invariant

The invariant is “the system’s next action depends solely on its current situation and the result of the last charge attempt.” In other words, the behavior is a function of state and event. This is the hallmark of a finite state machine.

Step 3: Match to a pattern

A state machine consists of:

  • A finite set of states (e.g., START, ATTEMPTING, RETRY_WAIT, SUCCESS, FAILED).
  • Events that trigger transitions (CHARGE_SUCCEEDED, CHARGE_FAILED_RETRYABLE, CHARGE_FAILED_FATAL, BACKOFF_COMPLETE).
  • Actions performed on entry/exit of a state or during a transition (e.g., invoke gateway, schedule a timer, log).

We can now encode the machine explicitly. Below is a Python implementation using a simple transition table; the same idea works in any language.

from enum import Enum, auto
import time

class PaymentState(Enum):
    START = auto()
    ATTEMPTING = auto()
    RETRY_WAIT = auto()
    SUCCESS = auto()
    FAILED = auto()

class PaymentEvent(Enum):
    CHARGE_SUCCEEDED = auto()
    CHARGE_FAILED_RETRYABLE = auto()
    CHARGE_FAILED_FATAL = auto()
    BACKOFF_COMPLETE = auto()

class PaymentProcessor:
    def __init__(self, gateway, max_attempts=3, base_backoff=1):
        self.gateway = gateway
        self.max_attempts = max_attempts
        self.base_backoff = base_backoff
        self.state = PaymentState.START
        self.attempts = 0
        self._transition_table = {
            # (state, event) -> (next_state, action)
            (PaymentState.START, None): (PaymentState.ATTEMPTING, self._start_attempt),
            (PaymentState.ATTEMPTING, PaymentEvent.CHARGE_SUCCEEDED): (PaymentState.SUCCESS, None),
            (PaymentState.ATTEMPTING, PaymentEvent.CHARGE_FAILED_RETRYABLE): (PaymentState.RETRY_WAIT, self._schedule_backoff),
            (PaymentState.ATTEMPTING, PaymentEvent.CHARGE_FAILED_FATAL): (PaymentState.FAILED, None),
            (PaymentState.RETRY_WAIT, PaymentEvent.BACKOFF_COMPLETE): (PaymentState.ATTEMPTING, self._increment_and_try),
        }

    def _start_attempt(self):
        self.attempts += 1
        try:
            charge = self.gateway.charge(self.amount, self.card_token)
            if charge.succeeded:
                self._dispatch(PaymentEvent.CHARGE_SUCCEEDED)
            else:
                # assume gateway returns a flag for retryability
                if charge.retryable:
                    self._dispatch(PaymentEvent.CHARGE_FAILED_RETRYABLE)
                else:
                    self._dispatch(PaymentEvent.CHARGE_FAILED_FATAL)
        except GatewayError as exc:
            # treat exception as retryable unless marked fatal
            self._dispatch(PaymentEvent.CHARGE_FAILED_RETRYABLE if exc.retryable else PaymentEvent.CHARGE_FAILED_FATAL)

    def _schedule_backoff(self):
        delay = self.base_backoff * (2 ** (self.attempts - 1))
        time.sleep(delay)
        self._dispatch(PaymentEvent.BACKOFF_COMPLETE)

    def _increment_and_try(self):
        if self.attempts >= self.max_attempts:
            self._dispatch(None)  # will transition to FAILED via a guard
        else:
            self._start_attempt()

    def _dispatch(self, event):
        # Simple guard for max attempts exceeded
        if self.state == PaymentState.ATTEMPTING and event is None and self.attempts >= self.max_attempts:
            self.state = PaymentState.FAILED
            return
        key = (self.state, event)
        if key not in self._transition_table:
            raise RuntimeError(f'Unhandled transition: {self.state} --{event}--> ?')
        next_state, action = self._transition_table[key]
        if action:
            action()
        self.state = next_state

    def process(self, amount, card_token):
        self.amount = amount
        self.card_token = card_token
        while self.state not in (PaymentState.SUCCESS, PaymentState.FAILED):
            # In a real system you’d drive the loop with an event queue or async callbacks.
            # Here we repeatedly call _dispatch with None to let internal logic advance.
            self._dispatch(None)
        if self.state == PaymentState.FAILED:
            raise PaymentFailed("Payment failed after retries")
        return self._last_charge  # assume stored during attempt

Enter fullscreen mode Exit fullscreen mode

Why this is better:

  • The *