learn-tech-writing-with-phoebe / Session 2 of 8
Learn Tech Writing with Phoebe · Session 2 of 8

Sentences that work

Session 1 decided who Pulse's docs are for. Today we earn their trust one sentence at a time: consistent words, active voice, one idea per sentence. Then we take NOTES.txt, the worst paragraph in the repo, and rebuild it into something a human can use at 2am.

🟢 Easy Practitioners Data & AI teams 45 min live + self-study depth
0-3 · Welcome 3-18 · Concepts (live cards) 18-40 · Build-along on Pulse 40-45 · Q&A
Part 0

Why this session exists

Readers judge a doc's quality sentence by sentence, and sentence-level craft is about 80% of that perceived quality. A doc with perfect structure and wobbly sentences still reads as unreliable; a doc of plain, active, one-idea sentences reads as trustworthy even before it is. Today's five rules come from Google's Technical Writing One and Microsoft's style tips, and they are all mechanical - no talent required, just editing moves you can apply on any Tuesday.

Live - presented in session Self-study - read after class ★ Try it now exercise Sources: Google TW One + Microsoft Style Guide
★ What you walk out with today The five sentence rules (consistent terms, pronouns on a short leash, active voice, strong verbs, one idea per sentence) and Pulse's NOTES.txt rewritten into docs/notes-rewrite.md - a paragraph a human can actually use. Cards marked "Live" are what we do together; "Self-study" cards give you full source depth at your own pace.
Part 1 · covers Google TW One "Words"

Words that don't wobble 7 min live

Before sentences can work, the words inside them have to hold still. Google's Words unit has two enemies: terminology that drifts (one concept, three names) and pronouns that wander (a "it" whose owner left the paragraph). Both make the reader do detective work you were paid to do.

README says "the staged data" Code comment says "the validated rows" Slack says "the preprocessed stuff" Reader's head "...three things?" Imaginary "staged" thing Imaginary "validated" thing Imaginary third thing It is ONE folder. One concept gets one name - pick it once, use it everywhere.
🔍 Click to zoom - terminology drift: three names for one folder fork the reader's mental model into three imaginary things
LiveOne concept, one name3 min▶

Google's rule is short: use terminology consistently. If you name something "the staged data" in paragraph one, it stays "the staged data" for the rest of the doc - not "the validated rows", not "the intermediate output". Synonyms feel like good style; to the reader they read as new concepts.

  • New or unfamiliar term? Either link to a good existing definition, or define it yourself the first time it appears. Never make the reader infer a definition from usage.
  • Pick official terms early. For Pulse we lock three today: staged (output of ingest.py), cleaned (output of clean.py), metrics (output of metrics.py). Every later doc uses exactly these.
  • Elegant variation is for novels. In fiction, repeating a word is clumsy. In technical writing, repeating the term is the feature - repetition is how the reader knows it's the same thing.
★ Try it nowOpen your team's main README and pick one core concept (a dataset, a service, a job). Search the doc for every name it goes by. Found more than one name? You just found the doc's biggest source of confusion, and the fix is a two-minute find-and-replace.
LivePronouns on a five-word leash2 min▶

Pronouns are pointers, and like pointers they dangle. Google's guidance: keep a pronoun within about five words of the noun it stands for, and if anything ambiguous could grab the reference, repeat the noun instead.

  • The ~5 word rule. "Run clean.py after ingest.py finishes; it dedups the rows" - which script is "it"? Two nouns are in range, so the pronoun wobbles. Write "clean.py dedups the rows".
  • Watch it, they, this, that. These four cause most of the damage. "This is important" - what is? Google's fix: put a noun after this or that ("this filter step is important").
  • When in doubt, repeat the noun. Repeating "clean.py" three times in a paragraph costs nothing. One ambiguous "it" costs a re-read, or worse, a wrong command at 2am.
Real world

The it that deleted a table. A runbook said "the job repopulates the table after the sync, so you can safely drop it." An on-call engineer read "it" as the table. It was the sync. The postmortem fix was one word: replace "it" with the noun. Pronoun discipline is an incident-prevention technique, not a style preference.

Self-studyAcronyms: when to define, when to just say the words2 min read▶

