Naming things consistently is one of the underappreciated skills in software development. Every programming language, every framework, and every protocol has its own conventions for how words in multi-word identifiers are joined. camelCase, snake_case, PascalCase, kebab-case — these are not aesthetic preferences. They are conventions that encode information about scope, type, and context, and violating them creates friction every time a developer reads or searches your code.
camelCase: JavaScript and APIs
camelCase joins words without separators, capitalizing the first letter of each word except the first: firstName, getUserById, isActiveAccount. The name comes from the humps formed by the internal capital letters. It is the dominant convention in JavaScript, TypeScript, Java, and most languages in the C-family for variable names, function names, and object property names.
In JavaScript specifically, the standard library and DOM API use camelCase universally: addEventListener, getElementById, innerHTML, JSON.parse(). Following this convention means your code reads consistently alongside the platform it runs on. Deviating to snake_case in a JavaScript codebase creates constant mental switching between conventions.
REST API JSON responses from JavaScript and Node.js services conventionally use camelCase. This is a practical choice — the data maps directly to JavaScript object properties without transformation. APIs from Python or Ruby backends often use snake_case instead. This mismatch is a common source of client-side bugs where developers forget to account for the naming difference between the API response and their JavaScript code.
snake_case: Python, Databases, and System Code
snake_case separates words with underscores, keeping all letters lowercase: first_name, get_user_by_id, is_active_account. It is the dominant convention in Python (PEP 8), Ruby, Rust, C standard library functions, and SQL. snake_case is often considered the most readable format for human eyes because the underscores provide clear visual separation.
SQL column names and table names almost universally use snake_case: user_id, created_at, product_category. Database identifiers are typically case-insensitive, so PascalCase or camelCase column names are risky — some databases normalize everything to lowercase, turning firstName into firstname. snake_case with lowercase eliminates this ambiguity.
File names in many ecosystems also use snake_case: Python module names (my_module.py), shell scripts (deploy_app.sh), and system configuration files. When a file name needs to be a valid identifier in the language (Python imports, for example), snake_case is the safe choice because it avoids hyphens, which are not valid in Python identifiers.
PascalCase: Classes and Components
PascalCase (also called UpperCamelCase) capitalizes the first letter of every word with no separators: FirstName, UserAccount, HttpResponse. It is universally used for class names across virtually all object-oriented languages — Java, C#, Python, JavaScript, TypeScript, Go. The visual distinction between a PascalCase class name and a camelCase variable name immediately communicates the identifier's type.
React component names must use PascalCase to distinguish them from HTML elements. A component named button is treated by JSX as the HTML button element. A component named Button is treated as a React component. This is not a convention — it is a parser requirement. The same logic applies in Vue and other JSX-based frameworks.
Enum names and their members conventionally use PascalCase in TypeScript and C#: enum UserRole { Admin, Editor, Viewer }. In Python, enum members use SCREAMING_SNAKE_CASE by convention: class UserRole(Enum): ADMIN = 1. These subtleties matter for code that crosses language boundaries, such as when a TypeScript frontend consumes a Python backend API.
kebab-case and SCREAMING_SNAKE_CASE
kebab-case uses hyphens as separators and all lowercase: font-size, background-color, my-component. It is the native convention for CSS property names, HTML attribute names, and URL paths. Since hyphens are not valid identifier characters in most programming languages, kebab-case is restricted to contexts where identifiers are strings: CSS, HTML attributes, URL slugs, and CLI flags (--output-file).
SCREAMING_SNAKE_CASE (all caps with underscores) is universally used for constants and environment variables: MAX_RETRY_COUNT, API_BASE_URL, DATABASE_URL. The visual weight of all-caps signals "this value does not change at runtime." In Python, JavaScript (const with module-scope values), and environment files, this convention is universal across ecosystems.
Converting between cases programmatically requires knowing the word boundaries. A naive split on capital letters handles camelCase and PascalCase but misses acronyms (HTMLParser should become html-parser not h-t-m-l-parser). A split on underscores handles snake_case. A well-designed case converter applies all these rules, handling edge cases like consecutive capitals, numbers adjacent to letters, and leading/trailing separators.
Case conventions are a form of documentation. A reader who knows the conventions of a language can infer from an identifier's format whether it is a class, a constant, a function, or a file path — before reading a single character of surrounding context. Consistent application of these conventions is part of writing idiomatic code that your team can read quickly. A case converter is an everyday utility for renaming identifiers when refactoring, converting data keys between API formats, or ensuring consistency when integrating code from different language ecosystems.