<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nerd Specs Creative]]></title><description><![CDATA[I am a full-stack developer currently creating things with GradeCam.]]></description><link>https://blog.nerdspecs.com</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 22:38:46 GMT</lastBuildDate><atom:link href="https://blog.nerdspecs.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[When in Doubt, Crash]]></title><description><![CDATA[The Problem
If you’ve set up an existing codebase on your local machine before, you may know the pain of transferring and setting up ENV variables. Sometimes we have an ENV template, but they often go stale if someone forgot to update it even once.
O...]]></description><link>https://blog.nerdspecs.com/when-in-doubt-crash</link><guid isPermaLink="true">https://blog.nerdspecs.com/when-in-doubt-crash</guid><category><![CDATA[Node.js]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[error handling]]></category><category><![CDATA[Environment variables]]></category><category><![CDATA[tips]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Express]]></category><dc:creator><![CDATA[Brian Scramlin]]></dc:creator><pubDate>Fri, 22 Aug 2025 12:26:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/XcjVef6uvYA/upload/4b99c0881351c758fa15bd1d3271a69c.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-the-problem">The Problem</h2>
<p>If you’ve set up an existing codebase on your local machine before, you may know the pain of transferring and setting up ENV variables. Sometimes we have an ENV template, but they often go stale if someone forgot to update it even once.</p>
<p>Or, perhaps you have an existing codebase you work with and a merge was made while you were gone and you missed the Slack messages about the new ENV.</p>
<p>Long-story-short, sometimes <strong>we are missing ENV vars.</strong></p>
<p>Now, this wouldn’t be the biggest problem in the world if the app would just crash. Unfortunately, many developers (and I’ve noticed <em>AI)</em> love to give a fallback value.</p>
<p><strong>Warning: Insidious Fallback</strong></p>
<pre><code class="lang-typescript"><span class="hljs-keyword">export</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getApiUrl</span>(<span class="hljs-params"></span>): <span class="hljs-title">string</span> </span>{
  <span class="hljs-keyword">return</span> process.env.API_URL || <span class="hljs-string">"http://localhost:3000"</span>; <span class="hljs-comment">// &lt;-- insidious fallback</span>
}
</code></pre>
<p>If this ended up on production, some very strange results would occur. But, would it be noticed right away?</p>
<h2 id="heading-the-solution">The Solution</h2>
<p>The correct solution would be to have something like this before every ENV variable:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">let</span> apiUrl: <span class="hljs-built_in">string</span>;

<span class="hljs-keyword">try</span> {
  <span class="hljs-keyword">const</span> value = process.env.API_URL;
  <span class="hljs-keyword">if</span> (!value) {
    <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Missing required environment variable: API_URL"</span>);
  }
  apiUrl = value;
} <span class="hljs-keyword">catch</span> (err) {
  <span class="hljs-built_in">console</span>.error(err);
  process.exit(<span class="hljs-number">1</span>); <span class="hljs-comment">// Or handle it in some other way</span>
}
</code></pre>
<p>However,</p>
<p><img src="https://media1.tenor.com/m/pWQeAWBblmYAAAAC/nobody-got-time-for-that-a-intnobody-got-time-for-that.gif" alt class="image--center mx-auto" /></p>
<h2 id="heading-the-better-solution">The Better Solution</h2>
<p>Create a <code>requireEnv()</code> function that provides fail-fast protection, is clean, and provides good feedback. Here is the one I use in my own codebases:</p>
<pre><code class="lang-typescript"><span class="hljs-comment">/**
 * Get a required environment variable or throw an error if it's not set
 * @param name - The name of the environment variable
 * @returns The environment variable value
 * @throws Error if the environment variable is not set
 */</span>
<span class="hljs-keyword">export</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">requireEnv</span>(<span class="hljs-params">name: <span class="hljs-built_in">string</span></span>): <span class="hljs-title">string</span> </span>{
  <span class="hljs-keyword">const</span> value = process.env[name];

  <span class="hljs-keyword">if</span> (!value) {
    <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">`Required environment variable '<span class="hljs-subst">${name}</span>' is not set`</span>);
  }

  <span class="hljs-keyword">return</span> value;
}
</code></pre>
<p>And it is used like this</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { requireEnv } <span class="hljs-keyword">from</span> <span class="hljs-string">"./requireEnv"</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> config = {
  apiUrl: requireEnv(<span class="hljs-string">"API_URL"</span>),
  dbPassword: requireEnv(<span class="hljs-string">"DB_PASSWORD"</span>),
};
</code></pre>
<p>Let’s say that <code>API_URL</code> is not set, we get</p>
<pre><code class="lang-bash">Error: Required environment variable <span class="hljs-string">'API_URL'</span> is not <span class="hljs-built_in">set</span>
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Like the title says, when in doubt, crash—catch your missing env vars early!</p>
]]></content:encoded></item><item><title><![CDATA[The AI Team Checklist]]></title><description><![CDATA[Intro
So, you have a web or software engineering team that uses AI, huh?
How is that going for you?
Using AI is a good thing. We encourage the use of AI tools like ChatGPT, Grok, Claude, Gemini, and Cursor (which relies on them). However, using AI ca...]]></description><link>https://blog.nerdspecs.com/the-ai-team-checklist</link><guid isPermaLink="true">https://blog.nerdspecs.com/the-ai-team-checklist</guid><category><![CDATA[AI]]></category><category><![CDATA[#ai-tools]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[leadership]]></category><category><![CDATA[engineering]]></category><category><![CDATA[Python]]></category><category><![CDATA[management]]></category><category><![CDATA[Rust]]></category><category><![CDATA[PHP]]></category><dc:creator><![CDATA[Brian Scramlin]]></dc:creator><pubDate>Wed, 30 Jul 2025 14:43:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753886380860/dbe2edaf-b02c-4632-af5f-69e849dd3ffd.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-intro">Intro</h2>
<p>So, you have a web or software engineering team that uses AI, huh?</p>
<p>How is that going for you?</p>
<p>Using AI is a <em>good thing.</em> We encourage the use of AI tools like ChatGPT, Grok, Claude, Gemini, and Cursor (which relies on them). However, using AI can also cause some issues. I want to address these issues with a "checklist." Engineers, if you are using AI to generate code, please consider the checklist <strong><em>before putting up your PR!</em></strong></p>
<h2 id="heading-ai-checklist">AI Checklist</h2>
<h3 id="heading-1-did-i-read-the-entire-file-before-asking-the-ai-to-accomplish-a-task"><strong>1. Did I read the entire file before asking the AI to accomplish a task?</strong></h3>
<p>Reason: AI will accomplish a task according to the problem you present it. The AI <strong><em>does not</em></strong> have in mind principles like <strong>D</strong>o Not <strong>R</strong>epeat <strong>Y</strong>ourself, creating re-usable functions in shared utility folders, or other architectural principles. <strong><em>Architecture is up to the developer!</em></strong></p>
<h3 id="heading-2-ask-yourself-lots-of-questions-about-the-generated-code"><strong>2. Ask yourself lots of questions about the generated code.</strong></h3>
<p>Questions to ask:</p>
<ul>
<li><p>Is this DRY?</p>
</li>
<li><p>Do we have a utility function somewhere else that should have been included in this solution?</p>
</li>
<li><p>Is this how I would have solved this problem?</p>
</li>
<li><p>Is this over-engineered?</p>
</li>
<li><p>Does this solution fit with the patterns we have used elsewhere in the code base?</p>
</li>
</ul>
<h3 id="heading-3-consider-readability-and-maintainability"><strong>3. Consider readability and maintainability</strong></h3>
<p>AI does not have in mind readability or maintainability in the sense of how a human engineer might debug code. A lot of our time as engineers is spent reading and understanding an area of code we have not seen before, or have not seen in a long time. So, we need to <em>write code the way we read code.</em></p>
<h4 id="heading-not-easy-to-understand-debug-or-update-code">Not easy to understand, debug, or update code</h4>
<pre><code class="lang-typescript"><span class="hljs-comment">// not too bad, especially if formatted differently. But, not great.</span>

