<?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>Forem: Eddie</title>
    <description>The latest articles on Forem by Eddie (@eaich).</description>
    <link>https://forem.com/eaich</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%2F134672%2F32739b35-8748-46da-bb17-9826271aaeee.png</url>
      <title>Forem: Eddie</title>
      <link>https://forem.com/eaich</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/eaich"/>
    <language>en</language>
    <item>
      <title>Launched a new theme for VSCode today</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Sat, 30 Jan 2021 17:08:23 +0000</pubDate>
      <link>https://forem.com/eaich/launched-a-new-theme-for-vscode-today-507d</link>
      <guid>https://forem.com/eaich/launched-a-new-theme-for-vscode-today-507d</guid>
      <description>&lt;p&gt;Hello everyone! I launched a VSCode theme that my team uses internally. I've had several people ask about it in the past and finally got around to making it available to the public.&lt;/p&gt;

&lt;p&gt;I launched it on Product Hunt today and it would be awesome if you checked it out and tried it out yourself! -&amp;gt; &lt;a href="https://www.producthunt.com/posts/crucial-human-theme-for-vscode" rel="noopener noreferrer"&gt;Crucial Human Theme for VSCode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's some previews and I hope you enjoy it! 😎&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&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%2Fstatic.crucialhuman.com%2Fimages%2Fcrucialhuman-vscode-shadow.png" 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%2Fstatic.crucialhuman.com%2Fimages%2Fcrucialhuman-vscode-shadow.png" alt="Crucial Human Theme for VSCode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS
&lt;/h3&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%2Fstatic.crucialhuman.com%2Fimages%2Fcrucialhuman-vscode-css-shadow.png" 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%2Fstatic.crucialhuman.com%2Fimages%2Fcrucialhuman-vscode-css-shadow.png" alt="Crucial Human Theme for VSCode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Font used in previews is Fira Code&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>vscode</category>
      <category>theme</category>
    </item>
    <item>
      <title>Create your own State Management solution in one line</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Mon, 28 Dec 2020 05:33:37 +0000</pubDate>
      <link>https://forem.com/eaich/create-your-own-state-management-solution-in-one-line-19h8</link>
      <guid>https://forem.com/eaich/create-your-own-state-management-solution-in-one-line-19h8</guid>
      <description>&lt;p&gt;Not clickbait.&lt;/p&gt;

&lt;p&gt;Create a file and name it &lt;strong&gt;Store.js&lt;/strong&gt;. Put the following one line of code in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Store.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can store any data you want and share it across your modules and components without polluting the global namespace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Store&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Store.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Settings&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../api/Settings.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SETTINGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// store XHR response in Store module&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Module.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Store&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Store.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getSetting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SETTINGS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// get a specific setting from the Store&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Task.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Store&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Store.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;loadTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentTaskId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Store the current id in Store.js&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extending the Store
&lt;/h3&gt;

&lt;p&gt;How would extend this simple concept to add options for the following items?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Immutability&lt;/li&gt;
&lt;li&gt;Persistence&lt;/li&gt;
&lt;li&gt;Transformation&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Have dev tools and boilerplate code prevented you from learning how to code?</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Sat, 25 Jul 2020 17:27:27 +0000</pubDate>
      <link>https://forem.com/eaich/have-dev-tools-and-scaffolding-scripts-prevented-you-from-learning-how-to-code-34hb</link>
      <guid>https://forem.com/eaich/have-dev-tools-and-scaffolding-scripts-prevented-you-from-learning-how-to-code-34hb</guid>
      <description>&lt;p&gt;I'm curious to know how many devs here, especially junior devs, have had trouble understanding certain programming syntax and/or concepts and if dev tools and scaffolding scripts like create-react-app have had any part in stunting your growth?&lt;/p&gt;

&lt;p&gt;For example, some boilerplate scripts write basic HTML blocks for you, but did that prevent you from fully understanding concepts like:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Share your thoughts in the comments!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to overcome your impostor syndrome</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Wed, 08 Jul 2020 21:51:02 +0000</pubDate>
      <link>https://forem.com/eaich/how-to-overcome-your-impostor-syndrome-1323</link>
      <guid>https://forem.com/eaich/how-to-overcome-your-impostor-syndrome-1323</guid>
      <description>&lt;p&gt;When I was in college, my Calculus professor gave me partial credit for a problem that I had solved correctly. He said that I took a few additional unnecessary steps to reach the answer. I was pissed. In my mind, I got the correct answer and he gave me partial credit because I didn't do it the way &lt;em&gt;he&lt;/em&gt; wanted. But his point still stood. I could have done it a better way.&lt;/p&gt;

&lt;p&gt;Programming is the same; &lt;strong&gt;there are multiple ways to solve a problem&lt;/strong&gt; - some better than others. But unlike the exchange between me and my professor, us programmers can get multiple tries (most of the time).&lt;/p&gt;

&lt;p&gt;Let's get into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type every single character of your code
&lt;/h2&gt;

&lt;p&gt;Impostor syndrome could be exacerbated from copy and pasting code snippets and examples and from using boilerplate app starters like &lt;strong&gt;create-react-app&lt;/strong&gt;. As a beginner, you don't know what is going on under the hood and you might nonchalantly say you don't care, but deep down inside, you actually do - or at least if you want to become a good programmer, you should care.&lt;/p&gt;

&lt;p&gt;One way to solve this is to practice typing every single character and line of your code. Much like athletes, chess players, and musicians do the same thing over and over again to get better, programmers, especially beginners, should practice repetitive writing.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj7xv17maw3udvd8wxqd1.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj7xv17maw3udvd8wxqd1.gif" alt="Animation of writing basic HTML code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even if your code is partially copy and pasted from another source, practice typing that snippet by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work Backwards
&lt;/h2&gt;

