<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muhammad Ali</title>
    <description>The latest articles on DEV Community by Muhammad Ali (@maliuppal).</description>
    <link>https://dev.to/maliuppal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4085605%2F7aa2ed8b-b6af-499a-b2bd-82f1b3b1ca49.jpg</url>
      <title>DEV Community: Muhammad Ali</title>
      <link>https://dev.to/maliuppal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maliuppal"/>
    <language>en</language>
    <item>
      <title>Stop Hand-Renaming Variables: A Developer's Guide to Case Conventions (With Free Tools)</title>
      <dc:creator>Muhammad Ali</dc:creator>
      <pubDate>Wed, 19 Aug 2026 20:02:39 +0000</pubDate>
      <link>https://dev.to/maliuppal/stop-hand-renaming-variables-a-developers-guide-to-case-conventions-with-free-tools-405b</link>
      <guid>https://dev.to/maliuppal/stop-hand-renaming-variables-a-developers-guide-to-case-conventions-with-free-tools-405b</guid>
      <description>&lt;h1&gt;
  
  
  Stop Hand-Renaming Variables: A Developer's Guide to Case Conventions
&lt;/h1&gt;

&lt;p&gt;If you've ever migrated a PostgreSQL schema to a JSON API, you know the pain.&lt;/p&gt;

&lt;p&gt;Database columns are &lt;code&gt;user_profile_id&lt;/code&gt;. Your React components expect &lt;code&gt;userProfileId&lt;/code&gt;. Your URL slugs need &lt;code&gt;user-profile-id&lt;/code&gt;. And someone on the team just committed &lt;code&gt;UserProfileID&lt;/code&gt; because they were in a hurry.&lt;/p&gt;

&lt;p&gt;Naming conventions are not glamorous. But inconsistent casing causes real bugs — failed API calls, broken ORM mappings, and lint errors that block your PR at 4:55 PM on a Friday.&lt;/p&gt;

&lt;p&gt;This post is a practical guide to the six conventions you'll encounter in the wild, when to use each one, and how to convert between them without manual find-and-replace.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Full reference guide:&lt;/strong&gt; I published a deeper walkthrough with examples for every layer of the stack at &lt;a href="https://caseswitch.net/blog/complete-guide-developer-naming-conventions/" rel="noopener noreferrer"&gt;CaseSwitch&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The six conventions you'll actually use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. camelCase — &lt;code&gt;userProfileId&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; JavaScript/TypeScript variables, JSON API keys, Java methods.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userProfileId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userProfileId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchOrderHistory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; First word lowercase, each following word capitalized. No separators.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. PascalCase — &lt;code&gt;UserProfileCard&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; React components, TypeScript interfaces, C# classes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;OrderSummary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfileCard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Same as camelCase, but the first letter is also capitalized.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. snake_case — &lt;code&gt;user_profile_id&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; Python (PEP 8), Ruby, SQL columns, environment variables in some stacks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_user_profile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;user_profile_id&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;order_history&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. kebab-case — &lt;code&gt;user-profile-id&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; URL slugs, CSS classes, HTML &lt;code&gt;data-*&lt;/code&gt; attributes, CLI flags.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://myapp.com/user-profile/settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.nav-bar-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SEO note:&lt;/strong&gt; Google treats hyphens as word separators in URLs. Underscores are not treated the same way.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. dot.case — &lt;code&gt;user.profile.id&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; i18n translation keys, nested config paths, Lodash-style accessors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"errors.validation.email.invalid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Please enter a valid email."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. SCREAMING_SNAKE_CASE — &lt;code&gt;MAX_RETRY_COUNT&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; Constants, environment variables, some legacy codebases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MAX_RETRY_COUNT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// .env: DATABASE_URL=postgres://...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How conventions map across a typical stack
&lt;/h2&gt;

&lt;p&gt;Here's what a full-stack project often looks like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Convention&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;snake_case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_profile_id&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API JSON&lt;/td&gt;
&lt;td&gt;camelCase&lt;/td&gt;
&lt;td&gt;&lt;code&gt;userProfileId&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React component&lt;/td&gt;
&lt;td&gt;PascalCase&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UserProfileCard&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL route&lt;/td&gt;
&lt;td&gt;kebab-case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/user-profile&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS class&lt;/td&gt;
&lt;td&gt;kebab-case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.profile-card&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i18n key&lt;/td&gt;
&lt;td&gt;dot.case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;errors.email.invalid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Env var&lt;/td&gt;
&lt;td&gt;SCREAMING_SNAKE&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DATABASE_URL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The ORM or serializer handles DB → API transformation. But when you're writing migrations, docs, or one-off scripts, you're doing the conversion yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The migration patterns that break teams
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Database → API.&lt;/strong&gt; You export a CSV with &lt;code&gt;first_name, last_name, email_address&lt;/code&gt; and need camelCase keys for a seed script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spreadsheet → code.&lt;/strong&gt; Product sends a column list in Title Case. Engineering needs snake_case for migrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blog title → URL slug.&lt;/strong&gt; "How to Write SEO-Friendly URLs" becomes &lt;code&gt;how-to-write-seo-friendly-urls&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legacy codebase cleanup.&lt;/strong&gt; Half the variables are camelCase, half are snake_case, and ESLint is screaming.&lt;/p&gt;