Google's acronym rules are more restrictive than most people expect, and they save readers real effort:

  • On first use, spell out the full term in bold with the acronym in parentheses: "directed acyclic graph (DAG)". After that, use only the acronym - do not flip between the two.
  • Only introduce an acronym at all if it is significantly shorter than the full term AND appears many times in the doc. An acronym used twice is a puzzle, not a shortcut - just write the words.
  • Remember the cost model. Every acronym makes the reader run a tiny mental lookup on each occurrence. Familiar ones (CSV, API) are free for your audience; team-invented ones (PMDQ, the "pipeline metrics daily quality" job) are not.
Writing tip Your audience statement from Session 1 decides which acronyms are free. For Pulse's primary audience (a new data analyst), CSV and UTC need no definition; anything invented inside your team does.
Part 2 · covers Google TW One "Active voice" + "Clear sentences" + "Short sentences", Microsoft "Revise weak writing"

Active, strong, short 8 min live

Google's formula for a working sentence is actor + verb + target: who does what to whom. Most weak technical sentences fail this three ways at once - passive voice hides the actor, a vague verb hides the action, and three ideas share one sentence. The fix is surgery, and it is teachable.

BEFORE · 1 sentence, 3 ideas, 0 actors "The rows are deduplicated and invalid types are filtered and then the daily metrics are calculated by the process." cut at each idea, name each actor AFTER · 3 sentences, 1 idea each, actor + verb + target clean.py dedups rows on event_id. It drops invalid event types. metrics.py computes daily aggregates. Same facts, half the words, zero re-reads. Shorter sentences are more maintainable, like shorter code.
🔍 Click to zoom - sentence surgery: one passive three-idea sentence becomes three short active ones
LiveSpot the passive: "form of be + past participle"3 min▶

You don't need grammar school to find passive voice - you need one pattern. Passive verbs are a form of be (is, are, was, were, been, being) plus a past participle (usually a verb ending in -ed or -en). Find that pattern, and you've found a sentence hiding its actor.

Passive (be + past participle)Active (actor + verb + target)
"The rows are dropped if event_id is missing.""ingest.py drops rows that are missing event_id."
"Timestamps are converted to UTC.""clean.py converts timestamps to UTC."
"Low days are flagged.""metrics.py flags days with fewer than 50 events as LOW."

Notice what the active versions add for free: the actor. In pipeline docs the actor is usually a specific script, and naming it answers the reader's next question ("which script do I look at?") before they ask it. Active is also shorter - the passive tax is roughly two words per sentence, forever.

★ Try it nowGrep your last runbook or README for these six words: is, are, was, were, been, being. Check each hit: is it followed by a past participle? If yes, ask "who actually does this?" - and if you know the answer, rewrite with the actor first. If you DON'T know the answer, you just found a real knowledge gap wearing a grammar costume.
LiveOne idea per sentence, strong verbs only3 min▶

Google draws the analogy explicitly: shorter code is more maintainable, and so are shorter sentences. Each sentence should carry exactly one idea; when a sentence carries a list of things, convert it into an actual list (Session 3 goes deep on lists).

  • The comma-and test. Every ", and" in a long sentence is a candidate cut point. "ingest.py validates headers, and it drops bad rows, and it writes staged output" is three sentences wearing a trench coat.
  • Strong, specific verbs. "Occurs", "happens", "is done" are verb-shaped placeholders. "The dedup happens in clean.py" tells you less than "clean.py dedups rows on event_id" in the same breath. Weak verb + noun ("performs validation of") is one strong verb ("validates") in disguise.
  • Reduce "there is / there are". These openers bury the real subject. "There is a threshold that flags low days" becomes "metrics.py flags days below the threshold". The sentence starts doing work two words sooner.
  • Vague adjectives are unpaid promises. "Very fast", "quite large", "significantly better" - replace with the number. "Drops about 3% of rows" beats "drops some rows" in every audience.
  • That vs which, the US convention: that introduces a clause the sentence needs (restrictive, no comma); which plus a comma adds an aside the sentence survives without (nonrestrictive). "Rows that lack event_id are dropped" vs "config.yaml, which lives in the repo root, holds the settings."
Self-studyMicrosoft's rewrite moves, with receipts3 min read▶

