AM Ameet Madan
  • Projects
  • Skills
  • Courses
  • Lessons
  • Tools
  • Freebies
  • Impact

Lessons

Short notes on working better, learning faster, and staying effective over time.

  • Embrace Continuous Learning →

    The tech world evolves fast. Keeping up with trends, frameworks, and languages is key to staying relevant.

  • The library our auth system depended on was archived on GitHub two years ago. We found out during a compliance audit. →

    Dependency health should be checked on a schedule, especially for anything security-sensitive. Nothing tells you a library went quiet.

  • Our on-call engineer muted the pager after 200 false alarms that month. Alarm 201 was the real outage. →

    An alert should mean exactly one thing. A human needs to act right now. Everything else belongs in a dashboard or digest.

  • I used to leave 15 comments on every pull request. Half were about semicolons. My team started dreading my reviews. →

    Automate style and formatting completely so human review time is reserved exclusively for logic, edge cases, and intent.

  • I've read a hundred 'add login' PRs from side projects. They all break the same way. →

    Auth isn't a login form, it's an identity and session lifecycle. Reset tokens, session invalidation, and rate limits included.

  • Our dashboard got slower the longer someone left it open. We assumed it was their laptop. It was every event listener we never cleaned up. →

    Every listener, subscription, or interval needs a matching teardown tied to the same lifecycle event that created it.

  • Our CPU was at 12%. Our database was idle. Every request still hung for 30 seconds. We weren't out of resources. We were out of connections. →

    Monitor connection pool checkout time and utilization as first-class metrics. CPU and DB load can look fine while the pool is starved.

  • Our error rate dropped to zero overnight. We hadn't fixed anything. We'd added a try/catch that swallowed every failure. →

    Never catch an exception without deciding what happens to that information. A quiet catch block deletes the only signal something is broken.

  • I explained event-driven architecture to our CEO using a food delivery app. It landed faster than my last three whiteboard diagrams combined. →

    Start with a system the listener already understands intuitively, introduce the benefit before the terminology, and only name the pattern last.

  • A feature flag stayed in the codebase two years after the feature fully shipped. Cleaning it up caused the outage. →

    Give every feature flag an owner and an expiry date at creation, or it becomes permanent untested config.

  • We added an index to fix one slow query. Every write got 3x slower for a year before anyone connected the two. →

    Before adding an index, check the table's read/write ratio and measure write latency, not just the query you were trying to fix.

  • We shipped an API key in our frontend bundle. It took nine months for someone to notice, and abuse it. →

    The security boundary is "does this ever reach the browser," not "is it in an env file." Client-reachable code needs scoped, revocable keys or a backend proxy.

  • We asked AI to write a database migration. It passed every test. It would have silently dropped six months of customer data. →

    AI tools are confident about the code they can see and blind to what they can't. Grep the whole org for a column name before merging a migration, not just the service being changed.

  • I restructured our backend's folders exactly once. Three years and 20 engineers later, I still haven't touched it again. →

    Organize by domain/feature first and technical layer second. A folder should map to an owner, not a technical concern.

  • Two engineers argued for twenty minutes about a variable name. The unhandled null case three lines down shipped anyway. →

    Review against whether a bug fails loudly, whether someone else can safely change it later, and whether it's easy to reason about, not naming taste.

  • A user signed up with an emoji in their name. Nothing broke for eight months. Then our export job started crashing every night at 3am. →

    Use full UTF-8 end to end and test with emoji and non-ASCII strings as normal QA. Bad encoding can sit silently for months before it surfaces.

AM Ameet Madan

Building software, sharing lessons, and documenting tools that compound over time.

© 2026 Ameet Madan

Explore

  • Projects
  • Skills
  • Courses
  • Lessons

Resources

  • Tools
  • Freebies
  • Testimonials
  • Impact

Connect

  • Resume
  • Blog
  • External links