Files
unchecked-io/docs/marketing-business.md
2025-11-21 17:51:00 -07:00

6.2 KiB

UncheckedIO: Business Strategy & Technical Roadmap

Date: 2025-11-21 Status: Strategic Planning Core Philosophy: "The Configured Opinion" — We trade flexibility for raw, unchecked speed.


1. Target Audience & Value Propositions

We are not selling "a faster Pandas." We are selling infrastructure efficiency.

Primary Target: Data Platform & MLOps Engineers

  • Who they are: The people managing Kubernetes clusters, Airflow DAGs, and AWS Fargate costs. They care about stability and resource usage.
  • The Pitch: "A Zero-Copy Transport Layer for Postgres."
  • Key Selling Points:
    • Cut Compute Costs: Reduces CPU starvation by saturating network bandwidth. 10x faster serialization means 10x less time paying for vCPUs.
    • Memory Safety: Written in Rust, ensuring no segfaults in your Python pipeline despite the speed.
    • Predictable Throughput: Unlike generic drivers that choke on large datasets, UncheckedIO uses partitioned streaming to maintain constant memory usage regardless of data size.

Secondary Target: High-Frequency Trading (HFT) / Quant Developers

  • Who they are: Developers who need to backtest models on massive tick-data history stored in Postgres.
  • The Pitch: "The fastest way to get data from Disk to Arrow Memory."
  • Key Selling Points:
    • Zero-Copy to Polars: Output directly to Apache Arrow memory layouts, ready for immediate analysis or SIMD vectorization.
    • Bypass the overhead: Skips the "Safety Checks" (schema validation) that cost milliseconds per query. You promise the data is clean; we promise to load it instantly.

Tertiary Target: Data Scientists (The Users, Not Buyers)

  • Who they are: End users writing Jupyter Notebooks.
  • The Pitch: "Stop waiting for read_sql."
  • Key Selling Points:
    • Installation Simplicity: pip install unchecked_io. No complex C dependencies or drivers to configure.
    • Drop-in Speed: Replace a 5-minute load time with a 30-second load time.

2. Optimization Strategy: The "Win" Plan

We need to stop fighting "theoretical" bottlenecks and fix the "physical" ones.

🔴 Focus On (High ROI)

  1. Infrastructure-Aware Tuning (The "Blast Radius"):
    • Why: The "astronomical" delay was caused by thrashing.
    • Action: Implement the num_cpus detection to auto-scale the connection pool and partition count. Do not let the user guess wrong.
  2. Memory Management (The "String Killer"):
    • Why: 15M heap allocations for strings creates allocator contention.
    • Action: Refactor the parser to use a reusable buffer or "Zero-Copy" string slicing from the raw stream before writing to Arrow.
  3. Database Interaction (The Index):
    • Why: As discovered, a missing index turns a parallel fetch into a DDoS attack.
    • Action: Documentation MUST strictly warn users: "If you use blast_radius, you MUST index your partition column."

🛑 Leave Alone (Diminishing Returns)

  1. Complex "Safe Mode" Logic:
    • Why: We are UncheckedIO. If we add too many safety checks/fallbacks for dirty data, we become just another slow connector (like ConnectorX).
    • Strategy: Let it fail fast. If the data violates the config schema, panic. That is the contract.
  2. Micro-Optimizing the TCP Handshake:
    • Why: Connection pooling already solves 95% of this. Saving another 1ms here is irrelevant compared to the 500ms of Query Planning time.

3. Configuration Matrix

To be a "System-Level" tool, we need to expose the knobs that Platform Engineers expect.

Currently Configurable (The "MVP" Set)

These features are already present in the code or config.yaml:

  1. connection_string: Standard Postgres URI.
  2. query: The exact COPY ... TO STDOUT (FORMAT binary) command. Allows total control over the SQL execution plan.
  3. schema: Explicit definition of Arrow Types (Int64, Utf8, etc.). Skips runtime type inference.
  4. blast_radius (Argument): Controls the row-count per partition. Passed from Python to Rust.

Must-Add Configurations (To Delight Consumers)

These options solve specific "Enterprise" pain points:

  1. worker_threads:
    • Value: Allows limiting the library to use only 4 cores on a shared 64-core server.
    • Implementation: Pass to tokio::runtime::Builder::worker_threads().
  2. pool_size:
    • Value: Overrides the auto-detected defaults. Essential for databases with strict connection limits (e.g., AWS RDS limits).
    • Implementation: Pass to deadpool_postgres::Pool::builder().max_size().
  3. batch_size (Arrow):
    • Value: Controls the size of the Arrow RecordBatches. Critical for streaming data into ML models (e.g., "Give me 10k rows at a time").
    • Implementation: Currently aggregated at the end; needs to be exposed in the streaming loop.
  4. danger_mode (Explicit Toggle):
    • Value: A flag to strictly enforce "Panic on Error" vs. "Try to Recover."
    • Implementation: As described in Sprint 4.

4. The "Reputation Builder" Roadmap (Future Optimizations)

These features serve two purposes: Extreme performance for the 1% of users who need it, and "Street Cred" for the author.

  1. io_uring Network Layer:
    • The Tech: Replace tokio-postgres (epoll) with a custom io_uring implementation for Linux.
    • The Flex: "True Asynchronous syscall batching." Reduces context switches during massive data transfers.
    • Status: High effort, high reputation, low immediate business ROI (unless on 100Gbps networks).
  2. SIMD Parser (AVX-512 / NEON):
    • The Tech: Use std::simd or portable-simd to parse 16 integers at once from the binary stream.
    • The Flex: "Saturating the memory bandwidth of modern CPUs."
  3. Custom Allocator Support (mimalloc / jemalloc):
    • The Tech: Allow users to swap the global allocator via a feature flag.
    • The Flex: "Optimized for high-fragmentation environments." (Note: mimalloc is already configured for non-MSVC targets).
  4. Kernel-Bypass Networking (DPDK):
    • The Tech: Bypassing the OS network stack entirely.
    • The Flex: The absolute theoretical limit of data transfer. (Overkill, but legendary).