Microsoft's Top 10 tips arrive at the same place as Google from the product-writing side, and their before/after pairs are worth memorizing verbatim:

  • "Use bigger ideas, fewer words." Their example: "If you're ready to purchase Office 365 for your organization, contact your Microsoft account representative." becomes "Ready to buy? Contact us." Same decision enabled, 80% fewer words.
  • "Write like you speak." Read your sentence aloud; if you'd never say it to a colleague at their desk, rewrite it until you would. Contractions are welcome - "don't" reads faster than "do not".
  • "Revise weak writing." Three concrete moves: start sentences with a verb where you can, cut "you can" openers, and avoid "there is / there are / there were". Their example: "You can access Office apps across your devices..." becomes "Store files online, access them from all your devices, and share them with coworkers." Every clause now starts with the action.
  • The shared consensus. Where Google and Microsoft agree, treat it as law: second person "you", active voice, present tense (avoid "will" for things that simply happen), US spelling, no unexplained jargon.
Writing tip Present tense is underrated in pipeline docs. "The script will write staged output" quietly implies a future that might not arrive. "The script writes staged output" describes behavior. Reserve "will" for genuine futures, like deprecation dates.
Build-along 1 of 3

Autopsy NOTES.txt ★ 7 min · everyone follows

In Session 1 you read pulse/NOTES.txt and felt the pain. Today we diagnose it with the tools from Parts 1 and 2. Every fact in this paragraph is true, and almost every sentence-level rule is broken. That combination - true but unusable - is what most tribal-knowledge docs look like.

pulse/NOTES.txt - the patientthe pipeline is basically run by the scripts and it should be noted that the data that is being processed by them is ingested and staged and cleaned and then the metrics are being calculated by the last one, there is deduplication that is happening somewhere in the process and also events that are not valid are being filtered out by it which is important, the config has the settings and it can be changed if it is needed but be careful because if it is wrong then things will not work, when it is run the order matters a lot and if you do not run them in the right order there will be problems that are hard to debug, also the timestamps are being converted so that they are consistent which was a thing that caused issues before, the alert threshold thing is in there too and it flags days that are low which the team looks at, ask Dana about the value column because there is history there.

Underline every passive verb. Hunt the tell: form of be + past participle. "is run", "is ingested", "are being calculated", "are being filtered", "are being converted"... count them (there are at least seven). Notice not one names which script does the work.

Circle every ambiguous pronoun. "filtered out by it" - by what? "if it is wrong" - the config or the change? "when it is run" - which script? Each wobbly "it" forces the reader to guess, and at 2am guesses become incidents.

Count ideas per sentence. Trick question: it is one sentence. One 160-word sentence carrying seven distinct facts, joined by commas and "and". Say out loud how many sentences this should be.

Find the buried treasure. Two genuinely important facts are hiding mid-clause: wrong config fails without an error message, and timestamps caused real issues before. Both deserve their own sentence, up front.

Writing tip Notice "it should be noted that" and "basically" add zero information - pure filler. Google's short-sentences unit says cut these on sight. If something should be noted, note it.
Build-along 2 of 3

Rewrite it: docs/notes-rewrite.md ★ 10 min · build your own

Now the surgery. Same facts, new sentences. Target: every sentence active with a named actor, one idea each, official terminology only (staged, cleaned, metrics - locked in Part 1). This file becomes raw material for the README in Session 4.

Create docs/notes-rewrite.md. List the facts first, one per line, before writing prose - extraction and rewriting are separate jobs.

Rewrite each fact as one active sentence. For each, ask: who is the actor? In Pulse it is always one of three scripts, config.yaml, or you the operator.

Check terminology: the word for ingest.py's output is staged, everywhere. No "validated", no "preprocessed".

Handle "ask Dana". A doc that ends in "ask a person" has a hole where a fact should be. Convert it to a visible, honest placeholder that names the missing fact - then actually go ask Dana this week.

