ABCsteps lesson path

What Makes Professional Documentation

Write a README that explains purpose, setup, usage, architecture, and limitations truthfully. Build one artifact, keep one review trail, and make the work easy to inspect later.

Lesson
18
Time
40 min
Access
public lesson

Learning objective

Document a project so another learner can run and inspect it.

Lab outcome

Write a complete README with setup and limitations.

Module milestone

Polish the product and add one AI-assisted capability with documentation.

Lesson proof workflow

Read, build, then review the evidence.

  1. GitHub hero workflow iconStep 1ReadStart with README writing before touching tools.
  2. Git hero workflow iconStep 2BuildBuild toward: Write a complete README with setup and limitations.
  3. VS Code hero workflow iconStep 3ReviewReview the evidence using Architecture notes.

Toolchain

Documentation is part of the product, not decoration after shipping.

These are the practical surfaces used in this lesson. Learn the habit first, then connect it to the wider engineering ecosystem.

GitHub iconGitHubREADME surface

Explain setup and usage where the project lives.

Git iconGitChange record

Make documentation changes reviewable.

VS Code iconVS CodeWriting workspace

Edit docs beside the code they describe.

Proof of work

Leave one inspectable trail from this lesson.

The useful output is not a passive note. It is a small artifact another person can inspect: a working file, a command result, a commit, a screenshot, a README note, or a demo link.

Lesson lab: Write a complete README with setup and limitations.

Tool and platform logos are ecosystem references only: no affiliation, endorsement, interview access, hiring promise, salary promise, or placement guarantee.

GitHub proof icon

Build

Produce the artifact

Complete the lab and keep the result visible: Write a complete README with setup and limitations.

Git proof icon

Record

Save review evidence

Capture what changed, what broke, and how README writing became clearer through the work.

VS Code proof icon

Explain

Write the vocabulary

Use your own words for Setup instructions and Architecture notes; this is what makes the lesson inspectable later.

Skills companies recognize

Translate the lesson into inspectable work language.

This lesson turns one small lab into the language a learner can use in a README, demo note, or technical conversation. The point is not to collect logos; the point is to explain work clearly enough that another engineer can inspect it.

Where this skill appears

Documentation is a hiring signal because teams need engineers whose work can be run by someone else.

Engineering onboardingDeveloper relationsOpen-source projects

Ecosystem references

GitHub skill ecosystem logoMicrosoft skill ecosystem logoGoogle Cloud skill ecosystem logoAWS skill ecosystem logoOpenAI skill ecosystem logoCloudflare skill ecosystem logoGoogle skill ecosystem logo

Platform and company logos are ecosystem references only: no affiliation, endorsement, interview access, hiring preference, salary outcome, or placement guarantee.

GitHub skill proof icon

README line

Name the artifact

Lab proof: Write a complete README with setup and limitations. Connect it to README writing so the result reads like work, not a passive note.

Git skill proof icon

Review line

Explain the stack

Use GitHub, Git, VS Code to explain Setup instructions and what changed between the first attempt and the inspected result.

VS Code skill proof icon

Conversation line

Answer with evidence

If a team asks about Architecture notes, use this proof line: Show setup, usage, architecture, limitations, and the exact command another person should run.

Proof translation

GitHub proof translation icon

Skill signal

README writing is the market word. The lesson makes it visible through a small working artifact.

Git proof translation icon

Proof artifact

The inspectable artifact is: Write a complete README with setup and limitations.

VS Code proof translation icon

Interview answer

Use Setup instructions and Architecture notes to explain what changed, what failed, and how you verified it.

Paid guidance

Read publicly. Upgrade when guidance will help you finish.

This lesson remains part of the public written syllabus. Paid help is online-only and human-led: video walkthroughs as they roll out, live class context, WhatsApp Q&A, and project review around the same work.

No account wall, automated checkout, or placement promise is introduced here. Enrollment stays human-led by WhatsApp or call, and the useful proof remains the learner's own artifact.

GitHub paid guidance icon

Public

Written lesson stays open

Read the prepare and review material for lesson 18 on the public site before buying anything.

Git paid guidance icon

Recorded

Recorded and live guidance clarify the work

Paid guidance can add founder-led video walkthroughs as they roll out and live online class context; the teaching explains the work, but does not replace the written lesson.

VS Code paid guidance icon

Human

Questions use real context

When stuck, useful guidance starts from the route, error, screenshot, repo fragment, and the lab artifact: Write a complete README with setup and limitations.

Phase 1 · Briefing

Lesson briefing

Before You Study (5 mins)