&lt;p&gt;Focus on the intended result. Focus on getting there first. It may be ugly. It may be slow. But that doesn't matter (yet).&lt;/p&gt;

&lt;p&gt;Did your button work? Is that modal window displaying? Were you able to fetch the right data set from the API?&lt;/p&gt;

&lt;p&gt;Yes, but there are some errors. Who cares? In this exact moment, who freakin' cares? You achieved the result. Now you can focus on making that error disappear, make sure your code is properly tabbed (or is it spaced?), etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I know if I'm writing bad code?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"In order to write good code, you must first write bad code."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don't remember who said this, but the answer to knowing if your code is good or bad is: &lt;strong&gt;experience&lt;/strong&gt;. Don't confuse programming best practices for good code. A programming best practice could simply be someone else's opinion, or it could be something that applies to general usage.&lt;/p&gt;

&lt;p&gt;Here's a typical best practice for using the viewport meta tag:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;But if you constantly rely on this as being &lt;em&gt;the&lt;/em&gt; best practice, you don't expose yourself to understanding what other parameters and options there are to perhaps handle a situation that is unique to you. Use best practices as a starting point, but don't stop there.&lt;/p&gt;

&lt;h4&gt;
  
  
  Just start writing code.
&lt;/h4&gt;

&lt;p&gt;It does not have to be perfect. Then ask yourself these simple questions to improve incrementally:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did I repeat myself too much?&lt;/li&gt;
&lt;li&gt;Does my code look messy?&lt;/li&gt;
&lt;li&gt;Am I being consistent?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you have the resource available, ask another person to look it over.&lt;/p&gt;

&lt;h4&gt;
  
  
  Follow the carrot
&lt;/h4&gt;

&lt;p&gt;The best part about programming is that feeling when you get a win. The cool thing is that these are typically visual and we as humans respond tremendously to visual cues. It's those incremental wins that keep us going.&lt;/p&gt;

&lt;h2&gt;
  
  
  There's more than one way to solve a problem
&lt;/h2&gt;

&lt;p&gt;This is the key right here. You may have solved the problem, but you might have this looming thought or feeling that the path you took to get there is wrong or not the best way. You might feel self-conscious leading up to a code review. Guess what? That's normal and it's absolutely OK as long as you strive for continuous improvement.&lt;/p&gt;

&lt;p&gt;And you know the best part? You can have another crack at it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can find me on the Twitter - &lt;a href="https://twitter.com/eddieaich" rel="noopener noreferrer"&gt;https://twitter.com/eddieaich&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>advice</category>
      <category>beginners</category>
    </item>
    <item>
      <title>6 essential tools you should know before launching your website</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Fri, 03 Jul 2020 13:45:56 +0000</pubDate>
      <link>https://forem.com/eaich/5-essential-tools-you-should-know-before-launching-your-website-460e</link>
      <guid>https://forem.com/eaich/5-essential-tools-you-should-know-before-launching-your-website-460e</guid>
      <description>&lt;p&gt;Before you launch your shiny new website, use these tools to make sure that your site is compliant, secure, high performing, and can be easily discovered by your audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  HTML Validators
&lt;/h2&gt;

&lt;p&gt;These tools look for invalid HTML on your site and show you the actual code and line numbers that you need to correct.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://validator.w3.org/"&gt;W3C Markup Validator&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.freeformatter.com/html-validator.html"&gt;FreeFormatter&lt;/a&gt;
&lt;/h4&gt;

&lt;h2&gt;
  
  
  Social Media Card Testing
&lt;/h2&gt;

&lt;p&gt;Tests to see how your site will look on social media feeds when someone shares or posts it. Just enter your website address and they will show you the results.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://cards-dev.twitter.com/validator"&gt;Twitter Card Validator&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;. &lt;a href="https://davidwalsh.name/twitter-cards"&gt;How to Create a Twitter Card&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.linkedin.com/post-inspector/inspect/"&gt;LinkedIn Post Tester&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://developers.facebook.com/tools/debug/"&gt;Facebook Sharing Debugger&lt;/a&gt;
&lt;/h4&gt;

&lt;h2&gt;
  
  
  Security Scanning
&lt;/h2&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://observatory.mozilla.org/"&gt;Mozilla Observatory&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Scans your site's infrastructure configuration to ensure that your site is safe and secure. You can also allow third-party tests to be run from Observatory. For example, a scan from ImmuniWeb will check if your site has SSL vulnerabilities.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.ssllabs.com/ssltest/"&gt;SSL Labs&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Scans your site for SSL/TLS misconfigurations and compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Webmaster Search Console
&lt;/h2&gt;

&lt;p&gt;These tools allow you to directly submit your website for search engine indexing. They also provide tools to measure the mobile-friendliness of your site. If you opt-in, they will periodically send you e-mail notifications if they detect an error on your site that would reduce search engine optimization.&lt;/p&gt;

&lt;p&gt;Below are the three most popular options. Note that you will have to prove that you own your domain or are the owner of the website either by providing a specific DNS entry in your configuration or by adding a temporary meta tag to your site.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://search.google.com/search-console"&gt;Google Search Console&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.bing.com/webmaster"&gt;Bing Webmaster Tools&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://webmaster.yandex.com/"&gt;Yandex Webmaster&lt;/a&gt;
&lt;/h4&gt;

&lt;h2&gt;
  
  
  Performance + Speed
&lt;/h2&gt;