docs/notes-rewrite.md - the rewrite target# Pulse pipeline notes (rewritten from NOTES.txt) Pulse runs three scripts in a fixed order: ingest.py, then clean.py, then metrics.py. Running them out of order produces failures that are hard to debug. clean.py dedups rows on event_id and drops event types not listed in config.yaml. clean.py also converts every timestamp to UTC ISO format; inconsistent timestamps caused real issues before this step existed. config.yaml holds all pipeline settings, and a wrong value fails silently - check it first when output looks wrong. metrics.py computes daily aggregates and flags any day with fewer than 50 events as LOW. The team reviews LOW days. TODO: document the history of the value column (source: Dana - the fact belongs in this doc, not in Dana).
★ Compare the two Same seven facts. The original: one sentence, seven passives, five wobbly pronouns, zero named actors. The rewrite: eight sentences, every actor named, and a knowledge gap turned into a tracked TODO instead of a tribal ritual. Time a colleague reading each - the rewrite wins by minutes, forever, for every reader.
Build-along 3 of 3

The 10-minute sentence workout ★ 8 min · build your own

Now run the same passes on your own writing. Pick one doc you own - a README, a runbook, that design note you keep meaning to fix - and give it four timed passes. Mechanical, repeatable, no inspiration needed.

Pass 1 - passive hunt (3 min). Search for is, are, was, were, been, being. Rewrite every be + past participle where you can name the actor. Flag the ones where you can't - those are knowledge gaps, not grammar problems.

Pass 2 - pronoun check (2 min). Search for it, they, this, that. Any pronoun more than about five words from its noun, or with two possible owners: repeat the noun.

Pass 3 - sentence split (3 min). Any sentence over roughly 25 words or with more than one ", and": cut it at the idea boundaries. Three or more parallel items become a list.

Pass 4 - filler sweep (2 min). Delete "basically", "it should be noted that", "in order to", "very", "quite". Replace vague adjectives with numbers where you know them.

Real world

The workout as a review habit. One data team made pass 1 and pass 2 a checklist item on runbook PRs - two searches, five minutes. Within a quarter, their on-call handoff questions dropped noticeably, because runbooks finally said which script does what. The workout scales better as a review habit than as a heroic rewrite.

Homework

Try it yourself - this week ◐ 30-45 min total

Source material

Official sources covered

This session teaches the working content of these source units. What stays with the originals: the full worked exercise sets and answer keys.

✓Google TW One · WordsPart 1: terminology consistency, definitions, acronym rules, pronoun distance
✓Google TW One · Active voicePart 2: actor + verb + target, the be + past participle tell
✓Google TW One · Clear sentencesPart 2: strong verbs, reducing there is/are, replacing vague adjectives with data
✓Google TW One · Short sentencesPart 2: one idea per sentence, converting to lists, cutting filler, that vs which
✓Microsoft Style Guide · Top 10 tipsPart 2 self-study: bigger ideas fewer words, write like you speak, revise weak writing
◐Google TW One · Just enough grammarOptional refresher unit; read it if "past participle" felt fuzzy today
Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · The reliable tell that a sentence is in passive voice is...

"Is dropped", "are being converted", "was flagged" - be + past participle is the pattern. Length and "there is" are separate (also fixable) problems.

2 · "Run clean.py after ingest.py finishes; it dedups the rows." What's wrong?

Two script names sit within range of "it", so the pronoun wobbles. Google's fix: keep pronouns within about five words of one clear noun, or repeat the noun.

3 · Google justifies "one idea per sentence" with an analogy to...

The analogy is straight from the short-sentences unit: sentences are like code, and shorter units are easier to read, maintain and debug.

Session 2 cheat sheet · pin this

One concept, one namePick the official term once, use it everywhere. Synonyms read as new concepts. Pulse's terms: staged, cleaned, metrics.
Define or linkNew term? Link to a definition or define it on first use. Never make readers infer meaning from usage.
Acronym rulesBold full term (acronym) on first use. Only coin one if it's much shorter AND used often - otherwise just say the words.
Pronoun leashKeep it/they/this/that within ~5 words of their noun. Two possible owners? Repeat the noun.
Passive tellForm of be + past participle. Rewrite as actor + verb + target - in pipeline docs the actor is usually a script.
Strong verbsKill "occurs", "happens", "there is/are". Replace vague adjectives with numbers.
One idea per sentenceEvery ", and" is a candidate cut. Three parallel items become a list. Cut "basically" and "it should be noted".
Pulse statusAudience ✓ · plan ✓ · notes-rewrite.md ✓ (active, one idea each, official terms). Structure lands in Session 3, README in Session 4.