<span class="hljs-keyword">const</span> result = users.filter(<span class="hljs-function"><span class="hljs-params">u</span> =&gt;</span> u.age &gt; <span class="hljs-number">18</span>).map(<span class="hljs-function"><span class="hljs-params">u</span> =&gt;</span> <span class="hljs-string">`<span class="hljs-subst">${u.firstName}</span> <span class="hljs-subst">${u.lastName}</span>`</span>).sort(<span class="hljs-function">(<span class="hljs-params">a, b</span>) =&gt;</span> a.localeCompare(b)).slice(<span class="hljs-number">0</span>, <span class="hljs-number">5</span>);
</code></pre>
<h4 id="heading-easy-to-understand-debug-and-update">Easy to understand, debug, and update</h4>
<pre><code class="lang-typescript"><span class="hljs-keyword">const</span> getTopAdultUserNames = (users: User[]): <span class="hljs-built_in">string</span>[] =&gt; {
  <span class="hljs-comment">// Filter adults</span>
  <span class="hljs-keyword">const</span> adults = users.filter(<span class="hljs-function"><span class="hljs-params">user</span> =&gt;</span> user.age &gt; <span class="hljs-number">18</span>);

  <span class="hljs-comment">// Map to full names</span>
  <span class="hljs-keyword">const</span> fullNames = adults.map(<span class="hljs-function"><span class="hljs-params">user</span> =&gt;</span> <span class="hljs-string">`<span class="hljs-subst">${user.firstName}</span> <span class="hljs-subst">${user.lastName}</span>`</span>);

  <span class="hljs-comment">// Sort alphabetically</span>
  <span class="hljs-keyword">const</span> sortedNames = fullNames.sort(<span class="hljs-function">(<span class="hljs-params">a, b</span>) =&gt;</span> a.localeCompare(b));

  <span class="hljs-comment">// Return top 5</span>
  <span class="hljs-keyword">return</span> sortedNames.slice(<span class="hljs-number">0</span>, <span class="hljs-number">5</span>);
};

<span class="hljs-keyword">const</span> result = getTopAdultUserNames(users);
</code></pre>
<h3 id="heading-4-do-i-understand-the-code-i-am-pushing-up"><strong>4. Do I understand the code I am pushing up?</strong></h3>
<p>This is <strong><em>a must!</em></strong></p>
<p>Before AI existed, code reviewers, team leads, and engineering managers only needed to deal with a stray copy-pasted answer from StackOverflow. Now, it is daily or hourly that code reviewers must look more closely at the solutions presented in pull requests to make sure there are no hallucinations, that it jives with the codebase, and that it follows the team's patterns, etc.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>AI has sped things up for all of us, but it will slow our code reviews down if the engineers putting up code are not going back through the code and refactoring AI generated solutions to match human engineering practices.</p>
<p><em>Engineers—</em>You have super powers now, but as Uncle Ben said,</p>
<blockquote>
<p>With great power, comes great responsibility.</p>
<p>-Benjamin Franklin "Ben" Parker</p>
</blockquote>
<h2 id="heading-what-about-you">What about you?</h2>
<p>How have AI tools affected your life as a developer, code reviewer, or engineering manager?</p>
]]></content:encoded></item><item><title><![CDATA[Debouncing GraphQL Apollo in Vue]]></title><description><![CDATA[Scenario
You have an input that must make a real-time query to the database. This is often an autocomplete, but in my case it is checking to see if a subdomain is unique.
Input Component
I am using PrimeVue, so that is where the components are coming...]]></description><link>https://blog.nerdspecs.com/debouncing-graphql-apollo-in-vue</link><guid isPermaLink="true">https://blog.nerdspecs.com/debouncing-graphql-apollo-in-vue</guid><category><![CDATA[Vue.js]]></category><category><![CDATA[GraphQL]]></category><category><![CDATA[Apollo GraphQL]]></category><category><![CDATA[debouncing]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[HTML5]]></category><category><![CDATA[Input]]></category><category><![CDATA[Autocomplete]]></category><dc:creator><![CDATA[Brian Scramlin]]></dc:creator><pubDate>Wed, 25 Jun 2025 11:35:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750851239799/93897d17-b642-4339-8412-abdeb62ce293.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-scenario">Scenario</h2>
<p>You have an input that must make a real-time query to the database. This is often an autocomplete, but in my case it is checking to see if a subdomain is unique.</p>
<h2 id="heading-input-component">Input Component</h2>
<p>I am using <a target="_blank" href="https://primevue.org/">PrimeVue</a>, so that is where the components are coming from.</p>
<pre><code class="lang-xml">            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"flex flex-col gap-2"</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"subdomain"</span>&gt;</span>Organization Subdomain<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">InputText</span>
                <span class="hljs-attr">id</span>=<span class="hljs-string">"subdomain"</span>
                <span class="hljs-attr">v-model</span>=<span class="hljs-string">"subdomain"</span>
                <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"i.e. grace-church-bc"</span>
                <span class="hljs-attr">:class</span>=<span class="hljs-string">"{ 'p-invalid': errors.subdomain }"</span>
                <span class="hljs-attr">fluid</span>
              /&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">Message</span> <span class="hljs-attr">v-if</span>=<span class="hljs-string">"errors.subdomain"</span> <span class="hljs-attr">severity</span>=<span class="hljs-string">"error"</span> <span class="hljs-attr">variant</span>=<span class="hljs-string">"simple"</span> <span class="hljs-attr">size</span>=<span class="hljs-string">"small"</span>&gt;</span>{{
                errors.subdomain
              }}<span class="hljs-tag">&lt;/<span class="hljs-name">Message</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">Message</span>
                <span class="hljs-attr">v-if</span>=<span class="hljs-string">"subdomainMessage.message &amp;&amp; !subdomainLoading"</span>
                <span class="hljs-attr">:severity</span>=<span class="hljs-string">"subdomainMessage.severity"</span>
                <span class="hljs-attr">variant</span>=<span class="hljs-string">"simple"</span>
                <span class="hljs-attr">size</span>=<span class="hljs-string">"small"</span>
              &gt;</span>
                {{ subdomainMessage.message }}
              <span class="hljs-tag">&lt;/<span class="hljs-name">Message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Nice.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750848551866/20236736-9080-4305-8ba9-caea74cbb7fd.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-graphql-file-structure">GraphQL File Structure</h2>