&lt;p&gt;Tests your site for speed and performance.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://developers.google.com/speed/pagespeed/insights/"&gt;Google PageSpeed Insights&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;This is basically a web-based Lighthouse.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.webpagetest.org/"&gt;WebPageTest&lt;/a&gt;
&lt;/h4&gt;

&lt;h2&gt;
  
  
  Mobile Friendliness / Responsive
&lt;/h2&gt;

&lt;p&gt;Tests to see if your site is mobile-friendly, shows you screenshots and provides suggestions on what you need to fix if your site is not mobile-friendly.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://search.google.com/test/mobile-friendly"&gt;Google Mobile-Friendly Test&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.bing.com/webmaster/tools/mobile-friendliness"&gt;Bing Mobile-Friendliness Tool&lt;/a&gt;
&lt;/h4&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Once you've launched your website, you can continuously use the above tools to make sure that your site remains secure, mobile-friendly, and delivers to your audience at blazing speeds.&lt;/p&gt;

&lt;p&gt;Happy websiting!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can find me on the Twitter - &lt;a href="https://twitter.com/eddieaich"&gt;https://twitter.com/eddieaich&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>security</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What is your routine to snap out of a dev funk?</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Tue, 05 May 2020 14:31:18 +0000</pubDate>
      <link>https://forem.com/eaich/what-is-your-routine-to-snap-out-of-a-dev-funk-2an</link>
      <guid>https://forem.com/eaich/what-is-your-routine-to-snap-out-of-a-dev-funk-2an</guid>
      <description>&lt;p&gt;Lately, I've been hitting a wall more often than I would like while I'm programming. No matter how much coffee I drink, I just can't seem to snap out of it. Sometimes, it gets to a point where I'm doing more damage than good. I write sloppy, lazy code. Take shortcuts.&lt;/p&gt;

&lt;p&gt;I can't really pinpoint the root cause either. Lack of sleep, stress, kids, distractions.&lt;/p&gt;

&lt;p&gt;I've tried all sorts of things but the one thing that has seemed to help me is to exercise vigorously. Do jumping jacks until exhaustion.&lt;/p&gt;

&lt;p&gt;What's your routine? How do you identify the root cause? How often do you get into a mental funk?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to detect when the user stops typing</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Tue, 07 Apr 2020 14:21:34 +0000</pubDate>
      <link>https://forem.com/eaich/how-to-detect-when-the-user-stops-typing-3cm1</link>
      <guid>https://forem.com/eaich/how-to-detect-when-the-user-stops-typing-3cm1</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;It is common to add keystroke events to input elements to detect when a user is typing such as &lt;code&gt;keypress&lt;/code&gt;, &lt;code&gt;keydown&lt;/code&gt;, and &lt;code&gt;keyup&lt;/code&gt;. But sometimes, these alone are too granular for your needs. Imagine sending a Fetch request to your server to update a DB record after every keystroke!&lt;/p&gt;

&lt;p&gt;With just a little bit of code, we can make handling user keystrokes more practical and more performant.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical applications
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Implement an auto-save feature&lt;/li&gt;
&lt;li&gt;Keep your local data store up-to-date&lt;/li&gt;
&lt;li&gt;Synchronize the view with real-time collaborators&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Here's what you're going to build
&lt;/h2&gt;

&lt;p&gt;&lt;iframe src="https://jsfiddle.net/aichforhuman/9146qbwy//embedded/result,js,html//dark" width="100%" height="600"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's define some basic variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;timeoutVal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// time it takes to wait for user to stop typing in ms&lt;/span&gt;

&lt;span class="c1"&gt;// pointers to our simple DOM elements&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;typer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add two separate event listeners on keypress and keyup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// detects when the user is actively typing&lt;/span&gt;
&lt;span class="nx"&gt;typer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keypress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleKeyPress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// triggers a check to see if the user is actually done typing&lt;/span&gt;
&lt;span class="nx"&gt;typer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleKeyUp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a timeout on keyup event
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// when the user has stopped pressing on keys, set the timeout&lt;/span&gt;
&lt;span class="c1"&gt;// if the user presses on keys before the timeout is reached, then this timeout should be canceled via the keypress event&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handleKeyUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// prevent errant multiple timeouts from being generated&lt;/span&gt;
  &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;All done typing! Do stuff like save content to DB, send WebSocket message to server, etc.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;timeoutVal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clear the timeout object on keypress
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// when user is pressing down on keys, clear the timeout&lt;/span&gt;
&lt;span class="c1"&gt;// a keyup event always follows a keypress event so the timeout will be re-initiated there&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handleKeyPress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Typing...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  That's it!
&lt;/h2&gt;

&lt;p&gt;See how simple that was? Now you can make a more accurate determination on when the user has stopped typing and process data more intelligently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it better - other things to think about!
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;How would you handle Backspace events?&lt;/li&gt;
&lt;li&gt;How would you handle version control?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Follow me on Twitter &lt;a href="https://twitter.com/eddieaich"&gt;https://twitter.com/eddieaich&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to structure API for creating content with parent/child relationship?</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Wed, 20 Nov 2019 21:30:20 +0000</pubDate>
      <link>https://forem.com/eaich/how-to-structure-api-for-creating-content-with-parent-sibling-relationship-2be9</link>
      <guid>https://forem.com/eaich/how-to-structure-api-for-creating-content-with-parent-sibling-relationship-2be9</guid>
      <description>&lt;p&gt;I need some advice on deciding which endpoint to use in order to create an article and have that article be assigned to a publication.&lt;/p&gt;

