<?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: Justin Noel</title>
    <description>The latest articles on DEV Community by Justin Noel (@justinnoel).</description>
    <link>https://dev.to/justinnoel</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F109653%2Fb7899cad-1a79-4729-a0b9-027b8f35ca4b.jpg</url>
      <title>DEV Community: Justin Noel</title>
      <link>https://dev.to/justinnoel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/justinnoel"/>
    <language>en</language>
    <item>
      <title>Using AI to Research Available Domain Names</title>
      <dc:creator>Justin Noel</dc:creator>
      <pubDate>Sat, 12 Jul 2025 16:29:27 +0000</pubDate>
      <link>https://dev.to/justinnoel/using-ai-to-research-available-domain-names-1h67</link>
      <guid>https://dev.to/justinnoel/using-ai-to-research-available-domain-names-1h67</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5j3n8zmhncbwmyk6bvxu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5j3n8zmhncbwmyk6bvxu.jpg" alt="Using AI to Research Available Domain Names"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've all been there. You had a great idea for a new service. Vibe coding helped you develop the front end and back end in a few &lt;del&gt;days&lt;/del&gt;  &lt;del&gt;hours&lt;/del&gt; minutes 😜.  &lt;/p&gt;

&lt;p&gt;Now you're stuck trying to choose a domain name for it. As we all know, all the good ones are taken, right?&lt;/p&gt;

&lt;p&gt;How are you going to find some good domain names for your service? Tell AI all about your amazing idea. Then, let it generate a list of possible domain names for you and see if they're available. Rinse and repeat.&lt;/p&gt;

&lt;p&gt;Next step? Fame, instant riches, private jets, and attending weddings with other gazillionaires!&lt;/p&gt;

&lt;p&gt;Here's a demo of how to do that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://iframe.videodelivery.net/5653cfd537db1edbed98c5c0119f390c" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Video of Generating Domain Name Ideas with AI&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Transcript from video:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here's an interesting use case for AI.&lt;/p&gt;

&lt;p&gt;Say you're starting a website to help people remember to brush their teeth.&lt;/p&gt;

&lt;p&gt;But as we all know, choosing a domain name is the hardest part of creating a new SaaS.&lt;/p&gt;

&lt;p&gt;Well, use AI to do it for you.&lt;/p&gt;

&lt;p&gt;Tell it what you're going to do and ask to suggest some domain names.&lt;/p&gt;

&lt;p&gt;I'm using TypingMind to query OpenAI for this.&lt;/p&gt;

&lt;p&gt;You get this nice list of domain names and a question mark next to each one of them.&lt;/p&gt;

&lt;p&gt;When you move your mouse over the results, you can see that you can actually check if a domain name is already registered.&lt;/p&gt;

&lt;p&gt;If I click here you'll see that BrushBuddy is already registered.&lt;/p&gt;

&lt;p&gt;You could contact the broker to buy it or see the WHOIS information on it.&lt;/p&gt;

&lt;p&gt;Let's see, mintireminders.com.&lt;/p&gt;

&lt;p&gt;This is not taken, so you could register this domain name and use it for your great new service.&lt;/p&gt;

&lt;p&gt;FYI, the domain name status is provided by &lt;a href="https://instantdomainsearch.com" rel="noopener noreferrer"&gt;https://instantdomainsearch.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There you go. Now you're well on your way to dot com riches!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Photo Credit: &lt;a href="https://unsplash.com/photos/a-black-and-white-photo-of-the-word-comm-S7GcgdI7WjQ" rel="noopener noreferrer"&gt;https://unsplash.com/photos/a-black-and-white-photo-of-the-word-comm-S7GcgdI7WjQ&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Real Code is Better than "leet" Code</title>
      <dc:creator>Justin Noel</dc:creator>
      <pubDate>Mon, 03 Apr 2023 13:49:09 +0000</pubDate>
      <link>https://dev.to/justinnoel/real-code-is-better-than-leet-code-2pkd</link>
      <guid>https://dev.to/justinnoel/real-code-is-better-than-leet-code-2pkd</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zkF32Iog--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2023/04/nubelson-fernandes-gTs2w7bu3Qo-unsplash-3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zkF32Iog--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2023/04/nubelson-fernandes-gTs2w7bu3Qo-unsplash-3.jpg" alt="Real Code is Better than" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm a member of the amazing &lt;a href="https://virtualcoffee.io"&gt;Virtual Coffee online community&lt;/a&gt;. For about 2 1/2 years, I've watched aspiring developers discuss their struggles, wins/losses, ask for help, learn, and grow into professional developers.&lt;/p&gt;

&lt;p&gt;In our many video and Slack discussions, we talk about job hunting, interview preparation, and the struggles of live coding and take home assignments during interviews. Many of the aspiring developers go to great lengths to create portfolio apps from boot camps, maintain an active Github a profile, and participate in "leet" code, kata, or code war challenges. I'm always very impressed by their tenacity and dedication to their craft.&lt;/p&gt;




&lt;p&gt;WARNING: Opinions below. Take them with a grain of salt. YMMV.&lt;/p&gt;




&lt;p&gt;I often see these aspiring developers spend so much time "preparing" that they have never actually produced anything that solves a real problem. I have often given the advice that scratching your own itch and building a useful product might be better than all this preparation. This "product" doesn't have to be a money making thing. Otherwise you might actually not need a job! It could just be some tool you've created for yourself to solve a simple problem. It could be an amazing spreadsheet you created for your accountant friend. It could be something to help a local charity process new food intakes. Perhaps you've created a website for a local business. It can literally be anything that solves a problem or entertains someone.&lt;/p&gt;

&lt;p&gt;As anecdotal evidence, I present this quote from &lt;a href="https://news.tonydinh.com/p/making-22k-in-7-days-the-story"&gt;Tony Dinh&lt;/a&gt;, the creator of &lt;a href="https://blackmagic.so"&gt;BlackMagic&lt;/a&gt; and &lt;a href="https://www.typingmind.com"&gt;TypingMind&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My technical skills: I can write code very fast. Coding is the easy part for me. I’ve been writing code since 15. I have written code almost every day over the past 8 years. I can’t solve medium Leetcode problems and don’t write the best clean code out there, but I still love writing code and putting code together to make something useful.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Personally, I have never even attempted any of these "code war" problems before. I don't do any of those katas or other type challenges. I bet most of you "junior developers" would run circles around me at those challenges.&lt;/p&gt;

&lt;p&gt;My point is that you can create profitable, useful, and/or innovative products without being a particularly good programmer as long as you find something you like to work on and solve a problem that you or someone you know has.&lt;/p&gt;

&lt;p&gt;If you enjoy doing these code challenges, that's great. I'm sure they can be very educational. Enjoy! However, if you're just doing them to "level up", I &lt;em&gt;think&lt;/em&gt; you'd be better off just solving a real problem with code. Then in interviews, you'd have a real code base to demonstrate your skills to potential employers. They will see that you have the ability to solve actual problems. Your code base can demonstrate to them you have the technical skills, the initiative, and the tenacity to solve problems just like they will need you to do in their work environment.&lt;/p&gt;

&lt;p&gt;Please understand, that I'm not discounting your struggles. Breaking into the tech industry is very hard to do. There are way too many hurdles and ridiculous hiring practices in this industry. However I believe a real product that you have created yourself and can demonstrate during interviews may do more to help you get the job you desire than some scorecard on a "coding wars" website. In the long run, you have to do what is best for you to get a job in the tech industry. Maybe the best thing is what you're already doing or maybe it's a combination of what you're doing now and what I'm suggesting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But!!:&lt;/strong&gt; Sometimes, I've suggested this approach and heard back from people that you shouldn't have to be a programmer in your spare time. Your hobby shouldn't have to be programming. You should be able to have a life outside of work! That is all 100% true. However, if you're trying to get your first developer job, you have the choice of either spending your spare time on code challenges that may not help you at all or spending that same time building something useful. I know which I would choose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To Hiring Managers:&lt;/strong&gt; Please stop using coding challenges, white boarding, and take home assignments as your default way of evaluating a candidate. Instead, find out if they have a project that they've created themselves from scratch. Get permission to access their git repo, review the code, evaluate their coding style, and see their growth over an extended period of time. In the interview have them walk through the code to make sure they truly understand it. Also ask them for an explanation of why they wrote a function a particular way and how they may change it now that they're more experienced. You're much more likely to find out how well somebody can code this way than from some random coding challenge or whiteboard problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://unsplash.com/photos/gTs2w7bu3Qo"&gt;Photo Credit&lt;/a&gt;:&lt;/strong&gt; &lt;a href="https://unsplash.com/@nublson"&gt;Nubelson Fernandes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jobs</category>
    </item>
    <item>
      <title>Without Us</title>
      <dc:creator>Justin Noel</dc:creator>
      <pubDate>Wed, 30 Nov 2022 14:58:20 +0000</pubDate>
      <link>https://dev.to/justinnoel/without-us-b1c</link>
      <guid>https://dev.to/justinnoel/without-us-b1c</guid>
      <description>&lt;p&gt;tl;dr: The marvels of the modern world aren't possible without the contributions of us all. YOU are important. Your role is vital. So is everyone else. Let's treat each other that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backstory