<p>When I work with <a target="_blank" href="https://graphql.org/">GraphQL</a>, <a target="_blank" href="https://www.apollographql.com/">Apollo</a>, and <a target="_blank" href="https://apollo.vuejs.org/">Vue Apollo</a> , I find separation extremely important. GraphQL is flexible in its ability to fetch just what you need, but it requires a lot of boiler plate. I find the following setup very good for the frontend portion—</p>
<pre><code class="lang-plaintext">src
|_graphql
    |_operations
        |_index.ts // barrel file
        |_subdomain.ts // one of many operation files
    |_composables
        |_index.ts // barrel file
        |_useCheckSubdomainAvailability.ts // one of many composables
    |_types
        |_index.ts // generated by codegen
|_App.vue
...
</code></pre>
<h2 id="heading-operations">Operations</h2>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { gql } <span class="hljs-keyword">from</span> <span class="hljs-string">"graphql-tag"</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> CHECK_SUBDOMAIN_AVAILABILITY = gql<span class="hljs-string">`
  query CheckSubdomainAvailability($subdomain: String!) {
    checkSubdomainAvailability(subdomain: $subdomain) {
      available
      subdomain
    }
  }
`</span>;
</code></pre>
<p>This is a simple GraphQL client query that uses the <code>graphql-tag</code> library to parse the GQL syntax. It takes a string and then calls our resolver <code>checkSubdomainAvailability</code> with the string as its argument. We are asking that the resolver give back <code>available</code> and <code>subdomain</code>. We don’t really need <code>subdomain</code>, but I don’t feel like changing the existing code at the moment.</p>
<h2 id="heading-composables">Composables</h2>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { useQuery } <span class="hljs-keyword">from</span> <span class="hljs-string">"@vue/apollo-composable"</span>;
<span class="hljs-keyword">import</span> { CHECK_SUBDOMAIN_AVAILABILITY } <span class="hljs-keyword">from</span> <span class="hljs-string">"../operations/subdomain"</span>;
<span class="hljs-keyword">import</span> { computed, <span class="hljs-keyword">type</span> Ref } <span class="hljs-keyword">from</span> <span class="hljs-string">"vue"</span>;
<span class="hljs-keyword">import</span> { CheckSubdomainAvailabilityQuery } <span class="hljs-keyword">from</span> <span class="hljs-string">"../types"</span>;

<span class="hljs-keyword">export</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">useCheckSubdomainAvailability</span>(<span class="hljs-params">
  subdomain: Ref&lt;<span class="hljs-built_in">string</span> | <span class="hljs-literal">undefined</span>, <span class="hljs-built_in">string</span> | <span class="hljs-literal">undefined</span>&gt;,
</span>) </span>{
  <span class="hljs-keyword">const</span> { result, loading, error, refetch } = useQuery&lt;CheckSubdomainAvailabilityQuery&gt;(
    CHECK_SUBDOMAIN_AVAILABILITY,
    computed(<span class="hljs-function">() =&gt;</span> ({ subdomain: subdomain.value ?? <span class="hljs-string">""</span> })),
    {
      fetchPolicy: <span class="hljs-string">"no-cache"</span>,
      debounce: <span class="hljs-number">500</span>,
    },
  );

  <span class="hljs-keyword">const</span> isAvailable = computed(<span class="hljs-function">() =&gt;</span> result.value?.checkSubdomainAvailability?.available);

  <span class="hljs-keyword">return</span> {
    loading,
    error,
    isAvailable,
    refetch,
  };
}
</code></pre>
<p>This is where the magic really happens.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Notice that we are passing a <code>Ref</code> and not a <code>String</code>. This is vital as Vue Apollo’s <code>useQuery()</code> composable will <em>refetch automatically when a ref is updated!</em></div>
</div>

