Remember that time you opened your own code from last month and had absolutely no idea what it did?
I spent my first year as a developer rewriting perfectly good code because I couldn't figure out what Past Me was thinking. Then I learned these 5 commenting patterns, and debugging became 10x easier.
What you'll learn: The exact commenting system I use in production code Time needed: 20 minutes to read, 5 minutes to start using Difficulty: Complete beginner friendly
Here's what makes this different: I'm not teaching you theory about "clean code." I'm showing you the commenting patterns that saved my career and made my team actually want to work with my code.
Why I Had to Master This
Three months into my first dev job, my manager pulled me aside.
My setup:
- Junior developer on a 6-person team
- Working on a React app with 50+ components
- Zero commenting standards (everyone just "figured it out")
The wake-up call: I spent 4 hours debugging a function I wrote the week before. Four hours. On my own code. That's when I realized comments aren't just nice-to-have—they're survival tools.
What didn't work:
- No comments at all ("the code explains itself")
- Comments that just repeated the code (
// increment i) - Outdated comments that lied about what the code actually did
The 5 JavaScript Commenting Patterns That Changed Everything
Pattern 1: The "Why" Comment (Use This 80% of the Time)
The problem: Code shows what you're doing, but never why
My solution: Comment the business logic, not the syntax
Time this saves: 30 minutes every time you revisit complex logic
// Bad: Comments the obvious
let discount = 0;
if (user.isPremium) {
discount = 0.15; // Set discount to 15%
}
// Good: Explains the business reason
let discount = 0;
if (user.isPremium) {
// Premium users get 15% off to encourage subscription renewals
discount = 0.15;
}
// Even better: Include the context that matters
let discount = 0;
if (user.isPremium) {
// Marketing team: 15% discount increases renewal rate by 23%
// Based on A/B test data from Q3 2024
discount = 0.15;
}
What this does: Future you (and your teammates) understand the decision-making, not just the mechanics.
My actual code with "why" comments - notice how they explain business decisions, not syntax
Personal tip: If you're writing // set x to y, delete it. Ask yourself "why am I setting x to y?" and comment that instead.
Pattern 2: The "Gotcha" Comment (Your Debugging Lifeline)
The problem: Some code looks wrong but is actually correct for weird reasons
My solution: Document the tricky parts that will confuse people later
Time this saves: Hours of debugging "bugs" that aren't actually bugs
// This looks wrong but is correct
function calculateShipping(weight, distance) {
// Don't "fix" this: API expects weight in grams, but we store in kg
// Converting here would break the integration with ShipFast API
const shippingCost = (weight * 1000) * distance * 0.05;
// Minimum $2.99 shipping - legal requirement in California
return Math.max(shippingCost, 2.99);
}
// Another gotcha I hit constantly
function parseUserInput(input) {
// Trim BEFORE validation, not after
// Edge case: " admin " should not validate as "admin" user
const cleaned = input.trim().toLowerCase();
return cleaned;
}
Expected output: Comments that prevent your teammates from "fixing" code that's already correct.
These comments stopped my team from making the same mistakes I made
Personal tip: Every time you think "this is weird but necessary," write a comment. Your future self will thank you.
Pattern 3: The "TODO with Context" (Actually Actionable)
The problem: Most TODOs are useless because they lack context
My solution: Include priority, reason, and timeline in every TODO
Time this saves: No more wondering which TODOs actually matter
// Bad TODOs (I used to write these)
// TODO: fix this
// TODO: optimize
// TODO: handle edge cases
// Good TODOs (what I write now)
function processPayment(amount, cardToken) {
// TODO (HIGH): Add retry logic for network failures
// Currently fails silently - saw this break 3 transactions in production
// Target: Sprint 23 (Feb 2025)
const payment = chargeCard(amount, cardToken);
// TODO (LOW): Switch to Stripe v4 API when available
// Current v3 API works fine, no rush
// Waiting on their webhook improvements
return payment;
}
What this does: Your team can prioritize work and understand the impact of each TODO.
TODOs that actually help with sprint planning - my PM loves these
Personal tip: If you can't write why this TODO matters, it probably doesn't matter. Delete it.
Pattern 4: The "Complex Logic Breakdown" (Your Thinking Made Visible)
The problem: Complex algorithms look like magic to other developers
My solution: Break down the logic step-by-step like you're explaining to a friend
Time this saves: 45 minutes of head-scratching every time someone needs to modify complex code
function calculateDynamicPricing(basePrice, demand, timeOfDay, userHistory) {
// Dynamic pricing algorithm - 4 factors affect final price
// Step 1: Demand multiplier (1.0 to 2.0)
// High demand = higher prices, caps at 2x to avoid customer anger
const demandMultiplier = Math.min(1 + (demand / 100), 2.0);
// Step 2: Time-of-day adjustment (-20% to +50%)
// Peak hours: 9-11am, 6-8pm get +50%
// Off hours: midnight-6am get -20%
const hourMultiplier = getHourMultiplier(timeOfDay);
// Step 3: Loyalty discount (0% to 15% off)
// Returning customers get better prices to encourage retention
const loyaltyDiscount = userHistory.visits > 5 ? 0.15 : 0;
// Step 4: Apply all adjustments
let finalPrice = basePrice * demandMultiplier * hourMultiplier;
finalPrice = finalPrice * (1 - loyaltyDiscount);
// Never go below 50% of base price (business rule from finance team)
return Math.max(finalPrice, basePrice * 0.5);
}
Expected output: Anyone can understand and modify this algorithm without reverse-engineering it.
Breaking down complex logic - this saved 3 hours in a code review last week
Personal tip: If you're using more than 3 variables in a calculation, add comments. Your brain won't remember the logic in 2 weeks.
Pattern 5: The "API/Data Shape" Comment (Integration Lifesaver)
The problem: You forget what data structure external APIs return
My solution: Document the shape of data you're working with
Time this saves: No more console.log() detective work to remember API responses
// Working with Stripe webhook data
function handlePaymentWebhook(webhookData) {
/* Expected webhook structure:
{
type: "payment_intent.succeeded",
data: {
object: {
id: "pi_1234567890",
amount: 2999, // in cents
currency: "usd",
customer: "cus_abc123",
metadata: {
orderId: "12345",
userId: "user_abc"
}
}
}
}
*/
const payment = webhookData.data.object;
const orderId = payment.metadata.orderId;
// Update our database with the successful payment
updateOrderStatus(orderId, 'paid');
}
// Working with our own API
async function fetchUserProfile(userId) {
const response = await fetch(`/api/users/${userId}`);
/* Response shape:
{
id: "user_123",
email: "user@example.com",
profile: {
name: "John Doe",
avatar: "https://...",
preferences: {
theme: "dark",
notifications: true
}
},
subscription: {
plan: "premium",
expiresAt: "2025-12-31T23:59:59Z"
}
}
*/
return response.json();
}
What this does: No more guessing what properties are available or what format they're in.
Data shape comments - these prevent so many "undefined property" bugs
Personal tip: Copy-paste the actual API response into a comment, then clean it up. Real data beats theoretical examples.
What You Just Built
You now have 5 commenting patterns that work in real production code. These aren't academic theories—they're battle-tested approaches that make debugging faster and collaboration smoother.
Key Takeaways (Save These)
- "Why" comments > "What" comments: Code shows what you did, comments explain why you did it
- Document the gotchas: If it looks wrong but works, explain why it has to be that way
- TODOs need context: Priority, reason, and timeline make TODOs actually actionable
- Break down complex logic: Step-by-step comments turn magic into understandable code
- Document data shapes: API structures and response formats save debugging time
Your Next Steps
Pick one:
- Just starting: Practice "why" comments for one week—they'll change how you think about code
- Getting comfortable: Add "gotcha" comments to tricky code that's caused bugs before
- Ready for more: Learn JSDoc for proper function documentation (builds on these patterns)
Tools I Actually Use
- VS Code with Better Comments extension: Color-codes different comment types
- ESLint with comment rules: Catches outdated TODOs automatically
- JSDoc: When you need formal documentation (but start with these patterns first)
Personal tip: Start with just "why" comments. Master that pattern before adding the others. Quality beats quantity every time.