&lt;/h2&gt;

&lt;p&gt;Mid December, 2020&lt;/p&gt;

&lt;p&gt;My wife received news that her father, Brendan, was in hospital and about to pass away from a very aggressive type of cancer. He would soon be sent home for palliative care. My mother-in-law, Carmel, was not in the best of health either and was not able to take care for herself, let alone Brendan. So, we rushed to England with our boys to take care of them both.&lt;/p&gt;

&lt;p&gt;Brendan was brought home from hospital late Thursday, December 17th. For several days, many family members took turns caring for him while several hospice care nurses came in and out to monitor and assist. At some point, the hospital he'd been at called us with some bad news. The ward Brendan had been in for several weeks had a bad COVID outbreak. The doctors suspected Brendan had been infected as well. We were advised to take additional precautions. Sadly, Brendan died on December 19.&lt;/p&gt;

&lt;p&gt;Within a few days, we realized that &lt;strong&gt;eight&lt;/strong&gt; family members that had brought food or helped care for Brendan had COVID - including me, my wife, our two boys, and Carmel. The next few days were pretty miserable with us all sick and suffering with grief.&lt;/p&gt;




&lt;p&gt;Christmas morning, 2020 at about 8:30 am.&lt;/p&gt;

&lt;p&gt;My wife and I were asleep in bed, still sick with COVID. An unusual noise startled me from my sleep. Then, I heard it again. My phone was alerting me to something, but the sound was only vaguely familiar. I ignored it and waited to drift off to sleep again. As the sound repeated a third time, realization dawned on me that it was the ring tone for the &lt;a href="https://www.bemyeyes.com" rel="noopener noreferrer"&gt;Be My Eyes&lt;/a&gt; app. Someone with limited vision was using the app to ask for help.&lt;/p&gt;

