<?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: Richard Dillman</title>
    <description>The latest articles on DEV Community by Richard Dillman (@richarddillman).</description>
    <link>https://dev.to/richarddillman</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%2F183194%2F0030a8e2-21ec-4e4c-b5b2-f7a4e476f013.jpg</url>
      <title>DEV Community: Richard Dillman</title>
      <link>https://dev.to/richarddillman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/richarddillman"/>
    <language>en</language>
    <item>
      <title>You're Not Blocked. Your Work Is.</title>
      <dc:creator>Richard Dillman</dc:creator>
      <pubDate>Sun, 26 Jul 2026 20:12:23 +0000</pubDate>
      <link>https://dev.to/richarddillman/youre-not-blocked-your-work-is-1f77</link>
      <guid>https://dev.to/richarddillman/youre-not-blocked-your-work-is-1f77</guid>
      <description>&lt;p&gt;What my grandfather understood about being indispensable&lt;/p&gt;

&lt;p&gt;Let me tell you about the most productive week of my career, during which I accomplished absolutely nothing of value and was lavishly praised for it.&lt;/p&gt;

&lt;p&gt;I was brand new to the company, early career. First week on the team, still learning where the coffee was, still doing that thing where you laugh a beat late at jokes you didn't understand because you don't yet know all the context. And the fellow who wrote the .NET side of our little operation, the man whose code my code was supposed to talk to, went on vacation.&lt;/p&gt;

&lt;p&gt;For a week. &lt;/p&gt;

&lt;p&gt;Of course, he was entitled to have a vacation, and I want to state that clearly and without sarcasm, because I'm about to spend a thousand words making his vacation sound like the Hindenburg, and none of this was his fault.&lt;/p&gt;

&lt;p&gt;The work in front of me needed his endpoints. His endpoints did not exist. He wasn’t there to write them. I was a frontend person who was, at that point in his life, generously described as "learning JavaScript," and who knew precisely as much about .NET then as he does now, which is nothing.&lt;/p&gt;

&lt;p&gt;So there I sat. Blocked. Stopped. Done. Free, arguably, to spend the week reorganizing my desk.&lt;/p&gt;

&lt;p&gt;Now, here's where you might imagine that a wise senior engineer put a hand on my shoulder and explained the way forward. That's not what happened. What did happen is that I was raised by a man who would have found my situation morally suspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  A word about my grandfather
&lt;/h2&gt;

&lt;p&gt;He was a shop steward. If you're unfamiliar with blue-collar union shops of half a century ago, this means he was the person on the factory floor that a co-worker went to when something was wrong. He then took it to management, and was therefore trusted by everybody and beloved by nobody. This is a very specific kind of job and it makes a very specific kind of man.&lt;/p&gt;

&lt;p&gt;He told me, more times than I can count:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nothing and nobody stands in your way. If you don't have the thing you need, make do with what you have. And if the person who does the job you need done isn't here, then you learn to do their job.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hold onto that last sentence. We're going to come back to it, and I'm going to reveal that I misunderstood it for roughly two decades.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did instead of nothing
&lt;/h2&gt;

&lt;p&gt;I didn’t learn .NET. I had standards, and one of them was that.&lt;/p&gt;

&lt;p&gt;What I figured out from whatever scraps of the internet existed at the time, was how to build a convincing imitation of a thing that doesn't exist yet. In the dev world, we call these mocks. Stubs. Fakes. We devs didn’t invent this concept. Go to a home show, or a home-improvement place, and you’ll see cabinets installed in a mock kitchen. The rest of the house isn’t needed to get the task at hand done. &lt;/p&gt;

&lt;p&gt;It's honest work, oddly. Everybody knows it's fake. That's the deal.&lt;/p&gt;

&lt;p&gt;And it worked. The backender came back from vacation, and his endpoints landed. Of course they were not shaped the way I'd guessed they'd be, because “guessing” isn’t “knowing”, so I spent some time pulling my placeholders out one at a time and putting the real thing in behind them. But the work was there, waiting for me to dive into. I had not spent the week rearranging my desk.&lt;/p&gt;

&lt;p&gt;He was impressed. They asked me to show the other frontend folks how to do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hero reading
&lt;/h2&gt;

&lt;p&gt;Here's the thing about being praised for a workaround. It feels molecularly identical to being praised for a solution. There is no way to tell them apart from the inside. I have looked.&lt;/p&gt;

&lt;p&gt;Let’s read my grandfather's line again:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the person who does the job you need done isn't here, you learn to do their job.&lt;br&gt;
I heard that as “Grit your teeth, kid, be the hero, don't be the person standing around with his hands in his pockets.” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the flattering reading, and I was twenty-something, and I took the flattering reading, because that's what twenty-something is for. Honestly, who doesn’t enjoy being a hero? I once worked for a company that had a little green hero cape for heroic saves. Everyone loves a hero.&lt;/p&gt;

&lt;p&gt;And that reading isn't useless. It's the thing I still tell every new engineer who'll sit still long enough to hear it:&lt;/p&gt;

&lt;p&gt;You can't be blocked. There is always something to do.&lt;/p&gt;

&lt;p&gt;Write some documentation. Fix the linting errors. Increase the test coverage. Go learn the thing you've been avoiding because it's dull, or because you're a little afraid of it. Grab a broom. Empty the trash bins.&lt;/p&gt;

&lt;p&gt;And I mean that last part literally, which is why I say it. I'm not above trash duty. I have never once in my life been above trash duty, and I'll tell you something, I've never met a good one who was. That instinct, to sit there blocked rather than do something useful that doesn't happen to look impressive, is real. It's just worth calling it what it is. That's vanity. That's not a blocker.&lt;/p&gt;

