Skip to main content

How Senior Engineers Communicate, Collaborate, and Lead

The gap between a mid-level and senior engineer is rarely technical. It is almost always communication. Senior engineers ship outcomes, not just code, and outcomes require aligning people, resolving ambiguity, and making decisions stick. This guide covers the exact communication skills that separate engineers who get promoted from those who plateau.
Why this matters: Google’s Project Aristotle found that psychological safety, dependability, and clarity of communication were the top predictors of high-performing teams, not individual technical brilliance. Your ability to communicate is a technical skill.

1. Engineering Communication

Writing is a senior engineer’s highest-leverage tool. A well-written design doc prevents weeks of wasted work. A clear status update prevents unnecessary meetings. A direct Slack message unblocks a teammate in minutes instead of hours.
A design doc is not documentation. It is a decision-making tool. Its purpose is to surface disagreements early, align stakeholders before code is written, and create a record of why decisions were made.
1

State the Problem Clearly

One to three sentences. If you cannot articulate the problem crisply, you do not understand it well enough to propose a solution. Bad: “We need to improve the payment system.” Good: “Payment processing fails for 3.2% of international transactions because our provider does not support 3DS2 authentication, costing us ~$140K/month in lost revenue.”
2

Provide Context and Constraints

What has been tried before? What are the non-negotiable constraints (budget, timeline, compliance, existing contracts)? Who are the stakeholders? What is the scope boundary, what is explicitly not being solved?
3

Present Options (Minimum 2-3)

For each option: how it works, pros, cons, estimated effort, risks. Include the “do nothing” option with its cost. Never present a single solution; it looks like you have not thought it through.
4

Make a Clear Recommendation

State which option you recommend and why. Tie it back to the constraints and goals. “I recommend Option B because it addresses the 3DS2 requirement within our Q2 timeline and reuses our existing Stripe integration.”
5

Call Out Risks and Open Questions