&lt;p&gt;I snatched up my phone and answered the call, "Hello. I'm Justin. Can I help you with something?" The caller explained she was trying to find a snack in her pantry. She was blind and unable to tell the difference between several different bags of chips (crisps if you're in England). She turned on her camera to let me see her pantry. I was able to tell her which bag had the flavor she wanted. When I confirmed she didn't need any more assistance, I told her I was happy to help and hoped she'd have a Merry Christmas. She told me it wasn't Christmas yet for her. She explained she was in Alaska where it was Christmas Eve and about 11:30 pm. She'd just finished wrapping presents for her little kids and wanted to relax a bit with a snack before going to bed. She asked where I was, and I answered, "London, Englad". We exchanged more pleasantries and then said goodbye.&lt;/p&gt;

&lt;p&gt;Later in the day, our Christmas "celebrations" consisted of sitting on Carmel's bed while our boys each opened the one present I had brought with us. As we were all sick, we couldn't be bothered with a meal and spent most of the day in bed. Despite this being a less than cheerful scenario, I was actually elated that I'd helped someone earlier in the day with what to me was such a simple task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; This next portion is written from the perspective of technology. However, don't stop reading if you're not in that sector. Everything I describe here applies to anyone in any job or home life position.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Wonders of Technology
&lt;/h2&gt;

&lt;p&gt;Over the next few days, with nothing much more to do, I started to really think about what had transpired that Christmas morning.&lt;/p&gt;

&lt;p&gt;A blind person 4500 miles away had picked up a phone, placed a "call", was able to share video of her home, and get some assistance with such a "mundane" task from a complete stranger.&lt;/p&gt;

&lt;p&gt;On previous Be My Eyes calls, I had helped a caller find the puke her cat had left on her carpet, helped a person select a can of green beans from their cabinet, and assisted someone with reading a portion of a letter.&lt;/p&gt;

&lt;p&gt;I've only assisted with Be My Eyes about 4 or 5 times. However, there are 6 million volunteers and 500,000 blind and low vision people using the service - all for free.&lt;/p&gt;

&lt;p&gt;Those of us in the technology industry probably have a good idea of the scope of people, job functions, tools, and material required to make this and many other near-miracles happen.&lt;/p&gt;

&lt;p&gt;Without any one part of the chain, none of this could have happened. With no radio engineers, the phone couldn't connect to cellular networks or WiFi. With no software developers, the Be My Eyes app wouldn't exist nor would the databases nor servers that the app relies on. With no silicon, the computer chips would not exist for the phones or servers involved in this service. Literally hundreds of job functions and millions of workers were required for me to assist someone in picking a bag of Flaming Hot Cheetos rather than a bag of Doritos.&lt;/p&gt;

&lt;p&gt;Thanks to millions of other people, I was able to help someone on Christmas &lt;del&gt;Day&lt;/del&gt; Eve relax and just have a slightly more pleasant life.&lt;/p&gt;

&lt;h2&gt;
  
  
  Without (all of) Us
&lt;/h2&gt;

&lt;p&gt;Over time, I thought about this more. Above, I only mentioned the technology aspects of that near magical call. Looking a little deeper, it's clear that hundreds of millions, actually billions, of people made that "simple" phone call possible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Farmers produced the food that fed countless tech workers&lt;/li&gt;
&lt;li&gt;Truckers and other transportation workers got the food to stores&lt;/li&gt;
&lt;li&gt;Grocers provided a safe and sanitary place for people to buy the food&lt;/li&gt;
&lt;li&gt;Chefs, parents, wait staff served that food to their customers or family&lt;/li&gt;
&lt;li&gt;Sanitation workers collected all the refuse produced in this whole process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I could go on and on with the chain of workers that help us live everyday. If you look between the "Truckers" and "Grocers" section above, you could add hundreds of other sub functions. Then, you could split each of those dozens of ways.&lt;/p&gt;

&lt;p&gt;The point is that it takes all of us to make the world work. There are no "Essential" or "Vital" workers. Without &lt;strong&gt;all of us&lt;/strong&gt; , the world stops working. We &lt;strong&gt;all&lt;/strong&gt;"make the magic happen".&lt;/p&gt;

&lt;h2&gt;
  
  
  Without YOU
&lt;/h2&gt;

&lt;p&gt;Many times in my life, I've heard people say something like, "I'm just a ..." or "I only do ...". It's like they are ashamed of the work they do. These people have been friends, coworkers at multi-billion dollar companies, or casual acquaintances.&lt;/p&gt;

&lt;p&gt;In the past, I've agreed with them and even said the same thing myself. It can be a bit humbling to have a less than glamorous role in a group of peers that seem to make "the magic" happen. Working as a bagger in a grocery store can seem less important than helping to launch a space ship.&lt;/p&gt;

&lt;p&gt;"In the beginning", humans had only one job. They had to feed themselves. Anyone that didn't participate in the job of hunting or gathering, didn't eat and didn't survive long.&lt;/p&gt;

&lt;p&gt;Over time, humans began to specialize. One group hunted, one group gathered, and another group cooked. Later came farmers, potters, ship builders, sailors, historians, teachers, engineers, and astronauts.&lt;/p&gt;

&lt;p&gt;Despite these specializations, every person on earth still has &lt;strong&gt;one primary job&lt;/strong&gt; - to feed themselves. However, now, they outsource it to billions of other people so they can focus on their specialty. No single role is more important than any other. We all play an essential role in ensuring goods, services, and health care are available worldwide.&lt;/p&gt;

&lt;p&gt;If you're "just" the cashier, administrative assist, accountant, barista, sailor, homemaker, salesperson, cook, CTO, cotton picker, designer, planner, etc., you are a linchpin in the entire process of the world. If you stop doing your secondary job, each of those specialists will begin to slow down. If you walk away from your phlebotomists role, people start dying! Instead of having their clothes dry-cleaned, they'll need to wash them at home. House cleaners all start farming? That CEO has to start to vacuum themselves. Eventually, as more and more "secondary" jobs are abandoned, everyone has to revert to their primary job of feeding themselves. The world would devolve into chaos.&lt;/p&gt;

&lt;p&gt;The world needs &lt;strong&gt;you&lt;/strong&gt; in whatever capacity you provide. &lt;strong&gt;You&lt;/strong&gt; are important. Your job is vital. Those rockets aren't going to launch themselves!&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;But I'm just a cashier in a coffee shop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you "just" numbly ring up purchases and hand coffee across the counter, then you really are "just" a cashier. If you instead greet each customer with a smile, wish everyone a good day, and learn to greet returning customers by name, you are much more. You're an ambassador to everyone's morning. You build good will for your company. More importantly, you can set the tone for all your customers' days. Greet them with a kind friendly smile, and they'll walk out of that coffee shop ready to take on the world. They'll have a smile on their face, and they'll return your courtesy to others. It's infectious! Go spread the disease!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But I'm just a housekeeper.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No, you're not. You're a household maintenance expert. Your employer(s) leave(s) their house knowing the mess they left behind will magically get taken care of. They won't dread their afternoon because of thoughts of returning home to a mess that they have to deal with.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But I'm just ....&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's so easy to denigrate ourselves and for others to do the same to us. Learn to get out of this mindset trap. Figure out what you can do in any role that helps someone else in their role. You have to be at your job anyway. Why make it miserable for you and others? If you can do this routinely, you just might find you will no longer "just" be "X" because you've been promoted to "Y".&lt;/p&gt;




&lt;p&gt;P.S. Now that we see how everyone is equally important, let's please start treating each other that way. There are no "peons". No job is worthless or meaningless. Please don't be condescending to the accountants, waiters, nurses, or bell boys you encounter each day. Don't yell at management because someone didn't do something "just so". Be pleasant to everyone you interact with. If possible, put a smile on their face. Your kindness will make it easier for them to deal with so many others that are less than pleasant.&lt;/p&gt;

&lt;p&gt;Keep in mind that if your rudeness causes someone to get fired or to quit, you might soon regret it ... Someday you may discover they are &lt;strong&gt;much&lt;/strong&gt; better at hunting and gathering than you are.&lt;/p&gt;

&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@dillydallying?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Dillon Wanner&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjustinnoel.dev%2Fcontent%2Fimages%2F2022%2F11%2Fcrawford-jolly-3IxuF9MCjkA-unsplash-2-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjustinnoel.dev%2Fcontent%2Fimages%2F2022%2F11%2Fcrawford-jolly-3IxuF9MCjkA-unsplash-2-1.jpg" alt="Without Us"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@crawford?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Crawford Jolly&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/neanderthal?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Using the Side Door to Get a Developer Job</title>
      <dc:creator>Justin Noel</dc:creator>
      <pubDate>Thu, 28 Jan 2021 08:26:34 +0000</pubDate>
      <link>https://dev.to/justinnoel/using-the-side-door-to-get-a-developer-job-3fip</link>
      <guid>https://dev.to/justinnoel/using-the-side-door-to-get-a-developer-job-3fip</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1506704183731-613f9a3a935d%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDIwfHxkb29yfGVufDB8fHw%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1506704183731-613f9a3a935d%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDIwfHxkb29yfGVufDB8fHw%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" alt="Using the Side Door to Get a Developer Job"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I recently left my "Senior Mobile App Devleper" job to deal with some mental health issues, get myself back to "normal", and explore what I wanted to do with my life.&lt;/p&gt;

&lt;p&gt;Fortunately, I stumbled across the amazing &lt;a href="https://virtualcoffee.io" rel="noopener noreferrer"&gt;Virtual Coffee community&lt;/a&gt; started by &lt;a href="https://twitter.com/bekahhw" rel="noopener noreferrer"&gt;Bekah Hawrot Weigel&lt;/a&gt; and &lt;a href="https://twitter.com/dino_momma" rel="noopener noreferrer"&gt;Sara McCombs&lt;/a&gt;. They've fostered a very welcoming community for tech professionals from many diverse backgrounds and different skill levels.&lt;/p&gt;

&lt;p&gt;A frequent topic in our meetings and Slack conversations is about how hard it is to get hired for a "junior" developer role. There are horror stories of 3 hour interviews, no call backs, "we only hire senior developers", etc.&lt;/p&gt;

&lt;p&gt;It's clearly demoralizing for so many of these very talented people. I see their conversations, check their portfolios from boot camps, see their Github repos and their blog posts, and think, "Many of these 'wannabe' or 'junior' developers are more capable than me 🤯!" (Looking at you &lt;a href="https://luciacerchie.dev/" rel="noopener noreferrer"&gt;Lucia Cerchie&lt;/a&gt;, &lt;a href="https://twitter.com/_torrborr" rel="noopener noreferrer"&gt;Tori Crawford&lt;/a&gt;, &lt;a href="https://dev.to/debrakayeelliott"&gt;Debra-Kaye Elliott&lt;/a&gt;, &lt;a href="https://twitter.com/LiliVerrot" rel="noopener noreferrer"&gt;Aurelie Verrot&lt;/a&gt;, &lt;a href="https://dominicduffin.uk/" rel="noopener noreferrer"&gt;Dominic Duffin&lt;/a&gt;, &lt;a href="https://meghangutshall.com/" rel="noopener noreferrer"&gt;Meghan Gutshall&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;However, they are still struggling to get in through the front door 🚪. I recently wrote this screed in a #job-hunting Slack channel for Virtual Coffee. Since I also needed to post it in another group, I decided to just blog about it and share it with more people. Maybe it will help you figure out how to get started as a developer in a non-traditional way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://jobs.lever.co/openphone" rel="noopener noreferrer"&gt;OpenPhone has some “open” 😜 positions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're struggling to get into an engineering role, maybe consider applying for a different role like "Customer Experience Representative".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion:&lt;/strong&gt; If / when you interview for something like that, explain to them that your real goal is to get into web/frontend/mobile/back-end development. You’d love to start with them to get experience in their company. However, you’d be very interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starting at Job X with a goal of being considered for Y Jobs after Z months &lt;/li&gt;
&lt;li&gt;Hope this introduction actually leads them to say, “You know what, I know Helen in Engineering is looking for a junior developer. Let me send your resume to her.” &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, don’t be deceptive or intending to waste their time. If you’re really in need of a job, be ready/willing/able to do Job X and commit to it for at least a year.&lt;/p&gt;
&lt;h2&gt;
  
  
  Long Personal Story:
&lt;/h2&gt;

&lt;p&gt;I applied for a job at MCI (now defunct - thanks, Bernie Sanders 😡!!) and got invited for an interview. I had &lt;strong&gt;ZERO&lt;/strong&gt; telecom experience. Fortunately, before the interview, I found a downloadable course online about telecom switches. This was back in 1995 when "online" was very different to today. I had to pay $65 💰 to buy the course!&lt;/p&gt;

&lt;p&gt;When I arrived, the recruiter talked to me for a long while as we waited for the hiring manager to arrive. We got to know each other (yes, this works well &lt;a href="https://twitter.com/GantLaborde" rel="noopener noreferrer"&gt;@Gant!&lt;/a&gt;) at a personal level.&lt;/p&gt;

&lt;p&gt;Finally, the hiring manager came in. She was quite abrupt and rude. She literally walked in, looked at my resume, and said, "He doesn't have any skills I need." Then she walked out. That was the extent of my "interview".&lt;/p&gt;

&lt;p&gt;The recruiter was shocked and angry. She apologized profusely and then said, "I know Don is looking for someone. Let me go get him."&lt;/p&gt;

&lt;p&gt;He came in, looked at my resume, and then asked me a few questions. "You were a nuclear reactor operator?". It was clear he knew I had no relevant experience but was intrigued with my ability to learn something so difficult as that. He finally asked, "What's tip and ring?".&lt;/p&gt;

&lt;p&gt;OMG 🤯! Thank goodness for purchasing that course! I was able to explain it. He asked how I knew the answer, and I told him. He hired me on the spot for $10K more than what I was previously making and had stupidly offered as my starting salary.&lt;/p&gt;

&lt;p&gt;Within 4 months, I had excelled at the job, purloined a Windows 95 computer (we were on Windows 3.1 &amp;amp; NeXTSTEP) that had Microsoft Access on it, and developed a massive time saving program using Visual Basic for Applications. I got a huge raise, was awarded the "Ring of Champions", went to lunch with a Vice President of the company, and flown out to California for 5 days for an award ceremony.&lt;/p&gt;

&lt;p&gt;While I was not officially a "professional" programmer (not my job title), this was really the launch of my programming career. Through 2005, I had other telecom job titles but did "shadow IT" work developing tools for my department to improve workflow and productivity. Again, I ... umm .... got access to a server to build web apps using the LAMP stack.&lt;/p&gt;

&lt;p&gt;Finally, in 2006 after leaving the company to try (and fail) at starting my own business, a former co-worker that was now a manager called and offered me a job doing full-time development work for his entire department.&lt;/p&gt;

&lt;p&gt;I had finally "made it"!&lt;/p&gt;
&lt;h2&gt;
  
  
  Moral of the Story:
&lt;/h2&gt;

&lt;p&gt;Good managers / corporate recruiters are looking for people that can prove they are willing and able to learn and persevere. That is infinitely more important than checking all the boxes on a bogus job requirements list.&lt;/p&gt;

&lt;p&gt;They &lt;strong&gt;know&lt;/strong&gt; that no one can do all those things. They &lt;strong&gt;know&lt;/strong&gt; that no one already knows their processes, workflows, and road blocks.&lt;/p&gt;

&lt;p&gt;They are looking for someone that can come in and get up to speed quickly and deal with all their internal hurdles.&lt;/p&gt;

&lt;p&gt;If you're having trouble breaking in through the front door ("Frontend Developer"), then consider sneaking in through the side door. Consider jobs that might not be exactly what you want (but are still appealing) that can get you a foot in the door.&lt;/p&gt;

&lt;p&gt;Prove your skills. Maybe make a tool that speeds up your workflow and show it to your manager. You just might get a chance to ride the escalator up to the next level.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;P.S. I really struggle with depression, self-confidence, and impostor syndrome. Many times, I've considered hanging up my developer hat because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I just can't hack it anymore"&lt;/li&gt;
&lt;li&gt;"I'm not good enough"&lt;/li&gt;
&lt;li&gt;"Tech moves too fast for an older person like me"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Often, I've also considered those "alternative" roles like "Customer Success", "Tech Support", and "Developer Relations". I've developed applications, web sites, and mobile apps. I know how non-technical users can struggle to get things to work. I can empathize with them, create tutorials, etc. One of my favorite things is to see how delighted someone can be after they've struggled with making something work and then I show them how to do it.&lt;/p&gt;

&lt;p&gt;Does anyone have stories, advice, or suggestions on how to stay in tech while not actively contributing to a code base? I just don't feel in the right frame of mind to keep up with the developer pace anymore. However, developer jobs at my level pay a whole lot more than these other roles. Ideas? Let me know on &lt;a href="https://twitter.com/JustinNoelDev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or DM me in any Slack/Discord servers we share.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://unsplash.com/photos/e-g2bhvb2iQ" rel="noopener noreferrer"&gt;Door Photo Credit&lt;/a&gt;: &lt;a href="https://unsplash.com/@neonbrand" rel="noopener noreferrer"&gt;NeONBRAND&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jobs</category>
    </item>
    <item>
      <title>Job Hunting Advice for Developers</title>
      <dc:creator>Justin Noel</dc:creator>
      <pubDate>Tue, 08 Dec 2020 15:06:54 +0000</pubDate>
      <link>https://dev.to/justinnoel/job-hunting-advice-for-developers-5dlp</link>
      <guid>https://dev.to/justinnoel/job-hunting-advice-for-developers-5dlp</guid>
      <description>&lt;p&gt;I hope you and your family are well in these trying times. This is a tough situation for millions of people right now. However, as software developers, we are pretty fortunate that we can generally work from anywhere and there are lots of opportunities out there.&lt;/p&gt;

&lt;p&gt;Having said that, finding work is a job in and of itself. If you're looking for developer jobs, here's a list of sites I've learned about over the years that list jobs or have advice on looking for work. I've also added some of my personal advice. I hope it helps you find the right opportunity!&lt;/p&gt;

&lt;h2&gt;
  
  
  Remote / Contracting / Freelance Jobs
&lt;/h2&gt;

&lt;p&gt;(Listed in the order of my familiarity with them)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://weworkremotely.com/"&gt;https://weworkremotely.com&lt;/a&gt; Excellent resource!&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.gun.io/"&gt;https://www.gun.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://remoteok.io/"&gt;https://remoteok.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nocsok.com"&gt;https://nocsok.com&lt;/a&gt; Great newletter service of jobs not requireing a Computer Science degree&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sourceful/jobs"&gt;https://github.com/sourceful/jobs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://communo.com/"&gt;https://communo.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://justremote.co/"&gt;https://justremote.co&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://remote.co/remote-jobs"&gt;https://remote.co/remote-jobs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.dl-remote.com/"&gt;https://www.dl-remote.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.moonlightwork.com/"&gt;https://www.moonlightwork.com&lt;/a&gt; (Thanks &lt;a href="https://twitter.com/thatrandybrown"&gt;Randy Brown&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apps.apple.com/us/app/tech-remote-jobs/id1536178505"&gt;Tech Remote Jobs App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jobspresso.co/"&gt;https://jobspresso.co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.flexjobs.com/"&gt;https://www.flexjobs.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://knack.io/"&gt;https://knack.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Big Name Job Search Sites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.dice.com/"&gt;https://www.dice.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.indeed.com/"&gt;https://www.indeed.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://stackoverflow.com/jobs"&gt;https://stackoverflow.com/jobs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  General Info Sites &amp;amp; Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.getscriptordietryin.com/Preparing-For-a-FrontEnd-Developer-Interview/"&gt;https://www.getscriptordietryin.com/Preparing-For-a-FrontEnd-Developer-Interview/&lt;/a&gt; (Great resource from &lt;a href="https://twitter.com/MightyJoeW"&gt;Joe Warren&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://justjake.substack.com/p/a-hackers-guide-to-job-hunting"&gt;https://justjake.substack.com/p/a-hackers-guide-to-job-hunting&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://chrisachard.com/how-to-quit-your-job-and-start-freelancing"&gt;https://chrisachard.com/how-to-quit-your-job-and-start-freelancing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://huntr.co/"&gt;https://huntr.co&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Grow Your Community === Grow Your Opportunities
&lt;/h2&gt;

&lt;p&gt;Since becoming a "professional developer", I haven't actually ever had to search for a job. In most cases, they came to me. I've been incredibly blessed. While freelancing from 2013 to 2019, I actually got 3 contracts just through referrals on Twitter (thank you &lt;a href="https://twitter.com/gnomeontherun"&gt;Jeremy Wilken&lt;/a&gt;!) and the Ionic Framework forum. Every week, I receive numerous emails and LinkedIn messages from recruiters.&lt;/p&gt;

&lt;p&gt;The key to this I my involvement in the developer community. I was very active on the Ionic Framework forum in the early days. I answered questions, posted sample code, etc. As I was learning AngularJS and Ionic Framework, I used the forum to help myself and others. I actively use Twitter to keep aware of the tech I'm interested in and connect with others with the same interests. From time to time, I answer a question on &lt;a href="https://stackoverflow.com/"&gt;Stackoverflow&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blogging
&lt;/h3&gt;

&lt;p&gt;Another key to building a community is blogging. Blogging really helps to get your name out there. It showcases your knowledge, growth, and writing skills. Development jobs require the ability to communicate with others, express complex ideas in easy to understand ways, and the ability to teach and educate. Your blog can prove to an employer that you have those skills. It also demonstrates your passion and commitment to your craft. Finally, it will be a great resource for you when you forget how to do something you already solved in the past 🤣.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--KUFTTOHi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1333156271969742849/2QmpIlRD_normal.jpg" alt="Kadi Kraman 💚 profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Kadi Kraman 💚
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="mentioned-user" href="https://dev.to/kadikraman"&gt;@kadikraman&lt;/a&gt;
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      One of the awesome benefits of writing blog posts is being able to refer back to a past you who had in depth knowledge in a particular topic that current you has long since forgotten
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      09:09 AM - 28 Oct 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1321378655856197632" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1321378655856197632" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1321378655856197632" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Linkedin
&lt;/h3&gt;

&lt;p&gt;Keep your Linkedin profile up to date and follow your coworkers (past and present). An expansive network on Linkedin will lead many recruiters to your door. Former coworkers might have become managers and are looking for new hires. Occasionally, instead of blogging about something, post it on Linkedin or put it on your blog and cross-post it on sites like &lt;a href="https://dev.to/"&gt;dev.to&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;FYI: I advise not accepting Linkedin connections from recruiters. This will pollute your recommendations with more and more recruiters instead of people you've worked with in the past and others you're actually interested in. Instead, just let recruiters message you directly via Linkedin. If you do get a connection request with some job info you're interested in, look the person/company up and contact them directly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;UPDATE: Linkedin a bit too "corporatey" for you? I just discovered another networking service that's starting up now - &lt;a href="https://plural.com/"&gt;Plural.com&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Social Media
&lt;/h3&gt;

&lt;p&gt;Use your social feeds to promote others. If you see a great new blog post, tool, or service, post about it! We all love a little recognition. By helping others get noticed, you are also raising awareness of you.&lt;/p&gt;

&lt;p&gt;Remember that it is better to give than to receive. Don't be out there shilling yourself non-stop. Instead, engage with others and get to know them on a professional level and later personally (depending on your comfort level). Share info and links that will help others. Once you are part of the community, you'll find others will be there when you need help.&lt;/p&gt;

&lt;p&gt;Follow other developers on Twitter and join discussions that interest you. Use Twitter to search for specific topics and follow the people in those discussions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://twitter.com/search?q=%23ReactNative"&gt;https://twitter.com/search?q=%23ReactNative&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://twitter.com/search?q=%23ReactJSGirls"&gt;https://twitter.com/search?q=%23ReactJSGirls&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://twitter.com/search?q=%23ImpostorSyndrome"&gt;https://twitter.com/search?q=%23ImpostorSyndrome&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Search on just about any of your professional interests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Local/Virtual Meetups
&lt;/h3&gt;

&lt;p&gt;Use &lt;a href="https://www.meetup.com/"&gt;Meetup&lt;/a&gt; &amp;amp; &lt;a href="https://meetingplace.io/"&gt;Meeting Place&lt;/a&gt; (thanks &lt;a href="https://twitter.com/chrisachard"&gt;@ChrisAchard&lt;/a&gt;) to attend events (virtually of course 🤣). Now that everything is virtual, you don't need to worry about not finding something of interest in your city. Here are some I attend or just discovered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://meetingplace.io/frontendengineer"&gt;https://meetingplace.io/frontendengineer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://meetingplace.io/virtual-coffee"&gt;https://meetingplace.io/virtual-coffee&lt;/a&gt; This looks really interesting!&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://meetingplace.io/react-Indy"&gt;https://meetingplace.io/react-Indy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/ReactJSDallas"&gt;https://www.meetup.com/ReactJSDallas&lt;/a&gt; (Thanks &lt;a href="https://twitter.com/drumsensei"&gt;Mike Mathew&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/DallasJS/"&gt;https://www.meetup.com/DallasJS/&lt;/a&gt; (Thanks &lt;a href="https://twitter.com/alexisabril"&gt;Alexis Abril&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/HTML5-User-Group/"&gt;https://www.meetup.com/HTML5-User-Group/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/React-Native-Bay-Area/"&gt;https://www.meetup.com/React-Native-Bay-Area/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/Front-End-Development-Group-North-Dallas/"&gt;https://www.meetup.com/Front-End-Development-Group-North-Dallas/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/Dallas-Entrepreneurs/"&gt;https://www.meetup.com/Dallas-Entrepreneurs/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Almost all of these events start off with a jobs discussions. People looking for work get to announce themselves, and people hiring get to describe their company and open positions. This is a great opportunity to get an interview and get exposure in the community.&lt;/p&gt;

&lt;p&gt;At these events, get to know other developers and most importantly the organizers. Once you feel comfortable with the group, offer to present on a topic you're really interested in. Organizers are frequently looking for new people to present. Don't miss this chance to get yourself out there. This can open many doors for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discord and Slack Groups
&lt;/h3&gt;

&lt;p&gt;Find a Discord or Slack group that matches your professional interests and participate. Most often, they have general discussion, jobs, and help channels. Get in there and be part of a community. Examples:&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--2UJtInLv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1029267098206232576/1GRV52o7_normal.jpg" alt="React Podcast profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        React Podcast
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @reactpodcast
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Join is in Discord today for a New Episode Party!&lt;br&gt;&lt;br&gt;These events are a great way to meet other React folks in a fun, casual way&lt;br&gt;&lt;br&gt;&lt;a href="https://twitter.com/tylermcginnis"&gt;@tylermcginnis&lt;/a&gt; is joining us today and excited to meet you too 🥳&lt;br&gt;&lt;br&gt;Today, 10am PT&lt;br&gt;&lt;br&gt;&lt;a href="https://t.co/ehFyVJyhOU"&gt;discord.gg/dx7ZWCy&lt;/a&gt; &lt;a href="https://t.co/VTpi3B16Kw"&gt;twitter.com/chantastic/sta…&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      16:30 PM - 27 Nov 2020
    &lt;/div&gt;

      &lt;div class="ltag__twitter-tweet__quote"&gt;
        &lt;div class="ltag__twitter-tweet__quote__header"&gt;
          &lt;span class="ltag__twitter-tweet__quote__header__name"&gt;
            HTML Developer
          &lt;/span&gt;
          &lt;a class="mentioned-user" href="https://dev.to/chantastic"&gt;@chantastic&lt;/a&gt;
        &lt;/div&gt;
        Tyler takes it back, waaaaaaay back to 2015 and the first React Conf 🐣

&lt;a class="mentioned-user" href="https://dev.to/tylermcginnis"&gt;@tylermcginnis&lt;/a&gt; shares everything new at https://t.co/SzEqm6HOC1, cheating our way into React events, and the curious link between Mormon missions and React education…

https://t.co/p4pWHlTkDD #reactjs
      &lt;/div&gt;

    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1332361200596709376" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1332361200596709376" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1332361200596709376" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;



&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--SU6Z4B1z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1333672089404882944/pt8c8re5_normal.jpg" alt="Madison Kanna profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Madison Kanna
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="mentioned-user" href="https://dev.to/madisonkanna"&gt;@madisonkanna&lt;/a&gt;
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      An announcement I'm very excited about!&lt;br&gt;&lt;br&gt;Are you learning JavaScript in 2020? Or are you a JS dev who wants to level up his/her skills?&lt;br&gt;&lt;br&gt;Myself &amp;amp; 2 of my friends are starting an online JS book club. I wrote up some details below. I hope you'll join us!👇&lt;br&gt;&lt;br&gt;&lt;a href="https://t.co/3fZviRejro"&gt;dev.to/madisonkanna/j…&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      20:42 PM - 11 Jan 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1216098159685881856" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1216098159685881856" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1216098159685881856" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Open Coffee Clubs
&lt;/h3&gt;

&lt;p&gt;Get out of the house (hopefully soon!) and meet new people by attending a local &lt;a href="https://duckduckgo.com/?q=open+coffeee+club"&gt;Open Coffee Club&lt;/a&gt;. Most of these have gone virtual as well. A broad spectrum of people are at these meetings. Quite often the discussion is about entrepreneurship, new technology, etc. They also frequently start with job discussions. This is a great way to slowly begin networking with professionals in your area.&lt;/p&gt;

&lt;p&gt;Unlike "meet and greet" events, you won't be on the spot to do small talk with someone you've never meet before (introverts raise your hand 🖐 - you know what I'm talking about). Instead, these meetings are about group discussions and casual back and forth. You can lurk here safely without fear of being in the spotlight.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be Nice!
&lt;/h3&gt;

&lt;p&gt;You can post whatever you like on your social media accounts (no judgement from me). However, be aware that your posts, likes, favorites, and even followers are a window into your personality.&lt;/p&gt;

&lt;p&gt;If you're kind, caring, and helpful online, potential employers will see this. If you're caustic, mean, and uncaring, potential employers will see this as well.&lt;/p&gt;

&lt;p&gt;Again, post whatever you like. Sometimes social media is the right place to rant about a subject to get someone to fix a problem. However, lean towards more positive than negative content.&lt;/p&gt;

&lt;p&gt;Employers are of course looking for someone that knows their tech stack or can learn it quickly. Just as importantly, they're looking for someone that's a good fit for their team. How you present yourself in public can be the difference between getting an interview or having your resume ending up in &lt;a href="https://en.wikipedia.org/wiki/File_13"&gt;File 13&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Suggestions?
&lt;/h2&gt;

&lt;p&gt;I really hope all this info helps someone in their job hunt. If anyone else has suggestions or other resources, feel free to let me know on &lt;a href="https://twitter.com/JustinNoelDev"&gt;Twitter&lt;/a&gt;. I'll be happy to add them here with your permission.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Photo Credit: &lt;a href="https://unsplash.com/@kevnbhagat"&gt;https://unsplash.com/@kevnbhagat&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>career</category>
      <category>jobs</category>
      <category>developer</category>
      <category>programming</category>
    </item>
    <item>
      <title>Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript</title>
      <dc:creator>Justin Noel</dc:creator>
      <pubDate>Mon, 20 Jul 2020 10:40:09 +0000</pubDate>
      <link>https://dev.to/justinnoel/enforcing-consistent-and-error-free-code-in-an-expo-react-native-project-with-typescript-418b</link>
      <guid>https://dev.to/justinnoel/enforcing-consistent-and-error-free-code-in-an-expo-react-native-project-with-typescript-418b</guid>
      <description>&lt;p&gt;Have you ever done any development in a team environment - anywhere it's not just one person committing code? You've probably seen inconsistent code formating, different structure, etc. You've probably even been in a few "tabs vs. spaces" debates - perhaps more than a few times on the same team 🤦‍♂️.&lt;/p&gt;

&lt;p&gt;Several teams I've worked with have solved these problems by either using &lt;a href="https://editorconfig.org"&gt;EditorConfig&lt;/a&gt; or &lt;a href="https://prettier.io"&gt;Prettier&lt;/a&gt; in their IDEs. However, this has alway lead to someone's IDE or config file being slightly different and not always being consistent.&lt;/p&gt;

&lt;p&gt;Another pain point in group development is with code that has cruft. Say for example, someone adds a variable or imports a library in a file and never actually uses them. Other teams might have a "rule" of "No &lt;code&gt;for&lt;/code&gt; loops!", but they have no way to enforce it other than code reviews. We know many of our team's rules are going to slip through the cracks.&lt;/p&gt;

&lt;p&gt;The best way to solve all these problems, improve productivity, and prevent constant bike shedding is to have automated tools enforce code quality. Don't worry, this doesn't mean you can't choose your own rules, it's just that you won't have to repeatedly insist on them during code reviews. After implementing the suggestions in this post, your code will be "perfect" - but not necessarily bug free (that's on you).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; You can see the final configuration on this Git repo: &lt;a href="https://github.com/calendee/expo-lint-demo"&gt;https://github.com/calendee/expo-lint-demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vLxIl2wg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-0-perfect.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vLxIl2wg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-0-perfect.gif" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="500" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The open source tools I'll present here will save you &amp;amp; your team/company countless hours of bickering or developing custom tooling.&lt;/p&gt;

&lt;p&gt;Please consider contributing to them to ensure the developers have the funding and motivation necessary to keep making these great tools.&lt;/p&gt;

&lt;p&gt;You can find links to several of these tools on my own contribution record on &lt;a href="https://opencollective.com/justinnoel"&gt;Open Collective&lt;/a&gt; or their respective GitHub Sponsorship pages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article, I'm going to walk through starting a brand new &lt;a href="https://expo.io"&gt;Expo&lt;/a&gt; tabs project (this whole article can be used for &lt;strong&gt;ANY&lt;/strong&gt; React or React Native project) from scratch and do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure Prettier&lt;/li&gt;
&lt;li&gt;Configure Linting with TypeScript&lt;/li&gt;
&lt;li&gt;Solve all the existing linting &amp;amp; formatting issues&lt;/li&gt;
&lt;li&gt;Setup auto-commit hooks that enforce all the new configuration rules&lt;/li&gt;
&lt;li&gt;Teach you how to speed up your auto-commit hooks&lt;/li&gt;
&lt;li&gt;Explain the neeed for CI/CD build tools to prevent anyone from bypassing the team's rules before PRs are merged&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Start an Expo Project
&lt;/h2&gt;

&lt;p&gt;Our base project is going to be the default Expo "tabs" project with TypeScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expo init expo-lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Expo CLI will prompt us to choose a template and then install it for us.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jnRUoVx2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jnRUoVx2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-1.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s_Inx1mM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s_Inx1mM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-2.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: The configuration ideas from this point forward are from several of my own older blog posts and code I liberally copied from &lt;a href="https://khalilstemmler.com"&gt;Khalil Stemmler's great series&lt;/a&gt; on doing similar things in TypeScript projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Configure ESLint for TypeScript
&lt;/h2&gt;

&lt;p&gt;First, we need to get &lt;a href="https://eslint.org"&gt;ESLint&lt;/a&gt; configured to support TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add --dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's add an &lt;code&gt;.eslintrc&lt;/code&gt; file in our project's root directory so that it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "root": true,
  "parser": "@typescript-eslint/parser",
  "plugins": [
    "@typescript-eslint"
  ],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended"
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we'll need to add an &lt;code&gt;.eslintignore&lt;/code&gt; file to ensure our linter doesn't go to crazy and start linting every directory in our project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
dist
.expo
.expo-shared
web-build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we'll need to add a lint script to our &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
...,
"lint": "eslint . --ext .ts,.tsx,.js,.jsx,.json",
"lint-and-fix": "eslint . --ext .ts,.tsx,.js,.jsx,.json --fix",
...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two script above will let you run &lt;code&gt;yarn lint&lt;/code&gt; or &lt;code&gt;yarn lint-and-fix&lt;/code&gt; to see/fix all the linting errors in your project.&lt;/p&gt;

&lt;p&gt;If you run &lt;code&gt;yarn lint&lt;/code&gt; right now, you'll see an explosion of errors/warnings 🤯!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KAeSO7_E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KAeSO7_E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-3.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="940"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's just ignore those for now and move along.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing and Configuring Prettier
&lt;/h2&gt;

&lt;p&gt;To install &lt;a href="https://prettier.io"&gt;Prettier&lt;/a&gt;, run this command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add --dev prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we need to add the magic sauce to keep all your files formatted just the way your team likes (after arguing for a few days).&lt;/p&gt;

&lt;p&gt;Add a &lt;code&gt;.prettierrc&lt;/code&gt; file to look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "semi": true,
  "trailingComma": "all",
  "singleQuote": false,
  "printWidth": 80
}

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