&lt;h2&gt;
  
  
  The half I missed
&lt;/h2&gt;

&lt;p&gt;But notice what "you can't be blocked" doesn't say. It doesn't say the work can't be blocked.&lt;/p&gt;

&lt;p&gt;Because the work absolutely can. That ticket can be dead in the water while you are perfectly fine, whistling, up to your elbows in something else entirely. Those are two different facts, and a standup meeting mashes them into one status, and the one that comes out of your mouth is the one about you.&lt;/p&gt;

&lt;p&gt;Which is exactly the trap I walked into, and got applauded for. Look at what actually happened that week. A company discovered that it had exactly one human being who could write its backend, and that when that human being took a perfectly ordinary vacation, the work stopped. That's not a scheduling inconvenience. That's a structural fact about the business, and it walked right up to them and introduced itself.&lt;/p&gt;

&lt;p&gt;And the reason they noticed is that some kid had to spend his first week building a papier-mâché backend to survive it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There's always something to do&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If "there's always something to do" just means you stay busy, you haven't solved a thing. You've hidden one. The board looks fine. Nothing's red. Everybody's productive. And the actual problem is sitting right where it was, running up a bill nobody is counting, precisely because you were good enough at your job to make sure it never showed a single symptom.&lt;/p&gt;

&lt;h2&gt;
  
  
  That's not grit. That's camouflage.
&lt;/h2&gt;

&lt;p&gt;My grandfather was a shop steward, and a shop steward is not in the hero business. He was a cross-train-everybody man, his entire life. The reason a union hall insists that everyone on the floor knows more than just their own machine is that a shop where exactly one person knows how a thing works is one vacation, one illness, one bad afternoon away from stopping cold. On a factory floor, redundancy isn't a nice-to-have. It's the whole ballgame. &lt;/p&gt;

&lt;p&gt;He wasn't telling me to be a hero. He was telling me that a shop where only one worker knows the machine has a problem, and that the fix is for more on the floor to know the machine.&lt;/p&gt;

&lt;p&gt;Same sentence. Both halves sitting right there in it, the whole time. I took the half that made me feel good about myself.&lt;/p&gt;

&lt;p&gt;To the company's enormous credit — and I want to be fair, because this story could have gone the other way and usually does — they did the right thing. We started cross-training the backend people across the different parts of the system. The next time somebody went on vacation, nothing happened. The most boring possible outcome, which is what a fixed problem looks like.&lt;/p&gt;

&lt;p&gt;I didn't understand at the time that this was the actual ending of the story. I thought the ending was that I was clever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Say both things
&lt;/h2&gt;

&lt;p&gt;The work is blocked, and I am not blocked, both.&lt;/p&gt;

&lt;p&gt;The work is blocked: Here's the cause. Here's what it's costing us. That goes to the room, and it goes to whoever's above the room, and you don't soften it, and you don't swallow it just because you found a clever way around it. A way around is not a fix. The bottleneck is still there, and it will be there next month, wearing a different hat.&lt;/p&gt;

&lt;p&gt;I am not blocked: Here's what I’ve done, and here’s what I’m doing next.&lt;/p&gt;

&lt;p&gt;The first part is the shop steward. The second is the kid. My grandfather was both, and he handed me both, and I spent an embarrassingly long time doing only the one that felt like winning.&lt;/p&gt;

&lt;p&gt;The same split explains the PR sitting out there waiting on a review. Nobody is coming. Nobody is thinking about your branch. Nobody feels the little pang of guilt you've imagined them feeling. Their day does not get worse because your work is going stale. &lt;/p&gt;

&lt;p&gt;It’s not &lt;em&gt;their&lt;/em&gt; problem. It’s yours.&lt;/p&gt;

&lt;p&gt;So go get it. Ask in the channel. Ask again. Walk over there. Put the ticket on the screen in standup where everybody can see what's waiting on what. Cut your nine-hundred-line monstrosity into something a human being could actually review without weeping, because a diff that size isn't a request, it's an imposition, and you know it.&lt;/p&gt;

&lt;p&gt;Get pushy, but not rude. Pushy. And then a little pushier than feels comfortable, because the alternative is sitting there "blocked on review," which is the softest, most pitiful version of that word ever spoken in a conference room. You're not blocked. You just haven't asked hard enough yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are you blocking somebody?
&lt;/h2&gt;

&lt;p&gt;That's the shop steward giving me the side eye. But hero mode can blind a dev to that, which is the whole problem.&lt;/p&gt;

&lt;p&gt;It can show up as being the only one who knows how the deployment works. Being the one with the credentials. Being the person they come to. I was the only SEO person once. The only Lighthouse person. Way back, I was the only one on the dev team who could get a thing done with a CSS selector instead of a heap of JavaScript, and I'll admit it felt terrific.&lt;/p&gt;

&lt;p&gt;None of it felt like being a bottleneck. It felt like being valuable, which is the most flattering thing, and the hardest thing to see straight.&lt;/p&gt;

&lt;p&gt;Being the person they come to while being the person they wait on - that’s the blocker.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You're a bottleneck with good performance reviews&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So go look. Whose work runs through you? What breaks if you take a week off — which you are also entitled to do? If the honest answer is "quite a lot," then you're not indispensable. You're a bottleneck with good performance reviews.&lt;/p&gt;

&lt;p&gt;Make do. Don’t be in the way. Be loud about what is in the way.&lt;/p&gt;

