Your country

Tools that support it use your country for local currency, number formats, units and paper size. Your choice is saved only in this browser.

Type a name or a two-letter code. Use the up and down arrow keys to move through the countries, Enter to choose one and Escape to close.

Professional English for Developers  Module 3 – Grammar that changes meaning at work

Articles and countable nouns in tech writing

Choose a, an, the or no article for technical nouns, pick a or an by sound before API or SQL, and use feedback, software and data without slips.

  • Beginner
  • 20 minutes
  • Examples run with Node.js 24.21.0 and quickjs 0.32.0
  • By MySmartCoPilot
Free lesson, Pro answers: 20 minutes
Free: the whole lesson. With a pass: the model answers to its 2 interview questions.

What you will learn

  • Choose a, an, the or no article for technical nouns in tickets, docs and messages
  • Choose a or an by the first sound of the next word, including abbreviations such as SQL, FAQ and API
  • Use uncountable nouns such as feedback, information, software and advice with the right words around them
  • Write plurals of abbreviations and product names without apostrophes

Before you start

What you’ll learn · Before you start

What you will learn

  • Choose a, an, the or no article for technical nouns in tickets, docs and messages
  • Choose a or an by the first sound of the next word, including abbreviations such as SQL, FAQ and API
  • Use uncountable nouns such as feedback, information, software and advice with the right words around them
  • Write plurals of abbreviations and product names without apostrophes

Before you start

On this page

Hindi, Marathi, Urdu, Russian, Korean and Polish have no words for a and the: the World Atlas of Language Structures (WALS) codes 198 of the 620 languages in its sample that way. If you think in one of them, English articles are a habit to build rather than a word to translate, and a bug report such as “Fixed bug in payment page” is what happens without it.

This lesson gives you four questions to ask of every noun, so you can choose a, an, the or no article in tickets, docs and stand-ups. You will choose a or an by sound, use nouns such as feedback and software that take no a, and write plurals such as APIs without an apostrophe. Small programs check each habit, and you can run them on your own sentences.

A or an for something new, the for something the reader knows

Compare two lines a teammate might post in the team channel: “A test failed on staging” and “The test failed on staging”. The first reports one test among many, one the reader has not heard of yet. The second says that the test you were both waiting for has failed. One word changes what the reader does next: look up which test, or go straight to the one they know.

English marks this difference with its articles. A or an introduces something the reader does not know yet, or any one of a kind: a user, a bug, a new branch. The points at something the reader can identify, because you have mentioned it already or because there is only one in your shared context: the build, the main branch, the login page of your app. A singular countable noun: A noun with a singular and a plural that you can count: one bug, two bugs. In the singular it needs a, an, the or another determiner. such as bug never stands alone. It needs an article or another determiner: A word in front of a noun that says which one or how many, such as a, an, the, this, my, each or some. A singular countable noun always needs one. that does the same job, such as this, my or each. The British Council’s elementary lesson on articles gives the same rules, with drills if you want more practice.

Step through the four questions with five nouns from this lesson’s messages:

Interactive · stage by stage Choosing the article for one noun Step through five nouns from the messages of this lesson. Each one goes through the same four questions, in order.
Choosing the article for one noun, step 9 of 9. Showing One noun of your text (API key), Can you count it? (feedback: no a, no -s), One, or in general? (in general: no article), Reader knows which? (the only one: the), First sound: a or an (an API key). In focus: First sound: a or an.the next nounOne noun of your textAPI keyCan you count it?feedback: no a, no -sOne, or in general?in general: no articleReader knows which?the only one: theFirst sound: a or anan API key

The drawing shows the whole scene; its 9 steps are listed below.

Every step as text
  1. Start with bug. The update says "Yesterday I fixed bug in payment page." Take its nouns one at a time, starting with bug.
  2. Bug is countable. You can say two bugs, so bug is countable. A singular countable noun never stands alone in English: it needs a, an, the or another word such as this or my.
  3. One bug. The sentence is about one bug, the one you fixed, not about bugs in general.
  4. A first mention. The reader has not heard of this bug before, so it takes a or an. Once you have mentioned it, it becomes the bug.
  5. A consonant sound. Bug starts with the consonant sound b, so the article is a: "I fixed a bug".
  6. Payment page. The app has one payment page and the reader knows it, so it takes the: "on the payment page". A or an would suggest one payment page among several.
  7. Feedback. In "got a feedback from QA", feedback cannot be counted: nobody says two feedbacks. It takes no a or an: "got feedback" or "got some feedback".
  8. Logs in general. In "Logs help when a build fails", logs means logs of every kind, not some logs the reader knows. A plural used in general takes no article.
  9. An API key. In "I need API key", key is countable, there is one, and the reader does not know it yet. API starts with the vowel sound of "ay", so: "I need an API key".

The program below checks the first rule for you. It looks for a singular countable noun from its list with no article or other determiner in front of it, in a bug report and a stand-up update, before and after a rewrite:

Nouns without an article, before and after JavaScript · report/missing_articles.mjs
// A check for one common slip: a singular countable noun with no article in front of it ("fixed bug in payment
// page"). It knows only the nouns and the describing words in its two lists, so treat a flag as a question for the
// writer, and add your own team's words to the lists.

const NOUNS = new Set([
  'app', 'bug', 'build', 'button', 'check', 'crash', 'error', 'file', 'fix', 'flow', 'issue', 'log', 'page', 'pr',
  'release', 'screen', 'server', 'service', 'test', 'token', 'user',
]);
// Words that can stand between an article and its noun ("the new login page").
const DESCRIBING = new Set(['android', 'auth', 'build', 'correct', 'login', 'new', 'old', 'payment', 'refund', 'staging', 'token', 'wrong']);
// Words that already do the article's job.
const DETERMINERS = new Set([
  'a', 'an', 'the', 'this', 'that', 'my', 'your', 'our', 'their', 'its', 'his', 'her', 'each', 'every', 'any', 'no',
  'one', 'another', 'which', 'what', 'some',
]);

const isNoun = (w) => NOUNS.has((w ?? '').toLowerCase());

function bareNouns(sentence) {
  const words = sentence.replace(/[.,:;!?]/g, ' ').split(/\s+/).filter(Boolean);
  const flagged = [];
  words.forEach((w, i) => {
    if (!isNoun(w)) return;
    // A noun followed by a number is a name: "release 4.2", "PR 412".
    if (/^\d/.test(words[i + 1] ?? '')) return;
    // A noun in front of another noun describes it: "build log", "token check".
    if (isNoun(words[i + 1])) return;
    let start = i;
    while (start > 0 && DESCRIBING.has(words[start - 1].toLowerCase())) start--;
    const before = (words[start - 1] ?? '').toLowerCase();
    if (!DETERMINERS.has(before) && !/'s$/.test(before)) flagged.push(words.slice(start, i + 1).join(' '));
  });
  return flagged;
}

function report(label, text) {
  let total = 0;
  console.log(label);
  for (const s of text.split(/(?<=[.!?])\s+/)) {
    const flags = bareNouns(s);
    total += flags.length;
    console.log(`  ${s}`);
    if (flags.length) console.log(`    no article: ${flags.join(', ')}`);
  }
  console.log(`  ${total} noun phrase${total === 1 ? '' : 's'} without an article\n`);
}

const bugBefore =
  'Sign-in fails in Android app. User enters correct OTP but screen shows error. ' +
  'Issue started after release 4.2. Fix is to update token check in auth service.';
const bugAfter =
  'Sign-in fails in the Android app. A user enters the correct OTP, but the screen shows an error. ' +
  'The issue started after release 4.2. The fix is to update the token check in the auth service.';

const standupBefore =
  'Yesterday I fixed bug in payment page and raised PR. Today I will write test for refund flow. ' +
  'Blocker: staging server is down, so I need access to build log.';
const standupAfter =
  'Yesterday I fixed a bug on the payment page and raised a PR. Today I will write a test for the refund flow. ' +
  'Blocker: the staging server is down, so I need access to the build log.';

report('Bug report, before', bugBefore);
report('Bug report, after', bugAfter);
report('Stand-up update, before', standupBefore);
report('Stand-up update, after', standupAfter);

Output

Bug report, before
  Sign-in fails in Android app.
    no article: Android app
  User enters correct OTP but screen shows error.
    no article: User, screen, error
  Issue started after release 4.2.
    no article: Issue
  Fix is to update token check in auth service.
    no article: Fix, token check, auth service
  8 noun phrases without an article

Bug report, after
  Sign-in fails in the Android app.
  A user enters the correct OTP, but the screen shows an error.
  The issue started after release 4.2.
  The fix is to update the token check in the auth service.
  0 noun phrases without an article

Stand-up update, before
  Yesterday I fixed bug in payment page and raised PR.
    no article: bug, payment page, PR
  Today I will write test for refund flow.
    no article: test, refund flow
  Blocker: staging server is down, so I need access to build log.
    no article: staging server, build log
  7 noun phrases without an article

Stand-up update, after
  Yesterday I fixed a bug on the payment page and raised a PR.
  Today I will write a test for the refund flow.
  Blocker: the staging server is down, so I need access to the build log.
  0 noun phrases without an article

Recorded with Node.js 24.21.0 on macOS 26 arm64. To run it yourself: mise exec node@24.21.0 -- node missing_articles.mjs

The two drafts left 15 noun phrases without an article, and the rewrites none. The rewrite added a for the bug, the user and the PR, which the reader meets for the first time, and the for the app, the screen, the payment page and the staging server, of which there is only one. The checker also missed a slip: correct OTP needs the, but OTP is not in its list. A checker finds the slips it knows; reading the sentence finds the rest.

Check a sentence of your own

Press Edit, put a sentence from your last ticket into bugBefore, and add its nouns to NOUNS if the checker does not know them. Run it and decide, for each flag, whether the reader meets the thing for the first time.

Every flag, whatever the noun, comes down to the same two questions: can you count it, and does the reader know which one you mean?

Key idea

Give every singular countable noun an article: a or an when the reader meets it for the first time, the when the reader can tell which one you mean.

Checkpoint

Check: A or an for something new, the for something known

  1. Question 1 of 2 A teammate posts "The test failed on staging." What does it tell the channel that "A test failed on staging" would not?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: Which test failed, because it is one the readers can identify, such as the test they were waiting for

    The test is one the readers can identify: mentioned before, or the only one in the context. A test is one of many, new to the reader. One word changes what the channel does next.

  2. Question 2 of 2 Fill both gaps: "I found ___ bug in the export job. ___ bug drops the last row of every file."

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: a, The

    A or an for the first mention, the once the reader knows which one: "I found a bug in the export job. The bug drops the last row of every file."

No article for things in general, and none before product names

Not every noun needs an article. A plural or an uncountable noun used in general takes none: “Logs help when a build fails”, “Code needs tests”, “Feedback makes a design better”. These sentences are about logs, code and feedback of every kind, not about some logs the reader knows. The British Council’s lesson gives the rule for general statements: “we normally use a plural or uncountable noun with no article”. Add the and the meaning narrows: “The logs show a timeout” means the logs of this incident.

Product names take no article either. Google’s style guide says not to put the before a product name unless the name modifies something else, and to use the before tool and API names. So you install Kubernetes, open the Kubernetes dashboard and call the Transcoder API. Five sentences from team messages show both rules at work:

Sentence Article Why
Logs help when a build fails. none before logs logs of every kind
The logs show a timeout at 02:14 UTC. the the logs of this incident
Code needs tests before it is merged. none code and tests in general
Install Kubernetes on the test machine. none before Kubernetes a product name
Open the Kubernetes dashboard. the it belongs to dashboard

Keep the articles in headings and short labels too. Google’s guide asks writers not to skip articles for brevity, “including in headings and titles”, and gives Create a VM instance rather than Create VM instance. Microsoft’s writing tips give the reason that matters for a global team: an article tells the reader, and translation software too, that a noun is coming and which words describe it.

Adding the to a general statement

“The documentation is important for the new developers” sounds as if you mean one set of documents and one group of people. If you mean documentation and new developers in general, drop both: “Documentation is important for new developers.”

Checkpoint

Check: No article in general statements and before names

  1. Question 1 of 2 Which sentence is right with no article before its nouns?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: Code needs tests before it is merged.

    Plurals and uncountable nouns in general statements take no article: "Code needs tests." A singular countable noun always takes one.

  2. Question 2 of 2 Google's style guide says not to put the before a product name unless the name modifies something else. Which line follows that advice?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: Install Kubernetes, then open the Kubernetes dashboard.

    No article before the product name, and the before the noun it describes: "Install Kubernetes, then open the Kubernetes dashboard."

A or an goes by sound, so it is an API and a URL

Is it a API or an API? The letter does not decide; the first sound does. An goes before a vowel sound and a before a consonant sound, whatever the spelling: an hour (the h is silent), a user (said “you-zer”), a one-time password (“wun”). Google’s guide gives the same rule, and the case that matters most in tech follows from it: an abbreviation said letter by letter starts with the sound of its first letter’s name. API is said “ay-pee-eye”, so it is an API. URL is “you-ar-el”, the pronunciation Oxford’s learner’s dictionary gives, so it is a URL.

Some abbreviations are said two ways, and then the rule has two answers. Oxford lists both “eff-ay-cue” and “fack” for FAQ. Google’s word list prefers a SQL, “pronounced ‘a sequel’”, and an SAP system, because SAP is said letter by letter; its general advice is to base the choice on the pronunciation that is most common for your audience. The program applies the rule to 18 words and abbreviations from tickets and docs, then checks seven short phrases:

A or an for 18 terms, chosen by their first sound JavaScript · aan/a_or_an.mjs
// A or an goes by the first SOUND of the next word, not by its first letter. An abbreviation said letter by letter
// starts with the sound of its first letter's name (A is "ay", F is "eff", U is "you"); one said as a word starts
// like that word. Where readers say a term two ways, the rule gives two answers, and you choose the one most of your
// readers use.

// The names of the letters, as they are said.
const LETTER = {
  A: 'ay', B: 'bee', C: 'see', D: 'dee', E: 'ee', F: 'eff', G: 'jee', H: 'aitch', I: 'eye', J: 'jay', K: 'kay',
  L: 'el', M: 'em', N: 'en', O: 'oh', P: 'pee', Q: 'cue', R: 'ar', S: 'ess', T: 'tee', U: 'you', V: 'vee',
  W: 'double-you', X: 'ex', Y: 'why', Z: 'zed',
};
const DIGIT = { 0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine' };

// How a term is said when the spelling misleads: a silent h, a u or an o said with a consonant sound, and the
// abbreviations that many people say as a word. Add your own terms here.
const SAID = {
  hour: ['our'],
  honest: ['onnest'],
  user: ['yoo-zer'],
  unique: ['yoo-neek'],
  'one-time': ['wun-time'],
  SQL: ['see-kwel', 'ess-cue-el'],
  FAQ: ['fack', 'eff-ay-cue'],
};

// Letter by letter: "S3" is "ess three", "HTTP" is "aitch tee tee pee".
const spelledOut = (term) => [...term].map((c) => LETTER[c] ?? DIGIT[c] ?? c).join(' ');
const saidAs = (term) => SAID[term] ?? (/^[A-Z0-9]+$/.test(term) ? [spelledOut(term)] : [term.toLowerCase()]);
// A vowel sound starts with a, e, i, o or u in these spellings ("you" and "wun" start with consonant sounds).
const articleFor = (spoken) => (/^[aeiou]/.test(spoken) ? 'an' : 'a');

const TERMS = ['hour', 'honest', 'user', 'unique', 'one-time', 'URL', 'API', 'HTTP', 'HR', 'LLM', 'MVP', 'NPM', 'S3', 'SAP', 'XML', 'EOD', 'SQL', 'FAQ'];

console.log('term       said as                 article');
const counts = { a: 0, an: 0, either: 0 };
for (const term of TERMS) {
  const ways = saidAs(term);
  const articles = [...new Set(ways.map(articleFor))];
  const verdict = articles.length > 1 ? 'either: choose by how your readers say it' : articles[0];
  counts[articles.length > 1 ? 'either' : articles[0]]++;
  console.log(`${term.padEnd(10)} ${ways.join(' / ').padEnd(23)} ${verdict}`);
}
console.log(`\n${counts.an} take an, ${counts.a} take a, ${counts.either} depend on the reader\n`);

// The same rule as a check on short phrases.
const PHRASES = ['a hour', 'an user', 'a API', 'a URL', 'an HTTP request', 'an SQL query', 'a SQL query'];
for (const phrase of PHRASES) {
  const [written, term] = phrase.split(' ');
  const allowed = [...new Set(saidAs(term).map(articleFor))];
  const verdict = allowed.includes(written) ? 'fine' : `write "${allowed.join('" or "')} ${term}"`;
  console.log(`${phrase.padEnd(16)} ${verdict}`);
}

Output

term       said as                 article
hour       our                     an
honest     onnest                  an
user       yoo-zer                 a
unique     yoo-neek                a
one-time   wun-time                a
URL        you ar el               a
API        ay pee eye              an
HTTP       aitch tee tee pee       an
HR         aitch ar                an
LLM        el el em                an
MVP        em vee pee              an
NPM        en pee em               an
S3         ess three               an
SAP        ess ay pee              an
XML        ex em el                an
EOD        ee oh dee               an
SQL        see-kwel / ess-cue-el   either: choose by how your readers say it
FAQ        fack / eff-ay-cue       either: choose by how your readers say it

12 take an, 4 take a, 2 depend on the reader

a hour           write "an hour"
an user          write "a user"
a API            write "an API"
a URL            fine
an HTTP request  fine
an SQL query     fine
a SQL query      fine

Recorded with Node.js 24.21.0 on macOS 26 arm64. To run it yourself: mise exec node@24.21.0 -- node a_or_an.mjs

Twelve of the 18 take an, four take a, and two, SQL and FAQ, depend on how your readers say them. The letters to watch are the ones whose names start with a vowel sound: A, E, F, H, I, L, M, N, O, R, S and X. That is why an HR policy, an LLM, an MVP and an S3 bucket are right, although each starts with a consonant letter.

Choosing by the letter instead of the sound

A HTTP request looks right because H is a consonant letter, but you say “aitch”: an HTTP request. The opposite slip is an user and an URL: both start with the sound “you”, so they take a.

Passive Voice & Writing Style Checker Paste a draft to find a or an in front of a word whose first sound needs the other one, along with passives and long sentences.

Checkpoint

Check: A or an by the first sound

  1. Question 1 of 2 Which phrases are right?

    Choose every answer that is right.

    Show the answer: Question 1 of 2

    Answer:

    • a URL
    • an LLM
    • an HTTP request

    The first sound decides: "aitch", "el" and "em" start with vowel sounds, "you" with a consonant sound. So an HTTP request, an LLM, an MVP, a URL and a user.

  2. Question 2 of 2 Your team says SQL letter by letter; the product docs say "a SQL query". A reviewer asks you to change every "an SQL query" in your README. What is right?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: Both forms follow the rule; choose by how most of your readers say it, and use one form in each document

    For a term said two ways, the article follows the pronunciation most common for your readers. Agree on one form for your documents, so the reviewer and the README say the same.

Feedback, software and advice take no a and no plural

Oxford’s learner’s dictionary marks feedback, software, information, advice, hardware and equipment as uncountable, and lists several of them among the uncountable nouns often used wrongly. An uncountable noun: A noun with no plural that takes no a or an, such as feedback, software or advice. Use some, a piece of or a countable noun instead. has no plural and takes no a or an. Write some feedback, a piece of advice or two new tools, never a feedback, advices or softwares. Oxford’s note on advice says it directly: “We say a piece of advice (not ‘an advice’)”.

Two tech nouns need a second look. Code meaning program instructions is uncountable, as in Oxford’s example “a few lines of code”, so you push the code, never the codes. Separate codes, such as error codes or OTP codes, are countable. Data is marked both uncountable and plural: “The data shows a spike” is normal at work, and “These data show” is the form of specialist writing, such as scientific papers.

The program checks ten sentences for the noun forms of this section and the next:

Ten sentences checked for uncountable nouns and plurals JavaScript · nouns/noun_forms.mjs
// Checks ten sentences for the noun forms this lesson names: a or an, or a plural, on an uncountable noun ("a
// feedback", "softwares"); "codes" for program code; an apostrophe in the plural of an abbreviation ("API's"); a
// plural unit after a number ("64 GBs"); and the plural of a product name ("two GitHubs").

// Marked [uncountable] in the Oxford Advanced Learner's Dictionary, with words to use instead of a or an.
const UNCOUNTABLE = {
  feedback: 'some feedback, or a comment',
  advice: 'some advice, or a piece of advice',
  information: 'some information, or a detail',
  software: 'some software, or a program or a tool',
  hardware: 'some hardware, or a device',
  equipment: 'some equipment, or a piece of equipment',
};
// "codes" is right for separate codes, such as error codes, and wrong for program code.
const CODE_KINDS = /\b(?:error|status|exit|response|country|discount|OTP|QR)\s+codes\b/i;
const PRODUCTS = ['GitHub'];

function problems(sentence) {
  const out = [];
  for (const [noun, use] of Object.entries(UNCOUNTABLE)) {
    // "a software engineer" is fine: there the noun describes the next noun.
    const alone = `(?=[.,;:!?]|$|\\s(?:on|about|for|from|of|to|in|with|and|is|was)\\b)`;
    if (new RegExp(`\\ban? (?:\\w+ )?${noun}${alone}`, 'i').test(sentence)) out.push(`no a or an before ${noun}: ${use}`);
    if (new RegExp(`\\b${noun}s\\b`, 'i').test(sentence)) out.push(`${noun} has no plural: ${use}`);
  }
  if (/\bcodes\b/i.test(sentence) && !CODE_KINDS.test(sentence)) out.push('program code is uncountable: the code');
  const apostrophe = sentence.match(/\b[A-Z][A-Z0-9]*[A-Z0-9]'s\b/g);
  if (apostrophe) out.push(`a plural takes s alone: ${apostrophe.map((a) => a.replace("'s", 's')).join(', ')}`);
  const unit = sentence.match(/\b\d+(?:\.\d+)?\s?(?:KB|MB|GB|TB)s\b/g);
  if (unit) out.push(`a unit's abbreviation stays singular: ${unit.map((u) => u.slice(0, -1)).join(', ')}`);
  for (const p of PRODUCTS) {
    if (new RegExp(`\\b${p}s\\b`).test(sentence)) out.push(`no plural of a product name: two ${p} repositories, projects or files`);
  }
  return out;
}

const PAIRS = [
  ['Thanks for the feedbacks on my PR.', 'Thanks for the feedback on my PR.'],
  ['Can you give me an advice on the schema?', 'Can you give me some advice on the schema?'],
  ['We need more informations about the crash.', 'We need more information about the crash.'],
  ['The team installed two new softwares.', 'The team installed two new tools.'],
  ['I wrote the codes for the parser.', 'I wrote the code for the parser.'],
  ['The service returns three error codes.', 'The service returns three error codes.'],
  ["We expose three API's to partners.", 'We expose three APIs to partners.'],
  ['Each VM has 64 GBs of memory.', 'Each VM has 64 GB of memory.'],
  ['Clone both GitHubs before the workshop.', 'Clone both GitHub repositories before the workshop.'],
  ['The data shows a spike at 02:00 UTC.', 'The data shows a spike at 02:00 UTC.'],
];

let before = 0;
let after = 0;
PAIRS.forEach(([original, fixed], i) => {
  const found = problems(original);
  before += found.length;
  after += problems(fixed).length;
  console.log(`${String(i + 1).padStart(2)}  ${original}`);
  for (const f of found) console.log(`      ${f}`);
  if (fixed !== original) console.log(`    -> ${fixed}`);
  else console.log('    (nothing to fix)');
});
console.log(`\nProblems: ${before} before, ${after} after`);

Output

 1  Thanks for the feedbacks on my PR.
      feedback has no plural: some feedback, or a comment
    -> Thanks for the feedback on my PR.
 2  Can you give me an advice on the schema?
      no a or an before advice: some advice, or a piece of advice
    -> Can you give me some advice on the schema?
 3  We need more informations about the crash.
      information has no plural: some information, or a detail
    -> We need more information about the crash.
 4  The team installed two new softwares.
      software has no plural: some software, or a program or a tool
    -> The team installed two new tools.
 5  I wrote the codes for the parser.
      program code is uncountable: the code
    -> I wrote the code for the parser.
 6  The service returns three error codes.
    (nothing to fix)
 7  We expose three API's to partners.
      a plural takes s alone: APIs
    -> We expose three APIs to partners.
 8  Each VM has 64 GBs of memory.
      a unit's abbreviation stays singular: 64 GB
    -> Each VM has 64 GB of memory.
 9  Clone both GitHubs before the workshop.
      no plural of a product name: two GitHub repositories, projects or files
    -> Clone both GitHub repositories before the workshop.
10  The data shows a spike at 02:00 UTC.
    (nothing to fix)

Problems: 8 before, 0 after

Recorded with Node.js 24.21.0 on macOS 26 arm64. To run it yourself: mise exec node@24.21.0 -- node noun_forms.mjs

Eight of the ten had a problem, and none of the rewrites has one. Sentences 6 and 10 were right all along: three error codes are separate codes, and “the data shows” is fine at work. When a countable word says what you mean, use it:

Not Write Or, with a countable noun
a feedback, feedbacks feedback, some feedback a comment, two comments
an advice, advices advice, a piece of advice a suggestion, three tips
informations information a detail, the details
softwares software a program, two tools
the codes (of a parser) the code two scripts

Checkpoint

Check: Uncountable nouns: no a, no plural

  1. Question 1 of 2 Which rewrites of "Thanks for the feedbacks, I will act on all of them" are right?

    Choose every answer that is right.

    Show the answer: Question 1 of 2

    Answer:

    • Thanks for the feedback. I will act on all of it.
    • Thanks for the comments. I will act on all of them.

    Either keep the uncountable noun and drop the plural ("the feedback ... all of it"), or switch to a countable noun ("the comments ... all of them").

  2. Question 2 of 2 Which sentence uses codes correctly?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: The API returns two error codes for this case.

    Code meaning program instructions is uncountable. Codes is right only for separate codes: error codes, status codes, OTP codes.

Plurals of abbreviations take s, never an apostrophe

Google’s guide treats abbreviations as regular words in the plural: “APIs, SKEs, and IDEs”, not “API’s, SKE’s, and IDE’s”. Abbreviations that end in s, sh, ch or x take es, as in OSes. An apostrophe before the s makes a plural look like a possessive, as in “the API’s rate limit”, and the guide warns that this can confuse readers and cause problems in translation. Sentences 7, 8 and 9 of the last program are this section’s three slips.

Write Not Rule
three APIs, two PRs, all VMs three API’s, two PR’s s alone, no apostrophe
two OSes two OS’s es after s, sh, ch or x
64 GB of memory 64 GBs of memory a unit’s abbreviation after a number stays singular
two GitHub repositories two GitHubs no plural of a product name
the API’s rate limit (right as it is) the apostrophe marks one API’s possession

The rules for units and product names come from the same guide. A unit’s abbreviation after a number stays singular, 64 GB, while a unit you spell out takes the plural, 64 gigabytes. A product, feature or company name takes no plural or possessive form: say what you have two of, as in two GitHub repositories.

Checkpoint

Check: Plurals of abbreviations and product names

  1. Question 1 of 2 What is the plural of PR in Google's style?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: PRs

    Abbreviations make their plural like regular words, with s alone, as in PRs, APIs and VMs.

  2. Question 2 of 2 Which line follows Google's plural rules?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: Each of the three VMs has 64 GB of memory.

    Plurals of abbreviations take s alone (VMs), and a unit's abbreviation after a number stays singular (64 GB).

Practise: a bug report, a README and an update

The exercise holds three short texts with the slips of this lesson: missing articles, a or an chosen by the letter, uncountable nouns with a or a plural, and plurals with an apostrophe. Fix them inside the quotes; the sample tests check each habit and that every fact survives:

Exercise · Easy · JavaScript

Fix the articles and nouns of a report, a README and an update

fixes.mjs holds three short texts with the slips of this lesson: a bug report, a section of a README and a status update. Fix them by editing the text inside the quotes:

  • every singular countable noun gets an article or another determiner: a or an for something the reader meets for the first time, the for something they can identify;
  • a or an goes by the first sound: an error, an API key, a user;
  • uncountable nouns such as feedback, advice and information take no a or an and no plural;
  • plurals of abbreviations take s alone, with no apostrophe;
  • every fact stays: the button, the page, the release and the builds of the report; the API key, the Node version, the config file and the FAQ of the README; the table, QA, the refund flow and the column of the update.

Run the sample tests after each text. When they pass, read the three texts aloud once: the tests know the nouns of these texts, and only you can tell whether each the points at something your reader knows.

Starter code · fixes.mjs

// Fix the articles and noun forms of each text: edit the words inside the quotes, and keep every fact.

// 1. A bug report.
export const report =
  'Export button crashes app on settings page. Steps: open app, go to settings page and tap Export button. ' +
  "App shows a error and closes. Expected: file with user's data downloads. " +
  "Crash started after release 3.4, and I reproduced it on two APK's.";

// 2. A section of a README.
export const readme =
  'The tool sends a alert to the team channel when API returns error. To install it, you need a API key and ' +
  'Node 24. Settings are in config file at root of repository. For more informations, see FAQ.';

// 3. A status update.
export const update =
  'Done: migrated orders table to new schema and got a feedback from QA. Next: write test for refund flow. ' +
  'Blocker: I need an advice on index for status column.';
The sample tests · fixes.test.mjs
import { test, assert } from 'mysmartcopilot:test';
import { report, readme, update } from './fixes.mjs';

// The lesson's checks, with the nouns of these three texts.
const NOUNS = new Set([
  'alert', 'api', 'app', 'button', 'column', 'crash', 'error', 'faq', 'file', 'flow', 'index', 'key', 'page',
  'repository', 'root', 'schema', 'table', 'test', 'tool',
]);
const DESCRIBING = new Set(['api', 'config', 'export', 'new', 'orders', 'refund', 'settings', 'status']);
const DETERMINERS = new Set([
  'a', 'an', 'the', 'this', 'that', 'my', 'your', 'our', 'their', 'its', 'each', 'every', 'any', 'no', 'one',
  'another', 'some',
]);
const isNoun = (w) => NOUNS.has((w ?? '').toLowerCase());

function bareNouns(text) {
  const flagged = [];
  for (const sentence of text.split(/(?<=[.!?])\s+/)) {
    const words = sentence.replace(/[.,:;!?]/g, ' ').split(/\s+/).filter(Boolean);
    words.forEach((w, i) => {
      if (!isNoun(w) || /^\d/.test(words[i + 1] ?? '') || isNoun(words[i + 1])) return;
      let start = i;
      while (start > 0 && DESCRIBING.has(words[start - 1].toLowerCase())) start--;
      const before = (words[start - 1] ?? '').toLowerCase();
      if (!DETERMINERS.has(before) && !/'s$/.test(before)) flagged.push(words.slice(start, i + 1).join(' '));
    });
  }
  return flagged;
}
const all = () => ({ report, readme, update });

test('every singular noun has an article or another determiner', () => {
  for (const [name, text] of Object.entries(all())) {
    assert.deepEqual(bareNouns(text), [], `${name}: these nouns have no article in front`);
  }
});

test('a or an matches the first sound', () => {
  for (const [name, text] of Object.entries(all())) {
    const anNeeded = text.match(/\ba (?:alert|error|API|index|hour|HTTP)\b/gi) ?? [];
    const aNeeded = text.match(/\ban (?:user|URL|unique|new|test|file|refund)\b/gi) ?? [];
    assert.deepEqual([...anNeeded, ...aNeeded], [], `${name}: a or an does not match the sound`);
  }
});

test('uncountable nouns take no a or an and no plural', () => {
  const alone = '(?=[.,;:!?]|$|\\s(?:on|about|for|from|of|to|in|with|and|is|was)\\b)';
  const withArticle = new RegExp(`\\ban? (?:\\w+ )?(?:feedback|advice|information|software)${alone}`, 'i');
  for (const [name, text] of Object.entries(all())) {
    assert.ok(!withArticle.test(text), `${name}: an uncountable noun has a or an`);
    assert.ok(!/\b(?:feedbacks|advices|informations|softwares)\b/i.test(text), `${name}: an uncountable noun has a plural`);
  }
});

test('plurals of abbreviations have no apostrophe', () => {
  for (const [name, text] of Object.entries(all())) {
    assert.ok(!/\b[A-Z][A-Z0-9]*[A-Z0-9]'s\b/.test(text), `${name}: a plural of an abbreviation has an apostrophe`);
  }
});

test('every fact stays', () => {
  const facts = {
    report: ['Export button', 'settings page', 'release 3.4', 'APK'],
    readme: ['alert', 'API key', 'Node 24', 'config file', 'FAQ'],
    update: ['orders table', 'QA', 'refund flow', 'status column', 'advice'],
  };
  for (const [name, list] of Object.entries(facts)) {
    for (const fact of list) assert.ok(all()[name].includes(fact), `${name} no longer says "${fact}"`);
  }
});
A hint

Start with the report. Every place where a page, a button or the app appears with nothing in front of it needs the, because the reader knows which one you mean: the settings page, the Export button, the app. Then look for a before a vowel sound (a error) and for an apostrophe in a plural (APK's).

The sample tests run on this device, in your browser (QuickJS): nothing is sent to mysmartcopilot.com. The first run downloads JavaScript (about 0.6 MB), which is kept for the next runs. A check in your browser is feedback for you, not proof that the code is right for every input.

Then answer the questions on the five habits. The session opens with the habit your answers so far show to be the weakest, and moves on from there:

Practice that adapts to you

Practise this lesson

10 questions about 5 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.

  1. Question 1 of 10 When does a singular noun take the?

    Choose one answer.

    Show the answer: Question 1 of 10

    Answer: When the reader can tell which one you mean, because you mentioned it or there is only one in your shared context

    The is for something the reader can identify. A or an is for something new to them, or any one of a kind.

  2. Question 2 of 10 During an incident you post "Restart a pod in the payments deployment." A teammate restarts one at random, but you meant the pod with the memory leak you were both looking at. Which message would have worked?

    Choose one answer.

    Show the answer: Question 2 of 10

    Answer: Restart the pod with the memory leak, payments-7f9c.

    A means any one; the means the one we both know. In an incident, say the and add the name: "Restart the pod with the memory leak, payments-7f9c."

  3. Question 3 of 10 Which nouns take no article when you talk about things in general?

    Choose one answer.

    Show the answer: Question 3 of 10

    Answer: Plurals and uncountable nouns, as in "Logs help" and "Code needs tests"

    Plurals and uncountable nouns used in general take no article. A singular countable noun always takes one, even when you mean any member of its kind.

  4. Question 4 of 10 Which heading follows Google's advice on articles?

    Choose one answer.

    Show the answer: Question 4 of 10

    Answer: Create a VM instance

    Keep articles in headings and titles too, as in Google's example "Create a VM instance".

  5. Question 5 of 10 What decides between a and an?

    Choose one answer.

    Show the answer: Question 5 of 10

    Answer: The first sound of the next word

    The sound decides: an hour, a user, an API, a URL. Spelling only helps when it matches the sound.

  6. Question 6 of 10 Which phrases are right?

    Choose every answer that is right.

    Show the answer: Question 6 of 10

    Answer:

    • an hour
    • an S3 bucket
    • a user

    A silent h gives a vowel sound (an hour); "you" and "wun" are consonant sounds (a user, a one-time password); S is said "ess" (an S3 bucket).

  7. Question 7 of 10 Which nouns does Oxford's learner's dictionary mark as uncountable?

    Choose every answer that is right.

    Show the answer: Question 7 of 10

    Answer:

    • feedback
    • advice
    • software

    Feedback, software and advice are uncountable: no plural, no a or an. Bug and comment are countable.

  8. Question 8 of 10 Rewrite: "Can you give me an advice on the index?"

    Choose one answer.

    Show the answer: Question 8 of 10

    Answer: Can you give me some advice on the index?

    "Can you give me some advice on the index?" A countable word works too: "Can you give me a suggestion?"

  9. Question 9 of 10 What is the plural of OS in Google's style?

    Choose one answer.

    Show the answer: Question 9 of 10

    Answer: OSes

    Abbreviations that end in s, sh, ch or x take es in the plural, as in OSes.

  10. Question 10 of 10 A workshop note says "Fork both GitHubs and open three PR's." Which rewrite follows Google's guidance?

    Choose one answer.

    Show the answer: Question 10 of 10

    Answer: Fork both GitHub repositories and open three PRs.

    No plural of a product name, so say what you have two of: two GitHub repositories. And PRs, with s alone.

Interview questions

Warm-up (fresher to mid-level): Why do style guides ask you to keep articles, even in headings?

Because articles tell the reader which things are new and which they already know, and they mark where a noun phrase starts. “Restart the pod” and “Restart a pod” are different instructions. Google’s guide asks writers to include articles for ease of comprehension and translation, and not to drop them in headings: “Create a VM instance”, not “Create VM instance”. Microsoft’s tips add that translation software, like a human reader, uses the articles to find the nouns. Dropping them saves a few characters and moves the work to the reader.

The module’s question bank holds two longer questions on articles and nouns:

Model answers open with any pass: ₹79 for 1 week ($2.99), one payment that never renews.

  1. Fresher to mid

    Your README says "an SQL query" and the product docs say "a SQL query". A reviewer asks you to change all of yours before the release. Do you change them, and how do you settle which form the team uses?

    Model answer, Pro. Model answers open with any pass; prices are in the notice on this page. First step and follow-ups

  2. Mid to senior

    A new colleague's onboarding guide has about 40 missing or wrong articles. Your lead asks you to help them improve, not to rewrite it for them. What do you fix first, and how do you coach them?

    Model answer, Pro. First step and follow-ups

Key takeaways

  • Give every singular countable noun an article: a or an for something the reader meets for the first time, the for something they can identify.
  • Use no article for plurals and uncountable nouns in general statements or before product names, and keep articles in headings.
  • Choose a or an by the first sound: an API, an HTTP request, a URL, a user; for SQL and FAQ, follow how your readers say them.
  • Uncountable nouns such as feedback, software, information and advice take no a and no plural: use some, a piece of or a countable word.
  • Write plurals of abbreviations with s alone, abbreviated units after numbers in the singular, and no plurals of product names.

Terms in this lesson

countable noun
A noun with a singular and a plural that you can count: one bug, two bugs. In the singular it needs a, an, the or another determiner.
determiner
A word in front of a noun that says which one or how many, such as a, an, the, this, my, each or some. A singular countable noun always needs one.
uncountable noun
A noun with no plural that takes no a or an, such as feedback, software or advice. Use some, a piece of or a countable noun instead.

References

Related tools

Report a problem with this lesson

Quick answers and tool search

Type to search tools or to get a quick answer, for example 18% of 2500. Use the up and down arrow keys to move through the results, Enter to choose, and Escape to close.