← Files fstackARCHIVED FILE
skills/principle-clear-naming/SKILL.md
3.11 KB · Oct 5, 2026 · 18:35 UTC
--- name: principle-clear-naming description: Apply when naming variables, functions, types, files, or endpoints. Enforces the 6-month amnesia test, language conventions, intent-based naming, and cross-boundary consistency. user-invocable: false disable-model-invocation: true --- # Clear Naming Discipline > "There are only two hard things in Computer Science: cache invalidation and naming things." — Phil Karlton Code is read far more often than it is written. A bad name forces every future reader to inspect the underlying implementation just to understand what a function or variable holds. A good name makes the surrounding code self-evident. --- ## 1. The 6-Month Amnesia Test Whenever you name a variable, function, class, file, or endpoint, ask: > **"If I wake up with amnesia in 6 months and read this line, will I immediately know what it is and what it does? Will a new teammate guess its exact purpose on their first day?"** If the answer is *"Only if they read the function body"*, the name has failed. Rename it. --- ## 2. Intent Over Mechanism Name by **what problem it solves and what data it represents**, not the mechanical data structure or plumbing: | Mechanical / Bad | Intent-Driven / Good | Rationale | |---|---|---| | `dataArray` | `activeSubscriptions` | Names the domain entity, not the memory structure. | | `dictMap` | `cachedUserPermissions` | Reveals what the lookup is for. | | `processStuff()` | `syncStripeInvoices()` | States the exact business operation. | | `tempFlag` | `hasVerifiedEmail` | Self-documenting state. | --- ## 3. Language & Ecosystem Conventions Always adhere to the idiom of the host language unless an explicit codebase convention overrides it: - **TypeScript / JavaScript**: - `camelCase` for variables, properties, and functions (`getUserSession`, `isOrgAdmin`). - `PascalCase` for classes, types, interfaces, and React components (`PaymentProcessor`, `UserProfileCard`). - `UPPER_SNAKE_CASE` for immutable module-level constants (`MAX_RETRY_ATTEMPTS`). - **Python**: - `snake_case` for functions, methods, and variables (`calculate_tax`, `user_id`). - `PascalCase` for classes (`DatabaseConnection`). - **Go / Rust**: Follow standard idiomatic casing (`userID`, `fetch_record`). --- ## 4. Consistency Across Boundaries Pick one verb per action in a subsystem and stick to it religiously. Do not mix semantic synonyms across files: - If you use `get...` for database lookups, do not switch randomly to `fetch...`, `retrieve...`, or `query...`. - If you use `delete...`, do not switch between `remove...`, `drop...`, and `destroy...` for the same entity type. --- ## 5. Booleans as Clear Predicates Booleans must sound like yes/no questions: - **Good**: `isEnabled`, `hasAccess`, `shouldRetry`, `canEdit`, `isPendingApproval`. - **Bad**: `status` (ambiguous), `access` (noun), `check` (sounds like a function). --- ## 6. Ban Cryptic Abbreviations Unless an abbreviation is universally recognized in the domain (`id`, `url`, `req`, `res`, `ctx`, `err`), spell it out: - Bad: `usrMgrSvc`, `calcDiscTot()`, `custAddrStr`. - Good: `userManager`, `calculateDiscountTotal()`, `customerAddress`.
SHA-256: 2a87394e3aa92fe3b49cf50650e73ff0df2a0308a905127366f343a511059b78