&lt;p&gt;My grandfather would've had that figured out before lunch. Took me twenty years, but I got there.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why Your React Component Is a Hot Mess (and How to Fix It)</title>
      <dc:creator>Richard Dillman</dc:creator>
      <pubDate>Wed, 25 Jun 2025 17:27:44 +0000</pubDate>
      <link>https://dev.to/richarddillman/why-your-react-component-is-a-hot-mess-and-how-to-fix-it-24n3</link>
      <guid>https://dev.to/richarddillman/why-your-react-component-is-a-hot-mess-and-how-to-fix-it-24n3</guid>
      <description>&lt;p&gt;Writing React components is kind of like doing laundry. Sure, you could toss everything in together and hope for the best… but you'll probably end up with pink socks and runtime errors. A clean, consistent order inside your functional components helps your code stay readable, maintainable, and most importantly, not broken.&lt;/p&gt;

&lt;p&gt;React’s &lt;a href="https://reactjs.org/docs/hooks-rules.html" rel="noopener noreferrer"&gt;Rules of Hooks&lt;/a&gt; are like those “do not put metal in the microwave” warnings. They exist because someone did put &lt;code&gt;useEffect&lt;/code&gt; inside a &lt;code&gt;for&lt;/code&gt; loop, and things caught fire.&lt;/p&gt;

&lt;p&gt;Let’s walk through a solid, time-tested order for organizing logic inside a functional component. You won’t always need every section, but knowing the ideal flow can save you from future debugging-induced hair loss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Hook Order Matters
&lt;/h2&gt;

&lt;p&gt;React tracks hooks by position, not by name. Think of it like calling roll in class, if someone swaps seats, the teacher starts marking the wrong student absent.&lt;/p&gt;

&lt;p&gt;If your hook order changes between renders (say, putting a hook inside an &lt;code&gt;if&lt;/code&gt; statement), React gets confused. Confused React is not fun React. You’ll likely see this cryptic gem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React has encountered a hook call that is inconsistent with previous renders.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1 Hooks - Built-in (useState, useEffect, etc.)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why they go first:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React’s built-in hooks need to run in the exact same order every time. No surprises, no detours, no mystery meat. Putting them right at the top ensures everything is predictable and in line with React’s rules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ExampleComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Guest&lt;/span&gt;&lt;span class="dl"&gt;"&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;Think of this section as the “meet the characters” part of a movie. Everyone’s introduced early, so the plot (i.e., the render) makes sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  2 Custom Hooks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why they’re next:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Custom hooks are like those helpful friends who show up with a toolbox and a pot of coffee. They usually rely on built-in hooks, so we want the foundation laid before they come in and start tightening bolts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTheme&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stacking them under the built-ins gives you a nice clean "hooks zone" where all the magic starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Derived Data (from props or state)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why it goes here:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you’ve got your raw ingredients (props, destructured props, and state), it’s time to prep them. Derived variables are like chopping onions, not exciting, but necessary before you start cooking the actual dish.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isLoggedIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;displayName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anonymous&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put these right after hooks so you’re always working with declared and up-to-date values.&lt;/p&gt;

&lt;h2&gt;
  
  
  4 Callbacks (useCallback, useMemo, useRef, etc.)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What now:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Callbacks and memoized values depend on state or props, and you want them nicely memoized before you start rendering or passing them down. Think of this as labeling your leftovers before you put them in the fridge.&lt;/p&gt;

&lt;p&gt;Note: If it can be easily done, move these outside the component, but if they rely on the hooks or modify them, don't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&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;Keeps things neat. Prevents unnecessary re-renders. Your future self will thank you.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Effects (useEffect, useLayoutEffect, etc.)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why are they down here:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Effects are the "cleanup crew" running after shadow dom has been generated the browser. Effects are hooks so order still matters. Even if you wind up not needing a hook it is still counted. They need to be after other types of hooks, or data, but before any conditional logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Component mounted or count changed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6 Conditional Logic (Conditionals, loops, fragments, etc.)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why it's here:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before React can draw the UI, you might need to make decisions, like whether to show a login prompt or a dashboard. This is where that logic lives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical rule:&lt;/strong&gt;&lt;br&gt;
Never put conditionals above your hooks. That’s how you get runtime gremlins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LoginPrompt&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This section is your last prep before serving the dish.&lt;/p&gt;

