PMs: co-owning the problem, not just the feature
I treat PMs as partners in defining the problem, not feature requesters. We align on the "why," the constraints, and the sequencing before I push pixels.
Example – ReportCaster: there was no roadmap and no real documentation. I worked with my PM to inventory the legacy behavior, decide what to retire vs. carry forward, and phase the redesign into something we could realistically ship instead of one risky "big bang."
Engineering: constraints as a design input
I bring engineers in early so constraints become a design input, not a late-stage blocker. We talk openly about what's trivial, what's expensive, and what's just not worth it.
Example – ReportCaster & IQ Plugin: I walked engineers through ideal flows and then negotiated trade-offs — keeping high-impact interactions, dropping the "two-week button" that wasn't worth the cost. That's how we stayed ambitious without being unrealistic.
Support & QA: protecting the edge cases
In legacy products, support and QA see where users actually suffer. I treat them as primary inputs, not afterthoughts.
Example – ReportCaster: we had almost no formal UX history, but support had years of tickets and patterns. I sat with them to understand where users were getting stuck and which workarounds they relied on. Those pain points shaped the new flows, defaults, and test scenarios QA could validate.
SMEs & Data Scientists: translating complexity
With SMEs, my job is translation. I learn their world deeply, then design a version of it that non-experts can use without feeling lost or stupid.
Example – ML Functions / Predict Data: I spent time with our principal data scientist learning how model training truly worked. Together we reshaped it into a guided, step-based workflow that analysts could follow, while still respecting all the underlying ML complexity.