Hazem Azzam.

BLOGNotes on shipping software

Featuredgit

How to Write Git Issues Like a Professional

A good issue is a contract: it tells the assignee what done looks like before they write a line of code. This post covers titles, bug reports, feature requests, acceptance criteria, labels, and triage habits that keep backlogs actionable instead of overwhelming.

Read the article

All articles

23 ARTICLES

How to Write Git Issues Like a Professional

A good issue is a contract: it tells the assignee what done looks like before they write a line of code. This post covers titles, bug reports, feature requests, acceptance criteria, labels, and triage habits that keep backlogs actionable instead of overwhelming.

  • git
  • github

How to Write Pull Requests Like a Professional

A pull request is a request for someone else's time. Professional PRs respect that: they are small, scoped, and honest about risk. This post covers titles, descriptions, test plans, review etiquette, and habits that get your changes merged faster.

  • git
  • github

How to Code Review: Eight Angles for Catching Real Bugs

Most reviews skim for style and miss the bugs that reach production. Here's a structured, multi-angle approach to reviewing a diff that consistently surfaces real defects — and a verification step that keeps you from crying wolf.

  • code-review
  • engineering

Building a Scalable Multi-Channel Notification Service

A practical architecture for a notification service that delivers across email, SMS, push, and in-app channels. It covers user preferences, rate-limiting, synchronous and batch delivery, queueing with retries, high availability, and the trade-offs between latency, cost, and reliability.

  • architecture
  • notifications

for vs forEach: the differences that actually matter

for and forEach look interchangeable until they aren't. This post walks through what they really differ on — control flow, async behavior, performance, and the cases where each one is the right tool.

  • javascript
  • for-loops

Controlled Inputs in React: One Controller for Any Component

Controlled components power validation and resets, but wiring value and onChange for every field is tedious. Learn how a thin react-hook-form wrapper uses cloneElement and prop mapping to turn any UI component into a controlled field.

  • react
  • controlled-inputs

Caching in Next.js: A Practical Guide for the App Router

Next.js layers several caches—client, server, and on-demand invalidation. This post explains how the App Router cache components model works, when to use cacheLife versus cacheTag, and how to avoid stale data in production.

  • nextjs
  • caching

Improving SEO in Next.js: Key Levers and How to Use Them

A practical map of what actually moves organic search for Next.js apps: metadata, canonical and social tags, sitemaps, structured data, performance, and content structure. Skim the key list up front, then dig into each area with App Router–oriented guidance.

  • nextjs
  • seo

How to Write Professional Commit Messages

Good commit messages turn git history into documentation: they explain what changed and why, without making the next reader trawl through diffs. This post covers subject lines, optional bodies, Conventional Commits, and habits that keep messages clear for you and your team.

  • git
  • workflow

Understanding the N+1 Query Problem and How to Fix It

ORM loops often trigger one extra query per row—classic N+1. Here is what that costs, how to spot it, and how to fix it with joins, batched prefetching, and SQL-side aggregates (with Django-focused examples).

  • performance
  • django

JavaScript Hoisting: What Actually Moves, and What Does Not

Hoisting is often taught as 'declarations move to the top,' but the real story is about when bindings are created and when you are allowed to read them. This post separates `var`, `let`, `const`, functions, and classes — and ties each to the temporal dead zone.

  • javascript
  • hoisting

The JavaScript Event Loop: How Async Code Really Runs

JavaScript runs your code on one thread, yet timers, network responses, and promises still feel concurrent. This post walks through the call stack, the task and microtask queues, and why the order of `setTimeout` and `Promise.then` matters in real apps.

  • javascript
  • event-loop

Drag-and-Drop Row Reordering in React Tables with dnd-kit

A practical guide to letting users drag rows into the order they want, using @dnd-kit alongside TanStack Table. Covers sensors, accessibility, persisting the new order, and how to make drag and column-sort coexist cleanly.

  • react
  • dnd-kit

Order-Total Tampering at Checkout (CWE-840, CWE-602, CWE-345)

A practical analysis of checkout price manipulation where attackers tamper with order totals in client requests. Learn the business-logic root cause, exploit flow, impact, and robust server-side controls to prevent fraudulent purchases.

  • business-logic
  • checkout-security

Clean Architecture in Real Projects: A Practical Guide

A practical walkthrough of Clean Architecture and dependency injection in real codebases. Learn how to keep business rules independent of frameworks, wire ports and adapters cleanly, and evolve a codebase without rewrites.

  • clean-architecture
  • dependency-injection