<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: IndieHacker</title>
    <description>The latest articles on Forem by IndieHacker (@devglish).</description>
    <link>https://forem.com/devglish</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3866954%2Fe38025b3-12e2-4f42-994b-4a1d84d00f9a.jpg</url>
      <title>Forem: IndieHacker</title>
      <link>https://forem.com/devglish</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devglish"/>
    <language>en</language>
    <item>
      <title>Running Gemma 4 Locally on an iPhone 13 Pro with Swift</title>
      <dc:creator>IndieHacker</dc:creator>
      <pubDate>Wed, 15 Apr 2026 10:02:46 +0000</pubDate>
      <link>https://forem.com/devglish/running-gemma-4-locally-on-an-iphone-13-pro-with-swift-2c6a</link>
      <guid>https://forem.com/devglish/running-gemma-4-locally-on-an-iphone-13-pro-with-swift-2c6a</guid>
      <description>&lt;p&gt;🚀 Introduction&lt;/p&gt;

&lt;p&gt;Running large language models on mobile devices has always felt out of reach. Most real-world applications rely heavily on cloud APIs due to hardware limitations.&lt;/p&gt;

&lt;p&gt;But what if we could run modern LLMs directly on a phone?&lt;/p&gt;

&lt;p&gt;In this post, I’ll share how I got Gemma 4 running locally on an iPhone 13 Pro, and the open-source Swift wrapper that makes it possible.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/mylovelycodes/LiteRTLM-Swift" rel="noopener noreferrer"&gt;https://github.com/mylovelycodes/LiteRTLM-Swift&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;💡 Why On-Device LLMs Matter&lt;/p&gt;

&lt;p&gt;Cloud-based LLMs are powerful, but they come with trade-offs:&lt;br&gt;
• Network latency&lt;br&gt;
• API costs&lt;br&gt;
• Privacy concerns&lt;br&gt;
• No offline support&lt;/p&gt;

&lt;p&gt;On-device inference changes the equation:&lt;br&gt;
• ⚡ Lower latency (no network round trips)&lt;br&gt;
• 🔒 Better privacy (data stays on device)&lt;br&gt;
• 📶 Works offline&lt;br&gt;
• 💰 Zero API cost&lt;/p&gt;

&lt;p&gt;The challenge? Hardware constraints.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;📱 The Experiment: Gemma 4 on iPhone 13 Pro&lt;/p&gt;

&lt;p&gt;I wanted to explore how far we can push mobile hardware.&lt;/p&gt;

&lt;p&gt;Surprisingly, with the right setup, it’s possible to run Gemma 4 locally on an iPhone 13 Pro.&lt;/p&gt;

&lt;p&gt;Not perfectly—but well enough to be useful.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🛠️ The Approach&lt;/p&gt;

&lt;p&gt;To make this work, I built:&lt;/p&gt;

&lt;p&gt;👉 LiteRTLM-Swift&lt;br&gt;
A lightweight Swift interface for running LiteRT-based LLMs on-device.&lt;/p&gt;

&lt;p&gt;Key design goals:&lt;br&gt;
• Native Swift API&lt;br&gt;
• Minimal dependencies&lt;br&gt;
• Easy integration into iOS/macOS apps&lt;/p&gt;

&lt;p&gt;Instead of building a full framework, I focused on making something simple and practical.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;⚙️ How It Works (High-Level)&lt;/p&gt;

&lt;p&gt;The system relies on:&lt;br&gt;
• A lightweight runtime (LiteRT)&lt;br&gt;
• Model optimization (quantization, smaller variants)&lt;br&gt;
• Efficient memory handling&lt;/p&gt;

&lt;p&gt;At a high level:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Load the model into device memory&lt;/li&gt;
&lt;li&gt; Run inference locally&lt;/li&gt;
&lt;li&gt; Return generated tokens back to the app&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything happens on-device — no server involved.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;📊 Performance &amp;amp; Constraints&lt;/p&gt;

&lt;p&gt;Let’s be honest — this is not comparable to cloud-scale inference.&lt;/p&gt;

&lt;p&gt;What works well:&lt;br&gt;
• Smaller / quantized models&lt;br&gt;
• Offline inference&lt;br&gt;
• Simple generation tasks&lt;/p&gt;

&lt;p&gt;What doesn’t:&lt;br&gt;
• Large models (memory limits)&lt;br&gt;
• Long context windows&lt;br&gt;
• High-throughput workloads&lt;/p&gt;

&lt;p&gt;Key bottlenecks:&lt;br&gt;
• 🧠 RAM constraints&lt;br&gt;
• 🌡️ Thermal throttling&lt;br&gt;
• ⏱️ Latency&lt;/p&gt;

&lt;p&gt;Still, for many use cases, it’s already usable.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧪 Real-World Use Cases&lt;/p&gt;

&lt;p&gt;Even with limitations, on-device LLMs unlock interesting possibilities:&lt;br&gt;
• Offline AI assistants&lt;br&gt;
• Private note summarization&lt;br&gt;
• On-device code tools&lt;br&gt;
• AI features inside native apps&lt;/p&gt;

&lt;p&gt;These are scenarios where privacy and availability matter more than raw speed.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🔓 Open Source&lt;/p&gt;

&lt;p&gt;I’ve open-sourced the project here:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/mylovelycodes/LiteRTLM-Swift" rel="noopener noreferrer"&gt;https://github.com/mylovelycodes/LiteRTLM-Swift&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is to make on-device LLMs more accessible for Swift developers.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🤔 What’s Next&lt;/p&gt;

