BMAD-METHOD/expansion-packs/bmad-technical-writing/data/technical-writing-standards.md

525 lines
12 KiB
Markdown

# Technical Writing Standards
Comprehensive standards for creating clear, consistent, accessible, and well-structured technical content. These principles apply across all publishers and formats.
## Clarity Principles
### Use Simple, Direct Language
**Do:**
- "Click the Submit button" (clear, direct)
- "The function returns a boolean value" (precise)
- "Remove the file" (simple verb)
**Don't:**
- "Utilize the Submit functionality to initiate the process" (unnecessarily complex)
- "The function facilitates the return of a boolean-type value" (wordy)
- "Effect the removal of the file" (pretentious)
### Explain Technical Terms
**First Use Pattern:**
```
JSON (JavaScript Object Notation) is a lightweight data format...
[Later in text]
...parse the JSON data...
```
**Inline Explanation:**
```
The API returns a 401 status code, which indicates unauthorized access.
```
**Glossary Reference:**
```
The service uses OAuth2 for authentication (see Glossary).
```
### Provide Examples
**Abstract Concept:**
```
❌ "Functions should be idempotent."
✓ "Functions should be idempotent - producing the same result when called multiple times with the same input. For example, `getUserById(123)` should always return the same user data for ID 123."
```
**Show, Then Tell:**
```python
# Example first
def calculate_total(items):
return sum(item.price for item in items)
# Then explain
The calculate_total function demonstrates list comprehension,
a Pythonic way to iterate and transform data in a single line.
```
### Break Down Complex Ideas
**Step-by-Step:**
```
To implement authentication:
1. Create a User model with password hashing
2. Build registration endpoint to create users
3. Implement login endpoint to verify credentials
4. Generate JWT token upon successful login
5. Create middleware to validate tokens
6. Protect routes using the middleware
```
**Progressive Disclosure:**
- Start with simplest case
- Add complexity incrementally
- Reference advanced topics for later
### Active Voice
**Prefer Active:**
- "The function returns an array" (active)
- "Pass the parameter to the function" (active)
- "The compiler throws an error" (active)
**Avoid Passive:**
- "An array is returned by the function" (passive)
- "The parameter should be passed to the function" (passive)
- "An error is thrown by the compiler" (passive)
**Exception:** Passive voice appropriate when actor is unknown or unimportant:
- "The file was corrupted" (we don't know who/what corrupted it)
- "Python was released in 1991" (focus on Python, not Guido)
### Sentence Clarity
**One Idea Per Sentence:**
```
❌ "The function validates the input and then transforms it to the required format and returns it to the caller or throws an error if validation fails."
✓ "The function first validates the input. If validation succeeds, it transforms the data to the required format and returns it. If validation fails, it throws an error."
```
**Specific vs Vague:**
```
❌ "The database might have some issues with performance."
✓ "Query response time increases from 50ms to 2 seconds when the users table exceeds 1 million rows."
```
---
## Consistency Requirements
### Terminology Consistency
**Choose One Term:**
```
✓ Consistent: "function" throughout
❌ Inconsistent: "function", "method", "routine", "procedure" interchangeably
```
**Create a Term List:**
```
Preferred Terms:
- "filesystem" (not "file system")
- "username" (not "user name")
- "backend" (not "back-end" or "back end")
- "email" (not "e-mail")
- "GitHub" (not "Github")
```
### Style Consistency
**Code Formatting:**
```
✓ Consistent:
Use `variable_name` for variables and `function_name()` for functions.
❌ Inconsistent:
Use variable_name for variables and function_name() for functions.
(Missing backticks, inconsistent formatting)
```
**Heading Capitalization:**
```
✓ Title Case Consistent:
## Chapter 1: Building Your First API
## Chapter 2: Adding Authentication
## Chapter 3: Deploying to Production
✓ Sentence Case Consistent:
## Chapter 1: Building your first API
## Chapter 2: Adding authentication
## Chapter 3: Deploying to production
❌ Inconsistent Mix:
## Chapter 1: Building your First API
## Chapter 2: Adding Authentication
```
### Voice and Tone
**Maintain Consistent Perspective:**
```
✓ Second Person Throughout:
"You create a function by using the def keyword. You then add parameters..."
❌ Mixed Perspectives:
"You create a function by using the def keyword. We then add parameters..."
"One creates a function by using the def keyword..."
```
**Consistent Formality Level:**
- Casual: "Let's dive in!", "Cool!", "Pretty neat, right?"
- Professional: "We'll begin", "Effective", "This demonstrates"
- Pick one and maintain throughout
### Formatting Patterns
**Code Blocks:**
```
✓ Consistent:
All code blocks use language tags and show complete context
❌ Inconsistent:
Some with language tags, some without; some show imports, some don't
```
**Lists:**
```
✓ Parallel Structure:
- Create the database
- Configure the connection
- Test the setup
❌ Non-Parallel:
- Create the database
- Configuring the connection
- You should test the setup
```
---
## Accessibility Standards
### Alt Text for Images
**Descriptive Alt Text:**
```
❌ <img alt="screenshot">
❌ <img alt="Figure 1">
✓ <img alt="Django admin interface showing user list with filter sidebar">
✓ <img alt="Error message: 'Connection refused on localhost:5432'">
```
**Complex Diagrams:**
```
<img alt="Authentication flow diagram" longdesc="auth-flow-description.html">
In text or linked file:
"The authentication flow begins with the client sending credentials to
the /login endpoint. The server validates these against the database.
If valid, a JWT token is generated and returned. The client includes
this token in subsequent requests via the Authorization header..."
```
### Color and Visual Information
**Don't Rely on Color Alone:**
```
❌ "The red items are errors, green items are successes."
✓ "Errors are marked with a red X icon (❌), while successes show a green checkmark (✓)."
```
**Code Syntax Highlighting:**
```
# Ensure code is understandable without color
❌ Relying only on color to show strings vs keywords
✓ Use descriptive comments:
# This string contains the API key:
api_key = "abc123xyz"
```
### Document Structure
**Proper Heading Hierarchy:**
```
✓ Correct:
# Chapter 1: Introduction (H1)
## Section 1.1: Prerequisites (H2)
### Installing Python (H3)
### Installing VS Code (H3)
## Section 1.2: Your First Program (H2)
❌ Incorrect:
# Chapter 1: Introduction (H1)
### Installing Python (H3) - skipped H2
## Your First Program (H2) - after H3
```
**Meaningful Headings:**
```
✓ Descriptive: "Installing PostgreSQL on macOS"
❌ Generic: "Installation" or "Next Steps"
```
### Screen Reader Considerations
**Link Text:**
```
❌ "Click [here] to download Python."
❌ "Learn more at [this link]."
✓ "[Download Python 3.11 for Windows]"
✓ "Read the [official Django tutorial]"
```
**Table Structure:**
```
| Header 1 | Header 2 | Header 3 |
|----------|----------|----------|
| Data 1A | Data 2A | Data 3A |
✓ Uses proper markdown table format with headers
✓ Screen readers can navigate by rows/columns
```
**Code Examples:**
```python
# Use descriptive variable names that make sense when read aloud
user_email = "user@example.com"
x = "user@example.com"
# Function names should be read able
calculate_total_price()
calc_tot()
```
### Plain Language
**Acronyms:**
```
✓ "REST (Representational State Transfer) is an architectural style..."
Later: "...using REST APIs..."
❌ Assuming knowledge: "Using REST..." (no definition)
```
**Define Jargon:**
```
✓ "Idempotent operations produce the same result when executed multiple times."
❌ "Operations should be idempotent." (no explanation)
```
---
## Structure Best Practices
### Logical Topic Progression
**Foundation First:**
```
Chapter Sequence:
1. Python Basics → 2. Functions → 3. Classes → 4. Advanced OOP
(Each builds on previous)
❌ Poor Sequence:
1. Advanced OOP → 2. Classes → 3. Python Basics
```
**Dependency Management:**
```
✓ "In Chapter 2, we learned about functions. Now we'll use functions to..."
✓ "This builds on the authentication system from Chapter 5..."
❌ Referencing concepts not yet covered without explanation
```
### Section Organization
**Consistent Chapter Structure:**
```
Chapter Template:
1. Introduction (hooks, context, objectives)
2. Prerequisites
3. Concept Explanation
4. Tutorial/Hands-On
5. Exercises
6. Summary
7. Further Reading
Use same structure for every chapter (readers know what to expect)
```
**Section Length:**
- Chapters: 15-30 pages typical
- Major sections: 3-8 pages
- Subsections: 1-3 pages
- Keep related content together
### Transitions
**Between Sections:**
```
✓ "Now that you understand basic routing, let's add authentication to protect routes."
✓ "With the database configured, we're ready to create our first model."
❌ Abrupt jump to new topic without connection
```
**Between Chapters:**
```
Chapter End: "In the next chapter, we'll deploy this application to production."
Next Chapter Start: "In Chapter 5, we built a REST API. Now we'll deploy it using Docker and AWS."
```
### Cross-References
**Specific References:**
```
✓ "See Chapter 3, Section 3.2: Database Setup"
✓ "As explained in the Authentication section on page 45..."
❌ "As mentioned earlier..."
❌ "See above..."
```
**Forward References:**
```
✓ "We'll cover error handling in depth in Chapter 8."
✓ "Advanced caching strategies are beyond this book's scope. See 'High Performance Python' by Gorelick and Ozsvald."
Manage expectations about what's covered where
```
### Visual Hierarchy
**Use Formatting:**
- **Bold** for emphasis or key terms
- `Code formatting` for inline code
- > Blockquotes for important callouts
- Lists for series of items
- Tables for structured data
**Consistent Callouts:**
```
**Note:** Additional information
**Warning:** Potential pitfall
**Tip:** Helpful suggestion
**Exercise:** Practice opportunity
```
---
## Code Documentation Standards
### Code Comments
**Explain Why, Not What:**
```python
# Set x to 5
x = 5
# Default timeout in seconds
timeout = 5
# Use exponential backoff to avoid overwhelming the API
for attempt in range(max_retries):
time.sleep(2 ** attempt)
```
**Document Intent:**
```python
# Remove duplicates while preserving order
seen = set()
result = [x for x in items if not (x in seen or seen.add(x))]
# Loop through items
for item in items:
# Do something
...
```
### Function Documentation
**Docstring Standard:**
```python
def authenticate_user(username, password):
"""
Authenticate user credentials against the database.
Args:
username (str): The user's username
password (str): The user's plain-text password
Returns:
User: The authenticated user object
Raises:
AuthenticationError: If credentials are invalid
DatabaseError: If database connection fails
Example:
>>> user = authenticate_user("john", "secret123")
>>> print(user.email)
john@example.com
"""
```
### API Documentation
**Endpoint Description:**
```
GET /api/users/:id
Description: Retrieve a single user by ID
Parameters:
- id (path): User ID (integer)
Headers:
- Authorization: Bearer token required
Response 200:
{
"id": 123,
"username": "john",
"email": "john@example.com"
}
Response 404:
{
"error": "User not found"
}
```
---
## References and Resources
### Style Guide Standards
- Microsoft Writing Style Guide
- Google Developer Documentation Style Guide
- Chicago Manual of Style (for publishers)
- AP Stylebook (for journalism-style technical writing)
### Accessibility Standards
- WCAG 2.1 Level AA (minimum)
- Section 508 (US government)
- Plain Language guidelines
### Technical Writing Communities
- Write the Docs: https://www.writethedocs.org/
- TC (Technical Communication) Stack Exchange
- Reddit: r/technicalwriting
### Tools
- Hemingway Editor (readability)
- Grammarly (grammar and style)
- Vale (style guide linter)
- alex (inclusive language linter)