<?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: Tracy Adams</title>
    <description>The latest articles on DEV Community by Tracy Adams (@tracycodes).</description>
    <link>https://dev.to/tracycodes</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%2F121462%2Fd2ff814d-bab8-4e99-a51b-092ef59871d0.png</url>
      <title>DEV Community: Tracy Adams</title>
      <link>https://dev.to/tracycodes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tracycodes"/>
    <language>en</language>
    <item>
      <title>How To Setup Shopify Slate on Ubuntu</title>
      <dc:creator>Tracy Adams</dc:creator>
      <pubDate>Fri, 03 Jan 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tracycodes/how-to-setup-shopify-slate-on-ubuntu-5doc</link>
      <guid>https://dev.to/tracycodes/how-to-setup-shopify-slate-on-ubuntu-5doc</guid>
      <description>&lt;p&gt;So recently, I've started to make the move off MacOS as my daily work driver and was trying to work solely on my Windows 10 Laptop (Razer Blade). Well, it was all fine and dandy with my sweet WSL2 setup, until I encountered an issue. &lt;em&gt;There's no official instructions on how to use Shopify Slate properly on Linux.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this post, I'd like to document my steps taken to properly get a local SSL setup while still following Shopify Slate's instructions with their &lt;em&gt;ssl-check&lt;/em&gt; shell function they provide you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: I've made a PR with documentation updates to the Shopify Slate repo!&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Follow all the &lt;a href="https://shopify.github.io/slate/docs"&gt;Shopify Slate instructions&lt;/a&gt; up to the "Create a self-signed SSL certificate" step&lt;/li&gt;