&lt;p&gt;There’s still a lot to explore:&lt;br&gt;
• Better model optimization&lt;br&gt;
• Improved memory efficiency&lt;br&gt;
• Support for more architectures&lt;br&gt;
• Real-world app integrations&lt;/p&gt;

&lt;p&gt;On-device AI is still early — but moving fast.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;💬 Final Thoughts&lt;/p&gt;

&lt;p&gt;Running Gemma 4 on an iPhone 13 Pro might sound surprising today.&lt;/p&gt;

&lt;p&gt;But it’s a glimpse of where things are heading:&lt;/p&gt;

&lt;p&gt;👉 AI moving closer to the user&lt;br&gt;
👉 Less reliance on centralized infrastructure&lt;br&gt;
👉 More control for developers&lt;/p&gt;

&lt;p&gt;I’d love to hear how others are experimenting with local LLMs — especially on constrained devices.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>llm</category>
      <category>showdev</category>
      <category>swift</category>
    </item>
    <item>
      <title>How to Ask for Help Without Sounding Junior</title>
      <dc:creator>IndieHacker</dc:creator>
      <pubDate>Sun, 12 Apr 2026 12:55:41 +0000</pubDate>
      <link>https://forem.com/devglish/how-to-ask-for-help-without-sounding-junior-ggh</link>
      <guid>https://forem.com/devglish/how-to-ask-for-help-without-sounding-junior-ggh</guid>
      <description>&lt;h1&gt;
  
  
  How to Ask for Help in English Without Sounding Junior (or Rude)
&lt;/h1&gt;

&lt;p&gt;There's a moment every non-native English speaking developer dreads: you're stuck, you need help, and you have to ask for it in English.&lt;/p&gt;

&lt;p&gt;Too vague and people can't help you. Too formal and you sound like a chatbot. Too blunt and you sound demanding. And if you're a non-native speaker, there's an extra layer of anxiety: "Will they think I don't understand the code, or will they realize I just don't have the English words?"&lt;/p&gt;

&lt;p&gt;I've watched developers sit stuck for hours rather than ask a question in Slack — not because they couldn't solve the problem, but because they couldn't phrase the question.&lt;/p&gt;

&lt;p&gt;Here are the patterns that actually work, organized from Slack DMs to public channels to formal escalations.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "Can You Help Me" Problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What non-native speakers write:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi, sorry to bother you. Can you help me? I have a problem with 
the API. I don't know how to fix it. Please help.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What the reader thinks:&lt;/strong&gt; "Okay... what's the problem? I need to know what's broken before I can help. And why are they apologizing?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to write instead:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey — I'm hitting a 403 on the /users endpoint after the auth 
migration. I've checked the token scopes and they look correct. 
Could you point me in the right direction?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; It states what you tried, what you observed, and asks for a &lt;em&gt;direction&lt;/em&gt; — not a solution. You're showing you've done work; you just need a nudge.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 3-Part Template
&lt;/h2&gt;

&lt;p&gt;Almost every effective help request follows the same structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. What I'm trying to do: [goal]
2. What's happening instead: [symptom]
3. What I've tried: [your investigation]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example — Slack DM:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey, quick question about the caching layer:

I'm trying to invalidate user sessions after a password change.
When I call `cache.delete(sessionKey)`, the old session still works
for ~60 seconds.

I checked the KV docs and it mentions eventual consistency — is that
what I'm seeing, or am I missing something?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example — public channel:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Has anyone seen this before?

Our staging deploy is failing with `Error: Module not found: @internal/utils`.
This worked yesterday. The module exists in node_modules locally.

I've tried:
- Deleting node_modules + fresh install
- Checking the package-lock for version mismatches
- Verifying the import path matches the package.json exports

Any ideas? Happy to share the full error log.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example — GitHub issue:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Expected behavior&lt;/span&gt;
&lt;span class="sb"&gt;`POST /api/sync/push`&lt;/span&gt; should accept an array of entries and return
the server-side IDs.

&lt;span class="gu"&gt;## Actual behavior&lt;/span&gt;
Returns 400 with &lt;span class="sb"&gt;`{"error": "Invalid payload"}`&lt;/span&gt; when the array
contains entries with &lt;span class="sb"&gt;`null`&lt;/span&gt; values for optional fields.

&lt;span class="gu"&gt;## Steps to reproduce&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; POST to &lt;span class="sb"&gt;`/api/sync/push`&lt;/span&gt; with body: [{"word": "cache", "notes": null}]
&lt;span class="p"&gt;2.&lt;/span&gt; Observe 400 response

