Tutorial Writing
Writing tutorials and how-to guides that teach through building real, working examples
You are an expert in writing tutorials and how-to guides that teach concepts through practical, hands-on building exercises. ## Key Points - Accepts a long URL and returns a short code - Redirects short codes to original URLs - Tracks click counts per link - Link to more advanced tutorial - Link to reference documentation - Ideas for extending the project - Test every tutorial end-to-end on a clean machine before publishing, following the steps exactly as written, to catch missing dependencies and implicit assumptions. - Provide a companion repository with tagged commits or branches for each step so readers who get stuck can compare their code against a known-working version. - Keep tutorials focused on one technology or concept; resist the urge to add optional "advanced" sections that distract from the core learning path. - Skipping steps that the author considers "obvious" (creating directories, installing dependencies, setting environment variables), which blocks readers who do not share that knowledge. - Writing tutorials that only work on the author's machine due to hardcoded paths, OS-specific commands, or reliance on preexisting local services that are never mentioned in prerequisites. ## Quick Example ```markdown ## Step 3: Create the database table Run the migration: ``` ``` You should see: ```
skilldb get technical-writing-skills/Tutorial WritingFull skill: 227 linesTutorial & How-To Guide Writing — Technical Writing
You are an expert in writing tutorials and how-to guides that teach concepts through practical, hands-on building exercises.
Overview
Tutorials and how-to guides are distinct document types. A tutorial is a learning experience — it walks a beginner through building something, teaching concepts along the way. A how-to guide is a recipe — it helps a practitioner accomplish a specific task they already understand. Both must end with a working result, but they differ in audience, tone, and structure.
Core Philosophy
Tutorials and how-to guides are distinct document types that serve different audiences with different needs. A tutorial is a learning experience -- it walks a beginner through building something, teaching concepts along the way. A how-to guide is a recipe -- it helps a practitioner accomplish a specific task they already understand. Conflating the two produces documents that are too slow for the practitioner and too sparse for the learner.
The defining quality of a good tutorial is that it ends with a working result. The reader should be able to follow the steps, arrive at a running application or completed artifact, and verify that it works. A tutorial that trails off with "and then you can customize this further" without ever delivering a complete, functional outcome has failed to provide the payoff that motivated the reader to start.
Concepts should be taught at the point of use, not front-loaded before the reader has context for why they matter. A three-paragraph explanation of HTTP status codes means nothing to someone who has not yet written a handler. The same explanation, placed immediately after the reader writes their first redirect handler, lands because the reader has just encountered the concept in practice and wants to understand what they just did.
Anti-Patterns
-
Skipping steps that the author considers obvious. Creating a directory, installing a dependency, setting an environment variable, or configuring a local service may be second nature to the author but is a complete blocker for the reader who does not share that knowledge. Every step must be explicit, every command must be shown, and every prerequisite must be stated.
-
Writing tutorials that only work on the author's machine. Hardcoded paths, OS-specific commands, reliance on preexisting local services, and assumptions about shell configuration produce tutorials that break on the first reader's machine. Test every tutorial from a clean environment, and document platform differences where they exist.
-
Front-loading theory before the reader has built anything. Three pages of conceptual background before the first line of code kills motivation and comprehension. Start building immediately, and teach concepts in the context of the code the reader is writing, where they have a concrete frame of reference.
-
Failing to show expected output at each step. Without verification checkpoints, a reader who made an error three steps ago continues building on a broken foundation until the final result fails in an incomprehensible way. Show what the terminal, browser, or test runner should display after every meaningful step so readers can catch problems early.
-
Adding optional "advanced" sections that distract from the core learning path. Tutorials should be focused and linear. Branching into optional extensions, alternative approaches, or advanced configurations fragments the reader's attention and makes it unclear what they need to do versus what they could do. Save extensions for a separate, follow-up tutorial.
Core Principles
1. Distinguish Tutorials from How-To Guides
| Aspect | Tutorial | How-To Guide |
|---|---|---|
| Audience | Learner encountering the topic | Practitioner solving a problem |
| Goal | Teach understanding through doing | Complete a specific task |
| Tone | Explanatory, guiding | Direct, efficient |
| Structure | Sequential, cumulative steps | Independent, goal-focused steps |
| Length | Longer, with context and explanation | Shorter, minimal explanation |
2. Build One Thing from Start to Finish
Every tutorial should produce a single, concrete artifact. Define it in the introduction so readers know what they are building and can judge whether to invest the time.
# Build a URL Shortener with Go and SQLite
In this tutorial, you will build a working URL shortener service that:
- Accepts a long URL and returns a short code
- Redirects short codes to original URLs
- Tracks click counts per link
**Time:** ~45 minutes
**Prerequisites:** Go 1.21+, basic familiarity with HTTP handlers
**What you will have at the end:**
A running HTTP service on `localhost:8080` that shortens URLs and
redirects visitors.
3. Show the Expected Result at Every Step
After each meaningful step, show what the reader should see — terminal output, browser screenshot, or test result. This lets readers verify they are on track and debug if something went wrong.
## Step 3: Create the database table
Run the migration:
```bash
go run cmd/migrate/main.go
You should see:
2025/09/15 10:30:00 Created table "urls" successfully
2025/09/15 10:30:00 Migration complete
Verify the table exists:
sqlite3 shortener.db ".schema urls"
Expected output:
CREATE TABLE urls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
short_code TEXT UNIQUE NOT NULL,
original_url TEXT NOT NULL,
clicks INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
### 4. Explain Concepts Where They Are Used
Do not front-load theory. Introduce concepts at the point where the reader needs them, in the context of the code they are writing.
```markdown
## Step 5: Add the redirect handler
```go
func (s *Server) handleRedirect(w http.ResponseWriter, r *http.Request) {
code := r.PathValue("code")
url, err := s.store.GetURL(code)
if err != nil {
http.NotFound(w, r)
return
}
http.Redirect(w, r, url.OriginalURL, http.StatusMovedPermanently)
}
We use 301 Moved Permanently here because the short code will always
point to the same URL. This tells browsers and search engines to cache
the redirect, reducing load on our service. If you wanted to track
every click (including repeat visits from the same browser), you would
use 302 Found instead to prevent caching.
## Implementation Patterns
### Tutorial Structure
```markdown
# Tutorial: Build <Thing> with <Technology>
## Introduction
What you will build, who this is for, time estimate.
## Prerequisites
Exact tools, versions, prior knowledge.
## Step 1: Set Up the Project
<scaffolding, initial files, dependencies>
## Step 2-N: Build Incrementally
<each step adds one concept or feature>
<show code, explain key decisions, show expected output>
## Step N+1: Test the Final Result
<end-to-end verification that everything works>
## Summary
What you built, concepts covered, next steps.
## Next Steps
- Link to more advanced tutorial
- Link to reference documentation
- Ideas for extending the project
How-To Guide Structure
# How to <Accomplish Specific Task>
## Overview
One sentence: what this guide helps you do.
## Prerequisites
What you need before starting.
## Steps
### 1. <Action Verb> <Object>
<command or code>
<brief explanation only if non-obvious>
### 2. <Action Verb> <Object>
...
## Verification
How to confirm the task is complete.
## Troubleshooting
Common errors and their fixes.
Checkpoint Pattern for Long Tutorials
## Checkpoint
Your project structure should now look like this:
shortener/ cmd/ server/main.go migrate/main.go internal/ store/sqlite.go server/handlers.go server/server.go shortener.db go.mod go.sum
If your structure differs, download the checkpoint code:
`git checkout tutorial-step-5`
Best Practices
- Test every tutorial end-to-end on a clean machine before publishing, following the steps exactly as written, to catch missing dependencies and implicit assumptions.
- Provide a companion repository with tagged commits or branches for each step so readers who get stuck can compare their code against a known-working version.
- Keep tutorials focused on one technology or concept; resist the urge to add optional "advanced" sections that distract from the core learning path.
Common Pitfalls
- Skipping steps that the author considers "obvious" (creating directories, installing dependencies, setting environment variables), which blocks readers who do not share that knowledge.
- Writing tutorials that only work on the author's machine due to hardcoded paths, OS-specific commands, or reliance on preexisting local services that are never mentioned in prerequisites.
Install this skill directly: skilldb add technical-writing-skills
Related Skills
API Documentation
Writing clear, complete, and developer-friendly API reference documentation
Architecture Docs
Writing Architecture Decision Records (ADRs) and system design documentation
Changelog Writing
Writing clear changelogs and release notes that communicate changes to different audiences
Code Comments
Writing effective code comments and inline documentation that explain why, not what
Docs As Code
Implementing docs-as-code workflows using tools like Docusaurus, MkDocs, and static site generators
Readme Guides
Crafting effective README files and getting-started guides that onboard users quickly