&lt;li&gt;Once at this step, do the following:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Install mkcert by following &lt;a href="https://github.com/FiloSottile/mkcert#linux"&gt;these instructions from the official mkcert repo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following function to your shell profile (.bash_profile, .zshrc, .bashrc, etc...)&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;     &lt;span class="k"&gt;function &lt;/span&gt;ssl-check&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
         &lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.localhost_ssl&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;ssl_crt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;/server.crt
         &lt;span class="nv"&gt;ssl_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;/server.key
         &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput bold&lt;span class="si"&gt;)&lt;/span&gt;
         &lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput sgr0&lt;span class="si"&gt;)&lt;/span&gt;

         &lt;span class="nv"&gt;local_ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
         &lt;span class="c"&gt;# local_ip=999.999.999 # (uncomment for testing)&lt;/span&gt;

         &lt;span class="nv"&gt;domains&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
             &lt;span class="s2"&gt;"localhost"&lt;/span&gt;
             &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$local_ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
         &lt;span class="o"&gt;)&lt;/span&gt;

         &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$ssl_crt&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
             &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;🛑  &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;Couldn't find a Slate SSL certificate:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
             &lt;span class="nv"&gt;make_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
         &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-text&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; &lt;span class="nv"&gt;$ssl_crt&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nv"&gt;$local_ip&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
             &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;🛑  &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;Your IP Address has changed:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
             &lt;span class="nv"&gt;make_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
         &lt;/span&gt;&lt;span class="k"&gt;else
             &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;✅  &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;Your IP address is still the same.&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
         &lt;span class="k"&gt;fi

         if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$make_key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
             &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"Generating a new Slate SSL certificate...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
             &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; &lt;span class="k"&gt;${#&lt;/span&gt;&lt;span class="nv"&gt;domains&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
             mkcert &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;domains&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

             &lt;span class="c"&gt;# Create Slate's default certificate directory, if it doesn't exist&lt;/span&gt;
             &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt;

             &lt;span class="c"&gt;# It appears mkcert bases its filenames off the number of domains passed after the first one.&lt;/span&gt;
             &lt;span class="c"&gt;# This script predicts that filename, so it can copy it to Slate's default location.&lt;/span&gt;
             &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                 &lt;/span&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; ./localhost.pem &lt;span class="nv"&gt;$ssl_crt&lt;/span&gt;
                 &lt;span class="nb"&gt;mv&lt;/span&gt; ./localhost-key.pem &lt;span class="nv"&gt;$ssl_key&lt;/span&gt;
             &lt;span class="k"&gt;else
                 &lt;/span&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; ./localhost+&lt;span class="nv"&gt;$count&lt;/span&gt;.pem &lt;span class="nv"&gt;$ssl_crt&lt;/span&gt;
                 &lt;span class="nb"&gt;mv&lt;/span&gt; ./localhost+&lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="nt"&gt;-key&lt;/span&gt;.pem &lt;span class="nv"&gt;$ssl_key&lt;/span&gt;
             &lt;span class="k"&gt;fi
         fi&lt;/span&gt;
     &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The biggest difference with this script is the &lt;code&gt;local_ip&lt;/code&gt; assignment. The one that is in the official Slate Documentation only handles for MacOS. This should work for most Linux environments (tested on Ubuntu 16.04 - 19.10)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Restart your terminal or run &lt;code&gt;source &amp;lt;location of your shell profile&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;ssl-check&lt;/code&gt; and then run &lt;code&gt;mkcert -install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You will need to restart your currently open browsers for these changes to take effect&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should now have a functioning local SSL setup for Shopify Slate. You can &lt;code&gt;yarn start&lt;/code&gt; your heart out!&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>ubuntu</category>
      <category>linux</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Adventures of Building A Startup - Part 1</title>
      <dc:creator>Tracy Adams</dc:creator>
      <pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/tracycodes/adventures-of-building-a-startup-part-1-mm7</link>
      <guid>https://dev.to/tracycodes/adventures-of-building-a-startup-part-1-mm7</guid>
      <description>&lt;p&gt;As promised in my &lt;a href="https://tracycodes.com/where-did-my-october-go-2019"&gt;last post&lt;/a&gt;, I will be writing about my experience with building a startup!&lt;/p&gt;

&lt;p&gt;In this initial part, I'd like to discuss the &lt;em&gt;idea&lt;/em&gt;, the &lt;em&gt;tech stack&lt;/em&gt;, and what I've got at this point in time.&lt;/p&gt;

&lt;h1&gt;
  
  
  The idea
&lt;/h1&gt;

&lt;p&gt;My idea is to build a startup that revoles around servicing eCommerce stores. Since my day-to-day work involves working on Shopify Sites, I'll be building a &lt;a href="https://developers.shopify.com/"&gt;Shopify App&lt;/a&gt;, to be specific.&lt;/p&gt;

&lt;p&gt;This app will be free on the &lt;a href="https://apps.shopify.com/"&gt;Shopify App Store&lt;/a&gt;, at least for the initial launch 😉. My reasoning behind releasing an initially free app is to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gain some initial traction&lt;/li&gt;
&lt;li&gt;Provide value up front&lt;/li&gt;
&lt;li&gt;Have a great resource of users to test new features&lt;/li&gt;
&lt;li&gt;Have a backlog of features that I consider "premium" to release in the future under paid plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this plan of attack, I'd like to dive into the actual Shopify App idea.&lt;/p&gt;

&lt;h1&gt;
  
  
  The app
&lt;/h1&gt;

&lt;p&gt;The main issue I run into on a day-to-day basis with most of my Shopify Stores is that I don't have a great solution for managing and scheduling promotional prices for products.&lt;/p&gt;

&lt;p&gt;There are some apps that do this &lt;strong&gt;somewhat okay-ish&lt;/strong&gt;, but I need something that's tailored to my specific needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;a href="https://polaris.shopify.com/"&gt;Shopify's Polaris UI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Can select all products, an entire collection of products, an individual product, or an invidivual variant of a product to schedule/set a sale price&lt;/li&gt;
&lt;li&gt;Can schedule at least 1 promo at a time&lt;/li&gt;
&lt;li&gt;Can view past, view/edit current, and view/edit future promotions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These needs are individually met by certain apps, but there isn't a singular app that does all of them well.&lt;/p&gt;

&lt;h1&gt;
  
  
  The tech stack
&lt;/h1&gt;

&lt;p&gt;I will be building this app in a full JavaScript-based environment&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NextJS for the front end&lt;/li&gt;
&lt;li&gt;NodeJS/JavaScript + &lt;a href="https://www.prisma.io/"&gt;Prisma&lt;/a&gt; for the back end &amp;amp; datastore&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I picked this stack as I'm most familiar with JavaScript tech, and I want to get to know the NextJS ecosystem a bit more. We'll be utilizing &lt;a href="https://zeit.co/now"&gt;Zeit's Now&lt;/a&gt; for our hosting needs outside of the datastore. For our datastore, we're going to start out with our own Postgres server with &lt;a href="https://m.do.co/c/b27f823c4eb9"&gt;DigitalOcean&lt;/a&gt; paired with a GraphQL API. If need be, we'll move to using RDS or DynamoDB, but a self-hosted solution will be more than enough to begin with.&lt;/p&gt;

&lt;h1&gt;
  
  
  The design
&lt;/h1&gt;

&lt;p&gt;I'll be using Shopify's Polaris to get the actual UI off the ground. Luckily, that means my app will fit right in with the standard Shopify Admin UI and will have some sweet premade components to go along with it.&lt;/p&gt;

&lt;p&gt;To start with, I've created some basic outlines of what the UI will look like with &lt;a href="https://whimsical.com/"&gt;Whimsical&lt;/a&gt;. I use Whimsical for most of my wireframing once I actually have an idea, as it's easy to get basic layouts from hy head/from paper and onto my computer.&lt;/p&gt;

&lt;h1&gt;
  
  
  Next steps
&lt;/h1&gt;

&lt;p&gt;So this is where I'm at&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Getting basic wireframes fleshed out&lt;/li&gt;
&lt;li&gt;Describing the MVP requirements&lt;/li&gt;
&lt;li&gt;Figuring out the tech stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With those pieces laid out, I will be getting started on building out the initial interactivity portions of this app&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic front end with Authentication&lt;/li&gt;
&lt;li&gt;Storing credentials to our datastore&lt;/li&gt;
&lt;li&gt;Reauthenticating sessions&lt;/li&gt;
&lt;li&gt;Backend lambda functions for the following actions

&lt;ul&gt;
&lt;li&gt;Workers to consume tasks from a queue&lt;/li&gt;
&lt;li&gt;Task queue for scheduled changes to be made&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once that is complete, I'll be back for another writeup and a potential quick sneak peak of the app in action 🚀&lt;/p&gt;

</description>
      <category>startup</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>Where did my October go?</title>
      <dc:creator>Tracy Adams</dc:creator>
      <pubDate>Sun, 10 Nov 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/tracycodes/where-did-my-october-go-424b</link>
      <guid>https://dev.to/tracycodes/where-did-my-october-go-424b</guid>
      <description>&lt;p&gt;Wow... how in the hell did it already get to be November? I guess I should recap what has been going on.&lt;/p&gt;

&lt;p&gt;I spent a lot of my October getting things prepped and ready to go for Black Friday/Cyber Monday at my day job. This included things like building out new product launchs, preparing new site features to drive higher conversion rates, and scheduling the obvious price discounts across our websites.&lt;/p&gt;

&lt;p&gt;To give some insights on what I've been working on, here's a glimpse into the specifics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased performance by over 20% (real-world load times reduced by ~3-4s on average)&lt;/li&gt;
&lt;li&gt;New checkout options to reduce stress of pricing&lt;/li&gt;
&lt;li&gt;New landing pages (always gotta build dem landing pages)&lt;/li&gt;
&lt;li&gt;Some secret projects I'm unfortunately not able to discuss publicly (&lt;em&gt;yet&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Along with that, I've taken on some contracting work in the Shopify world. This is awesome because I'm working with up-and-coming tech to build futuristic Ecommerce stores. With the knowledge from Web Dev Twitter, Shopify's GraphQL API Documentation, and my own trial-and-error, I've started work on a few Headless Shopify websites that'll be really nifty! When these projects are done, I'll do a writeup of the tech stacks used, performance vs. the old client websites, and reasons for why I did headless for these use cases.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ALONG&lt;/em&gt; with the Shopify contract work, I've started work on my first SaaS/Startup as well! 🎉🎉🎉&lt;/p&gt;

&lt;p&gt;This will be a service for Ecommerce businesses to better manage their customer service processes. I'm not gonna get into the nitty-gritty of this, because I don't want to give away my product just yet, but just know that the product already exists, and I've done extensive research and have definite validation for what I'm building out.&lt;/p&gt;

&lt;p&gt;I'm giving myself a deadline of 10 weeks to get this launched in the Beta phase to start testing with a few select customers. At the end of each week, I'll be posting a review of my week to hold myself accountable to the public. I'm dedicated to releasing this product, as I want to help reduce friction in the Ecommerce space with specific products that I've been experiencing for years.&lt;/p&gt;

&lt;p&gt;If you're interested in working with me on this project, I am looking for partners/contributors. Please feel free to &lt;a href="https://twitter.com/tracy_codes"&gt;DM me on Twitter&lt;/a&gt; or email me at &lt;a href="//mailto:tracy@tracycodes.com"&gt;tracy@tracycodes.com&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Coding practices you should learn now, and utilize forever</title>
      <dc:creator>Tracy Adams</dc:creator>
      <pubDate>Mon, 23 Sep 2019 03:41:46 +0000</pubDate>
      <link>https://dev.to/tracycodes/coding-practices-you-should-learn-now-and-utilize-forever-1eac</link>
      <guid>https://dev.to/tracycodes/coding-practices-you-should-learn-now-and-utilize-forever-1eac</guid>
      <description>&lt;p&gt;Here are 5 coding practices I’ve come to know and love over the last few years that I thank myself for every day.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Standard code formatting
&lt;/h1&gt;

&lt;p&gt;Most codebases are ready more than written. A codebase with consistent formatting is a lot easier to read vs code with varying styles from numerous contributors on a team. Standardized formatting brings about being able to easily scan through code and pick out the bits you need without bashing your head against your desk. Prettier + ESLint + a popular linting config can do all the heavy lifting for you. Do you have a team member who absolutely refuses to use semicolons in their JavaScript? That’s fine! Just have them use Prettier ESLint with a predetermined config, this will return errors if they don’t follow the code guidelines. When we implemented this exact setup in our codebase, we ended a lot of discussions/heated debate during code reviews and QA.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Don’t code DRY if it doesn’t make sense
&lt;/h1&gt;

&lt;p&gt;The DRY (Don’t Repeat Yourself) principle is almost a mantra (and sometimes a &lt;em&gt;great&lt;/em&gt; interview question) among developers. But, if it’s applied without knowing &lt;em&gt;why&lt;/em&gt;, then it will lead to some abstract code that is simply too hard to read and understand.&lt;/p&gt;

&lt;p&gt;For me and my team, we stick to a “2-copy maximum” rule. This means any function/code can be copied two times in a codebase. If it needs to be copied any more than twice, then we refactor so that the code is completely reusable within the rest of the application without having to copy+paste code constantly. This keeps us from assuming two problems should be solved the same way, at first glance.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Debug code via logging
&lt;/h1&gt;

&lt;p&gt;You should practice debugging code in your local environment via logs instead of a debugger. For us, we use &lt;a href="https://sentry.io"&gt;Sentry.io&lt;/a&gt; for our logger/debugger in production. Because of this, we’re charged &lt;em&gt;“per event”&lt;/em&gt;, which means logging and events are very precious.&lt;/p&gt;

&lt;p&gt;Since we treat logging and events as such, we do debugging on our local machines first to ensure that logs are added in the right place. This, in turn, makes it so that if an exception is handled via Sentry, it is super easy to track down since we don’t have a crazy clutter of logging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember, too much logging === not logging at all&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Don’t add complication early on
&lt;/h1&gt;

&lt;p&gt;Don’t complicate your codebase with features that no user or stakeholder has asked for. This is a problem you need to especially avoid in early product lifecycles. I struggled with this when I first joined my new team. I tried to come out the gate swinging and going above and beyond expectations. Do you know what this did? It added more questions, more tickets, and even more work on my team’s plate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is an anti-pattern.&lt;/strong&gt; Adding unnecessary features makes your codebase harder to read and debug. When you onboard new developers, they will find it difficult to differentiate between important features and ones that were added at 4am and were backed by a caffeine overdose.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Setup a CI/CD pipeline early in your project’s lifecycle
&lt;/h1&gt;

&lt;p&gt;I can’t say this enough. Even if you’re on your own with a project, a CI/CD pipeline will reduce the overhead of remembering (and doing) the build and deployment of your codebase.&lt;/p&gt;

&lt;p&gt;A common misconception is that CI/CD pipelines are important only for teams that push/deploy a lot of code to production every day. From my experience, even if you’re pushing to production once a week, it can save &lt;em&gt;hours&lt;/em&gt;. Recently, I introduced a CI/CD pipeline for our main project (deployment used to take several hours as a lot of it was copy+pasting code or uploading code to servers and replacing old files via diffing). After introducing CI/CD, we can run a full production deployment in under 5 minutes and can rollback in seconds if there’s an error.&lt;/p&gt;

&lt;p&gt;P.S. Having a CI/CD pipeline usually results in having an exact deployment history, linking it to a specific commit. This has helped us during postmortems to find the root cause for an incident.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>bestpractices</category>
      <category>learning</category>
    </item>
    <item>
      <title>Hello World</title>
      <dc:creator>Tracy Adams</dc:creator>
      <pubDate>Tue, 03 Sep 2019 20:48:58 +0000</pubDate>
      <link>https://dev.to/tracycodes/hello-world-5282</link>
      <guid>https://dev.to/tracycodes/hello-world-5282</guid>
      <description>&lt;p&gt;How exciting! This is my very first blog post (ever). Don’t try Googling it, because it’s definitely true.&lt;/p&gt;

&lt;p&gt;You’re probably thinking, “what’s this blog about?“. To that, I’d like to respond with the following:&lt;/p&gt;

&lt;p&gt;I’m primarily starting this blog so I can share the knowledge I’ve amassed over the last 4 years of professional web and software development. I’ve built distributed applications with both &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; and &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt;, complete desktop apps, warehouse management solutions, and more.&lt;/p&gt;

&lt;p&gt;Over the last 4 years, I’ve spent my time at&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agencies&lt;/li&gt;
&lt;li&gt;Full time freelancing&lt;/li&gt;
&lt;li&gt;Running an E-Commerce business&lt;/li&gt;
&lt;li&gt;Working full time as a lead developer for one company&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Along with technical know-how, based on my success in the freelancing world, I have gained a lot of knowledge with respect to being successful in the shark-infested waters that is freelance web development and software engineering.&lt;/p&gt;

&lt;p&gt;If you’re curious, I’m branching out and have rebuilt my entire website using &lt;a href="https://www.gatsbyjs.org/"&gt;GatsbyJS&lt;/a&gt; and plan to do some pretty neat things once I get out of this boilerplate stage.&lt;/p&gt;

&lt;p&gt;I hope you follow along on &lt;a href="https://twitter.com/tracy_codes"&gt;Twitter&lt;/a&gt; and &lt;a href="https://instagram.com/tracycodes"&gt;Instagram&lt;/a&gt; as I’ll be posting updates there when I push a new post live 🤓&lt;/p&gt;

&lt;p&gt;As a parting _gif_t, I’ll leave you with this… an accurate representation of me last week while on vacation in another state after deploying a broken branch to production…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BKTafR8q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://tracycodes.com/14ef62945dedbbf5ff58230f9c557f97/mess.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BKTafR8q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://tracycodes.com/14ef62945dedbbf5ff58230f9c557f97/mess.gif" alt="Diet Coke and Mentos explosion"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>go</category>
      <category>webdev</category>
      <category>firstpost</category>
    </item>
  </channel>
</rss>
