Senior vs Staff: What Companies Expect
π Concept
Senior React Native Engineer (IC3βIC4 / L5βL6) is expected to independently own large features end-to-end, make sound architectural decisions within a team, mentor junior/mid engineers, and ship production-quality code at scale without handholding.
Staff React Native Engineer (IC5 / L6βL7) transcends a single team. You're expected to:
- Set technical direction across multiple teams or an entire mobile platform
- Define architectural standards that scale across 10+ engineers
- Influence without authority β drive alignment between iOS, Android, backend, and design
- Anticipate problems 6β12 months ahead and build systems to prevent them
- Reduce organizational complexity through platform abstractions, shared libraries, and tooling
Key differentiators at top companies (Meta, Airbnb, Coinbase, Shopify):
| Dimension | Senior | Staff |
|---|---|---|
| Scope | Single team, 1β2 features | Cross-team, platform-level |
| Architecture | Follows/adapts patterns | Defines/evolves patterns |
| Code Review | Reviews PRs for correctness | Reviews for architectural alignment |
| Decision Making | Makes decisions within team | Makes decisions that affect the org |
| Mentoring | Helps individuals | Elevates entire team's bar |
| Tech Debt | Identifies and fixes | Creates strategies to prevent |
| Communication | Team standups, sprint demos | Architecture reviews, RFCs, tech talks |
| Impact | Feature delivery | Platform capability, developer velocity |
What gets you promoted from Senior to Staff:
- You solve problems nobody asked you to solve β but everyone needed
- Your abstractions and patterns are adopted by teams you've never spoken to
- Engineers across the org cite your RFCs, code, or documentation
- You reduce the total complexity of the system, not just your part
- Leadership trusts you to make irreversible technical decisions
π» Code Example
1// Senior-level: Owns a well-structured feature module2// Staff-level: Creates the abstraction that makes all feature modules consistent34// ---- SENIOR: Clean, well-architected feature module ----5// features/checkout/CheckoutScreen.tsx6import { useCheckout } from './hooks/useCheckout';7import { CheckoutForm } from './components/CheckoutForm';8import { OrderSummary } from './components/OrderSummary';9import { useAnalytics } from '@/shared/analytics';1011export const CheckoutScreen: React.FC = () => {12 const { state, actions } = useCheckout();13 const analytics = useAnalytics();1415 useEffect(() => {16 analytics.trackScreen('checkout', { itemCount: state.items.length });17 }, []);1819 return (20 <ScreenContainer loading={state.isProcessing} error={state.error}>21 <OrderSummary items={state.items} total={state.total} />22 <CheckoutForm23 onSubmit={actions.processPayment}24 onError={actions.handlePaymentError}25 />26 </ScreenContainer>27 );28};2930// ---- STAFF: Creates the platform abstraction used by ALL features ----31// platform/feature-module/createFeatureModule.ts32interface FeatureModuleConfig<TState, TActions> {33 name: string;34 initialState: TState;35 actions: (setState: SetState<TState>, getState: () => TState) => TActions;36 analytics?: AnalyticsConfig;37 errorBoundary?: ErrorBoundaryConfig;38 featureFlag?: string;39 lazyLoad?: boolean;40}4142export function createFeatureModule<TState, TActions>(43 config: FeatureModuleConfig<TState, TActions>44) {45 // Automatic analytics integration46 // Automatic error boundary wrapping47 // Automatic feature flag gating48 // Automatic lazy loading with skeleton49 // Automatic performance monitoring50 // Standardized state management pattern5152 return {53 Screen: withFeatureShell(config),54 useFeature: createFeatureHook(config),55 navigator: createFeatureNavigator(config),56 // Every feature gets these for free β consistent patterns across 50+ features57 };58}5960// Usage by any team β they get analytics, error handling,61// feature flags, and perf monitoring WITHOUT thinking about it62const CheckoutModule = createFeatureModule({63 name: 'checkout',64 initialState: { items: [], total: 0 },65 actions: (set, get) => ({66 processPayment: async () => { /* ... */ },67 }),68 analytics: { screenName: 'checkout' },69 featureFlag: 'new_checkout_flow',70 lazyLoad: true,71});
ποΈ Practice Exercise
Self-Assessment Exercises:
- List 3 architectural decisions you've made that impacted engineers outside your immediate team
- Write a 1-page RFC for migrating a shared component library to a monorepo β include trade-offs, rollout plan, and success metrics
- Identify a recurring pattern in your codebase that could be abstracted into a reusable platform primitive
- Draft a "technical vision" document for your mobile platform covering the next 12 months
- Write a post-mortem for a production incident β include root cause, timeline, action items, and systemic prevention
- Create a decision matrix for choosing between 3 state management approaches for a new project
- Identify 3 pieces of tech debt in your current project and propose a prioritized remediation plan with business justification
β οΈ Common Mistakes
Thinking Staff is just 'better coding' β it's about organizational impact, not personal output
Focusing on feature delivery instead of platform capability β Staff engineers build systems that make features easier to ship
Not writing RFCs or documentation β if your decisions aren't documented, they can't scale beyond your immediate influence
Avoiding cross-team alignment conversations β the discomfort of alignment meetings is exactly where Staff-level impact happens
Confusing 'being the smartest person' with leadership β Staff engineers make everyone around them more effective
πΌ Interview Questions
π€ Mock Interview
Mock interview is powered by AI for Senior vs Staff: What Companies Expect. Login to unlock this feature.