&lt;span class="gu"&gt;## Environment&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; API version: 2.1.0
&lt;span class="p"&gt;-&lt;/span&gt; Client: macOS app v1.3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the pattern: each example gets more structured as the audience gets larger and more formal. A DM to a colleague can be conversational. A public issue needs to be reproducible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 1: The Quick DM
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; You have a specific, small question for someone who knows the answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good openers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey — quick question about [topic]:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do you have a sec for a [topic] question?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sorry to ping you directly — you're the expert on [thing]. Quick one:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good closers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Any pointers would be great.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No rush — whenever you have a minute.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If you're busy, I can also check with [person/team].
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Non-native speaker traps:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Common mistake&lt;/th&gt;
&lt;th&gt;✅ Native-sounding version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hi, are you busy?&lt;/td&gt;
&lt;td&gt;Hey — quick question:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sorry to disturb you&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(just ask the question — the apology is unnecessary)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can you help me?&lt;/td&gt;
&lt;td&gt;Could you point me in the right direction on [X]?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I don't understand this&lt;/td&gt;
&lt;td&gt;I'm not sure I follow the [specific part] — is it doing X or Y?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I have a doubt about...&lt;/td&gt;
&lt;td&gt;I have a question about...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Please kindly assist me&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(just ask the question directly)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The key insight:&lt;/strong&gt; "Can you help me?" puts the burden on the other person to figure out &lt;em&gt;what&lt;/em&gt; help you need. "Could you point me in the right direction on [specific thing]?" tells them exactly what you need and how much of their time it'll take.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 2: The Channel Post
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; You're stuck, you've tried things, and you don't know who has the answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good openers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Has anyone run into [specific problem]?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sanity check: is [thing] supposed to behave like [observation]?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Looking for input on [topic] — context in thread 🧵
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Non-native speaker traps:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Common mistake&lt;/th&gt;
&lt;th&gt;✅ Native-sounding version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;I have a problem&lt;/td&gt;
&lt;td&gt;I'm running into an issue with...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I met an error&lt;/td&gt;
&lt;td&gt;I'm hitting a [error name] on...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This doesn't work&lt;/td&gt;
&lt;td&gt;This is returning [unexpected result] instead of [expected result]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who can help me with this?&lt;/td&gt;
&lt;td&gt;Has anyone seen this before?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I can't fix this bug&lt;/td&gt;
&lt;td&gt;I've been debugging this for a while — fresh eyes welcome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Please anyone help&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(just describe the problem clearly — people will help)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Phrases that signal competence (even when you're stuck):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These phrases show that you've already put in effort:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I've narrowed it down to..." — You've investigated&lt;/li&gt;
&lt;li&gt;"My current theory is..." — You're thinking critically&lt;/li&gt;
&lt;li&gt;"I've ruled out..." — You've tested hypotheses&lt;/li&gt;
&lt;li&gt;"This started happening after..." — You've identified a timeline&lt;/li&gt;
&lt;li&gt;"The weird part is..." — You've noticed something unexpected&lt;/li&gt;
&lt;li&gt;"I'm leaning toward [X], but wanted a sanity check" — You have a hypothesis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these frames you as a capable developer who needs a second opinion, not someone who can't do their job. The difference matters — especially when you're new to a team.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 3: The Pair Request
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; You need more than a pointer — you need someone to look at the problem with you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to ask without sounding needy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey — I've been going back and forth on the caching approach for 
the sync endpoint. I have a working solution but I'm not confident 
it handles edge cases well. Would you have 15-20 min to pair on it?