&lt;p&gt;Say I have two API endpoints:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;/v1/publications&lt;/li&gt;
&lt;li&gt;/v1/articles&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If I want to create a new article and have it automatically assigned to a publication, should I:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make the call to &lt;code&gt;POST /v1/publications/article&lt;/code&gt; and have that endpoint create the new article as well as its assignment to the specified publication or&lt;/li&gt;
&lt;li&gt;Make the call to &lt;code&gt;POST /v1/articles&lt;/code&gt; to create the new article and have that endpoint assign the new article to the publication&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Publications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createArticle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publicationId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// creates a new article&lt;/span&gt;
&lt;span class="c1"&gt;// publication id is required and auto assigns the new article to publication id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publicationId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Creates a new article&lt;/span&gt;
&lt;span class="c1"&gt;// publication id is optional. If it exists, assign it to the publication&lt;/span&gt;
&lt;span class="c1"&gt;// If it does not exist, just create the article&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>help</category>
      <category>api</category>
    </item>
    <item>
      <title>CSS - Keep it simple! 3 core concepts for a professional look</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Mon, 11 Nov 2019 15:35:15 +0000</pubDate>
      <link>https://forem.com/eaich/css-keep-it-simple-3-core-concepts-for-a-professional-look-2mc</link>
      <guid>https://forem.com/eaich/css-keep-it-simple-3-core-concepts-for-a-professional-look-2mc</guid>
      <description>&lt;p&gt;You don't need much to create a professional, clean looking web application. Just follow these three principles and basic techniques in each category and you'll be well on your way to making professional looking user interfaces. Today, we will be looking at the following core concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spacing&lt;/li&gt;
&lt;li&gt;Contrast&lt;/li&gt;
&lt;li&gt;Subtlety&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Spacing
&lt;/h2&gt;

&lt;p&gt;Spacing covers things like &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;line-height&lt;/code&gt;, and &lt;code&gt;letter-spacing&lt;/code&gt;. Giving your elements breathing room and space increases readability and cleanliness.&lt;/p&gt;

&lt;h4&gt;
  
  
  Padding
&lt;/h4&gt;

&lt;p&gt;The amount of padding works hand-in-hand with your chosen font size and line spacing. In this example, I am using &lt;code&gt;padding: 30px;&lt;/code&gt;, but as you can see, each line of text seems a bit crowded.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/jOOpZjV?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Line Height
&lt;/h4&gt;

&lt;p&gt;The next example includes &lt;code&gt;line-height: 1.5em&lt;/code&gt;. Notice how much more readable it is? If I used a smaller font size, then I would probably also reduce the line height, and possibly the padding.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/NWWBYrb?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Contrast
&lt;/h2&gt;

&lt;p&gt;Contrast is important for legibility and accessibility. It covers things like difference in color between text and background. It also covers differences in font weight: bold, semi-bold, thin.&lt;/p&gt;

&lt;h4&gt;
  
  
  Color Contrast
&lt;/h4&gt;