&lt;h2&gt;
  
  
  7 Return JSX
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why is this last:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s the final product! The visual output. The “ta-da!” moment. This is what the user sees, and it should be the last thing, after all your setup work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;displayName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click me (&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;React won’t force you to follow this order, but following a logical structure helps future-you (or your teammates) understand what’s happening and reduces the chance of hook-related surprises.&lt;/p&gt;

&lt;p&gt;Want to enforce it automatically? Tools like ESLint (with &lt;a href="https://github.com/facebook/react/tree/main/packages/eslint-plugin-react-hooks" rel="noopener noreferrer"&gt;eslint-plugin-react-hooks&lt;/a&gt;) and Prettier can keep your components nice and tidy.&lt;/p&gt;

&lt;p&gt;Working with an LLM like Claude or ChatGPT? Add this structure to its &lt;a href="https://www.anthropic.com/engineering/claude-code-best-practices#1-customize-your-setup" rel="noopener noreferrer"&gt;coding style guide&lt;/a&gt; so your AI pair-programmer doesn’t throw spaghetti at your component tree.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bonus dad joke: What do you call a TV vaccination?&lt;br&gt;
A screenshot.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>react</category>
      <category>programming</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Hero Image Optimization Techniques</title>
      <dc:creator>Richard Dillman</dc:creator>
      <pubDate>Tue, 17 Jan 2023 06:17:55 +0000</pubDate>
      <link>https://dev.to/richarddillman/hero-image-optimization-techniques-3mkk</link>
      <guid>https://dev.to/richarddillman/hero-image-optimization-techniques-3mkk</guid>
      <description>&lt;p&gt;Page speed is essential in determining a website's user experience. If a user can’t experience the content, they’ll bounce. A site's ideal complete load time is below 2 seconds. Studies show that most users will abandon the page within 3 seconds. You can also expect a 1.3% increase in that abandonment for every additional 100ms. For this reason, Google rates page speed quite heavily for SEO, and Google's Search Console provides a report on LCP, which can help website owners understand and improve the loading performance of their pages.&lt;/p&gt;

&lt;p&gt;Reasons why page speed needs to be a key KPI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you want your page to rank well in organic searches&lt;/li&gt;
&lt;li&gt;you want your ads to perform&lt;/li&gt;
&lt;li&gt;you don’t want users abandoning your page out of frustration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fortunately, a lot of low-hanging fruit can make a big difference in getting started. Following are some issues that I see a lot and have pretty straightforward ways to address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring page speed
&lt;/h2&gt;

&lt;p&gt;One of the key metrics used to measure page speed is the &lt;a href="https://web.dev/lcp/" rel="noopener noreferrer"&gt;Largest Contentful Paint (LCP)&lt;/a&gt;. The LCP measures the time it takes for the largest content element visible in the viewport to load and render. Therefore, optimizing the hero image can improve LCP and web page speed. Your goal is to have LCP occur as quickly as possible. Google has defined this as &lt;a href="https://support.google.com/webmasters/answer/9205520?hl=en#status_bucket" rel="noopener noreferrer"&gt;within 2.5 seconds&lt;/a&gt; or faster measured from the start of page load.&lt;/p&gt;

&lt;p&gt;We should always strive to set the hero image src in the initial HTML payload to reduce the length of the critical request chain. Some frameworks will add the src via Javascript or CSS. However, this will always take additional time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The file size
&lt;/h2&gt;

&lt;p&gt;One way to speed up the hero image is to reduce its file size through compression. You could also use a tool like &lt;a href="https://imageoptim.com/" rel="noopener noreferrer"&gt;ImageOptim&lt;/a&gt;, or &lt;a href="https://nextjs.org/docs/api-reference/next/image" rel="noopener noreferrer"&gt;NextJS’s Image Component&lt;/a&gt;. Additionally, a next-gen image format like &lt;a href="https://web.dev/serve-images-webp/" rel="noopener noreferrer"&gt;WebP&lt;/a&gt;, available for all modern browsers, can significantly reduce the file size without sacrificing quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  A content delivery network
&lt;/h2&gt;

&lt;p&gt;Another way to improve the LCP is to use a Content Delivery Network (CDN) to serve the hero image. A CDN is a network of servers distributed around the world. It can significantly reduce the time it takes for file delivery by serving it from a geographically closer server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Specify native height and width
&lt;/h2&gt;

&lt;p&gt;Images should always have both height and width tags to allow the browser to calculate the aspect ratio. These should be the native size of the image while allowing CSS to set the actual rendered size. Adding the height and width allows the browser to hold this space open for the image; therefore, the page will not shift when it loads, allowing the measurement to take place more quickly.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of using the height and width:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero-image.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
    &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Hero Image."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The srcset and sizes attributes
&lt;/h2&gt;

&lt;p&gt;A more responsive image optimization is to use the srcset and sizes attributes. These attributes allow you to provide different versions of an image for different screen sizes and resolutions and can significantly reduce the amount of data on smaller devices or lower-resolution screens.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of using the srcset and sizes:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero-image.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
        hero_400px.jpg 400w,
        hero_800px.jpg 800w,
        hero_1600px.jpg 1600w
    "&lt;/span&gt; 
    &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 600px) 100vw, 50vw"&lt;/span&gt; 
    &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Hero Image."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The loading attribute
&lt;/h2&gt;

&lt;p&gt;The loading attribute can prevent or encourage the browser’s loading order. The loading attribute can be set to lazy or eager, depending on the use case. “Lazy” loads the image when it becomes visible in the viewport, while eager loads the image immediately when the page is loaded, whether or not it’s in the viewport.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of using the loading attribute:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero-image.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
    &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"eager"&lt;/span&gt;
    &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Hero Image."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can add the loading attribute with a value of “lazy” to other images on your page when they should not load early. Slowing these items down helps speed up the rest of the assets. Lazy images are requested immediately if they are within the viewport. Outside the viewport, they are delayed and only fetched when approaching it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The link tag with preload
&lt;/h2&gt;

&lt;p&gt;A link tag with the preload attribute tells the browser about critical resources before encountering them in HTML. So, for example, you can use preload to increase the download priority of late-discovered Hero images, especially if they load via Javascript or CSS.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of using the link tag:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"hero-image.jpg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are already using the srcset in your hero’s image tag, you can also use that here in the link tag and ensure that the correct size image is selected.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of using the link tag with a responsive image:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt;
    &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt;
    &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt;
    &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"hero-image.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;imagesrcset=&lt;/span&gt;&lt;span class="s"&gt;"
        hero_400px.jpg 400w,
        hero_800px.jpg 800w,
        hero_1600px.jpg 1600w
    "&lt;/span&gt; 
    &lt;span class="na"&gt;imagesizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 600px) 100vw, 50vw"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The fetchpriority attribute