<p>We then break out the usual variables from the <code>useQuery</code> composable. Notice we add the generated type using a TypeScript Generic, which allows us to have type safety wherever we use this composable throughout the application.</p>
<p>Next, notice that we are able to pass an options object to the <code>useQuery</code> composable. We pass <code>fetchPolicy: "no-cache"</code> just in case another user creates the same subdomain within the cache duration. This keeps the data fresh. Secondly, we pass <code>debounce: 500</code>. This means the composable will only make the query <code>500ms</code> after the data changes and also cancel any previous requests it had started.</p>
<h2 id="heading-the-impact">The Impact</h2>
<p>This is crucial as we would otherwise overload our server with requests on every keystroke.</p>
<p><img src="https://s2.ezgif.com/tmp/ezgif-287afe58bbbe05.gif" alt="not-debounced.mov [video-to-gif output image]" /></p>
<p>But, with debounce, things work great.</p>
<p><img src="https://s2.ezgif.com/tmp/ezgif-2ee44d72e3c58c.gif" alt="debounced.mov [video-to-gif output image]" /></p>
<p>I love that debounce is built into the <a target="_blank" href="https://apollo.vuejs.org/">Vue Apollo</a> composable so we do not need to create a separate function and utilize a third party library like <a target="_blank" href="https://vueuse.org/shared/useDebounceFn/#usedebouncefn">VueUse</a> or <a target="_blank" href="https://lodash.com/docs/4.17.15#debounce">Lodash</a> to accomplish this task.</p>
]]></content:encoded></item><item><title><![CDATA[Becoming a Full-Time Developer: Your Resume]]></title><description><![CDATA[Introduction
It has been over one year since I published my featured article, Becoming a Full-Time Developer: Introduction. I desired to write this series over a few weeks, but life got away from me. I have two kiddos under nine, a house we are renov...]]></description><link>https://blog.nerdspecs.com/becoming-a-full-time-developer-your-resume</link><guid isPermaLink="true">https://blog.nerdspecs.com/becoming-a-full-time-developer-your-resume</guid><category><![CDATA[resume]]></category><category><![CDATA[resume-tips]]></category><category><![CDATA[resume]]></category><category><![CDATA[Soft Skills]]></category><category><![CDATA[job search]]></category><dc:creator><![CDATA[Brian Scramlin]]></dc:creator><pubDate>Sat, 21 Oct 2023 18:20:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/jLwVAUtLOAQ/upload/ce28e4e1374ce47eddc349cfead41e74.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>It has been over one year since I published my featured article, <a target="_blank" href="https://blog.nerdspecs.com/becoming-a-full-time-developer-introduction">Becoming a Full-Time Developer: Introduction</a>. I desired to write this series over a few weeks, but life got away from me. I have two kiddos under nine, a house we are renovating, a master's degree I am finishing, and a full-time job after all!</p>
<p>However, I am compelled to write about this subject because I want to help others enter into this amazing career. I love being a developer! There are many things I learned along the way and I believe I can help some of you get to where I am at today. In this installment, I'll talk about my resume.</p>
<p><img src="https://media.giphy.com/media/jwFbMfYthIM6pttfjF/giphy.gif" alt="resume" class="image--center mx-auto" /></p>
<p>There is probably a lot out there about resumes. I did not go and read about resumes. However, I knew I wanted to stand out and communicate <em>who I am</em> and not just what I have done. I will also say that I must be pretty good at writing resumes because a college professor from another state once left me a voicemail that he found my resume online and used it as an example in his class!</p>
<p>So, here is the real-true-to-life resume I have used. I've even included an error I found where I accidentally copy-and-pasted the same date for my bachelor's and upcoming master's degree. Oops!</p>
<p>Take a look and then I will discuss some things.</p>
<h2 id="heading-real-life-resume">Real Life Resume</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1697723464139/b8f0b202-4da6-42ae-ac1d-aa99ed38bdbe.jpeg" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1697723484846/42371f8e-712c-40ca-81d1-5ffe988c9ad9.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-examining-my-resume">Examining my Resume</h2>
<p>Let's take a look at each element of my resume from the top down.</p>
<h3 id="heading-header">Header</h3>
<p>Similar to a website, I have a header that is intended to grab the attention of the screener. Remember, if your resume gets stopped at any point, you do not get an interview. If you do not get an interview, you cannot get that job. Our goal with the resume is to <em>get an interview!</em> There are three important aspects of my header.</p>
<ol>
<li><p><strong>The image:</strong> You need to pay some money and get a real headshot from a real photographer. My wife did this for me as a gift one year and I had no idea how often I would use my headshots. I use them on X, Slack, (sounds like Ex-Lax lol), email signatures, and more.</p>
</li>
<li><p><strong>The tagline:</strong> A tagline helps instantly frame you. I know this version says "Developer + Great Guy," but for some positions I said "Developer + Designer" or "Developer + Leader" depending on the position I was applying for. I felt for the position I was applying for I did not want to pigeonhole myself into a particular role, but wanted to communicate that I am humorous and personable.</p>
</li>
<li><p><strong>The quote:</strong> A quote shows others that you read and what drives you. I recently heard <a target="_blank" href="https://syntax.fm/show/673/getting-hired-interviewing-and-why-recruiters-suck-with-taylor-desseyn">an interview</a> with <a target="_blank" href="https://gun.io/taylor/">Taylor Desseyn</a> where he said something like "When we interview people and ask 'what are you passionate about?' and the answer is 'nothing in particular,' that is a red flag. <strong>I just want to know you can be passionate about <em>something.</em></strong> Because maybe you can also be passionate about what we are doing here."</p>
</li>
</ol>
<h3 id="heading-intro">Intro</h3>
<p>Your intro is the next most important thing. Here is your elevator pitch. Screeners want to know <em>who you are, what you can do,</em> and <em>why they should pick you.</em> So, you can see I did these three things pretty clearly and used <strong>bold text</strong> sparingly to emphasize what is important to remember about me.</p>
<h3 id="heading-experience">Experience</h3>
<p>Moving on, we get to your experience. What we want to see here is the meta (company, position, and years there) and then a <em>story that communicates what you did, stack highlights,</em> and <em>how you added value to that company.</em> Some people call for the <a target="_blank" href="https://www.themuse.com/advice/star-interview-method#da4e22de-5579-40b3-92f8-fa6004a0656a">Star Method</a>, but I do not think there is room for that. Consider how I made the companies I have served look great (which makes me look great) and the way I highlighted parts of my experience that are valuable to the companies I am applying for. By the way, I think the stories should start longer the more recent they are and get shorter. Further, you can just blanket some things that are not that relevant. I was in full-time church ministry for eleven years, but that is not the most crucial to know for the roles I am applying for.</p>
<h3 id="heading-education">Education</h3>
<p>Education is <em>not that important.</em> That is, nobody cares about your GPA or where you went to school. Also, choose the most important things, but you do not need to fill up your paper with every badge you have ever earned on CodePen or FreeCodeCamp.org. What are the big blocks in your educational foundation? Now, I do not know if this is different if you have not attended college, so you may need more advice here.</p>
<h3 id="heading-what-you-can-expect">What You Can Expect</h3>
<p>This is essentially my conclusion. This is where I really want to hook people and help them realize they are missing out if they do not interview me. I thought about what I am good at and what I want to be doing, then <strong>put them in bold.</strong></p>
<h3 id="heading-my-story">My Story</h3>
<p>This is an "extra." If you have the room, you can share a back story that will help the interviewers get to know who you are. The screeners may not read this, but the people at the next round of interviews probably will. In this space, I can talk about my skills outside of tech and where I am at in life right now. Anything you can do to <em>create a conversation</em> during an interview will keep you "top of mind" when team leaders and CTOs are doing tens of interviews a day.</p>
<h3 id="heading-contact">Contact</h3>
<p>Obvious...</p>
<h3 id="heading-expertise">Expertise</h3>
<p>I break my expertise into two categories: Daily and Less Often. I do this because I want people to know I am not just loading up my resume with buzzwords. This differentiation allows me to be honest and highlight my strengths. Also, you will find that these lists get long quickly. What kind of companies and positions are you applying for? If you are getting a SaaS job, nobody cares about your WordPress experience. Show us you have the skills that we need.</p>
<h3 id="heading-other-skills">Other Skills</h3>
<p>I love this area. I am sure everyone has skills that are not directly relevant to the position at hand but may be useful in cross-team meetings, or at least as another hook to create conversations with interviewers. Almost every interview I have ever had has brought up Zelda with me.</p>
<h3 id="heading-quick-facts">Quick Facts</h3>
<p>This is another opportunity to share who you are and create conversation hooks.</p>
<h3 id="heading-references">References</h3>
<p>I do not know why, but I felt like having a good, symmetrical two professional and two personal references was just right. Find people that can vouch for you and I would guess the "higher up the ladder" they are, the better. Honestly, I have never had an interviewer talk to me about my references before. Maybe they are not even called very often!</p>
<h3 id="heading-links">Links</h3>
<p>I struggle with the links. Can I be real with you? I have weak links (am I the weakest link?). My CodePen is filled with half-baked things from throughout the years, my GitHub is a mess of project ideas, my portfolio has not been updated in years, my blog has two or three posts on it, and nothing is interesting on my Twitter feed.</p>
<p>But, you know what? <strong>The links look good.</strong> Am I right? Who doesn't love the feeling of contact information at the bottom of a website, and who doesn't love a bunch of links at the bottom of a resume? So, I say, keep the links, be they weak or strong.</p>
<h2 id="heading-additional-thoughts">Additional Thoughts</h2>
<ul>
<li><p>Do not include things in your resume that <em>you do not want to do.</em> I read in the book <a target="_blank" href="https://www.amazon.com/Days-Work-You-Love-Preparing/dp/1433685922/ref=sr_1_1?keywords=40+days+to+new+job&amp;qid=1697894054&amp;sr=8-1">48 Days to the Work You Love</a> that people are tempted to bulk up their resume with impressive things but that do not give them life. If you keep advertising yourself for things you do not want to do, then you will keep getting put in positions to do those things.</p>
</li>
<li><p>Change your resume to match the job you are applying for. Your lead statement can focus on things like design if you are applying for a hybrid Frontend-UI/UX position or on your versatility if applying for a full-stack role.</p>
</li>
<li><p>If a cover letter is asked for, I have taken the resume template and just included a custom paragraph that brought in elements from my resume. Most cover letters can be the same, but make sure to uniquely <em>name the company you are applying for.</em> However, do NOT forget to change it for each company!</p>
</li>
<li><p>What did I use to create my resume? I tried a few different programs but finally settled on Keynote. I think Keynote or PowerPoint are excellent programs because they allow you to put elements off the side of the document to swap in and out, but when you have the document the way you want it you can easily export it to various formats.</p>
</li>
<li><p>I recommend making folders for the companies you are applying for and then exporting your resume as a PDF with a filename like brian-scramlin-resume.pdf. The folders create namespaces for your resume so you can keep them from being something like brian-scramlin-resume-google.pdf. To me, that kind of filename shows you may be writing custom resumes depending on the company you are applying for. I understand that I told you to do that, but you do not need to be so obvious about it!</p>
</li>
<li><p>Jenna Pederson has eleven more great tips in her blog post here: <a target="_blank" href="https://jennapederson.hashnode.dev/11-tips-for-writing-a-resume-to-land-that-job">https://jennapederson.hashnode.dev/11-tips-for-writing-a-resume-to-land-that-job</a>.</p>
</li>
</ul>
<h2 id="heading-how-about-you">How About You?</h2>
<p>What tips and tricks have you learned regarding developer resumes? Are there any resources you would recommend to others?</p>
]]></content:encoded></item><item><title><![CDATA[Becoming a Full-Time Developer: Introduction]]></title><description><![CDATA[Welcome
Hi. I'm Brian and I recently became a developer for ArborXR!
An old friend of mine shared she is looking to get into development herself, which caused me to want to impart all I've learned over the past couple of years.
Maybe it can help you,...]]></description><link>https://blog.nerdspecs.com/becoming-a-full-time-developer-introduction</link><guid isPermaLink="true">https://blog.nerdspecs.com/becoming-a-full-time-developer-introduction</guid><category><![CDATA[Beginner Developers]]></category><category><![CDATA[Career Coach]]></category><category><![CDATA[Learning Journey]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Brian Scramlin]]></dc:creator><pubDate>Thu, 09 Jun 2022 16:17:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/mO9vKbG5csg/upload/v1654791450534/CK_2EIMKS.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-welcome">Welcome</h2>
<p><strong>Hi. I'm Brian and I recently became a developer for</strong> <a target="_blank" href="https://arborxr.com/"><strong>ArborXR</strong></a><strong>!</strong></p>
<p>An old friend of mine shared she is looking to get into development herself, which caused me to want to impart all I've learned over the past couple of years.</p>
<p>Maybe it can help you, too.</p>
<p><strong>Have you wondered any of the following...</strong></p>
<ul>
<li><p>Do I need a degree to be a developer?</p>
</li>
<li><p>When am I considered a "real" developer?</p>
</li>
<li><p>Am I a "fake" if I use <em>xyz</em> framework?</p>
</li>
<li><p>Why does every job description want a "senior" developer? What <em>is</em> a senior developer, anyway?</p>
</li>
<li><p>Is there a "best" language or framework to learn?</p>
</li>
<li><p>How much money will I make?</p>
</li>
<li><p>Is working remotely "real"?</p>
</li>
<li><p>What do all these buzzwords and acronyms mean—PR, MR, DevOps, e2e, Kubernetes, etc?</p>
</li>
<li><p>Do I need to master Git, unit tests, shell commands, and SQL?</p>
</li>
</ul>
<p><strong>If so, you're not alone.</strong></p>
<p>These are questions I had and had to learn the answers through pure experience. However, you, young padawan, will glean from what I have to share. I will answer these questions and many, many more through this series.</p>
<p>In this introductory post, I'll share my story of becoming a Developer (and not being afraid to believe it).</p>
<h2 id="heading-my-story">My Story</h2>
<h3 id="heading-prologue">Prologue</h3>
<p><img src="http://www.vacomputermuseum.org/wp-content/uploads/2015/01/Photo-2017-01-06-12-59-55_8560.jpg" alt="Tandy 6000" /></p>
<p>Let me begin by sharing a snippet of my experience before I ever saw HTML for the first time. I am doing this so you know I am a real, regular human being. I am not a genius. I did not have a huge "head start" on programming.</p>
<p>I began using computers when I was around three-years-old on a Tandy. My step-dad loved computers and electronics and I was hooked from the beginning. I never learned anything about programming, but enjoyed taking computers apart, messing with Windows settings, and defragmenting my hard drive regularly.</p>
<p>By the time I was in high school and college, I got into video / photo editing, motion graphics, and 3D modeling. If I ever considered doing something in the tech field, it was in the creative-design arena.</p>
<p>My focus in college was not computer or math-related at all. I earned a degree in Christian Ministries. I attended Indiana Wesleyan University from 2005 - 2009 and my goal was simply to help people.</p>
<p>I was able to travel to many places and be part of many amazing ministries from about 2002 to 2011. I worked with Native Alaskans in remote villages, reconciliation between people groups affected by <a target="_blank" href="https://en.wikipedia.org/wiki/The_Troubles">The Troubles</a> in Northern Ireland, and Christians in impoverished areas of Costa Rica, to name a few.</p>
<p>After graduating from IWU in 2009, I became a part-time Youth Pastor and Substitute Teacher. So, how did I get from <em>there</em> to <em>here</em>?</p>
<h3 id="heading-foundations-html-and-wordpress">Foundations: HTML and WordPress</h3>
<p><img src="https://i.ytimg.com/vi/xikpTKuc2YE/maxresdefault.jpg" alt="Simple HTML" /></p>
<p>Well, the church I worked for had a <em>terrible</em> website. I couldn't take it. So, I searched around for different ways of fixing the issue. At first, I tried this new service called Wix, a flash-based website builder. However, I kept coming up with limitations on how to get our sermons online in a way that could be searched and sorted.</p>
<p>This led me to WordPress. I realized I needed a server to install WordPress on and ended up signing up for a cheap server. It took some reading ( we barely had YouTube at this time ), but eventually, I figured out how to install WordPress, buy a theme on ThemeForest.net, and point our domain to this installation! Yay!</p>
<p>Then, something amazing happened. I saw HTML and CSS for the first time.</p>
<p>I had set up an extra desktop computer in my office to mentor students in video and graphic work. One student, Ryan, came in one day and said "Hey Pastor Brian, I started a class at school today on web design. Check this out."</p>
<p>He opened up Notepad on our Windows Vista machine and wrote some HTML</p>
<p><code>&lt;h1&gt;Hello World&lt;/h1&gt;</code></p>
<p>and then some CSS</p>
<p><code>body { background-color: red; }</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1654711067040/hs-WSnJME.png" alt="Screen Shot 2022-06-08 at 1.57.21 PM.png" /></p>
<p>Mind. Blown.</p>
<p>Looking back, I've always been a mix of creative thinking + linear/logical thinking. I think that's what attracted me to After Effects and Blender—The ability to create beautiful things by using organized input. But, for some reason HTML and CSS were different. I didn't need to drag and drop anything. There was <em>meaning</em> to the syntax, as well as styling. There was nesting and relationships. It instantly filled my heart with joy.</p>
<p>This led me to dig into articles and online learning environments. I just checked and, amazingly, it all started almost ten years ago:</p>
<ul>
<li><p>CodeAcademy: Joined Oct 3, 2012</p>
</li>
<li><p>GitHub: Joined 2013</p>
</li>
</ul>
<p>At this time I was making simple websites, learning CSS, and a tiny bit of JavaScript / JQuery.</p>
<p><strong>But then, questions and ideas began flooding my mind.</strong></p>
<h3 id="heading-full-stack-ruby-on-rails">Full-Stack: Ruby on Rails</h3>
<p><img src="https://miro.medium.com/max/7752/1*uKibwseMgeqaYahlvv-BfA.png" alt="Ruby on Rails" /></p>
<p>After getting a good understanding of how basic web pages work, as well as some familiarity with how the web itself works ( requests, servers, responses, databases, etc ), I wondered <strong>"What can I do with this?</strong></p>
<p>I felt as if I was an artist at heart, but no talent. At this point in my life, however, I realized I could <em>earn and learn</em> the skills I needed to create whatever my heart desired.</p>
<p>What about a simple app to replace giant group texts asking "Who's in for morning basketball?"</p>
<p>What about a website that connects church benevolence information so we can see how to help people better, and be aware of who is"playing the system"?</p>
<p>I've always wanted something like a "prayer team" where I could post something I'm going through and others could pray for it, then I could update the request as "answered" or keep others updated.</p>
<p><strong>I had to find a way to connect all the pieces together.</strong></p>
<p>That's when I found the book <a target="_blank" href="https://books.google.com/books?id=KdvTAAAAQBAJ&amp;printsec=frontcover&amp;source=gbs_ge_summary_r&amp;cad=0#v=onepage&amp;q&amp;f=false">Beginning Rails 4</a> by <a target="_blank" href="https://twitter.com/adamgamble">Adam Gamble</a>.</p>
<p>This book helped me understand and experience full-stack web development by putting all the pieces together and then offering a framework that combined them seamlessly.</p>
<p>Rails had it all—Frontend, backend, routing, databases, and tons of third-party libraries ( gems ).</p>
<p>Soon, I decided to put some money where my mouth was and spent $149 at <a target="_blank" href="http://onemonth.refr.cc/brian1">onemonth.com</a> where I completed my certificate on Mar 03, 2015—A day after my 28th birthday, and two months after my first child was born.</p>
<p>I built a Pinterest clone. A full CRUD app! I even pushed things to GitHub and deployed to Heroku. It was an amazing experience, and the tight one-month deadline kept me focused. I was out of tutorial hell and into developer heaven.</p>
<p>Okay, maybe not "developer heaven"... I still didn't know what PR meant at this time ( no I am <em>not joking!</em> ). But, I could begin to take what I learned and apply it to my own ideas.</p>
<p><strong>Maybe... I could even make money.</strong></p>
<h3 id="heading-real-life-frameworks-clients-and-processes">Real Life: Frameworks, Clients, and Processes</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1654787974993/xb2PPSmIC.jpeg" alt="cytonn-photography-vWchRczcQwM-unsplash.jpeg" /></p>
<p>At this point I was working as an Assistant Pastor at a larger church and had many responsibilities, not to mention a new baby. However, my wife and I had a concrete goal of paying off all our debt following the <a target="_blank" href="https://www.ramseysolutions.com/ramseyplus/financial-peace">Financial Peace University</a> plan. One of the things we knew we needed to do was get some extra income.</p>
<p>So, while my wife started selling stuff on eBay for people, I started Nerd Specs Creative—A general, digital-handyman company.</p>
<p>Okay, I don't know if it was a "company" since it was just me, but I did go to the bank and get a "Doing Business As" ( DBA ) account. So, I did have a real business debit card ( and had to pay taxes on my freelance work ).</p>
<p>My first client was a friend who started her own CPA firm. I created the site using Weebly because they had a sweet white-label interface. And, yes, I realize I just went from <em>Rails</em> to <em>Weebly</em> Well, pick yourself up off the floor and realize that</p>
<ol>
<li><p>She didn't need a custom, full-stack web application</p>
</li>
<li><p>Clients need to be able to edit their content ( and I don't have time to build that! )</p>
</li>
</ol>
<p>So, I got everything set, and she really loved it. However, she ended up going with a CPA-focused web service which offered her weekly newsletters to send to her clients automatically. My heart sank. But, then she said she would like to buy the design and give it to the web service and have them implement it on their CMS.</p>
<p>She asked "how much do I owe you?" I had no idea what to say. I loved doing the work. I was just learning. I felt like I didn't do anything to really help her. So, I replied, "Oh, nothing. Don't worry about it. We didn't even get it launched."</p>
<p>Then, she said, "Brian, don't ever charge for anything other than what your service is worth to your client." She explained when she began she was not charging as much as others, but her quality was better. When she raised her prices over time, one of her biggest clients said "Now you're finally charging what you're worth."</p>
<blockquote>
<p>Charge what your service is worth to your client.</p>
</blockquote>
<p>Wow. That's some great advice.</p>
<p>And, to make it stick, <em>she wrote me a check for $300!</em></p>
<p>I couldn't believe it. I just made money doing digital work—Something I really enjoyed. I realized at this point, <em>I just got paid to learn!</em></p>
<p>From there, I did a few more Weebly sites, but quickly came to the end of that CMS' capabilities for customization. I went back to my WordPress roots and found I could charge clients the price of the ThemeForest.net theme and then customize it, and now charge a hosting fee. Email was included for free, because I didn't really know what it was worth to people.</p>
<p>When I started, I was spending about $20/month in hosting fees on <a target="_blank" href="https://www.siteground.com/go/j4v0vsm01l">SiteGround.com</a> and charging $20/month per website and email. At first, I charged a flat rate of $300 for a website, but eventually switched to a $20/hour rate.</p>
<p>Looking back, I was charging <em>nothing</em> But, again, my goal was to <strong>get paid to learn</strong>, instead of paying to learn.</p>
<blockquote>
<p>My goal was to <strong>get paid to learn</strong>, instead of paying to learn.</p>
</blockquote>
<p>So, I continued to do this.</p>
<p>I wrote a Rails app that could manage church buildings and facilities ( it was called Truse<em>ease</em>, a play on church trustees ).</p>
<p>I implemented an entire Magento site for Impact Gel. This was killing me due to the time they wanted from me and the low $20/hour pay.</p>
<p>I wrote <a target="_blank" href="https://drydenwire.com/">DrydenWire</a> with the <a target="_blank" href="https://processwire.com/">ProcessWire</a> CMS/F after a co-worker tried to create a large-scale news website with Wix. It was a very frustrating situation where she paid me a little to do it, while she got paid a lot more to do nothing. As this company grew, more was demanded of me, and as the sole developer, with a full-time ministry ( which is way more involved than a job ), a new kid, and a marriage, I was stretched to the limit. Once I got half of a Cordova app written in pure, vanilla JavaScript, and I was spending hours studying how to integrate push notifications, I about lost it.</p>
<p>I was failing at everything, all at once. I had nothing left to give. My wife told me to quit, but I had to battle my people-pleasing issues. Finally, though, thankfully, God gave me the strength to face my inner-turmoil and step out of the situation.</p>
<p>Before I did, I made sure another ProcessWire developer was able to take over. There was a little bad blood, but my family was more stable. At this point, I felt I needed to choose between Ministry and Development. So, I chose Ministry.</p>
<p>I was able to become the Lead Pastor of <a target="_blank" href="https://njcc.me">New Journey Community Church</a> in Wabash, Indiana. We had another baby, grew that church, and I began a Masters in Theological Studies at Portland Seminary.</p>
<p>Of course, I still loved to code. So, I developed our church's website, said "no" to many clients, and tried to launch a couple of smaller things, but didn't have the time to finish ( i.e. http://wabashhelp.com/ )</p>
<p><strong>So, how does this lead to me being a full-time developer?</strong></p>
<h3 id="heading-my-first-dev-role">My First Dev Role</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1654790256759/WCEHFgxB7.png" alt="Screen Shot 2022-06-09 at 11.57.23 AM.png" /></p>
<p>Well, once again I took on too much. The church was growing, we had another kid, we had our own home, I was working on my Master's degree, and then my youngest had a significant injury. This final event really took a toll. We were driving 9-10 hours a week to take her to therapy, performing tons of therapy at home, undergoing surgeries, and trying to care for our first daughter.</p>
<p>With the pressures of ministry, combined with the other complexities, I felt I was beginning to slip internally. I didn't want to fail as a Husband, Father, Pastor, or Follower of Christ. So, I made a difficult decision—to step down from the Lead Pastor of our church. The Board offered me a sabbatical, but I felt I had to completely step down for a time of healing and reflection.</p>
<p>At this time, I had no idea what I was going to do. The tape played in my head,</p>
<p>"I love programming and web development, but what do I know? I don't have a degree in this stuff. I don't have many complete projects. Who is going to hire <em>me</em>?"</p>
<p>Now, interviews and hiring is a whole post in itself. It would be much longer than what I will share with you now. But, the quick of it is that I worked really hard on my portfolio website, re-worked my resume to focus on transferable skills from ministry to the tech space, and applied to local areas.</p>
<p>Web developer work is sparse in North-Central Indiana, where I was living. However, I came across a company only thirty minutes away who said they were looking for a Frontend Developer. Boy, did I not think I had a chance.</p>
<p>Well, apparently I did.</p>
<p>The feedback I received from that interview was</p>
<ul>
<li><p>You are obviously a good learner</p>
</li>
<li><p>You fit our culture really well</p>
</li>
<li><p>Your references and experience show you have great soft-skills, which are difficult to come by</p>
</li>
</ul>
<p>I did not need some of the crazy things you see on job postings:</p>
<ul>
<li><p>"10+ years of C++ / Java / etc experience"</p>
</li>
<li><p>"Kubernetes expertise"</p>
</li>
<li><p>"Be a Git Ninja"</p>
</li>
<li><p>"Produced your own Linux distro"</p>
</li>
</ul>
<p>But, in May 2020, I got my first full-time developer job.</p>
<p>It was a great experience being here, but I'd like to have an entire post dedicated to "What I learned at my first real developer job", so I'll just let you know it went really well. I loved it. I learned a ton. I wrote Vue ( which I had never written <em>any</em> modern MVVM frameworks )</p>
<p><strong>And, then after COVID I went full remote, which led me to explore other opportunities.</strong></p>
<h3 id="heading-my-current-dev-role">My Current Dev Role</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1654791286045/vOaVd5qe9.png" alt="Screen Shot 2022-06-09 at 12.14.33 PM.png" /></p>
<p>As of June 06, 2022 ( four days ago! ) I started at ArborXR as a Frontend Developer II. It was a promotion from where I was and I am writing more Vue and TypeScript—Thankfully all Vue 3!</p>
<p>I look forward to sharing more in-depth lessons I learned through each of these phases in my Developer journey.</p>
<p><strong>So, subscribe and stay tuned!</strong></p>
]]></content:encoded></item><item><title><![CDATA[How to Choose a Blog Platform]]></title><description><![CDATA[The Criteria
I have blogged in the past, but I have struggled with finding the right balance between

Site Speed
Appearance
Ease of Writing
Reach
Portability

All divided by how much time I have to spend developing the thing.
Let's use a point system...]]></description><link>https://blog.nerdspecs.com/how-to-choose-a-blog-platform</link><guid isPermaLink="true">https://blog.nerdspecs.com/how-to-choose-a-blog-platform</guid><category><![CDATA[Blogging]]></category><category><![CDATA[Hashnode]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Brian Scramlin]]></dc:creator><pubDate>Fri, 18 Feb 2022 18:39:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/Aohf8gqa7Zc/upload/v1645201230630/1Ul5nm7IJ.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-the-criteria">The Criteria</h2>
<p>I have blogged in the past, but I have struggled with finding the right balance between</p>
<ul>
<li>Site Speed</li>
<li>Appearance</li>
<li>Ease of Writing</li>
<li>Reach</li>
<li>Portability</li>
</ul>
<p>All divided by how much time I have to spend developing the thing.</p>
<p>Let's use a point system.</p>
<ul>
<li>😍 = 2</li>
<li>😐 = 1</li>
<li>😖 0</li>
</ul>
<h2 id="heading-my-experience">My Experience</h2>
<h3 id="heading-wordpress">WordPress</h3>
<ul>
<li>Site Speed: 😖</li>
<li>Appearance:  😍</li>
<li>Ease of Writing: 😍</li>
<li>Reach: 😐</li>
<li>Portability: 😐</li>
</ul>
<p><em>Score: 6</em></p>
<h4 id="heading-overview">Overview</h4>
<p>The general issue with WordPress is to increase speed and customization, you must increase the complexity of development and decrease out-of-the-box niceties. </p>
<h4 id="heading-site-speed">Site Speed 😖</h4>
<p>Unless rolling your own theme, you are at the mercy of the theme-developer. You'll often find things like: </p>
<ul>
<li>Loading the entire Bootstrap library, instead of parsing through the SCSS and JS needed for the site.</li>
<li>Not lazy loading images.</li>
<li>Auto-loading jQuery and other full JS libraries for one or two minor features.</li>
</ul>
<p>Further, everything is bundled, which used to be important for speed optimization. However, the modern web no longer favors large blocking bundles, but small, delayed, prioritized ones.</p>
<h4 id="heading-appearance">Appearance 😍</h4>
<p>WordPress themes often look quite good. There is not much to say here.</p>
<h4 id="heading-ease-of-writing">Ease of Writing 😍</h4>
<p>I absolutely love the WordPress Gutenberg editor. It allows markdown or rich text and supports columns, as well as third-party blocks. It is an excellent block editor and I wish it were based on an open-standard so I could use it in my client sites.</p>
<h4 id="heading-reach">Reach 😐</h4>
<p>There are many options for shareability on WordPress, as well as good SEO plugins. I would definitely rate it high. However, traffic is completely dependent on organic or paid reach. There is no community-feed reach, as with Dev.to or Hashnode. </p>
<h4 id="heading-portability">Portability 😐</h4>
<p>I'm probably being a little unfair here. Exporting to WordPress XML isn't technically your only option. However, third-party plugins are required for JSON. I would rather have everything pure markdown and in a repository.</p>
<h3 id="heading-custom-site">Custom Site</h3>
<ul>
<li>Site Speed: 😍</li>
<li>Appearance:  😍</li>
<li>Ease of Writing: 😐</li>
<li>Reach: 😖</li>
<li>Portability: 😐</li>
</ul>
<p><em>Score: 6</em></p>
<h4 id="heading-overview-1">Overview</h4>
<p>Keep in mind, the way I consider these factors is not "doability" but how they jive with the time I actually want to spend working on the tool itself. I have other projects to focus on, and I want to be creating content, not constantly working on blog engine. </p>
<p>Imagine this scenerio: You are a full-time mechanic who enjoys driving Uber on nights and weekends. Do you want to spend your after-hours working on the car, or driving people?</p>
<h4 id="heading-site-speed-1">Site Speed 😍</h4>
<p>Site speed should be no issue for an experienced developer. Whether it's a static HTML site, a Next.js, Nuxt.js, or ProcessWire site, it will be as fast as you make it. I'm sure if you're reading this, you are cacheing, lazy-loading, optimizing images, loading only the resources you need, etc.</p>
<h4 id="heading-appearance-1">Appearance 😍</h4>
<p>It looks as good as you make it :) However, I will say I've met many developers who are great with algorithms, but are terrible at design. In this sense, I could knock down appearance to a 😐. For me, I enjoy design as much as development. </p>
<h4 id="heading-ease-of-writing-1">Ease of Writing 😐</h4>
<p>I have used many rich text editors from TinyMCE to Quill.js to CKEditor and none of them compare with something like Gutenberg. An open source block editor is something we are in serious need of that is based on outputting CSS Grid through inline styles or some sort of dynamic class system without bloat. </p>
<h4 id="heading-reach-1">Reach 😖</h4>
<p>Can I just say, I hate dealing with API tokens and authorization? The amount of time I have spent writing server scripts to check the renewal date for long tokens is barely worth the effort when I could use some sort of plugin. While anything and everything is possible with a custom blog, I felt like wiring up sharing was annoying. Plus, I'm just a blog lost in the wind without a platform like Dev.to or Hashnode.</p>
<h4 id="heading-portability-1">Portability 😐</h4>
<p>This is generally what you make it. On my last PHP-based blog I had a function I could call to retrieve all the blog posts quite easily, but there was finesse involved in getting them into JSON. Again, work is involved. Depending on the backend you used it could be easy or hard.</p>
<h3 id="heading-static-site-generator">Static Site Generator</h3>
<p>I do not have experience using a static site generator. Could someone let me know how they were rate their experience according to site speed, appearance, ease of writing, reach, and portability? I would guess it is similar to a custom site, except portability is way easier due to a repository of markdown files.</p>
<p><em>Score: Unknown</em></p>
<h3 id="heading-blogging-platform">Blogging Platform</h3>
<ul>
<li>Site Speed: 😍</li>
<li>Appearance:  😐</li>
<li>Ease of Writing: 😐</li>
<li>Reach:  😍</li>
<li>Portability: 😍</li>
</ul>
<p><em>Score: 8 Winner!</em></p>
<h4 id="heading-overview-2">Overview</h4>
<p>A blogging platform is an all-in-one SaaS which provides you an editor, contend delivery, and an audience. Some examples are Medium, Dev.to, and Hashnode. </p>
<h4 id="heading-site-speed-2">Site Speed 😍</h4>
<p>Speed should be great as the platforms are all CDN-based.</p>
<h4 id="heading-appearance-2">Appearance 😐</h4>
<p>Appearance is so-so, since there is limited customization. However, it's also hard to make it look terrible.</p>
<h4 id="heading-ease-of-writing-2">Ease of Writing 😐</h4>
<p>Ease-of-writing is alright. The positives are</p>
<ul>
<li>Markdown</li>
<li>Easy embedding</li>
<li>Code insertion</li>
</ul>
<p>However, lack of columns, separate preview tabs, and lack of third-party modules doesn't wow me.</p>
<h4 id="heading-reach-2">Reach 😍</h4>
<p>Reach is excellent due to the built-in audience, share buttons, and SEO.</p>
<h4 id="heading-portability-2">Portability 😍</h4>
<p>Portability, at least on Hashnode is <a target="_blank" href="https://support.hashnode.com/docs/export-articles">excellent</a>. All I need to do is click "export" and I get everything in a nice JSON file. </p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I have chosen to publish on <a target="_blank" href="https://hashnode.com/@scramlo/joinme">Hashnode</a>. I was able to sign up, throw in my https://blog.nerdspecs.com address as the host name, and launch in about 5 minutes. No joke. </p>
<p>As I said earlier, many developers fall into the trap of "working on their car" and never get to the "Uber" part. If you want to write, then get writing. And if you want to write now, consider a blogging platform like <a target="_blank" href="https://hashnode.com/@scramlo/joinme">Hashnode</a>.</p>
<h3 id="heading-help-others-who-read-this">Help others who read this!</h3>
<p>What criteria would you add?</p>
<p>What platform or technology stacks would you add as blogging options?</p>
<p>Do you agree or disagree with my experience?</p>
<p>And, I really would like to hear from someone on their experience with static site generators—Which one do you use? What do you like about it? How does it stack up in according to the criteria I suggested?</p>
]]></content:encoded></item></channel></rss>