&lt;/div&gt;



&lt;p&gt;Now, everytime you save a file, your IDE will hopefully respect this file and format it just the way you've requested. You may need to adjust its settings to get this to work properly.&lt;/p&gt;

&lt;p&gt;For example, Prettier will automatically convert &lt;code&gt;const a = '1'&lt;/code&gt; to &lt;code&gt;const a = "1";&lt;/code&gt; every time you save the file.&lt;/p&gt;

&lt;p&gt;However, the real magic will happen later on. Even if someone codes in VI with no IDE assistance, we'll make sure those files are formatted properly.&lt;/p&gt;

&lt;p&gt;We also need to keep Prettier and ESLint from whacking each other over the head. Modify your &lt;code&gt;.eslintrc&lt;/code&gt; file to look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "root": true,
  "parser": "@typescript-eslint/parser",
  "plugins": ["react", "@typescript-eslint", "prettier"],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier"
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, add a script to &lt;code&gt;package.json&lt;/code&gt; to run prettier on all your existing files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
...,
"prettier-format": "prettier --config .prettierrc '**/*.{json,js,jsx,ts,tsx,css,scss,md}' --write",
...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script will automatically cleanup all the files we care about. If other file types are needed, include them inside the brackets with a comma - be sure to NOT have any spaces!&lt;/p&gt;