&lt;p&gt;Let's see what happens if we reduce the contrast between the text and background color.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/XWWBEpY?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Now let's meet in the middle between black (#000) and medium gray (#999). Below, I am using &lt;code&gt;color: #333;&lt;/code&gt;, which reduces the contrast just slightly enough to help reduce eye strain.&lt;br&gt;
 &lt;iframe height="600" src="https://codepen.io/eddieherm/embed/yLLqKMP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Font weight contrast
&lt;/h4&gt;

&lt;p&gt;The headline &lt;code&gt;h2&lt;/code&gt; element provides a contrast between itself and the text below using font weighting.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/LYYBdjo?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Notice that there is extra space above the &lt;code&gt;h2&lt;/code&gt;? It is there because by default, &lt;code&gt;h2&lt;/code&gt; adds additional margins above and below it. Since we have &lt;code&gt;padding: 30px;&lt;/code&gt; all around out box, the extra margin above the &lt;code&gt;h2&lt;/code&gt; is no longer necessary. Let's follow our spacing concept and remove that.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/XWWBEVx?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Subtlety
&lt;/h2&gt;

&lt;p&gt;Any complementary styles should be subtle. Let's use border as an example.&lt;/p&gt;

&lt;h4&gt;
  
  
  Subtle borders
&lt;/h4&gt;

&lt;p&gt;Below, we added a black border, but the contrast between the border and the box's background color seems a bit too strong. We want the focus to be on the content and the black border is taking some of the focus away.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/bGGjvvW?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Let's go for a lighter color for the border.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/xxxJWje?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Smoothness
&lt;/h4&gt;

&lt;p&gt;In some cases, you may want your user inteface to be a bit smoother. Let's smooth out the corners of our box a bit using &lt;code&gt;border-radius&lt;/code&gt;.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/BaaPrPW?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Add subtle interactions
&lt;/h4&gt;

&lt;p&gt;Let's say that we want to indicate to the user that the box is clickable. Let's change the mouse cursor and add a shadow effect to our box when a user hovers the mouse over it, but make sure we are subtle about it!&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/zYYLWme?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;...and let's add some smoothness to it by adding a transition time between states. We will add &lt;code&gt;transition: 0.3s;&lt;/code&gt; to our container style.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/GRRBxPj?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Universal Applicability
&lt;/h2&gt;

&lt;p&gt;The three concepts are universal. Here's a dark version.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/LYYBdwE?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;...and here's an alternative light version.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/eddieherm/embed/NWWBMKy?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;See? It doesn't take much to completely change the look and feel of our user interface. Subtle changes can make all the difference. We didn't use any crazy filters or styles. We kept it simple and applied three core concepts - Spacing, Contrast, and Subtlety.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm on Twitter &lt;a href="https://twitter.com/eddieaich"&gt;@eddieaich&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Pendulum Swing of Development and Technology Trends</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Wed, 06 Nov 2019 17:14:21 +0000</pubDate>
      <link>https://forem.com/eaich/the-pendulum-swing-of-development-and-technology-trends-5dek</link>
      <guid>https://forem.com/eaich/the-pendulum-swing-of-development-and-technology-trends-5dek</guid>
      <description>&lt;p&gt;Pendulum swings happen all around us from time to time. It's when a response to one extreme is the opposite extreme. Examples of industries where pendulum swings are prevalent include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Politics&lt;/strong&gt; - left/right dichotomy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fashion&lt;/strong&gt; - jeans, hair&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design&lt;/strong&gt; - open office vs. cubicles&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Basically, any industry that is flush with trends and opinions is susceptible to extreme swings and it often feels like we are repeating history.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"…there is no single correct answer, just a lot of subjective decisions to make." — &lt;a href="https://www.madebymany.com/stories/why-software-developers-need-creativity" rel="noopener noreferrer"&gt;Kat Lynch, Why Software Developers Need Creativity&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Software Development and Technology Trends
&lt;/h2&gt;

&lt;p&gt;Our industry is no exception. It goes without saying that we are surrounded by opinions that we often adopt blindly, sometimes to the detriment of our own unique needs. Here is a list of some current trends and swings.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Monorepo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Multiple repositories are difficult to maintain.&lt;/li&gt;
&lt;li&gt;Reduce dependency management.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiple repositories&lt;/strong&gt; - Separate our concerns. Teams can work independently. Easier to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Server-Side Rendering (SSR)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client-side rendering is slow.&lt;/li&gt;
&lt;li&gt;Poor to no SEO support.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client-side rendering&lt;/strong&gt; - Browsers are fast now, server-side rendering is slow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Prior PRIOR Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Render content from the Server-Side&lt;/strong&gt; - PHP, Ruby, Java, Python, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Functional Programming&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write less code.&lt;/li&gt;
&lt;li&gt;Object-Oriented code is hard to read.&lt;/li&gt;
&lt;li&gt;Inheritance and class extension is bad.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Object-Oriented Programming&lt;/strong&gt; - Separation of concerns. Everything is an object. Inheritance is good. Easier to read.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Web Components&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;(More) Reusable code.&lt;/li&gt;
&lt;li&gt;Combine HTML, CSS, and JS. Everything is right in front of my face in one file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separation of concerns&lt;/strong&gt; - Separate HTML, CSS, JS from each other.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Desktop Apps&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Users still like desktop apps for their convenience.&lt;/li&gt;
&lt;li&gt;"Always on."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web apps&lt;/strong&gt; - The future of apps will be purely web-based. No need for desktop apps anymore.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Prior PRIOR Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desktop apps&lt;/strong&gt; - Download and install everything on your computer.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;j/k... Web(Assembly) Apps&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write using your favorite language - JavaScript, C#, Rust, etc.&lt;/li&gt;
&lt;li&gt;The future of apps will be purely web-based.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web apps AND Desktop apps&lt;/strong&gt; - Every useful web app has a companion Desktop app.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;On-Premise&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Any application that my company adopts must be installed internally in our private data centers for maximum security.&lt;/li&gt;
&lt;li&gt;I don't care about added maintenance. Security is top priority.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Cloud&lt;/strong&gt; -  Less capital costs. Low maintenance of hardware and software upgrades and network management.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Microservices&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fix bugs and deploy features with minimal impact.&lt;/li&gt;
&lt;li&gt;Tech stack flexibility and choice due to loose coupling.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monolith&lt;/strong&gt; - Common language and tech stack that the entire team understands. Predictability.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GraphQL&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Theoretical Reasons for Trend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give me the data that I want and in the way that I want it.&lt;/li&gt;
&lt;li&gt;Less noise and calls, more data.&lt;/li&gt;
&lt;li&gt;Compatible with Microservices architecture.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST, RPC&lt;/strong&gt; - Predictable endpoints. Great control and restriction.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;...and last but not least, my favorite trend...&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Virtual Reality (VR)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Prior Trend&lt;/em&gt; - &lt;strong&gt;VIRTUAL REALITY!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/rqzxK1RL5Plp6/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/rqzxK1RL5Plp6/giphy.gif" alt="Animation of VR in Hackers movie"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Prior PRIOR Trend&lt;/em&gt; - &lt;strong&gt;The real world.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Our industry changes fast and often. It's easy to fall into the shiny object trap. The purpose of this article is five-fold:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make you aware of current trends&lt;/li&gt;
&lt;li&gt;Explain why they exist&lt;/li&gt;
&lt;li&gt;Understand the basic history that led up to the trends&lt;/li&gt;
&lt;li&gt;Realize that there will be more pendulum swings in the future, and last but not least,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Help you outlast trends and to think for yourself&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fgiphygifs.s3.amazonaws.com%2Fmedia%2FDBfYJqH5AokgM%2Fgiphy.gif" 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/http%3A%2F%2Fgiphygifs.s3.amazonaws.com%2Fmedia%2FDBfYJqH5AokgM%2Fgiphy.gif" alt="Scene from Jurassic Park"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow me on Twitter &lt;a href="https://twitter.com/eddieaich" rel="noopener noreferrer"&gt;@eddieaich&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>trends</category>
      <category>webdev</category>
      <category>technology</category>
      <category>thinkforyourself</category>
    </item>
    <item>
      <title>What happens to our data when we die?</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Thu, 31 Oct 2019 17:57:35 +0000</pubDate>
      <link>https://forem.com/eaich/what-happens-to-our-data-when-we-die-3i0k</link>
      <guid>https://forem.com/eaich/what-happens-to-our-data-when-we-die-3i0k</guid>
      <description>&lt;p&gt;&lt;em&gt;Because it's Halloween, here's something to ponder...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How many online accounts do you have? Social media, banking, forums, apps, bills, blogs, code repositories, games. How much of your intellectual property, content, identity, and life in general live online?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would happen if you were to die tomorrow?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Would anyone other than you be able to access all that you have online if you suddenly vanished? If you have friends solely on the Internet, how would they find out if you were no longer living?&lt;/p&gt;

&lt;h3&gt;
  
  
  Estate Planning
&lt;/h3&gt;

&lt;p&gt;Your online presence and property are often overlooked during Estate Planning. We have common documents like Wills, Trusts, and Power of Attorney but no boilerplate to handle our online lives.&lt;/p&gt;

&lt;p&gt;Why is this the case? In many ways, the Estate Planning industry is decades behind. With so much of people's lives now centered around the Internet, there is much room for improvement in this industry suffice to say.&lt;/p&gt;

&lt;h3&gt;
  
  
  What company policies exist to handle this?
&lt;/h3&gt;

&lt;p&gt;There are a number of policies depending on the type of service you use. For social media, your loved ones' primary option is to memorialize your profile. &lt;a href="https://www.facebook.com/help/408583372511972/"&gt;Here are Facebook's guidelines tucked away in their Help documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If, however, you use a service that may contain valuable information or intellectual property such as a note taking service or code repository, it gets a bit trickier Let's have a look at Evernote's Terms:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pIbKas3m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/f6st7crykqpxs8ifdpqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pIbKas3m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/f6st7crykqpxs8ifdpqw.png" alt="Snippet of Evernote Terms of Service"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, their policy is "store your credentials near your Will and give your account information to your friends." Ok, I guess that's fine.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about our email accounts?
&lt;/h3&gt;

&lt;p&gt;Google has a process to either close or obtain information from a deceased loved one's account outlined &lt;a href="https://support.google.com/accounts/troubleshooter/6357590?hl=en"&gt;here&lt;/a&gt;. They recommend setting an &lt;a href="https://support.google.com/accounts/answer/3036546"&gt;Inactive Account Manager&lt;/a&gt; to let them know who can access your account when you have been inactive for a long time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps you can take today
&lt;/h3&gt;

&lt;p&gt;Each service has its own policy and process for handling deceased users. Unfortunately, this is not something we often think about. Setting an Inactive Account Manager is not something a user thinks to do immediately after creating an account.&lt;/p&gt;

&lt;p&gt;If you have loved ones, children, or a business that depends on valuable intellectual property, you need to make sure that you have a means for your loved ones and/or business partners to gain access to your online content and properties.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what can you do?&lt;/strong&gt; Since every service is different, you can simply create a spreadsheet with all of your important accounts that describes use, purpose, and includes access credentials. If your account requires two-factor authentication, specify the method used (text, auth app, e-mail, phone). Print it out and keep it near your Will or Trust. Just make sure to safeguard your spreadsheet document! This is the easiest.&lt;/p&gt;

&lt;p&gt;If you are concerned about storing credentials in a document, another method is to read the Terms of Service and deceased user policies of each service you use and create a document with references to each one. At least your loved ones will know the services and products that you currently use. They can then follow the service's procedures as outlined.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you have a business/startup
&lt;/h3&gt;

&lt;p&gt;Make sure you have at the very least a policy and process to handle deceased users, especially if you run a service that hosts their sensitive or valuable information.&lt;/p&gt;

&lt;p&gt;Consult a qualified attorney to help you draft your process, which will then guide the design and workflow of any technologies you must create to fulfill your duties.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I hope that this gets you to start thinking about your life and content online. This topic is something we rarely think about, but as our lives continue to migrate more and more online and into the virtual world, it is absolutely crucial that you take some sort of action to protect yourself, your loved ones, and/or your business.&lt;/p&gt;

&lt;p&gt;I wish you a Happy Halloween!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G63X30J5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/http://giphygifs.s3.amazonaws.com/media/aOPINgmqpVXNK/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G63X30J5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/http://giphygifs.s3.amazonaws.com/media/aOPINgmqpVXNK/giphy.gif" alt="Girl signing death on her throat"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow me on Twitter &lt;a href="https://twitter.com/eddieaich"&gt;@eddieaich&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>security</category>
      <category>death</category>
      <category>intellectualproperty</category>
    </item>
    <item>
      <title>The one person/book that changed my life &amp; made me a better developer</title>
      <dc:creator>Eddie</dc:creator>
      <pubDate>Wed, 23 Oct 2019 18:41:09 +0000</pubDate>
      <link>https://forem.com/eaich/the-one-person-book-that-changed-my-life-made-me-a-better-developer-5g81</link>
      <guid>https://forem.com/eaich/the-one-person-book-that-changed-my-life-made-me-a-better-developer-5g81</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;br&gt;
It's &lt;a href="https://twitter.com/addyosmani" rel="noopener noreferrer"&gt;Addy Osmani&lt;/a&gt;. He wrote a book called &lt;a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/" rel="noopener noreferrer"&gt;Learning JavaScript Design Patterns&lt;/a&gt;. He made me infinitely better because I learned the underlying principles of programming. Frameworks, APIs, Languages come and go. Programming principles and design patterns are everlasting.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Infinite Game
&lt;/h3&gt;

&lt;p&gt;I recently saw &lt;strong&gt;Simon Sinek&lt;/strong&gt; speak in NY to launch his new book called &lt;a href="https://simonsinek.com/product/the-infinite-game/" rel="noopener noreferrer"&gt;The Infinite Game&lt;/a&gt;. The core concept of an Infinite Game is to play for longevity - have a vision. Win the war, not the battle. A Finite Game has a predefined, fixed set of rules that all players must abide by. In an Infinite Game, the rules keep changing; the players come and go.&lt;/p&gt;

&lt;p&gt;One of the five practices to successfully play in this Infinite Game is to &lt;a href="https://youtu.be/Xk7MpiP-sFI?t=51" rel="noopener noreferrer"&gt;have the capacity for existential flexibility&lt;/a&gt;. In other words, &lt;strong&gt;arm yourself with universal knowledge so that when the rules change, when the players come and go, you're still a viable player in the game.&lt;/strong&gt; How does this concept apply to programming?&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1186991102890565632-945" src="https://platform.twitter.com/embed/Tweet.html?id=1186991102890565632"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1186991102890565632-945');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1186991102890565632&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  The Game was Changing
&lt;/h3&gt;