&lt;/h2&gt;

&lt;p&gt;You can use a fetchpriority attribute to do the same thing as a link preload, although you will have to wait for the processor to discover the image tag. A priority hint can adjust the loading order of assets such as images, CSS, iframes, scripts, and fonts. So the Hero can be requested before other lower-priority assets. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of using the fetchpriority attribute:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero-image.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
    &lt;span class="na"&gt;fetchpriority=&lt;/span&gt;&lt;span class="s"&gt;"high"&lt;/span&gt;
    &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Hero Image."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Putting it all together
&lt;/h2&gt;

&lt;p&gt;Using all the resources we have learned, we can apply them all to receive an optimal loading path.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of using all the tools:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt;
        &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt;
        &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt;
        &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"hero-image.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;imagesrcset=&lt;/span&gt;&lt;span class="s"&gt;"
            hero_400px.jpg 400w,
            hero_800px.jpg 800w,
            hero_1600px.jpg 1600w
        "&lt;/span&gt; 
        &lt;span class="na"&gt;imagesizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 600px) 100vw, 50vw"&lt;/span&gt;
    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero-image.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
        &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;”400”&lt;/span&gt;
        &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"
            hero_400px.jpg 400w,
            hero_800px.jpg 800w,
            hero_1600px.jpg 1600w
        "&lt;/span&gt; 
        &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 600px) 100vw, 50vw"&lt;/span&gt; 
        &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Hero Image."&lt;/span&gt;
        &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"eager"&lt;/span&gt;
        &lt;span class="na"&gt;fetchpriority=&lt;/span&gt;&lt;span class="s"&gt;"high"&lt;/span&gt;
    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optimizing the hero image is essential in improving the LCP and web page speed. Applying the above techniques can get your site dramatically closer to that 2.5 seconds goal!&lt;/p&gt;

</description>
      <category>pagespeed</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>responsive</category>
    </item>
    <item>
      <title>Head tags organized</title>
      <dc:creator>Richard Dillman</dc:creator>
      <pubDate>Thu, 14 Jan 2021 20:41:48 +0000</pubDate>
      <link>https://dev.to/richarddillman/head-tags-organized-1c7p</link>
      <guid>https://dev.to/richarddillman/head-tags-organized-1c7p</guid>
      <description>&lt;p&gt;Order (still) matters&lt;/p&gt;

&lt;p&gt;A minimal number of tags are allowed within the HEAD of HTML documents. Those tags are title, style, base, link, meta, script, and noscript. Oddly enough, these elements’ order can drastically alter the loading of your document and its dependencies. Here are some things I have discovered trying to scratch out better performance within the sites I work on.&lt;/p&gt;

&lt;h2&gt;
  
  
  1: Character Encodings
&lt;/h2&gt;

&lt;p&gt;The meta tag for the charset declaration should fit entirely within the first 1024 bytes of the file. If the charset is included later in the code, the HTML will be re-parsed once encountered, wasting precious time before rendering anything. So always put it first. The same reasoning applies to the viewport and other meta tags that describe how a page should render.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2: Title Tag
&lt;/h2&gt;

&lt;p&gt;The title tag’s purpose is to declare the name of the document. It will replace the URL within the browser's tab, so it is good to place it as early as possible to avoid confusion if the user notices when the tab name updates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Page Title&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3: Preconnected Links
&lt;/h2&gt;

&lt;p&gt;Here we are focused on third-party domains that we know for sure will be requested. Preconnect will handle the DNS lookup, navigate the connection, and any redirects necessary to reach the targets. It will not download any content. Requesting these connections is particularly helpful on slow connections to establish the route as early as possible. However, this can be costly for mobile devices as multiple connections can consume unnecessary bandwidth.  Only preconnect to servers you are certain will be needed, such as analytics, your CDN, or your static asset site.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preconnect"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.google-analytics.com"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4: Synchronous Scripts
&lt;/h2&gt;

&lt;p&gt;Synchronous scripts include any JavaScript that must run before the page renders, such as populating the dataLayer. Here we include script blocks and external scripts but not deferred or async ones. No matter where it is, any script in the head will block applying CSS, even after the CSS. The browser must process anything that might modify the DOM before processing your styles.  So you should add those synchronous scripts before your style sheet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5: Synchronous CSS
&lt;/h2&gt;

&lt;p&gt;This includes inline style blocks and style sheets that are used for rendering. Consider using media queries and breaking your styles into multiple files. The media attribute will let the browser know if this CSS is going to be render-blocking or not.&lt;/p&gt;

&lt;p&gt;Inline styles are parsed first. It is important that we remember that styles are parsed as they are encountered.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;External files are requested and parsed next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"style.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next to be requested and parsed are the styles with media queries. If they match your current breakpoint, orientation, or pixel density.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"other.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width:768px)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next up for request and parsing are the print style sheets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"print.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"print"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stylesheets with media queries that do not match the current environment will not be requested.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"other.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width:1024px)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Knowing this, you can also trick the browser into loading non-critical CSS a bit later with the onLoad method. By pretending this is a print sheet, it will load after all other CSS but before any containing media queries. Once its load event fires, the media changes to all. With this being async, that will happen after the DOM has been parsed and images begin loading.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"lazy.css"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"print"&lt;/span&gt; &lt;span class="na"&gt;onload=&lt;/span&gt;&lt;span class="s"&gt;"this.media='all'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6: Preloaded Links
&lt;/h2&gt;