&lt;p&gt;Manual conversion fails at scale. Automated converters handle word boundaries consistently.&lt;/p&gt;




&lt;h2&gt;
  
  
  Free tools I use for this
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://caseswitch.net" rel="noopener noreferrer"&gt;CaseSwitch&lt;/a&gt; — a collection of 100+ browser-based utilities. The case converters are what I reach for most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://caseswitch.net/camelcase-converter/" rel="noopener noreferrer"&gt;camelCase Converter&lt;/a&gt; — &lt;code&gt;user profile id&lt;/code&gt; → &lt;code&gt;userProfileId&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://caseswitch.net/snake-case-converter/" rel="noopener noreferrer"&gt;snake_case Converter&lt;/a&gt; — &lt;code&gt;userProfileId&lt;/code&gt; → &lt;code&gt;user_profile_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://caseswitch.net/kebab-case-converter/" rel="noopener noreferrer"&gt;kebab-case Converter&lt;/a&gt; — &lt;code&gt;user profile id&lt;/code&gt; → &lt;code&gt;user-profile-id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://caseswitch.net/pascalcase-converter/" rel="noopener noreferrer"&gt;PascalCase Converter&lt;/a&gt; — &lt;code&gt;user profile card&lt;/code&gt; → &lt;code&gt;UserProfileCard&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://caseswitch.net/slug-generator/" rel="noopener noreferrer"&gt;Slug Generator&lt;/a&gt; — blog titles → URL-safe slugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs locally in the browser. I use these when formatting API keys and migration drafts — nothing gets uploaded.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common mistakes (and how to avoid them)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mixing conventions in the same API response.&lt;/strong&gt; Pick one style per layer and enforce it with linters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using kebab-case in JavaScript variable names.&lt;/strong&gt; Hyphens are minus operators. Use camelCase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Title Case in database columns.&lt;/strong&gt; Requires quoting in SQL and breaks most ORMs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring acronyms.&lt;/strong&gt; Decide upfront: &lt;code&gt;apiKey&lt;/code&gt; or &lt;code&gt;APIKey&lt;/code&gt;? Document it in your style guide and stick to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Converting without checking output.&lt;/strong&gt; Automated tools don't know that &lt;code&gt;iPhone&lt;/code&gt; and &lt;code&gt;JavaScript&lt;/code&gt; have special casing. Always scan results before committing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📖 &lt;a href="https://caseswitch.net/blog/complete-guide-developer-naming-conventions/" rel="noopener noreferrer"&gt;Complete Guide to Developer Naming Conventions&lt;/a&gt; — full reference with code samples&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://caseswitch.net/blog/what-is-camelcase/" rel="noopener noreferrer"&gt;What Is camelCase?&lt;/a&gt; — deep dive for JavaScript developers&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://caseswitch.net/blog/seo-url-slugs-kebab-case/" rel="noopener noreferrer"&gt;SEO URL Slugs: Why kebab-case Wins&lt;/a&gt; — URL naming for web projects&lt;/li&gt;
&lt;li&gt;🔧 &lt;a href="https://caseswitch.net/json-formatter-minifier/" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt; — pretty-print API responses while you're renaming fields&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's your biggest naming convention headache?
&lt;/h2&gt;

&lt;p&gt;Drop a comment — I'm curious whether it's database migrations, API design, or CSS class naming that causes the most friction on your team.&lt;/p&gt;

&lt;p&gt;If this was useful, the &lt;a href="https://caseswitch.net/blog/complete-guide-developer-naming-conventions/" rel="noopener noreferrer"&gt;full guide on CaseSwitch&lt;/a&gt; goes deeper on each convention with a quick-reference conversion table.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CaseSwitch is free, requires no account, and processes most tools locally in your browser. &lt;a href="https://caseswitch.net" rel="noopener noreferrer"&gt;Try it →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