&lt;p&gt;It's 2011. I launched a streaming video startup. At the time, I was weighing which tech stack to use. Mind you, the next evolution of libraries and frameworks were brewing around this time. JS frameworks like Backbone, Ember, Angular were just coming on to the scene. jQuery was ubiquitous. ES6 did not exist. Internet Explorer was still a thing to work around. CORS rules were very loose. SASS was starting to be used more heavily. Node.js was starting to gain meaningful adoption.&lt;/p&gt;

&lt;p&gt;The market was changing and &lt;strong&gt;changing quickly&lt;/strong&gt;. It was clear that there was a huge appetite for &lt;strong&gt;speed&lt;/strong&gt; - speed to market, development, production, deployment. &lt;a href="https://en.wikipedia.org/wiki/Minimum_viable_product" rel="noopener noreferrer"&gt;Minimum Viable Product (MVP)&lt;/a&gt; became a religion.&lt;/p&gt;

&lt;p&gt;As a startup founder, I also wanted in on the speed and I thought that with regards to technology, the aforementioned players were the way to go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Permission to Launch
&lt;/h3&gt;

&lt;p&gt;Suffice to say, I was &lt;strong&gt;overwhelmed and confused&lt;/strong&gt;. The industry seemed to be diverging instead of converging. There were standards set forth by W3C and ECMA, yet these popular frameworks were doing things differently. New ideas were being introduced and pushing the limits - sometimes for the good, sometimes for the bad.&lt;/p&gt;