&lt;p&gt;We should preload as few files as possible. These should be visual elements that are required for above the fold rendering. This includes items like fonts, hero images, or icons.  As for fonts, you most likely only need the woff2 version. Also, consider loading the fonts from your own server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"font"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"font.woff2"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"font/woff2"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7: Asynchronous or deferred Scripts
&lt;/h2&gt;

&lt;p&gt;All other scripts[?] requested, such as those that add interaction handlers, go here. We should put these at the bottom of the body to allow for quicker parsing of the DOM. But if you must put them in the head due to CMS or framework restrictions, place them here, and set them to either async or defer depending on your need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"foo.js"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"bar.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8: Prefetched Links
&lt;/h2&gt;

&lt;p&gt;These are assets that you know for sure you will need later within this page's render cycle. This includes things that you want in place before they are needed. This could include logos in the footer, Twitter feeds, or videos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"prefetch"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"jwpplayer.js"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9: Prerendered Links
&lt;/h2&gt;

&lt;p&gt;Entire content pages that you are reasonably certain that your user will visit next. You can download the assets for that page before it is even requested. I would render things like login, search, cart, or the next page in a series.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"prerender"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/search/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10: Non-rendering assets
&lt;/h2&gt;

&lt;p&gt;This includes meta tags and scripts that do not affect rendering in any way, such as OpenGraph, manifests, structured data. These tags are for bots and sharing in social media but are not necessary to render the page. To include a script in this spot it must be inline as this content will be inspected in the first pass through the document.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"shortcut icon"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"icon.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"apple-touch-icon-precomposed"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"icon.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"apple-mobile-web-app-title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Company Name"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://companyname.com"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:card"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"summary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"icon.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://json-ld.org/contexts/person.jsonld&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://dbpedia.org/resource/John_Lennon&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John Lennon&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;born&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1940-10-09&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;spouse&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://dbpedia.org/resource/Cynthia_Lennon&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are the most common tags that could be in your head. Do you wonder about any not listed here? Bring them up in the comments, and let’s discuss!&lt;/p&gt;

</description>
      <category>html</category>
      <category>performance</category>
      <category>javascript</category>
      <category>css</category>
    </item>
    <item>
      <title>Creating readable names</title>
      <dc:creator>Richard Dillman</dc:creator>
      <pubDate>Thu, 14 Jan 2021 20:41:22 +0000</pubDate>
      <link>https://dev.to/richarddillman/creating-readable-names-359d</link>
      <guid>https://dev.to/richarddillman/creating-readable-names-359d</guid>
      <description>&lt;p&gt;I have seen a proliferation of easy meaningless words that look like documentation but explain very little. Naming is one of our most challenging problems. The importance of meaningful names cannot be overstated and should not be an afterthought. Attention to naming increases code readability and trust. Well-named methods and variables are more likely to be reused, and creating reusable code is the purpose of creating shared libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combining words
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Camel&lt;/strong&gt;: (camelCase)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kebab&lt;/strong&gt;: (kebab-case)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pascal&lt;/strong&gt;: (PascalCase)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snake&lt;/strong&gt;: (snake_case)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screaming Snake&lt;/strong&gt;: (SCREAMING_SNAKE_CASE)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each language has its preferred cases for various things. Always follow the lining standards for your language. I use JavaScript and Python so here are those.&lt;/p&gt;

&lt;h3&gt;
  
  
  Javascript
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Camel&lt;/strong&gt;: variables, methods, and functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pascal&lt;/strong&gt;: types, classes, and constructors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screaming Snake Case&lt;/strong&gt;: global immutable constants&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snake Case&lt;/strong&gt;: variables, methods, and functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pascal&lt;/strong&gt;: types, classes, and constructors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screaming Snake Case&lt;/strong&gt;: global immutable constants&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meaningless words:
&lt;/h2&gt;

&lt;p&gt;Never use the following words. They add no meaning to the name and can always be replaced with a better, more specific term.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code&lt;/li&gt;
&lt;li&gt;data&lt;/li&gt;
&lt;li&gt;meta&lt;/li&gt;
&lt;li&gt;mutate&lt;/li&gt;
&lt;li&gt;parse&lt;/li&gt;
&lt;li&gt;payload&lt;/li&gt;
&lt;li&gt;transform&lt;/li&gt;
&lt;li&gt;util&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider the difference between two methods called &lt;strong&gt;getArticle&lt;/strong&gt; and &lt;strong&gt;getArticleData&lt;/strong&gt;. As an outsider reading that API, if there is nothing else known about those methods, it would be very difficult to know which one to use in each situation. The word &lt;strong&gt;data&lt;/strong&gt; is adding no information.&lt;/p&gt;

&lt;p&gt;One could say that people should just read the documentation if they want to know the method details. &lt;strong&gt;getArticleData&lt;/strong&gt; becomes tough to understand when nested within other functions.&lt;/p&gt;

&lt;p&gt;For example:&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;function&lt;/span&gt; &lt;span class="nf"&gt;getAuthors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getArticleData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getArticle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAuthors&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although we can see this method is supposed to get the authors of an article, the internal logic is difficult to read because it is unclear what the internal methods do. The word Data doesn't add enough meaning to warrant, adding it to the name.&lt;/p&gt;

&lt;p&gt;Consider the difference between the three methods &lt;strong&gt;mutate&lt;/strong&gt;, &lt;strong&gt;transform&lt;/strong&gt;, and &lt;strong&gt;parse&lt;/strong&gt;. Having not read the implementation of those methods, you can not know the convention for what these words mean within the context of the project. It is challenging to see the purpose of those methods or the order in which they should be used.&lt;/p&gt;