Lesson focus: Code is read 10× more than it is written. This sentence — first attributed to Robert C. Martin, repeated by every senior engineer since — is the core of why documentation is non-optional. By Lesson 17 you've shipped real software: a containerized full-stack app with database persistence, public hosting, and AI-powered features. The architectural decisions, prompt rationale, configuration choices, and operational gotchas are all in your head right now. Today we externalize them into a real README, code comments, and architecture documentation so that the project survives contact with the most important user it will ever have: future-you, six months from now, having forgotten the details.

What you should have ready:

  • Your full project from Lessons 06-17 in a GitHub repository
  • Markdown fluency from Lesson 08 (JSON's cousin)
  • One screenshot of your game running, or a 30-second screen recording
  • About 60 minutes
  • An honest answer to: "if I lost access to my own memory of this project tomorrow, what would my notes need to say?"

The Concept

Documentation has three audiences, and a good project addresses all three:

AudienceWhat they needWhere it lives
The first-time visitorWhat is this? Should I care? Can I run it?README.md (front door)
The contributorHow do I add a feature? Where does logic X live? Why was decision Y made?Code comments + architecture docs
The future-youWhat were the operational gotchas? Where are the secrets? Why isn't approach X used?All of the above + maybe a NOTES.md

The README is the most-read file in any open-source project — and for hiring, the most-read file in any portfolio repo. A typical recruiter spends ~30 seconds on a GitHub project. The README is what they see. Get it right and you've earned the next conversation.

A professional README has six sections, in this order:

text
1. Title + one-line description     What is this?
2. Demo / screenshot                 Show me, don't tell me.
3. Features (3-7 bullets)            What does it do?
4. Quick start                       How do I run it?
5. Architecture (one diagram)        How is it built?
6. License + author                  Whose work is this?

The order matters. Each section answers a question the previous one created. The visitor scrolls until they're convinced or until they leave; structure the README so the most compelling 30 seconds is at the top.

Code comments are different from docs. A common beginner mistake is comments that restate the code:

javascript
// Increment i by 1
i++

// Set name to "Divyanshu"
const name = "Divyanshu"

These comments are noise. They steal attention from the reader's actual job (reading code). Useful comments explain why, not what:

javascript
// We sort by score DESC and then by createdAt ASC so that ties favor
// the earlier submission — this prevents leaderboard churn when two
// players hit the same score in quick succession.
const sorted = scores.sort((a, b) =>
  b.score - a.score || a.createdAt.localeCompare(b.createdAt)
)

The "why" comment captures the decision — the design intent that made the code take this exact shape. Six months from now, when you (or someone else) wonders "why does it sort like this?", the comment is the answer.

Architecture documentation is the third piece. For projects above ~500 lines of code, an ARCHITECTURE.md (or docs/architecture.md) becomes valuable. It captures:

  • The major components and how they relate (one diagram)
  • Decisions and their rationale ("we chose SQLite over Postgres because ...")
  • The unsolved problems and known limitations
  • The path the project is on ("if we needed to handle 10× the load, the next change would be ...")

Real teams write Architecture Decision Records (ADRs) — short numbered files (docs/adr/0001-use-sqlite.md) capturing one decision each, with context, options considered, and rationale. ADRs are durable; they survive employee turnover and become the institutional memory of a codebase.

The professional habit you're building today: the work isn't done when the code runs. The work is done when someone else can run, modify, and extend the code without your help. Documentation is the difference between "demo" and "ship."

A line worth memorizing: documentation is a love letter to your future self. Every minute spent writing it is repaid ten-fold the next time you open this codebase after a long break — or the next time someone you've never met tries to use what you built.

Quick Concepts

TermSimple Meaning
README.mdThe front-door file every GitHub project needs
MarkdownThe plain-text formatting language for .md files (you've used it in Lesson 08 and on every blog post)
Code commentA note inside the code explaining why, not what
JSDocA code-comment format that describes function signatures (used by editors for autocomplete)
Architecture Decision Record (ADR)A short numbered file capturing one significant design decision
CHANGELOG.mdA version-by-version record of what changed in the project

What We Will Build

By the end of this lesson, you will have done these specific things:

  1. Wrote a real README.md with all six sections. Replaced any existing thin README. Deliberately wrote each section like you were the visitor:
    markdown
    # Snake Game — AI-Powered Full-Stack
    
    A browser-based Snake game with a persistent online leaderboard,
    AI commentary on key events, and full-stack architecture you can
    inspect end-to-end. Built across the [ABCsteps](https://abcsteps.com)
    20-lesson AI Engineering Course.
    
    ![Snake game running](docs/screenshot.png)
    
    ## Features
    - 3D rendering via Three.js
    - Persistent online leaderboard (Express + SQLite)
    - AI commentary powered by Google Gemini Flash
    - Containerized backend with health checks
    - Public hosting via Cloudflare Tunnel
    
    ## Quick start
    ...
    
  2. Added a screenshot to docs/screenshot.png and embedded it in the README. A picture establishes legitimacy in 1 second; text takes 30 seconds.
  3. Wrote a Quick Start section that gets a visitor from git clone to a running app in 5 minutes:
    markdown
    ## Quick start
    
    ```bash
    git clone [email protected]:<you>/snake-game.git
    cd snake-game
    cp .env.example .env       # then edit .env to add your GEMINI_API_KEY
    docker compose up -d
    open http://localhost:3000
    
    text
    Tested it on a fresh checkout (e.g., from a different folder) — confirmed the steps actually work.
    
    
  4. Created a .env.example file in the repo. List every env var the project reads (GEMINI_API_KEY=, PORT=, etc.) with empty values. The visitor copies it to .env and fills in their own keys. The actual .env stays in .gitignore (never commit secrets).
  5. Wrote an Architecture section in the README with a single ASCII diagram:
    text
    ┌──────────────┐    ┌──────────────────┐    ┌──────────────┐
    │   Browser    │───▶│  Express API     │───▶│   SQLite     │
    │  (Three.js)  │    │ (Lessons 12-13)  │    │ (Lesson 14)  │
    └──────────────┘    └──────────────────┘    └──────────────┘
                                │
                                ▼
                        ┌──────────────────┐
                        │  Gemini Flash    │
                        │  (Lessons 16-17) │
                        └──────────────────┘
    
  6. Audited every existing code comment in your project. Removed comments that restate the code. Added comments where you remember struggling (the CORS fix, the rate-limit logic, the JSON-mode response parsing). Made sure each remaining comment answers why.
  7. Added JSDoc to your three most important backend functions so future readers (and your editor's autocomplete) know the input/output shape:
    javascript
    /**
     * Submit a new score to the leaderboard.
     * @param {string} name - Player name (1-30 chars)
     * @param {number} score - Non-negative integer
     * @returns {{id: number, name: string, score: number, createdAt: string}}
     * @throws {Error} If validation fails — caller should handle 400 response
     */
    function insertScore(name, score) { /* ... */ }
    
  8. Wrote your first ADR at docs/adr/0001-use-sqlite.md:
    markdown
    # ADR 0001: Use SQLite for the leaderboard database
    
    ## Context
    The leaderboard needs persistent storage. Options: SQLite, PostgreSQL,
    Firestore, in-memory + cloud backup.
    
    ## Decision
    SQLite via `better-sqlite3`, in WAL mode, mounted as a Docker volume.
    
    ## Rationale
    - Single-file simplicity matches solo-developer ops
    - Read performance is excellent for leaderboard queries (<10K rows)
    - WAL mode handles the few concurrent writes we expect
    - No separate server to deploy or pay for
    
    ## Consequences
    - When usage exceeds ~100 concurrent writes, we'd migrate to PostgreSQL
    - Backup strategy is "copy the .db file" — simple but manual
    
  9. Pushed everything to GitHub. Visited your repo's GitHub page. Read the README from the top as if you were a stranger. Made one more pass of edits.

The final test of step 9 is the goal. The README a stranger reads in 30 seconds is the README that earns you the next conversation.

Think About

Before studying, consider:

  1. Find a popular open-source project on GitHub (e.g., tailwindcss or supabase). Read their README. Notice the structure, the tone, the screenshots, the "how to install in 30 seconds" sections. What patterns do they all share? (Compelling first 30 seconds, demo first, install second, features third, contribution last.)
  2. If your worst day's bug — production-down at 11pm — happened to your Snake game six months from now, what would you wish your future-self had documented? (Probably: how to redeploy, where the secrets live, what dependencies are critical, who else needs to be told. The runbook is documentation too.)

By the End

After this lesson, you'll:

  • ✅ Have a polished README.md covering all six sections (title, demo, features, quick start, architecture, license)
  • ✅ Have a screenshot or short recording embedded in the README
  • ✅ Have a .env.example listing every secret the project needs
  • ✅ Have removed comments that restate the code; kept ones that explain decisions
  • ✅ Have JSDoc on at least 3 important backend functions
  • ✅ Have your first Architecture Decision Record at docs/adr/0001-use-sqlite.md
  • ✅ Be able to hand the GitHub URL to anyone and have them get the project running in 5 minutes

Code is read 10× more than it is written. Documentation is the love letter to that majority.

Next lesson · 19

Final Polish and Verification

Improve UI, fix defects, and verify that the product behaves as expected before sharing it.

VS Code next lesson iconVue.js next lesson iconGitHub next lesson icon