&lt;p&gt;One day, I stumbled upon this unassuming, black and white website. It looked like this:&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Flc6kv99i9pizv62aoj8s.png" 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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Flc6kv99i9pizv62aoj8s.png" alt="Screenshot of website from 2011"&gt;&lt;/a&gt;&lt;/p&gt;
Screenshot from 2011.



&lt;p&gt;One of the first sentences that I read:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Another way of looking at patterns are as templates for how you solve problems - ones which can be used in quite a few different situations." - Addy Osmani&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Sold.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exactly what I was looking for. How do I build an application that is scalable enough so that pieces of my code could solve more than one problem across different situations? How do I get fast?&lt;/p&gt;

&lt;p&gt;As I read further and learned about patterns, anti-patterns, structure, and specific and trusted patterns like Revealing Module, Decorator, Facade, Observer, I started to understand that &lt;strong&gt;there is no one gotcha technique, library, framework; there is more than one way to solve a problem.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"...it’s not the number of patterns you implement that’s important but how you choose to implement them. For example, don’t choose a pattern just for the sake of using ‘one’ but rather try understanding the pros and cons of what particular patterns have to offer and make a judgement based on it’s fitness for your application." - Addy Osmani&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I can use more than one technique depending on the situation at hand. Wow - the world is my oyster. Now armed with universal knowledge, more confidence, and a greater understanding of techniques and when to use them, &lt;strong&gt;Addy Osmani gave me permission to launch my startup using --- JavaScript.&lt;/strong&gt; I felt &lt;strong&gt;free&lt;/strong&gt; and empowered.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You might not think that programmers are artists, but programming is an extremely creative profession. It's logic-based creativity." - John Romero&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Speed
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26AHLNr8en8J3ovOo/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26AHLNr8en8J3ovOo/giphy.gif" alt="Need for Speed movie animation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I got what I wanted. &lt;em&gt;Speed&lt;/em&gt;. Speed in development by being able to reuse code. Speed to market by being able to write with less duplication and looking to my previous solutions for answers. Speed in onboarding team members because now my code was easier to read and structured meaningfully. My 5,000 line file (!!) was broken up into bite-sized pieces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Existential Flexibility and Longevity
&lt;/h3&gt;

&lt;p&gt;Fast-forward a few years to 2014. &lt;a href="https://www.infoq.com/news/2014/10/angular-2-atscript/" rel="noopener noreferrer"&gt;Angular 2 was announced and caused an uproar.&lt;/a&gt; The JavaScript landscape was changing again. Some of the most used frameworks began to lose traction. &lt;strong&gt;Players were going. New players were arriving&lt;/strong&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%2F149351115.v2.pressablecdn.com%2Fwp-content%2Fuploads%2F2018%2F01%2Ftrends-minor.png" 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%2F149351115.v2.pressablecdn.com%2Fwp-content%2Fuploads%2F2018%2F01%2Ftrends-minor.png" alt="Graph of popular frameworks by year"&gt;&lt;/a&gt;&lt;/p&gt;
Source: &lt;a href="https://stackoverflow.blog/2018/01/11/brutal-lifecycle-javascript-frameworks/" rel="noopener noreferrer"&gt;The Brutal Lifecycle of JavaScript Frameworks&lt;/a&gt;



