Pains
726 pains collected
AWS VPC and subnet configuration is confusing and restrictive
5AWS VPC networking topology is confusing, with non-intuitive constraints like subnets being restricted to single availability zones ('one subnet equals one availability zone'). This creates gotchas when designing multi-AZ deployments.
AWS cost optimization tooling is reactive and lagging
5AWS cost management tools (Trusted Advisor, Cost Explorer) provide only historical analysis and recommendations, not proactive guidance. They lag real-time spending and cannot predict whether current costs will match forecasts, making it difficult to catch cost overruns early.
AWS NAT Gateway pricing model is heavy-handed and inconsistent with cloud elasticity promise
5NAT Gateway pricing is inconsistent with cloud elasticity promises—developers are charged for provisioning NAT Gateways even when not using them heavily, creating unexpected cost surprises and misalignment between pay-as-you-go expectations and actual billing.
Fragmented console experience across multiple services
5Deploying an app requires managing resources scattered across different AWS console sections (S3, CloudFront, Route 53, EC2/Fargate/Lambda+API Gateway, RDS/DynamoDB, billing alarms). These services don't integrate well out-of-the-box, forcing context switching and manual coordination.
Gossip protocol introduces higher failover latency than consensus algorithms
5Redis uses a gossip protocol and majority voting for failure detection instead of formal consensus algorithms like Raft or Paxos, reducing implementation complexity but increasing latency during failover operations.
AWS feature rollout is unpredictable and not customer-driven
5AWS does not communicate when services will be ready or whether specific requirements will be supported. Features evolve unpredictably, and if AWS doesn't add needed functionality within required timeframes, developers must compose workaround services.
Difficulty navigating complex foreign key relationships
5Developers struggle to navigate database schemas with many foreign keys, jumping between related tables creates confusion and slows development speed even though foreign keys improve database architecture and performance.
Only receiving first validation error slows debugging cycles
5PostgreSQL validation returns only the first error per record, forcing developers to iterate through multiple correction cycles to resolve all data integrity issues. This extends debugging workflows substantially.
Complex decision-making between specialized PostgreSQL extensions
5Developers must make complex architectural decisions about which PostgreSQL extensions to use. For example, PostGIS for geospatial needs and pgvector for ML/embedding use cases are "killer apps," but selecting and integrating specialized extensions requires significant expertise.
Table Bloat from Lack of Regular VACUUM
5Failing to run VACUUM regularly can lead to bloated tables and degraded performance. Without VACUUM, PostgreSQL cannot reclaim space from deleted rows, accumulating dead tuples that consume disk space and slow down query performance over time.
PostgreSQL configuration and management are overly complex with many non-obvious settings
5PostgreSQL requires extensive tuning across memory management, vacuum, background writer, write-ahead log, and free-space map settings. Configuration files are long with many unnecessary options for typical users. Default logging is unhelpful for new users, and there is no built-in out-of-band monitoring to diagnose startup failures or query issues without manually launching backends.
Difficulty managing missing primary keys at scale
5Managing tables without primary keys presents challenges that scale poorly. No decent solution exists for identifying and managing missing primary keys in large-scale PostgreSQL deployments.
Provider configuration repetition and manual management of duplicated code
5Terraform requires manual, repetitive copy-paste of provider configuration across multiple modules and environments. This duplication increases maintenance burden and introduces errors when updating provider settings.
HCL syntax is awkward and creates steep onboarding curve
5The Terraform configuration language (HCL) is unintuitive compared to standard programming languages. Concepts like conditional logic, looping with for_each, and mapping collections are unnecessarily cumbersome. Few developers have deep Terraform experience, slowing team onboarding.
Cryptic error messages and poor documentation
5Terraform error messages are often baffling, especially with complex modules or provider bugs. Documentation quality varies widely and lacks sufficient detail. Error context is insufficient for troubleshooting, making debugging slow and frustrating.
Terraform feels deceptively simple but hides deep complexity in real-world usage
5Initial Terraform tasks (provisioning a bucket) appear simple, but complexity emerges across backends, providers, variables, modules, environments, workspaces, and dependency management. Understanding what code actually does in production requires deep system knowledge.
Monolithic file structures impede navigation and collaboration
5Cramming numerous resources, data sources, and variables into single .tf files becomes increasingly difficult to navigate, troubleshoot, and collaborate on as infrastructure expands, slowing down team productivity.
Shallow merge() function prevents nested configuration composition
5Terraform's merge() function only performs shallow merging, not deep merging of nested maps and objects. This prevents clean composition of default configurations with user-supplied overrides and makes merging multi-level data structures awkward.
Long-lived branches in Terraform repos violate infrastructure best practices
5Unlike application code, infrastructure can only have one version deployed at a time. Keeping multiple long-lived branches in a Terraform repository is not common practice, limiting collaboration models and creating merge complexity.
WebAssembly support is incomplete
5Go's WebAssembly (WASM) support remains half-baked compared to Rust and TypeScript, which dominate in the WASM development arena.
Insufficient enterprise support for Redis Community Edition
5Redis Community Edition lacks enterprise-level support and advanced features. Organizations struggle to address performance bottlenecks, troubleshoot issues, or receive critical security updates without paid support.
Difficulty identifying trustworthy and reliable third-party modules
526% of developers report difficulty finding trustworthy Go modules. Developers lack reliable quality signals, maintenance indicators, and usage context to evaluate third-party modules.
Cannot extend types from other packages, requires wrapping boilerplate
5Go doesn't allow adding methods to types from different or standard library packages. Instead, developers must create wrapper types, resulting in additional boilerplate and code that is harder to understand and maintain.
Python-centric AI ecosystem documentation makes Go adoption harder
5Most documented paths for getting started with AI-powered applications are Python-centric, causing organizations to start in Python before migrating to Go. This creates friction in the adoption of Go for production AI workloads.