Pains
2403 pains collected
Over-optimization assumptions in schema design
5GraphQL forces developers to think about every possible query variation upfront and design schemas accordingly. Generated GraphQL APIs that auto-expose storage models violate information hiding, force business logic onto API consumers, and are hard to evolve due to tight coupling.
Unnecessary abstractions and over-engineering
5C# developers create overly generic or abstract code anticipating future requirements, leading to unmaintainable solutions. This introduces state ownership issues, implicit workflows, and feature creep that obstructs rather than assists code clarity and testability.
Duplicate authentication code required across all protected endpoints
5Dependency injection requires repeating authentication and authorization logic on every endpoint. Supporting multiple authentication schemes requires duplicated code with complex error handling.
Request validation error messages are not customizable
5FastAPI uses Pydantic for validation, but there is no straightforward way to pass custom validation messages from the validation point to the API response, forcing developers to use whatever generic messages Pydantic provides.
Upfront permission grants required for all features in v1 endpoint
5With Azure AD v1, developers must define all permissions their app will ever need upfront, and users must accept all required permissions during initial consent. This creates friction for multi-tenant applications with optional features (e.g., calendar integration), as users must grant access to capabilities they may never use.
Flexbox learning curve and retention
5Developers find Flexbox challenging to learn and struggle to retain the details without daily practice. The mental model requires repeated exposure to solidify understanding.
AI-powered development tools produce low-quality code
5While most Go developers use AI tools for learning and coding tasks, satisfaction is middling. 53% report that tools create non-functional code, and 30% complain that even working code is poor quality. AI struggles with complex features.
MSAL lacks fine-grained access control and authorization
5MSAL focuses primarily on authentication and token issuance but does not fully address access control issues or implement role-based and feature-level access control within applications. Developers must build custom authorization logic.
MSAL unsuitable for decentralized microservices architectures
5MSAL is not well-suited for complex microservices environments with decentralized identity requirements. Its centralized authentication approach doesn't map well to distributed systems where each service manages its own identity.
Free GitHub Actions hosted runners are significantly slower than local infrastructure
5Free GitHub-hosted runners perform 4-5x slower than comparable local hardware (e.g., i7-13700H mini-PC). This forces teams running Jenkins locally to accept longer build times (30 min to 40 min) even after parallelization, impacting developer velocity.
Grid layout complexity and configuration is difficult to master
5Even after extensive use, developers struggle with complex grid configurations. Grid is powerful but unintuitive, requiring significant learning and trial-and-error to use effectively.
IT team dependency limits competitive agility
5SaaS companies face rising dependence on IT teams to utilize cloud computing and stay competitive, but IT bandwidth is limited and expanding the team is costly. This creates a bottleneck for process automation and efficiency improvements.
Conditional Access and claims challenge handling requires manual implementation
5Developers must manually implement retry policies and claims challenge handling for Conditional Access scenarios in MSAL. Silent token acquisition can fail with claims challenges that require interactive re-acquisition, and HTTP errors (429, 500-600) need custom retry logic.
BaseHTTPMiddleware has poor performance compared to pure ASGI
5Using BaseHTTPMiddleware instead of pure ASGI middleware degrades performance. Developers should implement pure ASGI middleware for better throughput and responsiveness.
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.
Steep learning curve for async programming and type hints
5FastAPI's specific syntax and reliance on asynchronous programming, standard Python type hints, and Pydantic increases the learning curve significantly for developers unfamiliar with these concepts, potentially slowing onboarding and adoption.
Duplicate validation between request parsing and response models adds overhead
5When using type hints or `response_model`, FastAPI performs double validation—once during request parsing and again during response model creation. This adds 20-50% overhead to response processing and should be avoided by returning raw data instead.
Complex stack traces and debugging difficulties in error logs
5Java stack traces with long 'caused by' chains are difficult to parse, especially when log files contain tens of thousands of lines. Root causes can be unrelated to the thrown error, making debugging time-consuming and requiring deep analysis.
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.
Code organization becomes unwieldy as projects scale
5FastAPI tends to centralize everything in the main.py file, causing crowding and maintenance issues. Teams need to manually create dedicated files for exception handlers and router inclusion to maintain code organization.
Limited infrastructure control in PaaS offerings
5Azure's platform-as-a-service model means Microsoft manages infrastructure including servers, storage, and networking. This limits developers who need control to optimize performance or meet specific security requirements.
TCP Expensive Checksum Computation Bottleneck
5TCP uses per-packet checksums for end-to-end reliability despite modern network hardware already providing per-packet CRCs, creating redundant and expensive checksum computation that becomes a bottleneck in packet processing, especially on LAN where the extra reliability is unnecessary.
NGINX streaming capabilities are inadequate
5NGINX has poor support for streaming use cases and lacks robust streaming solutions compared to alternatives.
Suboptimal load balancing strategy selection in microservices
5Nginx offers multiple load-balancing strategies (round-robin, least connections) but they may not be optimal for specific use cases. Round-robin ignores current server load while least connections doesn't account for request complexity, making the best strategy choice challenging.