&lt;p&gt;I started to question our code and architecture. Should we actively adopt these new frameworks? A bunch of large, successful companies were using them, does that mean we should too?&lt;/p&gt;

&lt;h4&gt;
  
  
  Changing Players
&lt;/h4&gt;

&lt;p&gt;I came to the realization that what was happening now was &lt;strong&gt;deja vu&lt;/strong&gt;. It happened to the generation of frameworks and libraries 3 years ago, and happened to the frameworks and libraries that came before them and so on. And with Addy Osmani in mind, I realized that &lt;strong&gt;developers had simply discovered patterns and recurring problems, sought ways to make better programming decisions and then released their findings in a thing called a framework&lt;/strong&gt;. This time though, they were called React, Vue, etc. Soon to be followed by names like Next, Svelte, litHtml, and so on. SCSS, LESS. Django, Laravel. They were all just trying to help us because &lt;a href="https://www.youtube.com/watch?v=k7n2xnOiWI8&amp;amp;feature=youtu.be&amp;amp;t=600" rel="noopener noreferrer"&gt;they had experienced their own pains at one point&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you dig into the code and principles of these frameworks, you'll realize that they are all applying design patterns - some more prominently than others. &lt;a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript" rel="noopener noreferrer"&gt;Observer&lt;/a&gt; is a big one. You'll also realize that they are essentially someone's abstractions, opinions - written in a "pure" language like JavaScript, Python, etc. The "magic" was revealed and I realized, that the code that my team and I had written was aligned in principle to such frameworks.&lt;/p&gt;

&lt;h4&gt;
  
  
  Longevity
&lt;/h4&gt;

&lt;p&gt;We continued to improve the application but because of a number of factors, we were unable to adopt new and emerging standards such as ES6 quickly. Our customers were mostly in the enterprise space which meant that they were using older browsers (IE) and were slow to adopt newer technologies and devices. Our code base stayed on ES5 until my departure in late 2018. Yet, our product was still working. Our customers were still happy. Our development was still fast and scalable. We were still building new features.&lt;/p&gt;

&lt;h3&gt;
  
  
  New Standards, ES6
&lt;/h3&gt;

&lt;p&gt;The rules of the game had changed yet again. &lt;strong&gt;The new and better way of building things was now over there. So there is where people went.&lt;/strong&gt; ES6 came along in 2015 and established new standards. Much of these new standards, it turns out, were inspired or derived from the frameworks and libraries that came before it!&lt;/p&gt;

&lt;p&gt;Browsers changed. Mobile devices became faster. Support for modern language features arrived quickly. Yet, the underlying principles remained. Design patterns remained. ES6 introduced &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes" rel="noopener noreferrer"&gt;classes&lt;/a&gt;, which is just syntactic sugar for prototypical inheritance. &lt;a href="https://exploringjs.com/es6/ch_modules.html" rel="noopener noreferrer"&gt;Modules&lt;/a&gt; were introduced, which is simply extended support for the Module Pattern described by Addy Osmani in his book.&lt;/p&gt;

&lt;h3&gt;
  
  
  New Hotness and the Infinite Game
&lt;/h3&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%2Fi.imgur.com%2FLQjLQCY.gif" 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%2Fi.imgur.com%2FLQjLQCY.gif" alt="Men in Black animation talking about driving the new hotness"&gt;&lt;/a&gt;&lt;br&gt;
Now the hot new thing is &lt;strong&gt;Functional Programming&lt;/strong&gt; and there are some proponents of this paradigm that view it as a religion. All of a sudden, nothing else matters and everything else is wrong. We saw this play out when &lt;a href="https://www.reddit.com/r/reactjs/comments/9suobg/why_the_hate_for_react_hooks/" rel="noopener noreferrer"&gt;React introduced Hooks&lt;/a&gt;. All of a sudden, if you were still using classes, you're now illegitimate. This is playing with a &lt;strong&gt;Finite Mindset&lt;/strong&gt; inside an &lt;strong&gt;Infinite Game&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There will always be a new hotness. It's the nature of the Infinite Game of the software development industry. &lt;strong&gt;There is no winner or loser, only ahead and behind&lt;/strong&gt; - &lt;em&gt;Simon Sinek&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Addy Osmani, Mentor to Many
&lt;/h3&gt;

&lt;p&gt;Addy Osmani equipped me with knowledge that rises above trends and stands the test of time. I can learn new languages and syntax quicker and more efficiently because of my understanding of principles and patterns used. He gave me the confidence to build applications without feeling constrained by certain rules and regulations (i.e. you must ALWAYS do it this way). He instilled in me an Infinite Mindset so that when players come and go, trends arrive and disappear, I am able to remain viable, ready to learn, able to refactor with minimal impact, and build applications that stand the test of time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts on Mentorship and Thinking for Yourself
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Addy Osmani was my mentor and he didn't even know it&lt;/strong&gt;. He inspired me, gave me confidence and tools, but most importantly, he gave me the freedom to think for myself. The freedom to decide how best to solve my and my team's problems.&lt;/p&gt;

&lt;p&gt;There is a big difference between thinking for yourself and reinventing the wheel. Sometimes, the wheels that are in the market just don't fit your requirements and you'll have to make a new one and that is absolutely OK.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Here is a link to Addy Osmani's book, Learning JavaScript Design Patterns - &lt;a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/" rel="noopener noreferrer"&gt;https://addyosmani.com/resources/essentialjsdesignpatterns/book/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>career</category>
      <category>advice</category>
    </item>
  </channel>
</rss>