&lt;p&gt;Now, run &lt;code&gt;yarn prettier-format&lt;/code&gt; and watch it automagically format many of the files in our project. Just like that, we've updated the formatting for every file in the project. Now, if a team member modifies one of those files days or weeks later, their PR won't be polluted with tons of formatting changes that hide their real changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0A9Ufb7s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0A9Ufb7s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-4.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring React &amp;amp; Jest Linting Support
&lt;/h2&gt;

&lt;p&gt;When we ran &lt;code&gt;yarn lint&lt;/code&gt; earlier, there was something pretty strange in the output. It frequently pointed out things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;warning 'React' is defined but never used @typescript-eslint/no-unused-vars&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;warning 'View' is defined but never used @typescript-eslint/no-unused-vars&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;warning 'TouchableOpacity' is defined but never used @typescript-eslint/no-unused-vars&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;warning 'it' is not defined&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;warning 'expect' is not defined&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WTH??? The problem is that ESLint doesn't understand React and JSX. So, we need to introduce it to them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wwzzTb7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wwzzTb7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-5.gif" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="500" height="200"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add --dev @types/react @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-prettier eslint-config-react eslint-plugin-prettier eslint-plugin-jest eslint-plugin-react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, once again, edit the &lt;code&gt;.eslintrc&lt;/code&gt; file as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "root": true,
  "parser": "@typescript-eslint/parser",
  "plugins": ["react", "@typescript-eslint", "prettier", "jest"],
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier",
    "plugin:jest/recommended"
  ],
  "rules": {
    "no-console": 1,
    "prettier/prettier": 2,
    "jest/no-disabled-tests": "warn",
    "jest/no-focused-tests": "error",
    "jest/no-identical-title": "error",
    "jest/prefer-to-have-length": "warn",
    "jest/valid-expect": "error"
  },
  "settings": {
    "react": {
      "pragma": "React",
      "version": "detect"
    }
  },
  "env": {
    "jest/globals": true
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we run &lt;code&gt;yarn lint&lt;/code&gt; again, there are still a ton of problems, but &lt;code&gt;React&lt;/code&gt; ain't one of em.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding pre-commit Hooks with Husky
&lt;/h2&gt;

&lt;p&gt;We've finally got our project configured to lint and prettify everything! Now, let's configure &lt;a href="https://github.com/typicode/husky"&gt;Husky&lt;/a&gt; to make sure our code can't be committed with linting issues and that all code is automatically prettified.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add --dev husky
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, modify the &lt;code&gt;scripts&lt;/code&gt; section of &lt;code&gt;package.json&lt;/code&gt; again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
...
"husky": {
  "hooks": {
    "pre-commit": "yarn prettier-format &amp;amp;&amp;amp; yarn lint"
  }
},
...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, every time a developer runs &lt;code&gt;git commit -m"here's my awesome code!"&lt;/code&gt; Husky will try to run prettier and linting to make sure that code really is "awesome".&lt;/p&gt;

&lt;p&gt;Running that right now, results in a big, " &lt;strong&gt;NOT!&lt;/strong&gt;"&lt;/p&gt;

&lt;p&gt;Husky blocks the commit because there are a ton of errors in the code. Woohoo! Mission accomplished!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cN_W_ZOu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-6-mission-accomplished.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cN_W_ZOu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-6-mission-accomplished.gif" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing All the Linting Errors
&lt;/h2&gt;

&lt;p&gt;Our new &lt;code&gt;yarn lint&lt;/code&gt; output frequently shows issues like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Users/jn/Documents/Apps/expo-lint/App.tsx
  10:16 warning Missing return type on function @typescript-eslint/explicit-module-boundary-types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Missing Return Type
&lt;/h3&gt;

&lt;p&gt;In our IDE, the &lt;code&gt;function App()&lt;/code&gt; is underlined to show that ESLint thinks something is wrong with this code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QOOoAiza--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QOOoAiza--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-7.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Moving the mouse over the underlined code will show a hint about what is wrong:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wa3Iar3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wa3Iar3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-8.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The issue is that TypeScript really likes to have the return value of every function explicitly identified. This helps avoid bugs by ensuring any calling functions are expecting and properly using the return value of the function. It also forces a developer to seriously think about the consequences of changing the return signature of the function. If they just let type inference happen, they might not go investigate what impacts their change might have.&lt;/p&gt;

&lt;p&gt;With React, there are several ways to solve this problem. In the sample above, ESLint helpfully displays the inferred return value of the function.  So, one possible fix to this problem is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function App(): JSX.Element | null {...}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code explicitly tells TypeScript what to expect this function to return.&lt;/p&gt;

&lt;p&gt;Another possible refactor depending on style preferences is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const App: React.FunctionComponent = () =&amp;gt; { ... }
export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, let's go through finding all these &lt;code&gt;Missing return type&lt;/code&gt; issues and solve them like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function ???(): JSX.Element | null {...}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're not done with missing return types yet 😢.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Users/jn/Documents/Apps/expo-lint/components/Themed.tsx
7:8 warning Missing return type on function @typescript-eslint/explicit-module-boundary-types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This one's a bit different as this is just a function. We need to explicitly type the return as a &lt;code&gt;string&lt;/code&gt; like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export function useThemeColor(
  props: { light?: string; dark?: string },
  colorName: keyof typeof Colors.light &amp;amp; keyof typeof Colors.dark,
): string {...}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And another similar one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Users/jn/Documents/Apps/expo-lint/hooks/useColorScheme.web.ts
  3:16 warning Missing return type on function @typescript-eslint/explicit-module-boundary-types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, this one is a bit different. Let's look at this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// useColorScheme from react-native does not support web currently. You can replace
