Building AI features taught me that integrating an LLM is often the easiest part of the problem. The real challenge begins once those features interact with actual usage patterns.
I learned that synchronous request-response flows break down quickly when workloads become expensive, unpredictable, or long-running. Treating AI operations as tasks rather than immediate responses led to a more resilient architecture with clearer ownership, retry strategies, and failure handling.
I also gained a deeper appreciation for balancing competing priorities. Keeping sensitive data local improved privacy and reduced external dependencies, while cloud-based workers provided availability and operational flexibility when local execution wasn't practical.
Most importantly, I learned that good system design is rarely about choosing a single "best" technology. It is about understanding constraints, acknowledging trade-offs, and building solutions that fit the realities of how people actually use the product.