What could go wrong? What do you not know yet? What needs input from others? This is where trust is built. Engineers who hide risks lose credibility. Engineers who surface risks early earn it.
Senior move: End your RFC with a “Decision Deadline” and a list of required reviewers. Without this, design docs rot in limbo. “Please provide feedback by Friday March 14. If no blocking concerns are raised, we will proceed with Option B on Monday.”
Use this skeleton for any technical proposal, whether it is a two-page doc or a five-minute pitch:1. Problem — What is broken, missing, or suboptimal? Quantify impact. 2. Context — Why now? What changed? What constraints exist? 3. Options — At least two viable paths with tradeoffs. 4. Recommendation — Your pick and why. 5. Risks — What can go wrong, and your mitigation plan. 6. Ask — What do you need from the audience? Approval? Feedback? Resources?Example (60-second pitch):
“Our API response times have degraded 40% over six months because we are doing N+1 queries on the orders endpoint. I evaluated three approaches: query optimization, adding a caching layer, and denormalizing the schema. I recommend the caching layer because it gives us the biggest improvement with the least risk to existing queries, and we can ship it in one sprint. The risk is cache invalidation complexity, which I plan to handle with event-driven invalidation using our existing Kafka setup. I need two days of review time from the data team to validate the invalidation strategy.”
That is a complete proposal in 80 words.
The #1 rule: Lead with the ask. Engineers scan; they do not read essays.Bad Slack message:
“Hey, so I was looking at the deployment pipeline and noticed something weird with the staging environment. I checked the logs and it seems like the config might be off. I think maybe the last PR changed something? Not sure though. Anyway, could someone take a look when they get a chance?”
Good Slack message:
“@infrastructure-team — Staging deploys are failing since yesterday’s config PR (#2847). Error: REDIS_URL not found in env. Can someone from infra confirm if the env vars were updated for the new Redis cluster? Blocking: QA cannot test the payments feature (due Thursday).”
1

Lead with the ask or the conclusion

What do you need? Put it in the first sentence.
2

Provide just enough context

What, when, and why it matters. Link to logs, PRs, or dashboards.
3

State the impact and urgency

Who is blocked? What is the deadline? Is this P0 or P3?
4

Tag the right people

Do not broadcast to a 200-person channel if you know who can help.
The “Hey” trap: Do not send “Hey, are you free?” and wait for a reply. This is synchronous communication disguised as async. Send your full question. Let the other person respond when they can with full context.
Most status updates are useless. “Worked on the auth feature” tells the reader nothing. Senior engineers write updates that answer three questions:1. What shipped? (Not what you worked on. What is done.) 2. What is blocked? (And what you need to unblock it.) 3. What is next? (And any risks to the plan.)Bad update:
“This week: worked on authentication. Had some meetings. Also looked at some bugs.”
Good update:
Shipped: OAuth2 PKCE flow for mobile clients — merged and deployed to staging. Integration tests passing. Blocked: Cannot deploy to production until the security team completes the token storage review (ETA unknown — escalating Monday if no response). Next week: Session management API. Risk: the spec from product is incomplete on refresh token TTL. Meeting scheduled Wednesday to resolve.”
Pro pattern: Use the same format every week. Consistency builds trust. Your manager should be able to skim your updates in 30 seconds and know exactly where things stand.
Strong Answer (STAR+R format):Situation: Our team was about to migrate from PostgreSQL to DynamoDB for a high-traffic service. The proposal had verbal buy-in from leadership.Task: I had concerns about the migration’s impact on our reporting pipeline, which relied heavily on relational joins.Approach: Instead of raising a vague objection in a meeting, I wrote a one-page analysis showing five specific reporting queries that would break, the estimated cost of rewriting them ($180K in eng time), and an alternative approach using read replicas that solved the original scaling problem at 20% of the cost.Result: The team pivoted to read replicas. We shipped in three weeks instead of the estimated three months. The CTO cited the doc as an example of “engineering due diligence” in the next all-hands.Reflection: I learned that a well-structured written argument is more persuasive than any amount of verbal pushback in a meeting. Writing forces clarity.

2. Speaking in Meetings

Meetings are where decisions happen. Engineers who stay silent get their priorities decided for them. Engineers who ramble get tuned out. The goal is to speak concisely, at the right moment, with the right framing for your audience.
The Layer Cake method: Start with what they care about (business impact), then peel into technical detail only as far as the audience needs.
1

Start with the business outcome

“This will reduce checkout failures by 30%, which translates to roughly $50K/month in recovered revenue.”
2

Explain the 'what' in plain language

“We are replacing the way we process payments so it works with international banks that require extra verification steps.”
3

Address risks in terms they understand

“The main risk is a two-hour maintenance window during off-peak hours. If something goes wrong, we roll back instantly with zero data loss.”
4

Go technical only if asked

Have the details ready but do not volunteer them. If the VP of Product asks “how does the rollback work?”, then explain blue-green deployment. Do not start there.
Phrases that bridge technical and business:
  • “The technical constraint here is X, which means for the business…”
  • “We have two options. Option A is faster but riskier. Option B takes two extra weeks but has a safer rollout.”
  • “Think of it like [analogy]. The database is like a filing cabinet that is full. We can get a bigger cabinet (vertical scaling) or add more cabinets (horizontal scaling).”
Never say: “You wouldn’t understand the technical details.” This is condescending and destroys trust. If you cannot explain it simply, you do not understand it well enough.
Disagreement is a feature, not a bug. The best engineering teams surface disagreements early and resolve them with data.Framework for constructive disagreement:1. Acknowledge the other perspective first.
“I see why that approach is appealing, especially the simplicity of implementation.”
2. Introduce your concern with evidence.
“My concern is that it may not scale past 10K concurrent users. When we tried a similar approach on the notification service last year, we hit connection pool exhaustion at 8K users.”
3. Propose an alternative or a way to validate.
“Could we run a load test with realistic traffic before committing? That would give us concrete data either way.”
Phrases that work:
  • “I see it differently because…” (not “That’s wrong”)
  • “Have we considered the case where…” (not “You forgot about…”)
  • “What would change your mind on this?” (genuinely curious, not rhetorical)
  • “I want to make sure we’re not overlooking…” (collaborative framing)
Phrases that escalate conflict:
  • “That will never work.” (absolute, no evidence)
  • “We already tried that.” (dismissive, no context)
  • “I don’t think you understand the problem.” (personal attack)
A design review is not a presentation. It is a structured conversation to find flaws before they become bugs.
1

Send the doc 24-48 hours before the meeting

Attendees must read it beforehand. If they did not, reschedule. “Reading the doc together” is a waste of everyone’s time.
2

Start with a 2-minute summary, not a walkthrough

“Here is the problem, here is my proposed approach, and here are the three areas where I most want your input.”
3

Direct the discussion to risk areas

“I am least confident about the caching invalidation strategy on page 3. Can we start there?”
4

Assign a note-taker

Decisions made in design reviews evaporate without written records. Capture decisions, action items, and open questions.
5

End with clear next steps

“Based on feedback, I will revise the caching approach and post an updated doc by Wednesday. @Sarah will validate the schema changes with the data team. We reconvene Thursday only if there are blocking concerns.”
Senior move: As the presenter, explicitly invite criticism. “What am I missing?” and “Where would this break?” signal confidence and earn better feedback than a defensive presentation.
The best engineers ask better questions, not just give better answers. There are three types:Clarifying questions — Remove ambiguity.
  • “When you say ‘real-time’, do you mean sub-100ms or eventual consistency within a few seconds?”
  • “Are we optimizing for latency or throughput here?”
Probing questions — Stress-test assumptions.
  • “What happens if the message queue goes down? Do we lose data or queue it locally?”
  • “How does this behave at 10x current traffic?”
  • “What is the failure mode if the third-party API is unavailable for 30 minutes?”
Leading questions (use sparingly and honestly) — Guide toward a realization.
  • “Have we looked at how the payments team solved a similar problem?”
  • “What would this design look like if we had to support multi-region?”
Interview tip: In system design interviews, the quality of your questions at the start determines the quality of your design. Interviewers are evaluating whether you clarify requirements before jumping to solutions. Spend the first 5 minutes asking clarifying questions.
Strong Answer:Situation: Our team was building a monolithic REST API for a new product. I believed we should use an event-driven architecture because the product had heavy async workflows (notifications, data sync, audit logging).Task: Three of five engineers preferred the REST approach because it was familiar.Approach: I did not argue in meetings. Instead, I built a small prototype over a weekend showing both approaches handling the notification workflow. The REST version required seven synchronous API calls and took 2.3 seconds. The event-driven version used two events and completed in 180ms. I presented the prototype in our design review with the numbers.Result: The team unanimously chose the event-driven approach. We shipped the product on time, and the architecture has scaled to 50x initial traffic without redesign.Reflection: Data beats opinions. When you have a strong technical conviction, invest the time to prove it rather than arguing about it.

3. Code Review Communication

Code review is the most frequent form of written communication between engineers. It is also where the most damage is done to team culture through careless words. Great code reviewers make their teammates better. Poor code reviewers make their teammates dread opening PRs.
Every piece of feedback should be specific, actionable, and kind.Bad feedback:
“This is confusing.”
Good feedback:
“This function handles three responsibilities (validation, transformation, persistence). Could we split it into three functions? That would make each one independently testable and easier to understand. Something like validateOrder(), transformForDB(), and persistOrder().”
The feedback formula:1. What you observed (specific) — “This function is 80 lines with nested conditionals.” 2. Why it matters (impact) — “This makes it hard to test edge cases and increases the chance of regression.” 3. What you suggest (actionable) — “Consider extracting the validation logic into a separate function.” 4. How strongly you feel (calibration) — “Nit:”, “Suggestion:”, “Blocking:” prefixes.
Praise the good stuff too. Code review is not just about finding problems. “Great use of the strategy pattern here, this will make adding new payment providers trivial” reinforces good practices and makes critical feedback easier to receive.
Rule #1: Assume good intent. The reviewer wants your code to be better, not to attack you personally.
1

Read the full review before responding

Do not react to individual comments in isolation. Understand the overall feedback first.
2

Ask clarifying questions for anything unclear

“Can you say more about what you mean by ‘too coupled’? I want to make sure I address the right concern.” This is better than guessing and making the wrong change.
3

Separate ego from code

Your code is not you. “This function could be clearer” is not “You are a bad engineer.” Treat feedback as a gift from someone who took time to read your work carefully.
4

Explain your reasoning, then decide together

If you disagree: “I went with this approach because of X constraint. Do you think that changes your suggestion, or is there a way to get both?” This opens dialogue instead of shutting it down.
5

Thank the reviewer

Especially for thorough reviews. A simple “Great catch, fixed” or “Thanks for the detailed review, learned something new about connection pooling” goes a long way.
Blocking comments prevent merging. Use them only for:
  • Bugs or correctness issues
  • Security vulnerabilities
  • Performance problems that will impact production
  • Missing tests for critical paths
  • Violations of architectural decisions the team has agreed on
Nit comments are suggestions and style preferences. Prefix them clearly:
  • “Nit: I’d name this userCount instead of cnt, but up to you.”
  • “Suggestion: A map might read better than a for-loop here, but either works.”
  • “Optional: We could use destructuring here for readability.”
The rule of thumb: If the code works correctly, is not a security risk, is not a performance problem, and is reasonably readable, approve it. Do not block a PR over naming conventions or personal style preferences.
Anti-pattern: Death by a thousand nits. If a reviewer leaves 30 nit comments, it feels the same as getting 5 blocking comments. Batch your nits into one summary comment: “A few style nits below, none blocking. Approve after addressing the one blocking comment about error handling.” This preserves the author’s morale and keeps the PR moving.
Written words lack tone. What you mean as a neutral observation, the reader might interpret as criticism.Ambiguous (reader fills in tone, often negatively):
“Why did you do it this way?”
Clear (intent is explicit):
“Curious about the choice to use recursion here — was there a reason you preferred it over iteration? I want to understand in case I’m missing something.”
Strategies:
  • Use “I” language: “I found this confusing” vs “This is confusing” (the first is a data point; the second is a judgment).
  • State your intent: “Genuine question:” or “Not blocking, just curious:” removes ambiguity.
  • Avoid rhetorical questions: “Shouldn’t this be a constant?” reads as passive-aggressive. Say “This value appears in three places. Could we extract it to a constant to avoid drift?”
  • When in doubt, add an emoji or explicit tone marker: “This might be over-engineered for the current requirements (not a criticism, just want to check if we’re building for known future needs or speculating).”
Strong Answer:“I treat code reviews as a learning and teaching opportunity, not a gatekeeping exercise. My approach:As a reviewer: I read the PR description first to understand the intent, then review the tests before the implementation. Tests tell me what the author expects the code to do. I categorize my feedback explicitly — blocking, suggestion, or nit — so the author knows what must change versus what is a preference. I always try to leave at least one positive comment per review.As an author: I write detailed PR descriptions with context on why, not just what. I self-review my own diff before requesting review, which catches 30-40% of issues. When I get feedback I disagree with, I explain my reasoning and propose a discussion rather than just pushing back.On culture: I believe the fastest way to improve a team’s code quality is through code review culture, not linters or rules. When people feel safe getting feedback, they take bigger, better risks in their code.”

4. Conflict Resolution

Technical teams that avoid conflict produce mediocre software. Teams that resolve conflict well produce exceptional software. The difference is not whether disagreements happen, but how they are handled.
“Disagree and commit” means: voice your disagreement fully during the decision process, and once the team decides, execute the chosen path as if it were your own idea.What it IS:
  • “I think Option A is better for these reasons [evidence]. But if the team decides on Option B, I will build it to the best of my ability and not undermine it.”
  • Committing means actually committing: no “I told you so” if it fails, no passive resistance, no half-hearted implementation.
What it is NOT:
  • Silently going along with something you think is wrong (that is “agree and resent”)
  • Agreeing in the meeting and complaining in Slack afterward
  • Doing a bad job on purpose to prove you were right
1

State your position clearly with evidence

“I believe we should use GraphQL instead of REST because we have 12 frontend consumers with different data needs, and REST would require us to maintain multiple endpoints or over-fetch.”
2

Listen to the counterarguments genuinely

Maybe the team has context you lack. Maybe the REST approach is simpler to operate and the team is already stretched thin on ops.
3

If the decision goes against you, commit explicitly

“I still think GraphQL is the better long-term choice, but I understand the operational concerns. I am fully committed to making the REST approach work well. Let me take the lead on designing the endpoint structure.”
4

Set a review point

“Can we revisit this decision in six months once we see how the REST approach scales to more consumers?”
When NOT to commit: If the decision involves ethical violations, security risks that are being ignored, or something that will cause irreversible harm, escalate rather than commit. “Disagree and commit” applies to engineering tradeoffs, not to cutting corners on safety.
Step 1: Separate identity from idea. Your idea being rejected is not a personal failure. It might mean your idea was wrong, your communication was unclear, or the timing was bad.Step 2: Seek to understand the pushback. Ask: “Help me understand your concern. Is it about the approach itself, the timing, the effort, or something else?” Most pushback has a valid root cause. Find it.Step 3: Look for the compromise. Often, pushback means “not that exact thing” not “nothing like that.” Can you scope it down? Phase it? Prototype it?Step 4: Know when to persist and when to let go.
  • Persist when you have data, the risk is real, and the pushback is based on inertia or politics.
  • Let go when the pushback is based on constraints you did not consider, the cost-benefit does not justify fighting, or you have been heard and the decision-makers have all the information.
Example:
“I proposed migrating to Kubernetes and got pushback from the ops team. Instead of pushing harder, I asked what their concerns were. They were worried about the learning curve and the timeline. So I proposed a compromise: we would containerize one non-critical service as a pilot, I would run a two-day workshop for the ops team, and we would evaluate after a month. The pilot succeeded, and the team voted to migrate the rest.”
“Organizational politics” is often just “understanding how decisions are made and who makes them.” You do not have to play games. You do have to be strategically aware.Practical strategies:1. Build relationships before you need them. Have coffee chats with engineers on other teams. Understand their priorities and pain points. When you eventually need their help or buy-in, you have a relationship, not a cold request.2. Understand incentives. Your proposal to refactor the auth service is a priority for your team. But the platform team is measured on uptime this quarter. Frame your request in terms of their goals: “This refactor eliminates the auth service as a single point of failure, which directly improves your uptime metrics.”3. Give credit generously. “This builds on the caching pattern that @Maria’s team established” costs you nothing and builds allies. People support initiatives that acknowledge their contributions.4. Document decisions and rationale. Politics thrive in ambiguity. When decisions are documented with clear reasoning, it is harder for them to be revisited for political reasons.5. Pick your battles. Not every hill is worth dying on. Save your political capital for the decisions that truly matter for the product and the team.
Escalation is not tattling. It is a professional tool for resolving disagreements that are stuck at the current level.Escalate when:
  • You and a peer have fundamentally different views and have exhausted direct discussion
  • A decision is being delayed and the delay itself is causing damage
  • You have identified a risk that is being ignored and you have evidence
  • You need a tiebreaker and neither side has authority to decide
How to escalate well:1. Notify the other party first. “I think we need to bring Sarah into this conversation because we have been going back and forth for two weeks and the project is at risk. I want to do this transparently.”2. Present both sides fairly. When you talk to the escalation point (your manager, their manager, a tech lead), present the other person’s argument charitably. “Alex believes we should use Kafka because of its durability guarantees, and that is a valid concern. I believe RabbitMQ is sufficient for our throughput needs and significantly simpler to operate. Here are the tradeoffs…”3. Ask for a decision, not validation. “We need a decision on this by Friday. Can you help us get to one?” Not “Can you tell Alex he is wrong?”
Never surprise-escalate. Going to someone’s manager without telling them first destroys trust and creates an adversary. Always give the other person a chance to resolve it directly first, and always tell them before you escalate.
Strong Answer:Situation: I was working on a real-time analytics pipeline. My colleague wanted to use Apache Flink for stream processing. I believed Kafka Streams was a better fit because our team already operated Kafka and had no Flink expertise.Task: We needed to align on a technology choice within a week because the project deadline was fixed.Approach: Instead of debating in meetings, I suggested we each spend two days building a proof of concept for the same use case: processing 50K events per second with exactly-once semantics. We agreed on evaluation criteria upfront: operational complexity, performance, and time-to-production.Result: Flink performed 15% better on raw throughput, but Kafka Streams was production-ready in half the time and required no new infrastructure. We chose Kafka Streams. My colleague was satisfied because the decision was data-driven and the evaluation criteria were fair.Reflection: The key was moving from opinions to evidence, and agreeing on the criteria before building the prototypes. When both sides feel the process was fair, the losing side can commit fully.

5. Interview Communication

Technical interviews test your communication as much as your coding. An interviewer who cannot follow your thought process will assume you do not have one.
The standard STAR method (Situation, Task, Action, Result) is good. For engineering interviews, add Approach (your technical reasoning) and Reflection (what you learned). This becomes STAR+R or STAAR:S — Situation (2-3 sentences): Set the scene. Company, team size, what the product did, what was happening.
“At a fintech startup with 15 engineers, we were processing $2M/day in transactions through a monolithic Rails app that was hitting scaling limits.”
T — Task (1-2 sentences): What was your specific responsibility?
“I was tasked with designing and leading the migration to a microservices architecture for the payment processing pipeline.”
A — Approach (this is where engineers shine): What did you do and why? What alternatives did you consider? What tradeoffs did you make?
“I evaluated three approaches: strangler fig pattern, big-bang rewrite, and branch-by-abstraction. I chose strangler fig because it let us migrate incrementally without freezing feature development. I started with the highest-risk component — the payment validation service — because it was the bottleneck and would prove the architecture fastest.”
R — Result (quantify): What was the measurable outcome?
“We migrated the payment pipeline in four months with zero downtime. Processing latency dropped from 800ms to 120ms. The system handled Black Friday traffic (5x normal) without intervention.”
R — Reflection (the senior differentiator): What did you learn? What would you do differently?
“If I did it again, I would invest more upfront in distributed tracing. We spent two weeks debugging a race condition that would have been obvious with proper observability. I now treat observability as a day-one requirement for any distributed system.”
Calibration: A complete STAAR answer should take 2-3 minutes. Under 90 seconds and you are not giving enough detail. Over 4 minutes and you are losing the interviewer. Practice with a timer.
The Layered Explanation method:
1

Start with a one-sentence analogy (the 5-year-old test)

“A load balancer is like a host at a restaurant who seats people at different tables so no single waiter gets overwhelmed.”
2

Add the technical 'what' (the colleague test)

“It distributes incoming network traffic across multiple servers using algorithms like round-robin or least-connections to prevent any single server from becoming a bottleneck.”
3

Add nuance and tradeoffs (the expert test)

“At Layer 4, it routes based on IP/port with minimal overhead. At Layer 7, it can inspect HTTP headers for content-based routing but adds latency. We chose L7 because we need path-based routing for our API gateway, and the 2ms overhead is negligible for our use case.”
In an interview, start at Layer 1 and let the interviewer pull you deeper. If they nod and move on, you gave enough detail. If they ask follow-ups, go to the next layer. This shows you can communicate at multiple levels of abstraction.Practice exercise: Take any system you have built and explain it in:
  • 1 sentence (elevator pitch)
  • 1 paragraph (executive summary)
  • 5 minutes (design review)
  • 30 minutes (deep dive)
If you cannot do all four, you do not fully understand the system.
Thinking out loud is not narrating every thought. It is making your reasoning process visible so the interviewer can evaluate how you solve problems, not just whether you get the right answer.What to say out loud:1. Requirements clarification: “Before I start, I want to confirm: are we optimizing for read-heavy or write-heavy workloads? That changes my database choice significantly.”2. Approach selection: “I see two ways to approach this. A brute-force O(n^2) solution that is straightforward, or a hash map approach that gets us O(n). Let me start with the hash map approach since we are optimizing for performance.”3. Tradeoff acknowledgment: “I am choosing a BFS here because we want the shortest path. DFS would use less memory but does not guarantee shortest path in an unweighted graph.”4. When you are stuck: “I am stuck on how to handle the edge case where the input is empty. Let me think about this for a moment… OK, I think the cleanest approach is to handle it as a guard clause at the top of the function.”5. Complexity analysis: “This solution is O(n log n) due to the sort, with O(n) space for the hash map. If we needed to optimize further, we could…”What NOT to do:
  • Read your code out loud line by line (“OK so now I am declaring a variable…”)
  • Go silent for 3+ minutes (the interviewer starts worrying)
  • Narrate uncertainty without direction (“I have no idea… maybe… I don’t know…”)
Saying “I don’t know” is not a failure. Handling it poorly is. Senior engineers do not know everything. They know how to figure things out.The framework:1. Admit it cleanly. “I have not worked with Cassandra’s compaction strategies directly.”2. Share what you DO know. “What I know is that compaction is how Cassandra manages SSTables on disk, and different strategies optimize for different workloads — write-heavy versus read-heavy.”3. Explain how you would find out. “If I needed to make this decision, I would start by benchmarking our specific workload against the default compaction strategy, review the Cassandra docs for strategy options, and look at what companies with similar traffic patterns have done.”4. Draw an analogy if possible. “This reminds me of how we chose between LSM-tree and B-tree storage engines at my last company. The evaluation framework would be similar: understand the read/write ratio, test with production-like data, measure.”
What interviewers are evaluating: Not whether you know the answer, but whether you have a reliable process for dealing with uncertainty. An engineer who says “I don’t know, but here’s how I’d figure it out” is more valuable than one who confidently guesses wrong.
“Why are you leaving your current role?”
Weak: “I’m not growing.” (vague, sounds like complaining) Strong: “I have built the core payment infrastructure from zero to processing $5M/day. The system is stable, the team is trained, and I am looking for the next zero-to-one challenge. Your company’s real-time bidding system is exactly the kind of complex distributed system I want to build next.”
“What is your biggest weakness?”
Weak: “I am a perfectionist.” (cliche, not self-aware) Strong: “I tend to over-engineer solutions. In my last project, I built a generic plugin system when we only needed two integrations. I have learned to ask ‘what do we need in the next six months?’ instead of ‘what might we need someday.’ I now set explicit scope boundaries in my design docs and ask a colleague to review for over-engineering.”
“Tell me about a failure.”
Weak: “We launched late.” (no ownership, no learning) Strong: “I shipped a caching layer without proper invalidation testing. It worked fine for a week, then a race condition caused stale prices to display for 45 minutes during peak traffic. I owned the incident, wrote the postmortem, and implemented three changes: mandatory cache invalidation tests in our test suite, a circuit breaker for stale data detection, and a runbook for cache-related incidents. We have had zero cache incidents since.”
“Where do you see yourself in 5 years?”
Weak: “In management.” (sounds like engineering is a stepping stone) Strong: “I want to be a technical leader who shapes architecture decisions across multiple teams. Whether that is a Staff Engineer or Engineering Manager role depends on where I can have the most impact. Right now, I am focused on deepening my distributed systems expertise and building my ability to mentor other engineers.”
“Do you have questions for us?”
Strong questions to ask:
  • “What does the on-call rotation look like, and how do you handle incident severity?”
  • “Can you walk me through how a feature goes from idea to production here?”
  • “What is the ratio of new feature work to maintenance and tech debt?”
  • “What is the biggest technical challenge your team is facing right now?”
  • “How do you handle disagreements about technical direction?“

6. Building Influence as an Engineer

Influence is not a management skill. It is how senior engineers get things done without authority. You cannot mandate that another team adopt your library, prioritize your request, or follow your architecture. You have to earn it.
Credibility is built through a consistent track record, not a single heroic moment.The credibility formula: Ship + Quality + ReliabilityShip: Deliver working software on a regular cadence. Engineers who talk about great ideas but never ship them have zero credibility. Ship small, ship often, ship things that matter.Quality: Your code works. Your systems do not wake people up at 3am. Your PRs are clean and well-tested. When you say “this is ready,” people believe you because it always is.Reliability: You do what you say you will do. If you commit to a Thursday delivery, it is done Thursday. If it is going to slip, you communicate early, not the night before.Credibility destroyers:
  • Overpromising and underdelivering (even once erodes trust significantly)
  • Having opinions about everything but owning nothing
  • Taking credit for team work
  • Being the “well, actually” person in every conversation
  • Dismissing other people’s work or concerns
The “10% rule”: Spend roughly 10% of your time on high-visibility, cross-team work: fixing a painful bug in a shared library, improving documentation, writing a useful internal tool. This builds credibility outside your immediate team and makes you known as someone who makes things better.
Documentation is the most underrated form of engineering leverage. Every time you answer the same question twice, you should have written a document instead.Documentation as leverage:
Without docsWith docs
You explain the auth flow to every new hire (30 min each, 10 hires/year = 5 hours)You write it once (2 hours), link it in onboarding
Three engineers debug the same deploy issue independentlyOne engineer writes the runbook, everyone fixes it in 5 minutes
Architecture decisions get revisited every quarterADRs (Architecture Decision Records) capture the “why” permanently
High-leverage documents to write:
  1. Onboarding guide for your team — reduces ramp-up from weeks to days
  2. Runbooks for common operational tasks — transforms tribal knowledge into team knowledge
  3. ADRs for major decisions — prevents relitigating settled debates
  4. System architecture overview — the doc you wish existed when you joined
  5. Common debugging playbook — “If you see error X, check Y first”
The compound effect: A document you write today gets read 100+ times over the next year. That is a 50x return on your time investment.
Writing documentation is a senior signal. Junior engineers write code. Senior engineers write code and the docs that let other people understand, operate, and extend that code. If your system cannot run without you, you have not built a system. You have built a dependency on yourself.
The biggest mistake new mentors make is giving answers instead of teaching problem-solving. The goal of mentoring is to make the mentee independent, not dependent on you.The “ask, don’t tell” framework:Instead of: “Use a hash map here.” Try: “What data structure would give us O(1) lookup? What are the tradeoffs?”Instead of: “Your architecture is wrong.” Try: “Walk me through what happens when this service gets 10x traffic. Where does it break first?”Instead of: “Let me just fix this for you.” Try: “What have you tried so far? What happened? What do you think the root cause is?”
1

Ask what they have tried

This respects their effort and gives you context. Often they are closer to the answer than they think.
2

Ask what they think is happening

This builds their diagnostic skills. Even if they are wrong, their reasoning tells you where the gap is.
3

Guide with questions, not answers

“What if we looked at the logs for that specific timestamp?” is more educational than “Check the logs.”
4

Let them struggle productively

There is a difference between stuck-and-learning and stuck-and-frustrated. Intervention should come when they have been stuck for an unreasonable time with no new ideas to try.
5

Debrief after resolution

“Now that it is fixed, what would help you find this faster next time?” This locks in the learning.
The availability trap: Being a good mentor does not mean being available 24/7. Set boundaries. “I am happy to pair on this from 2-3pm” is better than constant interruptions that tank both your productivity and theirs. Teach them to batch questions and attempt solutions before coming to you.
Cross-team collaboration is where most organizational friction lives. Different teams have different priorities, different on-call schedules, and different definitions of “urgent.”Principles for cross-team work:1. Understand their priorities before pushing yours. Before asking the platform team to prioritize your feature, learn what they are working on and why. “I know you are focused on the migration this quarter. My request is related — here is how it fits…” is far more effective than “We need this by Friday.”2. Propose solutions, not just problems. Bad: “Your API is slow and it is blocking us.” Good: “Your /users endpoint is taking 800ms, which pushes our page load to 3s. I looked at it and the N+1 query on line 47 seems to be the cause. I have a PR ready if you want to review it, or I can walk your team through the fix.”3. Create shared artifacts. When working across teams, write everything down. Shared design docs, agreed-upon API contracts, SLAs. Verbal agreements across teams evaporate.4. Build bridges through small acts.
  • Fix a bug in their codebase and send a PR
  • Write documentation for their API that was missing
  • Shout out their work in company channels
  • Invite them to your design reviews when relevant
5. Escalate cleanly when stuck. If cross-team collaboration is blocked, escalate together: “Both teams agree this is important but we cannot align on timeline. Can we get 30 minutes with both managers to prioritize?” This is collaborative escalation, not finger-pointing.
The “ambassador” pattern: For major cross-team projects, designate one person from each team as the liaison. This person attends the other team’s standups, understands their constraints, and translates priorities in both directions. This one practice eliminates more cross-team friction than any process or tool.
Strong Answer:“I influence through three channels: credibility, empathy, and artifacts.Credibility comes from a track record. When I propose a solution, people know I have thought it through because I have a history of delivering on my proposals. I invest time in building small prototypes to prove ideas rather than arguing about them.Empathy means understanding what the other person or team needs. When I wanted our platform team to prioritize a new API endpoint, I did not just submit a ticket. I met with their tech lead, understood they were under pressure to reduce incident rate, and showed how my proposed endpoint would eliminate a fragile workaround that was causing 20% of their on-call pages.Artifacts means writing things down. Design docs, data analyses, prototypes. A written proposal that anyone can read, share, and comment on scales better than having the same conversation ten times. My most successful influence moment was a three-page doc showing that our manual deployment process was costing us 40 engineering hours per month. The doc was shared across five teams, got buy-in from all of them, and became the charter for our CI/CD initiative.The common thread is that I never try to ‘win’ arguments. I try to find the best solution and make it easy for others to see why it is the best solution.”
Strong Answer:Situation: At my previous company, every engineer spent 30-60 minutes per week debugging local development environment issues. Docker configs drifted, environment variables were outdated, and the setup guide was 18 months stale.Task: This was not assigned to me. I recognized it as a high-leverage problem after hearing the same complaints in three consecutive retros.Approach: I spent one week building a make dev-setup command that automated the entire local environment setup: pulled the right Docker images, seeded the database, configured environment variables, and ran a health check. I also wrote a troubleshooting guide for the five most common issues and added a CI check that verified the setup script worked on every PR that touched infrastructure files.Result: New engineer onboarding went from two days of setup to 45 minutes. The weekly “environment is broken” Slack messages dropped to near zero. Three other teams forked the approach for their own repos.Reflection: The biggest impact I have had as an engineer has rarely been in the features I have shipped. It has been in removing friction for other engineers. A tool that saves 20 engineers 30 minutes each week is 500 hours of engineering time recovered per year. That is more valuable than most features I could build.

Quick Reference: Communication Anti-Patterns and Fixes

Anti-PatternWhy It FailsThe Fix
”Just wanted to follow up…”Passive, buries the ask”Action needed: [specific request] by [date]“
Sending a wall of text on SlackNobody reads itLead with the ask, use bullet points, thread details
”That won’t work” in a meetingShuts down discussion, no alternative offered”My concern with that is X. What if we tried Y instead?”
Staying silent when you disagreeBreeds resentment, bad decisions persistSpeak up with evidence, then commit either way
Over-explaining to executivesWastes their time, obscures the decisionBusiness impact first, technical detail on request
”Per my last email…”Passive-aggressive, escalates tensionRe-state the key point directly without the snark
Giving only negative code review feedbackDemoralizes the author, reduces PR quality over timeBalance criticism with genuine praise for good patterns
Asking “Does that make sense?”Puts burden on listener, they will say yes even if confused”What questions do you have?” or “Should I go deeper on any part?”

Real-World Stories: Communication That Changed Outcomes

Great communication is not abstract advice. It shows up in real decisions at real companies. These four stories illustrate how the communication principles above play out at scale, for better and for worse.
In the early 2000s, Amazon meetings looked like meetings everywhere else: a presenter clicked through a slide deck, the audience half-listened, and decisions were made on vibes and whoever spoke loudest. Jeff Bezos noticed a pattern. Slide decks were hiding sloppy thinking. A bullet point like “Improve customer experience” could mean anything. It sounded good in a meeting, but it was not a plan. Nobody was forced to think through the details because the format did not demand it.In 2004, Bezos banned PowerPoint from senior meetings and replaced it with what Amazon calls the “6-page narrative memo.” Before any meeting where a decision is needed, the presenter writes a structured prose document, no bullet points, no slides, just complete sentences and paragraphs that lay out the problem, the data, the options, and the recommendation. The first 20 minutes of every meeting are spent in silence, with everyone reading the memo. Then the discussion begins.The effect was transformative. Writing in full prose forces the author to connect ideas logically. You cannot hide behind a vague bullet point when you have to write a paragraph explaining your reasoning. Reviewers catch gaps in logic because they are reading a coherent argument, not interpreting fragmented slides. And because everyone reads the same document simultaneously, the discussion starts from a shared understanding rather than a shared misunderstanding.The lesson for engineers is direct: the format of your communication shapes the quality of your thinking. A design doc written in full sentences will be clearer than one written in bullet-point shorthand. A proposal that forces you to articulate your reasoning in prose will be stronger than one that lets you gesture at ideas with three-word bullets. If Amazon, one of the most fast-moving companies on earth, decided that slowing down to write was faster than presenting slides, that should tell you something about the leverage of clear writing.
For decades, Linus Torvalds was as famous for his abrasive communication as for creating Linux and Git. His mailing list replies were legendary: profanity-laced takedowns of code he considered substandard, personal attacks on contributors who made mistakes, and a general tone that treated harsh feedback as a badge of technical rigor. Many in the Linux community defended this style as “brutally honest” and necessary for maintaining the quality of a kernel that runs most of the world’s infrastructure.But the cost was real and mounting. Talented contributors quietly stopped submitting patches. Entire demographics were effectively excluded from the project. In 2018, after a particularly heated exchange and growing public criticism, Torvalds took a temporary leave from kernel development and issued a public apology. “I need to change some of my behavior, and I want to apologize to the people that my personal behavior hurt and possibly drove away from kernel development entirely,” he wrote. He adopted a new Code of Conduct for the project and committed to changing how he communicated.The Linux community learned something that many engineering teams learn the hard way: technical excellence does not require personal cruelty. You can hold a high bar for code quality while treating contributors with basic respect. The engineers who left or never contributed in the first place represented lost innovations that the project will never get back. After the shift, the kernel development community saw an increase in new contributors and a noticeable change in mailing list tone, without any decline in code quality.For engineers leading code reviews, design discussions, or technical debates, the Torvalds story is a cautionary tale and a redemption arc in one. Harsh feedback might feel efficient. It might even be technically correct. But it is never the highest-leverage communication strategy, because it optimizes for the current patch at the cost of future contributions. The best engineering cultures are both rigorous and kind.
Stripe has long been known for an almost obsessive writing culture. Internal documents are expected to be clear, precise, and well-structured. New employees are often surprised by how much time engineers spend writing, not just code, but design docs, API documentation, decision records, and internal guides. Patrick Collison, Stripe’s co-founder, has spoken publicly about writing as a core company competency, not a nice-to-have.This culture was not accidental. Stripe sells developer tools, and developer experience is the product. Their API documentation is widely considered the gold standard in the industry. Developers often cite Stripe’s docs as the reason they chose Stripe over competitors. But the external docs are just the visible tip of an internal culture. Internally, clear writing meant that decisions were made faster because proposals were unambiguous. Engineers could onboard to new codebases faster because the documentation was maintained. Cross-team collaboration was smoother because written artifacts replaced lossy verbal handoffs.The competitive advantage compounded over time. When every engineer writes clearly, the entire organization moves faster. New hires ramp up in days instead of weeks. Architectural decisions are recorded and searchable, so teams stop relitigating the same debates. When an incident happens, the postmortem is genuinely useful because it is written to be understood, not to assign blame.The takeaway is that writing is not overhead. It is infrastructure. An engineering organization where everyone writes well is like a codebase where every function has clear naming and documentation. It reduces the cost of every interaction. Stripe proved that investing in writing culture is not a luxury of well-funded startups but a legitimate competitive moat that pays dividends in velocity, quality, and developer adoption.
This is a composite story based on patterns reported across multiple companies, but the details are realistic. At a mid-sized SaaS company, an engineer was investigating elevated error rates on a payments service during business hours. After some debugging, they posted in the team’s Slack channel: “I’m going to restart the payments service to clear the connection pool.”The message was technically accurate. But it was missing critical context. They meant they would perform a rolling restart in the staging environment to test whether a connection pool reset resolved the issue. A newer team member, also monitoring the error rates, read the message as an instruction, assumed it referred to production, and restarted the production payments service during peak hours. The restart caused a 12-minute outage. Transactions in flight were dropped. The company lost an estimated $40,000 in failed payments and spent the rest of the day on customer support and incident response.The postmortem did not blame the junior engineer. It identified the root cause as ambiguous communication. The original message failed to specify the environment (staging vs. production), the scope (rolling restart vs. full restart), and the intent (testing a hypothesis vs. executing a remediation). It also failed to state whether the action needed approval or was informational. The team implemented a new communication protocol for operational actions: every message about environment changes must specify the environment name, whether it is a proposal or an action being taken, and whether it needs approval.The lesson is deceptively simple: in async communication, the words you leave out are the words your reader fills in, and they will fill them in wrong. Slack is not a conversation. It is a written record that people read without your tone of voice, your facial expression, or the ability to ask “wait, do you mean production?” in real time. The cost of writing three extra words (“in staging environment”) is approximately two seconds. The cost of not writing them, in this case, was $40,000 and a very bad day.

Analogies Worth Keeping

Good analogies make abstract concepts click. Here are two that are worth internalizing and reusing when you are explaining communication concepts to your team.
“Writing a design doc is like drawing a map before a road trip.” The team might still take detours. They might discover a road is closed and need to reroute. But at least everyone agrees on the destination, the rough route, and what “we’re lost” looks like. A team without a design doc is five people in a car, each with a different idea of where they are going, discovering their disagreement 200 miles in. The map does not prevent all problems. It prevents the most expensive one: building the wrong thing because everyone assumed they were aligned when they were not.
“Code review comments are like post-it notes on a friend’s essay.” When they are specific and kind, “this paragraph is unclear because the subject shifts mid-sentence, consider splitting it,” they make the essay better and the writer better. When they just say “this is wrong” with no explanation, they are useless and demoralizing. And when there are 47 post-it notes on every page, most of them about comma placement, the writer stops reading any of them. The best reviewers leave fewer, higher-signal notes. They focus on structure and logic, not on whether you used a semicolon where they would have used a period.

7. Additional Interview Questions

These questions test the nuanced communication skills that separate senior engineers from everyone else: building consensus under disagreement, translating technical value for business audiences, and handling critical feedback with grace.
What interviewers are really testing: Do you default to authority, consensus, or process? Can you facilitate a decision without alienating either side? Do you understand that “no decision” is often worse than either option?Strong Answer Framework:1. Acknowledge both sides are valid. This is not a warm-up. It is load-bearing. If half the team feels dismissed, you have not made a decision. You have created a faction.
“First, I would make sure both sides feel genuinely heard. If people feel the process was fair, they can commit even to a decision they disagreed with. If they feel railroaded, they will resist even a good decision.”
2. Define the criteria before debating the solutions. This is the senior move. Most teams argue about solutions without agreeing on what “better” means.
“I would step back and ask the team: what are we optimizing for? Is it speed of delivery, long-term maintainability, operational simplicity, or something else? Once we agree on the criteria, the answer often becomes obvious, or at least defensible.”
3. If criteria do not break the tie, use a time-boxed experiment or a designated decision-maker.
“If the team is still split after aligning on criteria, I would propose one of two things. Either we time-box a small prototype, each side builds a proof-of-concept addressing the riskiest assumption, and we evaluate with data. Or, if time pressure does not allow that, I would ask the team to designate a decision-maker, usually the person who will own the implementation, and commit to their call.”
4. End with ‘disagree and commit.’
“Whatever we decide, I would explicitly name it: ‘We are going with Solution A. If you preferred B, I respect that, and I ask that you commit fully to A. We will revisit in [timeframe] if the decision is not working.’ The worst outcome is a team that half-builds both solutions.”
Common mistakes:
  • Saying “I would just pick the best one” without explaining how you evaluate “best”
  • Defaulting to “we’d vote” — majority rule without discussion breeds resentment
  • Avoiding the question by saying “I’d find a compromise” — sometimes there is no middle ground
  • Not addressing what happens to the losing side emotionally
Words that impress: “Disagree and commit,” “evaluation criteria before solutions,” “designated decision-maker,” “reversible vs. irreversible decision”
What interviewers are really testing: Can you translate technical debt into business language? Do you understand that executives allocate resources based on ROI, not technical elegance? Can you build a persuasive argument without jargon?Strong Answer Framework:1. Start with the business problem, not the technical problem.
“I would never lead with ‘we need to migrate from Postgres to DynamoDB.’ The VP does not care about database engines. I would lead with the business pain: ‘We are losing $X per month in failed transactions because our database cannot handle peak load. Customer complaints about slow checkout have increased 40% this quarter. Our biggest enterprise client has flagged performance as a contract renewal risk.’”
2. Quantify the cost of doing nothing.
“Executives understand opportunity cost. I would show them what happens if we do not migrate: projected revenue loss over 6 months, engineering hours spent on firefighting instead of feature work, customer churn risk. ‘We are spending 30% of on-call time patching symptoms of this problem. That is 1.5 engineers worth of capacity we are burning just to stay afloat.’”
3. Present the migration as an investment with a return.
“I would frame the three months not as a delay but as an investment: ‘If we invest three months now, we recover 1.5 engineers of capacity permanently, we unblock the enterprise tier which is worth $2M ARR, and we reduce incident rate by an estimated 60%. The payback period is four months.’”
4. Address the risk and offer a de-risking plan.
“Executives are allergic to risk, so I would preemptively address it: ‘Here is my phased plan. Month one is reversible. If at any point we discover the migration is not delivering expected results, we roll back with zero customer impact. I will provide weekly updates with measurable checkpoints.’”
5. Make the ask explicit.
“I would end with a clear ask: ‘I need your approval to pause feature X for three months. Here is what we defer, here is what we gain, and here is how I will keep you informed.’”
Common mistakes:
  • Leading with technical jargon (“Our connection pool is exhausted and the ORM is generating N+1 queries”)
  • Not quantifying the cost of inaction, making it feel like a tech vanity project
  • Framing it as “the engineers want this” instead of “the business needs this”
  • Not having a phased or reversible plan, making it feel all-or-nothing
Words that impress: “Cost of inaction,” “payback period,” “reversible phases,” “engineering capacity recovery,” “measurable checkpoints”
What interviewers are really testing: Emotional maturity, growth mindset, and self-awareness. Can you separate your ego from your code? Do you turn feedback into improvement or into resentment?Strong Answer Framework:1. Describe the situation honestly, including that it stung.
“Early in my career at [company], I submitted a PR for a caching layer I was proud of. The senior engineer’s review was blunt: ‘This entire approach is wrong. You are caching at the wrong layer and this will cause stale data in production. Please re-read the architecture doc and start over.’ No softening, no suggestions, just a rejection.”
2. Acknowledge your initial reaction without dwelling on it.
“My first reaction was defensiveness. I had spent three days on it. But I took an hour before responding. I have learned that my first emotional reaction to critical feedback is almost never the right one to act on.”
3. Describe what you did with the feedback.
“I re-read the architecture doc as suggested. The senior engineer was right. I was caching API responses at the controller level, but our system had multiple write paths that would bypass the cache, leading to stale data. I rewrote the solution to cache at the data access layer, where all writes were funneled through a single path, making invalidation reliable.”
4. Show what you learned about communication, not just code.
“I also talked to the reviewer afterward. I told them the feedback was correct but that the tone made it hard to receive. They appreciated the direct conversation and started prefixing their reviews with more context. We built a good working relationship after that. I learned two things: how to take harsh feedback without shutting down, and that it is OK to give feedback on how you receive feedback.”
Common mistakes:
  • Claiming you never feel defensive (“I always welcome feedback!” — nobody believes this)
  • Turning the answer into a complaint about the reviewer
  • Not showing what you actually learned technically
  • Missing the chance to talk about how you improved the feedback dynamic
Words that impress: “Separated ego from code,” “waited before responding,” “feedback on the feedback,” “growth mindset,” “the reviewer was right about the substance”

Curated Resources for Going Deeper

The principles in this guide will take you far, but communication is a skill that deepens with continued study. These resources are organized by focus area. Each one was selected because it offers something specific and actionable, not because it is famous.
Google’s Technical Writing Courses (free) — developers.google.com/tech-writing Self-paced courses designed specifically for engineers. Covers clarity, conciseness, active voice, and structuring technical documents. Start with Technical Writing One. It takes about two hours and will immediately improve every design doc, PR description, and email you write.Gergely Orosz on Writing as a Software Engineerblog.pragmaticengineer.com Orosz (author of The Pragmatic Engineer newsletter) writes extensively about how writing skills compound in an engineering career. His pieces on writing design docs, writing for promotion packets, and writing for influence are particularly worth reading. He draws on experience at Uber and Microsoft.Amazon’s “Working Backwards” Memo Culture — Explained in Working Backwards by Colin Bryar and Bill Carr This book details how Amazon replaced PowerPoint with structured narrative memos and why. Chapter 4 on the six-page memo process is the most relevant. Understanding this approach will change how you think about structuring any technical proposal or decision document.
Crucial Conversations: Tools for Talking When Stakes Are High by Kerry Patterson, Joseph Grenny, et al. The core framework: when you notice a conversation becoming emotionally charged, step back and establish “mutual purpose” (we both want the project to succeed) before diving into the disagreement. The book’s concept of “safety” in conversations maps directly to psychological safety in engineering teams. Key takeaway: people do not become defensive because of what you say, but because they no longer feel safe.Nonviolent Communication by Marshall Rosenberg Despite the title, this is not about violence. It is about separating observations from evaluations, expressing needs without blame, and making requests instead of demands. For engineers, the most useful principle is: “When I see [specific observation], I feel [emotion], because I need [underlying need]. Would you be willing to [concrete request]?” This structure defuses almost any interpersonal conflict. It sounds formulaic, but it works because it eliminates the ambiguity that causes defensive reactions.Chelsea Troy’s Blog on Code Review Practiceschelseatroy.com Troy writes some of the most thoughtful content on code review as a communication practice, not just a quality gate. Her posts on reviewing code you do not understand, giving feedback across experience levels, and the power dynamics embedded in code review are required reading for anyone who reviews code regularly.
The Staff Engineer’s Path by Tanya Reilly This is the definitive book on how senior individual contributors communicate, influence, and lead without authority. Chapters on “Building Alignment” and “Communicating with Leadership” are directly applicable to the skills in this guide. If you aspire to Staff+ roles, this book is essential.Lara Hogan’s Blog on Engineering Leadership and Feedbacklarahogan.me Hogan (former VP of Engineering at Kickstarter, author of Resilient Management) writes practically about giving feedback, having difficult conversations, and managing your emotional responses in high-stakes situations. Her “feedback equation” (observation + impact + question) is one of the most useful communication frameworks for engineers. Start with her post on giving feedback.