&lt;p&gt;For example:&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;function&lt;/span&gt; &lt;span class="nf"&gt;getArticle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mutateAuthors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parseAuthors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// bug: authors should have been parsed before being mutated&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transform&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;Although it is evident that this method gets an article (of some unknown state and type), finding bugs with the ordering or functionality of this method is impossible without resorting to debugger statements or console logs. It is forcing the developer to run the code to understand the expected values between each step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Obfuscation
&lt;/h2&gt;

&lt;p&gt;When the purpose of the function or variable name is to hide or limit understanding (i.e., black boxes, facades, moderators), then obviously this does not apply. The words referred to here as having low informational value may be useful in those cases where we're deliberately trying to hide.&lt;/p&gt;

&lt;p&gt;For example:&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getArticle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;applyTransformations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, we're deliberately hiding what the transformations are behind a layer of obfuscation or abstraction. There are many reasons this is valuable, including preserving the right to change the contents of the functionality in the future dramatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acronyms, Initialism, Abbreviations, and Disemvoweling
&lt;/h2&gt;

&lt;p&gt;Shortened words are a constant source of confusion. It is generally better to enter the full name and not the abbreviation, but there are cases where it would be redundant to do so, as in the case of well-known acronyms like AMP or HTML. In this case, stick to the camel case and only capitalize the first letter of the acronym, especially when the initialism is beginning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Single Characters
&lt;/h2&gt;

&lt;p&gt;Single-character names should be avoided, even within a loop where the temptation to use an “I” for the iterator.  Think of the group you are looping over. Doesn’t the following make a lot more sense?&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="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dog&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;dogs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;dogs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;`&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;h2&gt;
  
  
  Better Verbs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;get&lt;/strong&gt;: Retrieve some state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;set&lt;/strong&gt;: Change some state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reset&lt;/strong&gt;: Reset some state to its default value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;add&lt;/strong&gt;: Add new content to some state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;remove&lt;/strong&gt;: Delete some existing state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;apply&lt;/strong&gt;: In-memory replacements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;compose&lt;/strong&gt;: Create a new dataset from existing information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fetch&lt;/strong&gt;:  Retrieve some state from an external data store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;handle&lt;/strong&gt;: Deal with an action.  Often used in callbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;is/has&lt;/strong&gt;: A pre-verb to denote a boolean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$&lt;/strong&gt;: A pre-verb to indicate a JQuery reference.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Duplication
&lt;/h2&gt;

&lt;p&gt;Any named item that is a child should not duplicate its parent name, nor should it repeat any synonym of that patents name. In the following example, we see breakpoints.  We know that breakpoints refer to widths, and as our project is mobile-first, we know they are all minimum widths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BAD&lt;/strong&gt;&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="nx"&gt;$breakpoints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;minWidthLg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;minWidthMd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;minWidthSm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;992&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;minWidthXs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;768&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;minWidthXxs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&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;GOOD&lt;/strong&gt;&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="nx"&gt;$breakpoints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;992&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;768&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Classes
&lt;/h2&gt;

&lt;p&gt;Classes must be named with an appropriate proper singular noun in PascalCase, and tell us that this variable contains a type with properties and 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;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dachshunds&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Dog&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;h2&gt;
  
  
  Class Methods and properties
&lt;/h2&gt;

&lt;p&gt;Class methods and properties use the verb + noun convention, but the methods can get away with omitting the noun in some cases.  In this case, the noun is the parent class.  User.get() assumes you are getting the user User.name assumes a user name.&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="nx"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wagTail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Numbers, Strings, and Objects
&lt;/h2&gt;

&lt;p&gt;Name all Numbers, strings, and objects with the most appropriate singular noun.&lt;/p&gt;

&lt;h2&gt;
  
  
  Booleans
&lt;/h2&gt;

&lt;p&gt;The names for booleans are in the form of a question, asking what it is or has or can be.  So our verbs are: is, has, can, or will.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arrays
&lt;/h2&gt;

&lt;p&gt;Name arrays with a plural noun, allowing us to address each child as a singular noun.  If need be, you can replace plural with a collection name birds becomes &lt;strong&gt;flockOfBirds&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Functions
&lt;/h2&gt;

&lt;p&gt;Functions are always actions. So we start with a verb then add a noun. Verb + Noun results in a command for a thing.&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="nf"&gt;getBirds&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;goHome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some languages have their own rules around specific types of things (TypeScript prefers interfaces begin with a capital I). I am mostly interested in language-agnostic naming. Do you have any preferences around naming? Bring them up in the comments, and let’s discuss!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>codequality</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Operation Code at The Muse</title>
      <dc:creator>Richard Dillman</dc:creator>
      <pubDate>Fri, 25 Sep 2020 15:58:21 +0000</pubDate>
      <link>https://dev.to/richarddillman/operation-code-at-the-muse-4g56</link>
      <guid>https://dev.to/richarddillman/operation-code-at-the-muse-4g56</guid>
      <description>&lt;p&gt;This spring we were honored to connect with &lt;a href="https://operationcode.org/" rel="noopener noreferrer"&gt;Operation Code&lt;/a&gt; to host their April Meetup. Operation Code is a non-profit organization serving America’s veterans and their families to help them to sort out their next steps after their service - or sometimes, while they’re still serving. Helping people to find their passions and turn them into fulfilling careers is exactly what we do at The Muse, and we were delighted to pitch in. This being Operation Code, Engineering and Product were particularly excited to get involved.&lt;/p&gt;

