Pains
204 pains collected
RSC introduces client confusion, development complexity, and latency concerns
6React Server Components (RSC) create confusion about client-server boundaries, increase development complexity, and introduce latency. Simple applications feel overengineered due to RSC requirements, creating a steep learning curve and performance concerns with cold starts on serverless platforms.
Third-Party Font CDNs Introduce Request Chain Latency
5Web fonts from third-party CDNs require multiple round-trip requests (DNS lookup, CSS request, font file request), adding significant latency even on fast networks and degrading FCP.
Kubernetes hasn't improved cost, security, and architectural refactoring
5More than 25% of developers report Kubernetes has made cost management worse, 13% cite worsened security posture, and 15% report hindered architectural refactoring. Kubernetes provides scalability and HA benefits but creates new problems in these critical domains.
Forgetting to narrow union types leads to type errors
5Developers frequently forget to implement type guards or narrowing for union types, resulting in runtime errors when accessing type-specific properties or methods. This requires checking the actual type before using type-specific operations.
Opaque cost metrics and unpredictable platform expenses
5Vercel's usage dashboard shows metrics like 'Fluid Active CPU' and 'ISR Writes' without clear documentation on how they impact costs or how to optimize them. Developers pay subscription fees but lack visibility into what drives spending, making budgeting impossible.
Unexpected Cookie Behavior in Next.js Server Components
5The cookies() API allows type-checked usage like cookies().set() anywhere, but fails at runtime in certain contexts. This unexpected behavior differs from traditional request object access and creates developer footguns.
GitHub Actions lacks early validation of workflow syntax and job dependencies
5Workflow syntax errors and broken `needs` clauses are only discovered after pushing code. Linters exist but are imperfect. Developers cannot validate workflows locally before commit, forcing a push-and-wait debugging cycle.
Most developers stuck on older Python versions despite major performance gains
583% of developers run Python versions 1+ years old despite containerization making upgrades trivial. Missing out on 11-42% performance improvements (3.11→3.13/3.10→3.13) and 10-30% memory reductions without code changes.
Project complexity balloons quickly with scripting-style codebases
5Python scripts written without discipline grow unwieldy and difficult to maintain. Historic cross-implementation compatibility breaks regularly, causing pain. Refactoring becomes risky without strong static analysis.
Memory leaks and inefficient memory management
5Despite Python's automatic memory management, developers encounter memory leaks and inefficient memory usage patterns. The lack of explicit control over memory allocation/deallocation makes it difficult to identify and fix memory-related performance issues without specialized profiling tools.
Python 2 to Python 3 compatibility issues persist
5Despite Python 2's end-of-life, many libraries and frameworks still don't fully support Python 3, creating compatibility issues when trying to migrate legacy codebases or integrate multiple dependencies with different version requirements.
Docker incompatibility with certain Python frameworks
5Some Python libraries and frameworks (notably PySpark) cannot be easily used with Docker, forcing developers to choose between containerization approaches or framework selection, limiting deployment flexibility.
Overwhelming library choices and ecosystem overload
5The Python ecosystem has so many libraries and modules that developers struggle to determine which library best fits their project. Evaluation requires considering documentation, community support, maturity, and stability across numerous options.
Unpleasant code editor environment crushing productivity
5Working with code editors or tools that developers don't enjoy significantly crushes productivity, zapping energy levels and motivation. The editor is the most important daily tool for developers, and poor editor experience has outsized impact.
Debugging complexity in large and dynamic codebases
5Python's dynamic nature makes debugging difficult and time-consuming, especially in large codebases. Cryptic error messages and the need to trace through dynamically-typed code makes it hard to identify root causes of bugs without strong debugging tools.
Heavy dependency on C for computationally intensive tasks
5Python has a significant dependency on C implementations for heavy computational tasks, creating a gap between Python's ease-of-use and the complexity of leveraging performance-critical operations.
Difficult workflow re-run and testing experience
5GitHub Actions provides no simple way to re-run workflows against the tip of a branch, making it difficult to handle transient failures and test workflow changes. Developers must work around this limitation by adding additional triggers, which is unintuitive and slows development velocity.
Confusing Docker syntax and layer management complexity
5Docker, docker-compose, and Dockerfile syntax is confusing with numerous edge cases. Image sizes grow to problematic sizes unless carefully constructed, and Docker enforces restrictions on multi-line RUN commands that lack clear documentation on resolution.
Lack of Docker experts in developer community
5There is a substantial lack of Docker experts in the Stack Overflow community and broader developer ecosystem compared to other areas such as web development, making it difficult for developers to find help and solutions.
TypeScript does not support importing .ts file extensions
5TypeScript does not allow developers to import modules with explicit .ts extensions, unlike standard ECMAScript/JavaScript practices. This forces module resolution traversal which is particularly slow over networks, and contradicts TypeScript's own design where the team knows .ts files must be transpiled to .js anyway.
Error handling complexity with thrown exceptions as control flow
5Using thrown errors as stand-ins for expected error handling makes types non-exhaustive and unclear about what can go wrong. Try-catch blocks are scattered throughout implementations and not all thrown errors are caught correctly, leading to hard-to-follow error management patterns.
Developer skill gaps and longer hiring cycles for TypeScript expertise
5Not all JavaScript developers are comfortable with static typing, causing companies to face longer and more expensive hiring cycles when seeking developers proficient in both Node.js and TypeScript. This skill gap increases recruitment friction during team growth.
Low GitHub issue resolution rate masks framework debt
5Only 29% of Next.js GitHub issues get resolved; 52% of discussed issues remain unresolved. Many developers solve problems independently without creating tickets, making it impossible to measure framework debt accumulation. This visibility gap prevents data-driven planning and cost estimation.
GitHub Actions steep learning curve and complexity for new users
5GitHub Actions feels overwhelming for new users due to the range of features, options, and complexity of setting up workflows. The platform's learning curve is especially steep for those new to version control or CI/CD concepts.