// this with react-native-appearance if you would like theme support on web.
export default function useColorScheme() {
  return "light";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We &lt;em&gt;could&lt;/em&gt; fix it just like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function useColorScheme(): string {
  return "light";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, since this function literally can't return anything other than &lt;code&gt;light&lt;/code&gt;, we can fix this linting issue more precisely with a "&lt;a href="https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types"&gt;string literal&lt;/a&gt;".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function useColorScheme(): "light" {
  return "light";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Component Definition is Missing Display Name
&lt;/h3&gt;

&lt;p&gt;Our next big issue is about the &lt;code&gt;navigation/BottomTabNavigator.tsx&lt;/code&gt; missing a display name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KbO5PfkC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KbO5PfkC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-9.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="942"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/display-name.md"&gt;&lt;code&gt;react/display-name&lt;/code&gt; warning&lt;/a&gt; hints that the code in question is going to make debugging more difficult. When using the React debugging tools, it's very helpful for every component to have a name. This makes it easier to "see" what code is generated and search for a component in the debugger.&lt;/p&gt;

&lt;p&gt;Normally, a developer doesn't have to provide a "display name" to their components. React automatically derives it based on the variable assigned to it.&lt;/p&gt;

&lt;p&gt;However, in this file, the bottom tabs icon is generated in an anonymous, inline function. React can't make up a display name for it - hence the warning.&lt;/p&gt;

&lt;p&gt;To solve this, we need to get rid of those inline functions and replace them with a component as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const BottomTabTabBarIcon = ({ color }: { color: string }) =&amp;gt; (
  &amp;lt;TabBarIcon name="ios-code" color={color} /&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function BottomTabNavigator(): JSX.Element {
  const colorScheme = useColorScheme();

  return (
    &amp;lt;BottomTab.Navigator
      initialRouteName="TabOne"
      tabBarOptions={{ activeTintColor: Colors[colorScheme].tint }}
    &amp;gt;
      &amp;lt;BottomTab.Screen
        name="TabOne"
        component={TabOneNavigator}
        options={{
          tabBarIcon: BottomTabTabBarIcon,
        }}
      /&amp;gt;
      &amp;lt;BottomTab.Screen
        name="TabTwo"
        component={TabTwoNavigator}
        options={{
          tabBarIcon: BottomTabTabBarIcon,
        }}
      /&amp;gt;
    &amp;lt;/BottomTab.Navigator&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tada! Problem solved!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zDvQrYL4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-10-problem-solved.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zDvQrYL4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-10-problem-solved.gif" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="220" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Module is Not Defined
&lt;/h3&gt;

&lt;p&gt;We've got yet another problem with the &lt;code&gt;babel.config.js&lt;/code&gt; file. ESLint is warning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Users/jn/Documents/Apps/expo-lint/babel.config.js
  1:1 error 'module' is not defined no-undef
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are several solutions to this, but this file is not very irrelavant to our code; so, we're going to just ignore it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// eslint-disable-next-line no-undef
module.exports = function (api) {
  api.cache(true);
  return {
    presets: ["babel-preset-expo"],
  };
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  React/No-Unescaped-Entities
&lt;/h3&gt;

&lt;p&gt;Another issue in our &lt;code&gt;yarn lint&lt;/code&gt; output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Users/jn/Documents/Apps/expo-lint/components/EditScreenInfo.tsx
   9:16 warning Missing return type on function @typescript-eslint/explicit-module-boundary-types
  42:39 error `'` can be escaped with `&amp;amp;apos;`, `&amp;amp;lsquo;`, `&amp;amp;#39;`, `&amp;amp;rsquo;` react/no-unescaped-entities
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's focus on the &lt;code&gt;react/no-unescaped-entities&lt;/code&gt; part of this. When writing HTML, developers should avoid the use of apostrophe's, quotes, etc. "But..... this is a React Native project!", you might exclaim. That's true, but thanks to Expo for Web (via &lt;a href="https://github.com/necolas/react-native-web"&gt;React Native Web&lt;/a&gt;), our React Native project can also run in the browser. So, we need to be good citizens and fix our code.&lt;/p&gt;

&lt;p&gt;Replace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tap here if your app doesn't automatically update after making changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tap here if your app doesn&amp;amp;apos;t automatically update after making changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are several such issues throughout the app; so, go tackle them. This escaping works just fine in React Native views as well.&lt;/p&gt;

&lt;p&gt;Finally, run another &lt;code&gt;yarn lint&lt;/code&gt; and 💥! No more linting errors!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4Ad-Y7dy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-10-a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4Ad-Y7dy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-10-a.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Commit All The Thingz!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uCJjtfkR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-11-all-the-thingz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uCJjtfkR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-11-all-the-thingz.gif" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="498" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're &lt;strong&gt;finally&lt;/strong&gt; done! We fixed all the linting errors.&lt;/p&gt;

&lt;p&gt;Before committing, let's make one intentional mistake to prove our pre-commit hook prevents the commit.  In &lt;code&gt;App.tsx&lt;/code&gt;, add this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const a = 1;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should cause the pre-commit hook to fail because the variable &lt;code&gt;a&lt;/code&gt; is defined but never used, right?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m"cleanup all the code!"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BLSEN7kp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-12-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BLSEN7kp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-12-1.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="917"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevent Commits with ESLint Warnings
&lt;/h3&gt;

&lt;p&gt;Husky let us down 🤦‍♂️!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KJY3YCNq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-13-husky-let-us-down.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KJY3YCNq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-13-husky-let-us-down.gif" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What the heck?? Our pre-commit hook worked, prettified all the files, but it let our warning go through and commit?&lt;/p&gt;

&lt;p&gt;The problem is that ESLint doesn't consider "warnings" as fatal errors; so, &lt;code&gt;yarn lint&lt;/code&gt; runs and quits with an exit code of 0.  So, Husky thinks, "Looks good to me!"&lt;/p&gt;

&lt;p&gt;We do &lt;strong&gt;NOT&lt;/strong&gt; want this. The whole goal of this process is to enforce coding standards. If a developer can commit code with tons of warnings, we haven't really solved any problems. In fact, it can lead to buggy code if you attempt to use techniques like &lt;a href="https://justinnoel.dev/2019/10/28/2019-10-27-type-safe-switch-statements-with-typescript/"&gt;type safe switch statements&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To fix this, we need to make ESLint consider "warnings" as fatal errors. Modify the &lt;code&gt;lint&lt;/code&gt; script in &lt;code&gt;package.json&lt;/code&gt; to :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"lint": "eslint . --ext .ts,.tsx,.js,.jsx,.json --max-warnings 0",`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we're explicitly telling ESLint that warnings should not be allowed. When it encounters any warnings, it will exit with a status code other than &lt;code&gt;1&lt;/code&gt; and our pre-commit hook will reject the commit.&lt;/p&gt;

&lt;p&gt;Let's test to make sure it works.&lt;/p&gt;

&lt;p&gt;Again, in &lt;code&gt;App.tsx&lt;/code&gt;, change &lt;code&gt;const a = 1;&lt;/code&gt; to something like &lt;code&gt;const a = "1";&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add App.tsx
git commit -m"Don't fail me now, little doggy!"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZRNLVcAp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZRNLVcAp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-14.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="1171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Woohoo! Husky saw there was a problem with the code and rejected the commit!&lt;/p&gt;

&lt;p&gt;Now, just delete that offending code, recommit and you're done.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Commits are So Slow 😡!!!
&lt;/h2&gt;

&lt;p&gt;As your project grows, you'll add more and more files. When you commit, lint and prettier are going to examine every one of those files for issues. You can imagine in a very large project, it can take several seconds for your commits to get accepted. This gets really irritating, really fast.&lt;/p&gt;

&lt;p&gt;Let's fix this by adding &lt;a href="https://github.com/okonet/lint-staged"&gt;lint-staged&lt;/a&gt; to our project. With lint-staged, only the files we've touched and staged for commit will go through the linting process and be evaluated in the pre-commit hook.  This will drastically speed up your flow.&lt;/p&gt;

&lt;p&gt;Install and configure lint-staged as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx mrm lint-staged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, the installation process modified our Husky config in &lt;code&gt;package.json&lt;/code&gt; to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and added this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  "lint-staged": {
    "*.{ts,tsx,js,jsx,json}": "eslint --cache --fix"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are 3 issues with this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I don't like automated fixes. So, I remove the &lt;code&gt;--fix&lt;/code&gt;. I feel it's important for the developers to be warned about their mistakes and fix them manually.&lt;/li&gt;
&lt;li&gt;It removed our &lt;code&gt;--max-warnings 0&lt;/code&gt; flag; so, no ESLint warnings can make their way back into our code&lt;/li&gt;
&lt;li&gt;It removed our automatic prettification 😞&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, let's modify the &lt;code&gt;lint-staged&lt;/code&gt; section of &lt;code&gt;package.json&lt;/code&gt; to get it back the way we like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"lint-staged": {
  "*.{json,js,jsx,ts,tsx,css,scss,md}": "prettier --config .prettierrc --write",
  "*.{ts,tsx,js,jsx,json}": "eslint --cache --max-warnings 0"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, all commit attempts will run prettier and linting checks on any files we're attempting to commit and no one can commit bad  code anymore! Huzzah!&lt;/p&gt;

&lt;p&gt;Here's what a commit looks like now:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x9gajeoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x9gajeoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justinnoel.dev/content/images/2020/07/expo-lint-15.png" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="880" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Danger Will Robinson!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--crG5j3Nl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/es-lint-15-warning-will-robinson-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--crG5j3Nl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://justinnoel.dev/content/images/2020/07/es-lint-15-warning-will-robinson-1.gif" alt="Enforcing Consistent and Error Free Code in an Expo React Native Project with TypeScript" width="289" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Developers are human. Sometimes, we get in a rush, stuck on a problem, or just need to "Ship It!".  So, we sometimes try to bypass the rules to get something out the door. Sometimes, we just need to commit code even though we know it's got warnings to get it pushed up for another developer to work on.&lt;/p&gt;

&lt;p&gt;Be aware that anyone on your team can do the following to bypass the pre-commit hooks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m"Damn the torpedoes. Full steam ahead!" --no-verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, it's important to add something into your PR process (GitHub Actions, CI/CD tests, etc) to make sure this code doesn't actually get merged until it's fixed.&lt;/p&gt;

&lt;p&gt;I sure hope this walk through helps your team get on the path of clean, consistent code. If you have suggestions or questions, ping me on &lt;a href="https://twitter.com/JustinNoelDev"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>reactnative</category>
      <category>eslint</category>
      <category>prettier</category>
    </item>
  </channel>
</rss>