&lt;p&gt;How do you transition into the civilian workforce as a developer? Senior Application Engineer &lt;a href="https://www.linkedin.com/in/richarddillman/" rel="noopener noreferrer"&gt;Richard Dillman&lt;/a&gt; moderated a panel of Musers to explain how to master the technical job search, and how to maintain that success once hired. Director of Talent and Acquisition &lt;a href="https://www.linkedin.com/in/lillianlandrum/" rel="noopener noreferrer"&gt;Lillian Landrum&lt;/a&gt; shared how candidates can stand out in the selection process. Manager of Client Project Management &lt;a href="https://www.linkedin.com/in/danielle-incontrera-diflorio-62ab1445/" rel="noopener noreferrer"&gt;Danielle Incontrera&lt;/a&gt; discussed how people on the technical side can more effectively communicate with product about goals and timelines. Account Manager &lt;a href="https://www.linkedin.com/in/giordanochristina/" rel="noopener noreferrer"&gt;Christina Giordano&lt;/a&gt; explained how engineers help in both sales and client acquisition at The Muse. &lt;br&gt;
Director of Engineering &lt;a href="https://www.linkedin.com/in/peenakinamdar/" rel="noopener noreferrer"&gt;Peenak Inamdar&lt;/a&gt; fielded questions on what skills developers need to have on his team and how we at The Muse determine if a candidate’s skills meet those needs.&lt;/p&gt;

&lt;p&gt;Following Peenak’s remarks, Associate Product Manager &lt;a href="https://www.linkedin.com/in/jamesbmayr/" rel="noopener noreferrer"&gt;James Mayr&lt;/a&gt; gave a presentation on &lt;a href="https://docs.google.com/presentation/d/1IJx9REna-iJaYgezXwxI0pQBtkG79EWVrJZwrRy3_Fk" rel="noopener noreferrer"&gt;Google Tools for Product and Engineering&lt;/a&gt;, an overview of how developers can use Google tools such as Optimize, Analytics, Tag Manager, Lighthouse and Google Search Console to monitor site performance, dynamically add or modify content, and develop approaches to increase speed and reliability. We spent quite a bit of time on accessibility and usability too.&lt;/p&gt;

&lt;p&gt;Afterwards there was more pizza and more networking amongst all, with the most popular topic being breaking into the developer role as a fresh code camp graduate. Our conversation carried well past our 9PM target with some of us not leaving until well past 10.&lt;/p&gt;

&lt;p&gt;Meetups and Operation Code are both great ways to meet people you otherwise might not, learn new skills, and possibly make a connection for a new career.&lt;/p&gt;

&lt;p&gt;Check out the full video of the event&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zcSWBPCHqk0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to write a readable commit message.</title>
      <dc:creator>Richard Dillman</dc:creator>
      <pubDate>Sun, 09 Aug 2020 05:43:19 +0000</pubDate>
      <link>https://dev.to/richarddillman/how-to-write-a-readable-commit-message-33ah</link>
      <guid>https://dev.to/richarddillman/how-to-write-a-readable-commit-message-33ah</guid>
      <description>&lt;p&gt;Having a good guideline for creating commits and sticking to it makes working with Git and collaborating with others a lot easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subject
&lt;/h2&gt;

&lt;p&gt;The subject should be around 50 characters or less. You want it to fit in an email subject line.  If you need to explain why you made some decisions or tradeoffs, those comments should be in the code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An adequately worded commit should fit grammatically into the sentence below:

&lt;ul&gt;
&lt;li&gt;If applied, this commit will &lt;strong&gt;[Subject]&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use an &lt;a href="https://en.wikipedia.org/wiki/Imperative_mood" rel="noopener noreferrer"&gt;imperative mood&lt;/a&gt;. These changes will not be applied right away&lt;/li&gt;
&lt;li&gt;Capitalize the first letter&lt;/li&gt;
&lt;li&gt;No punctuation at the end&lt;/li&gt;
&lt;li&gt;Consider using a &lt;a href="https://www.conventionalcommits.org/" rel="noopener noreferrer"&gt;conventional commits&lt;/a&gt; prefix like &lt;a href="https://www.conventionalcommits.org/" rel="noopener noreferrer"&gt;karma&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;feat&lt;/strong&gt;: a new feature for the user, not a new feature for a build script&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fix&lt;/strong&gt;: bug fix for the user, not a fix to a build script&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;docs&lt;/strong&gt;: changes to the documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;style&lt;/strong&gt;: formatting, missing semicolons, etc.; no production code change&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;refactor&lt;/strong&gt;: refactoring production code, e.g., renaming a variable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;test&lt;/strong&gt;: adding missing criteria, refactoring tests; no production code change&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;chore&lt;/strong&gt;: updating grunt tasks etc.; no production code change&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A scope or section of the codebase can optionally follow the prefix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of writing down everything you did, think of each commit as a command. These are instructions to your future self. Git will apply your commits to the codebase, not you, and only once the PR is approved and merged.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat(login): Add a google OAuth endpoint"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Body
&lt;/h2&gt;

&lt;p&gt;If you need to offer more information within your commit (code examples, external references, documentation,  explain complexity), you could do it here. But most times, this information belongs either in the code or the final pull request. Please keep this as short as possible. It is not a blog post. Focus on the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give the reasons why you made this change&lt;/li&gt;
&lt;li&gt;Explain the way things worked before this change (and what was wrong with that)&lt;/li&gt;
&lt;li&gt;Describe why you decided to solve it the way you did&lt;/li&gt;
&lt;li&gt;Describe how the code works differently now than it did before
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat(login): Add a google OAuth endpoint"&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"This includes the handler, routes, and templates."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>codequality</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