No rush — anytime this week works.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm stuck on a Rust lifetime issue that I think is a conceptual gap 
on my part. Would you be up for a quick pairing session? I think seeing 
how you'd approach it would unstick me faster than docs.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The formula:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;State what you've done (so they know you're not starting from zero)&lt;/li&gt;
&lt;li&gt;State what kind of help you need (direction? review? pairing?)&lt;/li&gt;
&lt;li&gt;Give a time estimate (15 min? 30 min?)&lt;/li&gt;
&lt;li&gt;Offer flexibility ("no rush" / "anytime this week")&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker traps:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Too vague&lt;/th&gt;
&lt;th&gt;✅ Specific and respectful&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can we have a meeting?&lt;/td&gt;
&lt;td&gt;Would you have 15 min to look at something together?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I need your help with my code&lt;/td&gt;
&lt;td&gt;I could use a second pair of eyes on the auth flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Please teach me how to do this&lt;/td&gt;
&lt;td&gt;I'm stuck on [specific thing] — would pairing help?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I don't know how to do this&lt;/td&gt;
&lt;td&gt;I have an approach but I'm not sure it's the right one — can I run it by you?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Level 4: The Escalation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; You've tried everything, asked around, and you're still blocked. You need to involve a lead or another team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The structure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Impact:** [What's blocked and why it matters]
**What I've tried:** [Your investigation, briefly]  
**What I need:** [Specific ask — access? decision? expertise?]
**Timeline:** [When this becomes critical]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@team-lead Heads up — I'm blocked on the payment integration and 
it's on the critical path for the release.

**Impact:** Can't test the checkout flow. This blocks QA, which 
starts Monday.

**What I've tried:**
- The sandbox API returns 500 on all POST requests since Thursday
- I've checked our API keys, verified the payload format, and tested 
  with curl — same result
- RevenueCat's status page shows no outage

**What I need:** Either RevenueCat support access to file a ticket, 
or a decision on whether to mock the API and test against prod later.

**Timeline:** Need a path forward by EOD Friday for the Monday QA window.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; It's not "help me." It's "here's the situation, here's what I've done, here's exactly what I need from you." A tech lead can read this in 30 seconds and make a decision. Compare that to "I'm having issues with the payment thing, can we talk?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker traps:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Vague escalation&lt;/th&gt;
&lt;th&gt;✅ Structured escalation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;I'm blocked, can we talk?&lt;/td&gt;
&lt;td&gt;I'm blocked on X — here's the context and what I need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This is very urgent&lt;/td&gt;
&lt;td&gt;Impact: blocks QA starting Monday&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I've tried everything&lt;/td&gt;
&lt;td&gt;I've tried A, B, C — [specific results]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Someone needs to fix this&lt;/td&gt;
&lt;td&gt;I need [specific thing] from [specific team/person]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Please help me urgently&lt;/td&gt;
&lt;td&gt;Need a path forward by [date] for [reason]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Anti-Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The XY Problem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;How &lt;span class="k"&gt;do &lt;/span&gt;I parse the last 3 characters of a filename &lt;span class="k"&gt;in &lt;/span&gt;Bash?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Better:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;I&lt;span class="s1"&gt;'m trying to route files to different processors based on their 
file extension. I was thinking of parsing the filename in Bash — 
is there a better approach?
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first question will get you a Bash answer. The second might get you "just use the &lt;code&gt;file&lt;/code&gt; command" or "use &lt;code&gt;path.extname()&lt;/code&gt; in Node" — actually solving your real problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Don't ask about your attempted solution. Ask about your actual problem. This is hard in any language, but especially hard in a second language because it's tempting to ask the shortest possible question.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The "No Context" Drop
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is this right?
[code snippet]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Better:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm implementing rate limiting for the lookup endpoint. Does this 
sliding window approach look correct? Specifically, I'm not sure 
if the timestamp comparison on L8 handles the boundary correctly.

[code snippet]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Always say what the code is trying to do and what specific part you're unsure about. "Is this right?" forces the reader to reverse-engineer your intention from the code — which is work you should do for them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Premature "Sorry"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sorry, I know this is probably a stupid question, but I'm confused 
about how the middleware chain works. Sorry if this is obvious.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Better:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Quick question about the middleware chain: does `authMiddleware` run 
before or after `rateLimit`? I'm seeing different behavior depending 
on the route and want to make sure I understand the ordering.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Never apologize for asking a technical question. Never call your own question stupid. It doesn't make you look humble — it makes the reader think "should I bother answering this if even they think it's stupid?"&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Open with&lt;/th&gt;
&lt;th&gt;Close with&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Quick DM&lt;/td&gt;
&lt;td&gt;"Hey — quick question about [X]:"&lt;/td&gt;
&lt;td&gt;"Any pointers would be great"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Channel post&lt;/td&gt;
&lt;td&gt;"Has anyone run into [X]?"&lt;/td&gt;
&lt;td&gt;"Happy to share more context"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pair request&lt;/td&gt;
&lt;td&gt;"Would you have [time] to pair on [X]?"&lt;/td&gt;
&lt;td&gt;"No rush — anytime this week"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalation&lt;/td&gt;
&lt;td&gt;"Heads up — I'm blocked on [X]"&lt;/td&gt;
&lt;td&gt;"Need a path forward by [date]"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instead of...&lt;/th&gt;
&lt;th&gt;Write...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can you help me?&lt;/td&gt;
&lt;td&gt;Could you point me in the right direction on [X]?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I don't understand&lt;/td&gt;
&lt;td&gt;I'm not sure I follow — is it doing X or Y?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I have a problem&lt;/td&gt;
&lt;td&gt;I'm running into an issue with [X]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I met an error&lt;/td&gt;
&lt;td&gt;I'm hitting a [error] on [endpoint/component]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This doesn't work&lt;/td&gt;
&lt;td&gt;This returns [actual] instead of [expected]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sorry, stupid question&lt;/td&gt;
&lt;td&gt;Quick question:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I tried everything&lt;/td&gt;
&lt;td&gt;I've tried A, B, C — here's what I saw&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I have a doubt&lt;/td&gt;
&lt;td&gt;I have a question about [X]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why Asking Well Matters More Than You Think
&lt;/h2&gt;

&lt;p&gt;The ability to ask clear questions is a senior engineer skill. It's not about English — it's about communication. But when you're working in a second language, unclear communication gets attributed to the wrong cause. People think "they don't understand the system" when the reality is "they understand the system perfectly but can't phrase the question."&lt;/p&gt;

&lt;p&gt;A well-structured question does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gets you unstuck faster&lt;/strong&gt; — people can help you in one message instead of five&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds your reputation&lt;/strong&gt; — clear questions signal clear thinking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respects others' time&lt;/strong&gt; — a 3-line question with context takes 30 seconds to answer. A vague "can you help?" takes 10 minutes of back-and-forth&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The patterns are simple. The templates are copy-pasteable. Use them for a week and they'll become automatic.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is Part 3 of the "English for Developers" series:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/devglish/how-to-write-a-pr-description-that-sounds-native-2n72"&gt;Part 1: How to Write a PR Description That Actually Sounds Native&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/devglish/the-art-of-saying-no-in-code-review-4l7b"&gt;Part 2: The Art of Saying "No" in Code Review: 7 Levels from Soft to Hard&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;I'm building &lt;a href="https://devglish.com" rel="noopener noreferrer"&gt;DevGlish&lt;/a&gt; — a macOS menu bar app that helps non-native speakers navigate developer English in real time. Select text, press ⌘⇧D, get context-aware guidance on phrasing, tone, and pronunciation. It knows the difference between Slack tone and GitHub tone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://devglish.com" rel="noopener noreferrer"&gt;Try it free →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Art of Saying "No" in Code Review</title>
      <dc:creator>IndieHacker</dc:creator>
      <pubDate>Thu, 09 Apr 2026 02:18:47 +0000</pubDate>
      <link>https://forem.com/devglish/the-art-of-saying-no-in-code-review-4l7b</link>
      <guid>https://forem.com/devglish/the-art-of-saying-no-in-code-review-4l7b</guid>
      <description>&lt;h1&gt;
  
  
  The Art of Saying "No" in Code Review: 7 Levels from Soft to Hard
&lt;/h1&gt;

&lt;p&gt;There's a skill that nobody teaches in CS programs: &lt;strong&gt;how to reject code without making it personal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Native English speakers learn this through years of cultural osmosis. Non-native speakers often learn it the hard way — by accidentally sounding rude, or by being so polite that their blocking feedback gets ignored.&lt;/p&gt;

&lt;p&gt;I've collected these 7 levels from real code reviews across 4 companies and 3 countries. Each level serves a different purpose. Master all 7, and your code reviews will be clearer, kinder, and more effective.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level 0: The Positive Observation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Not saying no at all — just pointing out what's good.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nice approach here — the early return keeps the happy path clean.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TIL about this API. Clean usage.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is much more readable than the previous version. 👍
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; When code is genuinely good. Sounds obvious, but most reviewers only comment when something is wrong. Positive comments build trust so that your "no"s land softer later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker trap:&lt;/strong&gt; Don't write "Good job!" — it sounds patronizing from a peer. Stick to specific observations: what is good and why.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Sounds off&lt;/th&gt;
&lt;th&gt;✅ Sounds native&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Good job!&lt;/td&gt;
&lt;td&gt;Nice — this handles the edge case cleanly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Very good code&lt;/td&gt;
&lt;td&gt;This reads well, especially the error handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I think this is perfect&lt;/td&gt;
&lt;td&gt;LGTM 👍&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Level 1: The Nitpick
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"You could change this, but you don't have to."&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nit: `userCount` might read better than `cnt` here.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ultra-nit: extra blank line on L42.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Style nit: we usually put the constant on the left in comparisons.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Naming, formatting, minor style preferences. Things that don't affect functionality or correctness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The magic word:&lt;/strong&gt; "Nit" or "Nit:" at the start. This single word tells the author: "I noticed this, but don't block your PR on it." It's a social contract — if you label something a nit, you can't later block the PR over it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker trap:&lt;/strong&gt; Don't write "You should rename this variable." Without the "Nit:" prefix, it sounds like a hard requirement.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Sounds like a command&lt;/th&gt;
&lt;th&gt;✅ Sounds like a suggestion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You should rename this&lt;/td&gt;
&lt;td&gt;Nit: maybe &lt;code&gt;fetchUser&lt;/code&gt; instead of &lt;code&gt;getData&lt;/code&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change this variable name&lt;/td&gt;
&lt;td&gt;Nit: &lt;code&gt;count&lt;/code&gt; → &lt;code&gt;activeUserCount&lt;/code&gt; for clarity?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This name is bad&lt;/td&gt;
&lt;td&gt;Nit: the name doesn't tell me what it counts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Level 2: The Suggestion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Here's an alternative approach. Take it or leave it."&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Consider extracting this into a helper — it's used in 3 places already.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Another option: we could use a Map here instead of filter + find. 
Would bring this from O(n²) to O(n). Up to you.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Have you considered using early return here? Might reduce the nesting.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; When you see a better approach but the current one isn't wrong. The author should feel free to disagree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key phrases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Consider..." — the Swiss army knife of suggestions&lt;/li&gt;
&lt;li&gt;"Another option:" — explicitly frames it as optional&lt;/li&gt;
&lt;li&gt;"Have you considered..." — implies you're curious, not commanding&lt;/li&gt;
&lt;li&gt;"Up to you" / "Take it or leave it" — explicit opt-out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker trap:&lt;/strong&gt; "I think you should..." is NOT a suggestion in English. "Should" carries obligation. "I think" doesn't soften it enough.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Hidden command&lt;/th&gt;
&lt;th&gt;✅ Actual suggestion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;I think you should use a Map here&lt;/td&gt;
&lt;td&gt;Have you considered using a Map here?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It would be better to extract this&lt;/td&gt;
&lt;td&gt;Consider extracting this — it's used in 3 places&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You need to add caching&lt;/td&gt;
&lt;td&gt;This might benefit from caching if it's called frequently&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Level 3: The Question
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"I don't understand this. Help me understand before I judge."&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Curious: why `setTimeout` here instead of `requestAnimationFrame`?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is there a reason we're not using the existing `parseDate` util? 
Might be duplicating logic — or maybe I'm missing context.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What happens if `user` is null here? I might be wrong, but this 
looks like it could panic on L47.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; When you think something might be wrong but you're not sure. The question format gives the author an out — maybe they have context you don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this is powerful:&lt;/strong&gt; Questions are face-saving. If the author made a mistake, they can fix it without anyone explicitly saying "you're wrong." If they had a good reason, they can explain without feeling defensive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker trap:&lt;/strong&gt; "Why did you do it this way?" sounds confrontational in English, even if it's genuinely curious in your language. Add a softener.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Sounds confrontational&lt;/th&gt;
&lt;th&gt;✅ Sounds curious&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Why did you do it this way?&lt;/td&gt;
&lt;td&gt;Curious about the approach here — was X considered?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Why didn't you use X?&lt;/td&gt;
&lt;td&gt;Is there a reason we're not using X? (Might be missing context)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This doesn't make sense&lt;/td&gt;
&lt;td&gt;Help me understand the flow here — I'm not sure I follow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is this for?&lt;/td&gt;
&lt;td&gt;Could you add a brief comment here? I had to read it twice&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Level 4: The Concern
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"I think this might cause problems. Let's discuss."&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Concern: this allocates on every render. With 1000+ items, 
we might see jank. Want to memoize or move it outside the loop?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm a bit worried about the race condition here — if two requests 
hit this endpoint simultaneously, we could double-write. 
Could we add a lock or use an upsert?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Heads up: this pattern has bitten us before in the billing module 
(see #312). Might be worth adding a guard.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Real problems that need addressing, but where you're open to the author choosing &lt;em&gt;how&lt;/em&gt; to fix it. You're flagging the issue, not dictating the solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key phrases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Concern:" — like "Nit:" but serious&lt;/li&gt;
&lt;li&gt;"I'm a bit worried about..." — personal concern, not accusation&lt;/li&gt;
&lt;li&gt;"Heads up:" — framing as a friendly warning&lt;/li&gt;
&lt;li&gt;"This pattern has bitten us before" — evidence-based, not opinion-based&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker trap:&lt;/strong&gt; "This is wrong" or "This has a bug" is too direct even when it's true. Frame it as a risk or concern.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Too direct&lt;/th&gt;
&lt;th&gt;✅ Appropriately concerned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;This is wrong&lt;/td&gt;
&lt;td&gt;I think there might be an issue here — [explain]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This will crash&lt;/td&gt;
&lt;td&gt;This could panic if &lt;code&gt;user&lt;/code&gt; is nil — want to add a guard?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You have a race condition&lt;/td&gt;
&lt;td&gt;Heads up: I think there's a race condition here between X and Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This code is inefficient&lt;/td&gt;
&lt;td&gt;Concern: this is O(n²) — might be slow with large datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Level 5: The Blocker
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"This needs to change before we can merge."&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;Blocking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="k"&gt;SQL&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;vulnerable&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;injection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; 
&lt;span class="n"&gt;We&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;parameterized&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt; &lt;span class="n"&gt;here&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;See&lt;/span&gt; &lt;span class="n"&gt;our&lt;/span&gt; &lt;span class="n"&gt;guide&lt;/span&gt; &lt;span class="k"&gt;at&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This needs to be addressed: the API key is hardcoded on L23. 
Should come from env/secrets.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I can't approve this as-is: the migration is irreversible and 
we don't have a rollback plan. Can we discuss before merging?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Security vulnerabilities, data loss risks, breaking changes without migration, violations of critical conventions. Things that would cause real damage in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key phrases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Blocking:" — the nuclear prefix, use sparingly&lt;/li&gt;
&lt;li&gt;"This needs to be addressed:" — clear that this isn't optional&lt;/li&gt;
&lt;li&gt;"I can't approve this as-is:" — states your position, invites discussion&lt;/li&gt;
&lt;li&gt;"Can we discuss before merging?" — escalates to synchronous conversation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker trap:&lt;/strong&gt; Two opposite mistakes here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Being too soft on blockers: "Maybe we should consider not hardcoding the API key?" — NO. If it's a security issue, be direct.&lt;/li&gt;
&lt;li&gt;Using blocker language for nits: "This needs to change: rename &lt;code&gt;cnt&lt;/code&gt; to &lt;code&gt;count&lt;/code&gt;." — NO. Save the strong language for real issues.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Too soft for a real issue&lt;/th&gt;
&lt;th&gt;✅ Appropriately firm&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maybe don't hardcode the API key?&lt;/td&gt;
&lt;td&gt;Blocking: API key on L23 must come from env. Hardcoded secrets will hit our security scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I think this might have a SQL injection&lt;/td&gt;
&lt;td&gt;Blocking: SQL injection on L45. Must use parameterized queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perhaps we should add auth here&lt;/td&gt;
&lt;td&gt;This endpoint needs auth — it's currently public and returns PII&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Level 6: The Redirect
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"This is the wrong direction. Let's step back."&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I think we might be overcomplicating this. The existing `UserService.fetch()` 
already handles this case — could we use that instead of building a new path?

Happy to pair on this if it'd help.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before we go further: I chatted with @sarah and this feature is being 
redesigned in Q3. Might be worth checking if this approach still aligns. 
Can we sync briefly?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stepping back a bit: the original issue (#234) was about reducing latency, 
but this PR adds a new caching layer. I wonder if we could solve it at the 
DB query level instead? Simpler and fewer moving parts.

What do you think?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; When the approach itself is wrong, not just the implementation. This is the hardest "no" because you're rejecting the author's design decision, not a line of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key phrases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Stepping back a bit:" — signals you're zooming out&lt;/li&gt;
&lt;li&gt;"I wonder if..." — softest possible way to suggest an alternative direction&lt;/li&gt;
&lt;li&gt;"What do you think?" — makes it a conversation, not a veto&lt;/li&gt;
&lt;li&gt;"Happy to pair on this" — shows you're willing to invest time, not just criticize&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Non-native speaker trap:&lt;/strong&gt; "This approach is wrong" or "You should start over" will nuke the relationship. Even if the whole PR needs to be scrapped, frame it as a conversation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ Relationship-ending&lt;/th&gt;
&lt;th&gt;✅ Redirecting with respect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;This approach is wrong&lt;/td&gt;
&lt;td&gt;Stepping back — I wonder if there's a simpler path here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start over&lt;/td&gt;
&lt;td&gt;Before we go further, can we sync on the approach? I have some ideas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This is not what we need&lt;/td&gt;
&lt;td&gt;I think the original issue might be solvable without this layer — want to discuss?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Why did you build this?&lt;/td&gt;
&lt;td&gt;I might be missing context — is there a reason we're not using the existing X?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Cheat Sheet
&lt;/h2&gt;

&lt;p&gt;Print this. Pin it next to your monitor. Use it every code review.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Example opener&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(none)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;This is good&lt;/td&gt;
&lt;td&gt;"Nice — this handles..."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Nit:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Change if you want&lt;/td&gt;
&lt;td&gt;"Nit: maybe X instead of Y?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Suggestion:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Here's an alternative&lt;/td&gt;
&lt;td&gt;"Consider..." / "Another option:"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(question)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Help me understand&lt;/td&gt;
&lt;td&gt;"Curious:" / "Is there a reason...?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Concern:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;This might cause problems&lt;/td&gt;
&lt;td&gt;"I'm a bit worried about..."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Blocking:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Must fix before merge&lt;/td&gt;
&lt;td&gt;"This needs to be addressed:"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(conversation)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Wrong direction&lt;/td&gt;
&lt;td&gt;"Stepping back:" / "Can we sync?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Meta-Rules
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Match severity to language.&lt;/strong&gt; Don't use Level 5 language ("This needs to change") for a Level 1 issue (variable naming). Don't use Level 1 language ("Nit: maybe don't") for a Level 5 issue (SQL injection).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. One "Blocking" per review is enough.&lt;/strong&gt; If you have 3 blockers, something went wrong upstream (unclear requirements, no design review). Have a conversation instead of leaving 3 red flags on a PR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Always pair criticism with context.&lt;/strong&gt; "This is O(n²)" is a complaint. "This is O(n²) — with our current dataset of 50K rows, this loop takes ~3s. Using a Map brings it to ~5ms" is actionable feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Separate "what" from "how."&lt;/strong&gt; Flag the problem (Level 4-5), but let the author choose the solution unless there's only one right answer. "This could panic on nil" is better than "Add a nil check on line 47" — the author might have a better fix in mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. If you're angry, save as draft.&lt;/strong&gt; Come back in 30 minutes. The PR will still be there. Your relationship with the author won't survive a review written in frustration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters Beyond Code
&lt;/h2&gt;

&lt;p&gt;Code review is one of the few places where developers give and receive direct feedback daily. How you do it shapes how people perceive you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too soft → your feedback gets ignored, bugs ship&lt;/li&gt;
&lt;li&gt;Too harsh → people stop requesting your review, you lose influence&lt;/li&gt;
&lt;li&gt;Just right → you become the reviewer everyone wants, and your team's code quality goes up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For non-native speakers, the stakes are higher. You're already navigating a language gap. Getting the tone wrong in code review can create a reputation problem that has nothing to do with your technical ability.&lt;/p&gt;

&lt;p&gt;The good news: unlike grammar, code review tone is a &lt;strong&gt;finite skill with learnable patterns.&lt;/strong&gt; The 7 levels above cover ~95% of situations. Practice them deliberately for two weeks and they'll become automatic.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part of my "English for Developers" series. &lt;a href="https://dev.to/indiehacker_9527/how-to-write-a-pr-description-that-sounds-native-2n72"&gt;Part 1: How to Write a PR Description That Actually Sounds Native&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm building &lt;a href="https://devglish.com" rel="noopener noreferrer"&gt;DevGlish&lt;/a&gt; — a macOS menu bar app that gives you these kinds of context-aware English suggestions while you work. Select text → ⌘⇧D → instant guidance. It detects whether you're in GitHub, Slack, or email and adjusts the tone and phrasing accordingly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://devglish.com" rel="noopener noreferrer"&gt;Try it free →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>codequality</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>How to Write a PR Description That Sounds Native</title>
      <dc:creator>IndieHacker</dc:creator>
      <pubDate>Wed, 08 Apr 2026 05:21:18 +0000</pubDate>
      <link>https://forem.com/devglish/how-to-write-a-pr-description-that-sounds-native-2n72</link>
      <guid>https://forem.com/devglish/how-to-write-a-pr-description-that-sounds-native-2n72</guid>
      <description>&lt;h1&gt;
  
  
  How to Write a PR Description That Actually Sounds Native
&lt;/h1&gt;

&lt;p&gt;I've reviewed thousands of PRs from developers across 6 countries. The code is usually fine. The English? That's where things get interesting.&lt;/p&gt;

&lt;p&gt;Here's a collection of real patterns I've seen (anonymized), what native speakers actually think when they read them, and how to fix each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Please Kindly" Pattern
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What non-native speakers write:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Please kindly review this PR. I have made some changes to the authentication module. 
Please let me know if you have any questions. Thank you for your time.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What native speakers think:&lt;/strong&gt; "This reads like a customer service email, not a PR description."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to write instead:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## What&lt;/span&gt;
Refactored the auth module to use JWT refresh tokens.

&lt;span class="gu"&gt;## Why&lt;/span&gt;
Session tokens were expiring mid-workflow (see #142). Refresh tokens let us extend sessions without re-auth.

&lt;span class="gu"&gt;## How&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Added &lt;span class="sb"&gt;`refreshToken()`&lt;/span&gt; to AuthService
&lt;span class="p"&gt;-&lt;/span&gt; Updated middleware to auto-refresh on 401
&lt;span class="p"&gt;-&lt;/span&gt; Migration: new &lt;span class="sb"&gt;`refresh_tokens`&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; PR descriptions are technical documents, not letters. Use What/Why/How structure. Skip greetings and pleasantries.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "I Think Maybe" Pattern
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What non-native speakers write:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I think maybe we should consider possibly using a different approach here, 
if that's okay with you.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What native speakers think:&lt;/strong&gt; "Are they unsure about the technical approach, or just being overly polite? I genuinely can't tell."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to write instead:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'd suggest using a connection pool here instead of creating new connections per request. 
The current approach will hit scalability issues around ~100 concurrent users.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; One hedge word is polite. Three hedge words is confusing. "I'd suggest" or "Consider" is enough — then state your case directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "You Should" Pattern
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What non-native speakers write:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You should change this variable name. You should also add error handling here. 
You should not use var.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What native speakers think:&lt;/strong&gt; "This feels like a lecture, not a code review."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to write instead:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Template&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nitpick&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Nit: [suggestion]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nit: &lt;code&gt;userCount&lt;/code&gt; reads better than &lt;code&gt;cnt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suggestion&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Consider [doing X] — [reason]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consider extracting this into a helper — it's used in 3 places&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocking&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[Issue]: [explanation]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;This will panic on nil input — we need a guard here&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Frame feedback as observations about the code, not instructions to the person. "This will panic" vs "You should add a nil check."&lt;/p&gt;




&lt;h2&gt;
  
  
  The "Fixed Bug" Commit Message
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What non-native speakers write:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fixed bug
update code
modify function
add some changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What native speakers think:&lt;/strong&gt; "What bug? What code? I'm going to have to read the entire diff."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to write instead (Conventional Commits):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;fix(auth): prevent session expiry during active requests

The JWT middleware was checking token expiry before processing the request,
causing 401s for long-running uploads. Now checks after.

Closes #142
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The template:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;type&amp;gt;&lt;/span&gt;(&lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;): &lt;span class="nt"&gt;&amp;lt;what&lt;/span&gt; &lt;span class="na"&gt;changed&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;why&lt;/span&gt; &lt;span class="na"&gt;it&lt;/span&gt; &lt;span class="na"&gt;changed&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;context&lt;/span&gt; &lt;span class="na"&gt;that&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;diff&lt;/span&gt; &lt;span class="na"&gt;alone&lt;/span&gt; &lt;span class="na"&gt;doesn&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;t&lt;/span&gt; &lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;reference&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;issue&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;ticket&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Types: &lt;code&gt;feat&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;chore&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The "Please Help Me" Standup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What non-native speakers write:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yesterday I was working on the task. Today I will continue working on it. 
I have no blockers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What native speakers think:&lt;/strong&gt; "This tells me nothing."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to write instead:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**Yesterday:**&lt;/span&gt; Got the JWT refresh flow working end-to-end. Tests passing locally.
&lt;span class="gs"&gt;**Today:**&lt;/span&gt; Integration testing against staging, then PR.
&lt;span class="gs"&gt;**Blocked:**&lt;/span&gt; Need access to the staging KV namespace — @ops can you add me?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Be specific. Name the feature, the status, the next concrete action. "Working on the task" is a non-update.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instead of...&lt;/th&gt;
&lt;th&gt;Write...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Please kindly...&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(just skip it)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I think maybe we should consider...&lt;/td&gt;
&lt;td&gt;I'd suggest... / Consider...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You should...&lt;/td&gt;
&lt;td&gt;Nit: / Consider... / This will [problem]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed bug&lt;/td&gt;
&lt;td&gt;fix(scope): description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I was working on the task&lt;/td&gt;
&lt;td&gt;Got [specific thing] working, next up [specific thing]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Please let me know if you have any questions&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(just skip it — they'll ask if they have questions)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thank you for your time&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(unnecessary in PR context)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I want to ask...&lt;/td&gt;
&lt;td&gt;Quick question: ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can I know...?&lt;/td&gt;
&lt;td&gt;Do you know...? / Is there a way to...?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I have met a problem&lt;/td&gt;
&lt;td&gt;I ran into an issue with...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;These aren't grammar mistakes. They're &lt;strong&gt;register mistakes&lt;/strong&gt; — using email-formal language in a casual-technical context, or using a command tone when a suggestion tone is expected.&lt;/p&gt;

&lt;p&gt;Native speakers won't correct you. They'll just form a vague impression that your communication is "a bit off." Over time, that impression compounds.&lt;/p&gt;

&lt;p&gt;The good news: the patterns are finite and learnable. Once you internalize the ~20 templates above, you'll sound native in 90% of dev communication.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I built &lt;a href="https://devglish.com" rel="noopener noreferrer"&gt;DevGlish&lt;/a&gt; to solve this exact problem. It's a macOS menu bar app that gives you context-aware English suggestions while you work — select text, press ⌘⇧D, get instant guidance on pronunciation, phrasing, and native speaker conventions. It even detects which app you're in (Slack vs GitHub vs email) and adjusts the tone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Free tier: 10 lookups/day. &lt;a href="https://devglish.com" rel="noopener noreferrer"&gt;Try it →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>github</category>
      <category>softwareengineering</category>
      <category>writing</category>
    </item>
  </channel>
</rss>
