<?xml version="1.0" encoding="UTF-8" ?>
    <rss version="2.0" 
      xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:webfeeds="http://webfeeds.org/rss/1.0"
      xmlns:dc="http://purl.org/dc/elements/1.1/"
    >
      <channel>
        <title>jdnordstrom.com</title>
        <description>
          A public archives of creations and writings by a problem solver and perpetual learner.
        </description>
        <link>https://jdnordstrom.com</link>
        <atom:link href="https://jdnordstrom.com/rss.xml" rel="self" type="application/rss+xml"/>
        <webfeeds:cover image="https://jdnordstrom.com/joshua_og.jpeg"/>
        <webfeeds:icon>https://jdnordstrom.com/logo_v6.png</webfeeds:icon>
        <webfeeds:logo>https://jdnordstrom.com/logo_v6.png</webfeeds:logo>
        <webfeeds:accentColor>0004fa</webfeeds:accentColor>
        <language>en-us</language>
  <item><title>Why Am I Not Coding Outside Work?</title><dc:creator>Joshua David Nordstrom</dc:creator><description><![CDATA[<p>It&#39;s not always the case. I have spent my free time coding on personal projects. Just not right now. </p>
<p>It&#39;s been since I started working at Amazon. Before I left my previous company, I was overflowing with ideas for software projects. Some were non-starters; others, worthy of work. For example, I converted my old 2011 MacBook Pro into a PostgreSQL and web server to run an app on my home network. Then, as soon as I started at Amazon, I stopped. The server and code repo have remained untouched.</p>
<p>It all depends on my capacity. To answer the question with another question: How much am I pushed to the limits of my software engineering capacities--problem solving, learning new things, thinking hard, coding, writing technical docs, etc.--at work? If I&#39;m maxed out, I don&#39;t have the energy or desire to do much more. If not, then I feel the itch. The itch to keep learning or implementing what I have learned.</p>
<p>Is this a good thing? I think so. I&#39;m challenged at work. I&#39;m learning and expanding my technical prowess at a rapid rate. At the same time, I lament not having the space to work on my ideas. It&#39;s fun seeing what I can think up and then trying to do it. I&#39;m not too worried though, for everything there is a season.</p>
]]></description><pubDate>Mon, 27 Jun 2022 00:00:00 GMT</pubDate><link>https://jdnordstrom.com/writings/coding-outside-work</link><guid isPermaLink="true">https://jdnordstrom.com/writings/coding-outside-work</guid></item><item><title>And Just Like That, Career Changed</title><dc:creator>Joshua David Nordstrom</dc:creator><description><![CDATA[<p>If you would have asked me a few years ago where I&#39;d be today, I would never have guessed here. The road that led me to software engineering was unexpected, yet makes sense when I look back.</p>
<p>The purpose of writing this post is twofold: to connect the dots and make sense of this journey for myself and to inspire and encourage anyone else who might be on a similar journey.</p>
<h2 id="a-predisposition-to-programming">A Predisposition to Programming</h2>
<blockquote>
<p>I have always been a problem solver, a tinkerer, and an explorer.</p>
</blockquote>
<p>As I think back, I can recall numerous precursors to my future love of programming. I have always loved mathematics. In elementary school, I joined a team of Mathletes. We trained after school in preparation for the annual competition, which included various challenge rounds. We&#39;d spend a whole day doing math and then be ranked based on our team score.</p>
<p>In 2005 when I was 12 years old, I participated in the Sally Ride <a href="https://www.nasa.gov/audience/forstudents/5-8/features/F_Toy_Challenge.html">TOYChallenge</a>, which involved inventing a toy and developing a prototype. My team&#39;s toy, called The Underwater X-treme, took us to the finals at Hasbro&#39;s headquarters in Boston where we pitched our toy before a board of judges. We ended up winning first prize which included a trip to NASA&#39;s <a href="https://www.spacecamp.com/space/camp">Space Camp</a> in Alabama.</p>
<p>I was an avid Lego-er. Aside from being a fan of following the instructions to build something cool, I loved making my own creations. I would build elaborate kingdoms, cities, vehicles and then bring my creations to life my creations through stop motion movies.</p>
<p>In high school, math and physics were my favorite subjects. While I procrastinated most homework, I would do math before I played video games, watched TV, or hung out with friends. I just enjoyed doing it.</p>
<p>I think these examples demonstrate the piece of what makes me, me: I am a passionate problem solver and a perpetual learner. When faced with a problem, I am excited and my brain starts running, speeding down every path trying to find a solution. I find it hard to rest with an unresolved challenge laid before me. My brain will even keep working while I sleep. It has happened on numerous occasions where I will fall asleep with a lingering problem and wake up with a solution. Or I&#39;ll simply dig in, research, and implement until I have arrived at the optimal solution. And then, I get that buzz, that feeling of accomplishment, that feeling of bringing something new to life and I keep coming back for more.</p>
<p>In university, I debated between engineering and biblical studies. I ended up choosing the later, which meant I stopped attending to my excitement for and skills in mathematics and all things tech. Fortunately as it turns out, this was temporary.</p>
<h2 id="first-exposure">First Exposure</h2>
<p>These passions were reawakened in grad school thanks to another love of mine--video games. My housemate and I shared a mutual love of gaming and spent long hours where we probably should have been studying exploring and creating in virtual worlds.</p>
<p>We were console gamers until we wanted mod Skyrim. Since we were broke graduate students in 2016, we turned to an old pc tower of mine from 2004. We upgraded that baby to it&#39;s highest capacity and were able to run Skyrim on the lowest settings possible. This didn&#39;t satisfy us for long, so we both built our own gaming PCs from scratch.</p>
<p>After spending many long hours gaming together, we thought it would be fun to create our own video game. We&#39;d consumed a lot of good content, now it&#39;s time to create. I committed to learning programming so that we could get to work building our video game. Looking back, I have no idea what we were thinking. We were both full time graduate students and I had a part time job as a Youth Pastor. The task required more time than we were able to give.</p>
<p>Nonetheless I started an online course through Harvard called <a href="https://cs50.harvard.edu/summer/2020/">CS50: Introduction to Computer Science</a>. The first half of the course is comprised of learning computer science basics through programming in C. This laid an excellent foundation of understanding memory allocation, pointers, data structures, and algorithms that still carries me today.</p>
<p>While this class didn&#39;t bring to fruition the world my housemate and I dreamed up, it did bring to surface my love for mathematics and problem solving. When I programmed, I actualized my capacities. I was good it and the concepts just made sense. I continued programming as a hobby because after all I was paying a lot of money for my graduate degree program. I stayed on my current path yet refused to let my love of mathematics be ignored.</p>
<h2 id="full-send">Full Send</h2>
<p>Many strands of my thinking and experience culminated in my decision to career pivot. Rather than list all of them here, I want to describe the moment I decided to full send.</p>
<p>I sat at the dinner table with my soon-to -be wife on a lazy summer night. We sipped our wine and dreamed about our future. As we did, the potential career pivot for me entered into the conversation. We&#39;d spoken about it many times before; this time was different.</p>
<p>Our dreams about the future included children, a home for hospitality, a back house for grandparents, and my wife writing and raising our kids. These were important to us and that night they added a new weight into our discussion.</p>
<p>With these dreams on our hearts and minds, we decided I would career pivot into software engineering. I was overjoyed and excited--my passion for problem solving and love of mathematics would be given life.</p>
<p>Committing to a career pivot is one thing, making it happen another. With no technical background on paper, I didn&#39;t know where to turn. I finished the CS50 course and started learning Javascript on a deep level. Beyond this, I didn&#39;t know what would set me up for landing a job. I was confident in my ability, but how could I grow my skills?</p>
<p>I started a research phase. I spoke with my dev friends (some who also made rapid career pivots into software engineering). The overwhelming advice I received was build something or contribute to open source projects and if you can, join a team and get actual experience developing a product with multiple engineers.</p>
<p>Someone pointed me in the direction of <a href="https://www.codesmith.io/#">Codesmith</a>, a software engineering immersive program. The face paced learning environment and collaborative approach to engineering stood out to me. But what stood out to me most was the opportunity to work on a team under the guidance of the tech accelerator OS Labs. I was sold.</p>
<p>At the end of 2019, I stepped down from my position as Assistant Pastor at Journey of Faith and started Codesmith. I excelled at programming. The pace was perfect for me because it coding clicked. After developing my skills, OS Labs connected me with the Nautilus team.</p>
<p>The Nautilus team shared a passion for devops. We created a desktop application called <a href="https://jdnordstrom.com/writings/nautilus">Nautilus</a>. It&#39;s a Docker Compose visualization tool. On the Nautilus team, I got more than just the experience I was looking for--I built and launched a product that I am proud of and made some good friends along the way.</p>
<h2 id="securing-a-job">Securing a Job</h2>
<p>With Nautilus launched, the team decided to pursue other opportunities while maintaining the application. For me this meant job searching. The job hunt is full of challenges far different from the challenges of learning to program. This may have been the most difficult part for me in the whole career pivot journey.</p>
<p>The difficulty was twofold. First, sending out a quality application for a quality company takes a lot of energy--writing a cover letter unique to the company; researching the company&#39;s values, tech stack, and industry; and going through the interview process with specific companies. It&#39;s a constant performance and self-promotion so that my skills and personality will be noticed by a company.</p>
<p>Second, after all that energy most of the time (99% for me, it took around 100 applications before I landed a job), the process ends in rejection. I needed courage and confidence to keep pushing. I held on to what I knew was true about my ability and kept applying amidst rejection. But this also took a lot of energy and many days ended with discouragement.</p>
<p>I just keep chugging along. I found ways to sustain myself and my drive for programming during this time. I worked on algorithms every morning for an hour. One to prep for technical interviews when they came. And two because algorithms are fun and helped keep my coding skills fresh.</p>
<p>Also, I continued to work personal projects. I built <a href="https://jdnordstrom.com/writings/this-website">this website</a> that functions as a portfolio/blogger. I learned PHP by building a CMS under the guidance of an online course. I got involved in working on a friends web application called <a href="https://www.winebud.com/">winebud</a>. All of these projects allowed me to do what I love while I continued to apply to jobs. I kept a regular work schedule working from 9 to 5 on job apps and personal projects. It was hard, self-motivated work. And it all paid off.</p>
<p>After about a month and a half job hunting, I landed a job with Green Street Advisors working on the external web team. I couldn&#39;t be more excited about this opportunity and the company. The team is filled with bright engineers who love what they do and are excited by building cool stuff. It&#39;s a collaborative work environment where I&#39;ll be able to learn from experienced engineers and contribute from my skill set.</p>
<p>I signed the contract on Friday, June 5th and now I anxiously await my start date of July 6th. My sister-in-law&#39;s words describe how I felt, &quot;And just like that, career changed.&quot;</p>
<p>The hard work paid off. I get to do something that aligns with my skill set and my passion. I look forward to showing up to my job because I love the work that I am doing. I can&#39;t wait to build cool stuff with my team at Green Street Advisors.</p>
<p>As said at the beginning, &quot;I have always been a problem solver, a tinkerer, and an explorer.&quot; Software engineering is the culmination of this drive. I like to say that I&#39;ve always been one at heart--researching, implementing, assessing, repeat. Now, it&#39;s just activated.</p>
<blockquote>
<p>Hello world. I&#39;m Joshua and I&#39;m a software engineer at Green Street Advisors.</p>
</blockquote>
]]></description><pubDate>Wed, 10 Jun 2020 00:00:00 GMT</pubDate><link>https://jdnordstrom.com/writings/career-changed</link><guid isPermaLink="true">https://jdnordstrom.com/writings/career-changed</guid></item><item><title>To-Do List #1</title><dc:creator>Joshua David Nordstrom</dc:creator><description><![CDATA[<p>As a programmer, my mind always has a running to do list. The items on the list can be small such as adding a new feature to a project I&#39;m currently working on. Or large such as learning a new programming language. They can be iterations on past creations or ideas for new creations. Sometimes they are areas of programming that I want to study or books that I want to read.</p>
<p>Whatever the items, keeping them in my mind causes them to get jumbled. As an exercise, I&#39;ve decided every so often to write my current to do list here.</p>
<ol>
<li><p><del>Add an RSS feed for the writings section of this website.</del></p>
</li>
<li><p><del>Start consuming RSS feeds by setting up a feed reader and curating choice content from other sites.</del></p>
</li>
<li><p><del>Write about my journey to becoming a programmer.</del></p>
</li>
<li><p>Add a dark mode to this website.</p>
</li>
<li><p><del>Implement <code>prev</code> and <code>next</code> buttons for easier navigation through writings.</del></p>
</li>
<li><p>Read <a href="https://www.goodreads.com/book/show/1032758.The_Practice_of_Programming">The Practice of Programming</a> by Brian Kernighan and Rob Pike.</p>
</li>
<li><p>Build a CRUD application in PHP.</p>
</li>
<li><p>Create something with Vue in order to learn the framework.</p>
</li>
<li><p><del>Install <a href="https://deno.land/">Deno</a> and experiment around with it.</del></p>
</li>
</ol>
]]></description><pubDate>Wed, 27 May 2020 00:00:00 GMT</pubDate><link>https://jdnordstrom.com/writings/to-do-list</link><guid isPermaLink="true">https://jdnordstrom.com/writings/to-do-list</guid></item><item><title>The Creation of Nautilus</title><dc:creator>Joshua David Nordstrom</dc:creator><description><![CDATA[<p><a href="https://nautilusdev.com">Nautilus</a> is a Docker dev tool that visualizes <a href="https://docs.docker.com/compose/">Compose</a> instances showing important data about each service such as ports, volumes and bind mounts. It&#39;s an Electron desktop application built with React, Typescript and D3.</p>
<p>The Nautilus team deployed the application on April 17th and we received great feedback from the Docker community. Our product hit top 10 on Hacker News at launch date and was mentioned on Google&#39;s Kubernetes Podcast (<a href="https://kubernetespodcast.com/episode/099-kpt/">episode 99</a>) as hot news related to microservices.</p>
<h2 id="how-nautilus-came-to-be">How Nautilus Came to Be</h2>
<p>As a software engineer always seeking growth, I had multiple dev friends encourage me to build something. I researched what to build and if it would be possible to create with a team of other bright engineers. I discovered OS Labs, a nonprofit tech accelerator, through which I met the Nautilus team--Danny, Michael, Aris and Tyler.</p>
<p>As we discussed what excited us about the current web development landscape, we discovered a shared interest in DevOps, specifically containerization and container orchestration. After research and interaction with the Docker community, we heard an expressed desire for a Compose instance visualizer.</p>
<p>We were excited by the idea and got to work.</p>
<h2 id="the-goals-for-nautilus">The Goals for Nautilus</h2>
<p>From the very beginning, we approached Nautilus with three main goals.</p>
<ol>
<li><p><strong>Nautilus should be interactive and prioritize the most important information about each microservice by displaying it visually.</strong> To achieve this, we chose to work with <a href="https://d3js.org/">D3.js</a>, a powerful tool for data visualization.</p>
</li>
<li><p><strong>Nautilus should protect the proprietary data of all users wanting to visualize their compose instance.</strong> This meant that <em>uploading</em> a docker-compose.yml file to a web server was not an option. Fortunately, we found <a href="https://www.electronjs.org/">Electron</a> to be the perfect solution. By creating a desktop application, developers could <em>open</em> their compose file rather than upload.</p>
</li>
<li><p><strong>Nautilus should have a code base built for scale.</strong> We knew that if Nautilus was successful and well received (as it indeed turned out to be), there would be a high possibility that OS Labs would bring in other engineers to work on Nautilus. Thus, we wanted to guard against technical debt from the beginning rather than playing catch-up down the road. For this purpose, we incorporated <a href="https://www.typescriptlang.org/">Typescript</a>. While it meant a bit of on-boarding and more written code, the benefits of static type checking leading to less errors and more maintainable code won us over.</p>
</li>
</ol>
<h2 id="technical-challenges-along-the-way">Technical Challenges along The Way</h2>
<p>Unexpected technical challenges are par for the course when developing; Nautilus was no exception. The first major technical challenge faced was that by virtue of their relationship to the DOM, React and D3 don&#39;t play well together.</p>
<p>D3 interfaces with DOM in a similar way to jQuery--you select DOM elements, which are linked linked with a D3 object and then can use the D3 api to manipulate them. React interacts with the DOM through objects that represent the actual DOM (see <a href="https://reactjs.org/docs/faq-internals.html">the VDOM</a> and <a href="https://github.com/acdlite/react-fiber-architecture">React fiber</a>).</p>
<p>Our solution to working with D3 in React was to run all D3 DOM manipulations in the useEffect function which fires after React has updated the actual DOM. This is necessary because if the D3 logical ran in the functional component prior to the return statement, D3 would attempt to manipulate DOM elements that don&#39;t exist yet.</p>
<p>This ties into how component lifecycles work in React. To oversimplify, the actual DOM doesn&#39;t update until a React function returns a React Element. Thus, placing all D3 functions in useEffect allow them to run after the component is actually rendered on the DOM.</p>
<p>For example, here&#39;s an overview of the flow of rendering when Nautilus renders containers:</p>
<pre><code>|--&gt; file gets uploaded
  |--&gt; react component renders d3 container div
    |--&gt; react fires useEffect function
      |--&gt; d3 selects container div
          |--&gt; d3 renders svgs within container div.
</code></pre>
<p>While this solved one problem, it lead to another--persisting the D3 simulation across React state changes.</p>
<p>We used the D3 force graph simulation to visualize the Compose instance. We added two <em>views</em> for the services--a <a href="https://docs.docker.com/compose/compose-file/#depends_on">depends on</a> view and a <a href="https://docs.docker.com/compose/compose-file/#networks">networks</a> view.</p>
<p>The <code>depends_on</code> property controls the order in which Compose will start each microservice. If a service such as MyApp depends on another such as AppDb, then Compose will wait to start the MyApp container until the AppDB container is running.</p>
<p>The <code>network</code> property controls what network each service should join. When in a shared network, the services can access each other by the service name on the specified <code>CONTAINER_PORT</code>. By default, Compose puts all services in one network. However, it is common to have multiple networks, such as a backend network and frontend network in a Compose application.</p>
<p>In order to have Nautilus visualize these relationships, the application needed to have a smooth transition from the depends on view to the networks view. We wanted the containers to glide into their new position, rather than removed from the DOM and then re-rendered in their new position.</p>
<p>The issue here is that the variable pointing to the D3 simulation object needed to be outside the useEffect functions. We used two useEffect functions--one controlling the depends on view and on controlling the networks view--and both needed the simulation variable within their scope. But if the simulation variable were to be initialized by React, it would be re-intialized on state changes.</p>
<p>We came up with the solution to create a <a href="https://www.codeproject.com/Articles/829254/JavaScript-Namespace">global namespace</a> that existed &quot;outside&quot; of React containing the d3 nodes, links, and force graph objects. Nautilus calls this d3State. The only time React interacted with d3State was on a file upload where it &quot;set&quot; the d3state. This setting restarts the d3 simulation with the new node values based on the parsed docker-compose.yml file.</p>
<p>To synthesize what&#39;s happening here, D3 controls the simulation data and all DOM elements associated with it. React controls what the simulation should be showing by telling D3 what to do with the simulation.</p>
<p>Take for example toggling ports on in Nautilus by clicking the ports button.</p>
<p><img src="/nautilus_ports.gif" alt="ports toggle on"></p>
<p>Here&#39;s what&#39;s happening under the hood:</p>
<pre><code>|--&gt; User clicks ports button
  |--&gt; React state updates toggling ports on
    |--&gt; useEffect containing d3 port logic fires
        (this is React telling d3 to show the ports)
      |--&gt; d3 selects container nodes from the DOM
        |--&gt; d3 appends port svgs to containers based on objects in d3State
</code></pre>
<p>This way, React and D3 work together to visualize the data instead of fighting for control over the DOM.</p>
<h2 id="what-i-learned-from-nautilus">What I Learned from Nautilus</h2>
<p><strong>Developing an application from scratch is hard.</strong> There is a lot that goes into it--designing the UI, always thinking about the end user, setting up the dev environment, building out a code base, figuring out deployment solutions, etc. It&#39;s a lot of work and each decision is extra weighty because it will affect the trajectory of the application.</p>
<p><strong>Polishing an application for production, even harder.</strong> The Nautilus team built out the MVP fairly quickly, despite the difficulty of building something from scratch. Much of our work was dedicated to that last 20% that makes an application production ready.</p>
<p>It&#39;s slow and tedious work where significant changes aren&#39;t happening to the application. Finding edge cases, optimizing the code base, interacting with real users, and making small tweaks to UI are necessary parts of the process.</p>
<h2 id="the-future-of-nautilus">The Future of Nautilus</h2>
<p>The Nautilus founders will continue to maintain the application while seeking other opportunities to build cool stuff. We feel that the application has achieved what we wanted and are excited by exploring other opportunities.</p>
<p>Nautilus will continue to grow. OS Labs has offered to bring in another team of software engineers based in NY to continue working on the application. I&#39;m excited about the posssibility that within the next couple of months Nautilus 2.0 should become available for download.</p>
<p>Stay connected by joining our <a href="https://app.slack.com/client/T0119QAGYP5">slack</a>, following the Nautilus repo on <a href="https://github.com/open-source-labs/nautilus">github</a>, or checking out the <a href="https://nautilusdev.com">website</a>.</p>
]]></description><pubDate>Sun, 24 May 2020 00:00:00 GMT</pubDate><link>https://jdnordstrom.com/writings/nautilus</link><guid isPermaLink="true">https://jdnordstrom.com/writings/nautilus</guid></item><item><title>This Website</title><dc:creator>Joshua David Nordstrom</dc:creator><description><![CDATA[<p>As a software engineer, I&#39;m always looking for new projects to learn from and grow as an engineer.</p>
<p>I recently spoke with a friend from undergrad, Jared Gorski. We talked about web development, his work at Liferay, my work on <a href="https://nautilusdev.com">Nautilus</a> (a dev tool that visualizes Docker Compose instances). He also started sharing with my how he recently updated his <a href="https://jaredgorski.org/">website</a> to improve speed. After our conversation, I checked it out and was inspired. I had already been thinking about SSR (server side rendering) and how to leverage it. Thus, the mission to build this website was born.</p>
<h2 id="nextjs-and-react">Next.js and React</h2>
<p><img src="/white-nextjs.png" alt="Next.js Logo"></p>
<p>This website is built with <a href="https://nextjs.org/">Next.js</a>, a complete solution to pre-rendering React for lightning fast serving of static webpages. Next.js comes ready for production with the option of pre-rendering your React website at build time or running a Next.js server that renders the HTML server side on each request. The former being significantly faster and preferred to maximize the benefits of Next.js.</p>
<p>React has a definite sweet spot of use cases. When building an application that relies heavily on dynamic data with each view changing based on the current user, React shines. The ability to write modular, functional, and declarative components is unparalleled in other frameworks, hence the popularity for React over others. But, the trend towards treating React as a silver bullet for modern development is a bit off. A website such as this one which provides the same view for all users doesn&#39;t need to push the <em>building</em> of the HTML to the client; enter Next.js.</p>
<h2 id="server-side-rendering---an-old-tech-reskinned">Server-Side Rendering - An Old Tech Reskinned</h2>
<p>The concept of SSR is not new when it comes to web development; Django, Flask/Python, PHP are all about server side rendering. The client requests a webpage, server queries database, server renders HTML based on data and then serves the HTML to the client along with statics assets on subsequent requests. I recently started working on a web application called <a href="https://www.winebud.com/">winebud</a>. It&#39;s built with PHP and the folder structure is strikingly similar to Next.js. PHP is server side rendering in it&#39;s prime.</p>
<p>So, what&#39;s the big deal about Next.js?</p>
<p>Next.js offers the ability to write React while leveraging the benefits of SSR. While it is true that it shines when building an SPA with dynamic data, React is also great because it&#39;s just JavaScipt--functional and declarative. It allows for clean code; enforces one way data flow; and enables the creation of reusable components. I could go on, but if you&#39;ve worked with React you get it. It&#39;d be a bummer to say bye-bye to React when it came time to develop a static website.</p>
<p>With Next.js, you get to build out your static website by writing React. There is some on-boarding that comes with how Next.js handles pages and learning new APIs for fetching dynamic data. But, at the core, it&#39;s just React. And so, by extensions, it&#39;s just JavaScript.</p>
<p>All that being said, here are my thoughts about the good and the bad.</p>
<h2 id="the-good">The Good</h2>
<h3 id="1-time-to-first-paint-is-lightning-fast">1. Time to first paint is lightning fast</h3>
<p>Duh. This is the point of per-rendered HTML. Seriously, try it out. Click around my website and notice how quickly the view is rendered.</p>
<p>As previously mentioned, Next.js builds the HTML from your React and then deploys the static HTML into production. Thus, no need to wait for React to build the webpage for you client side; it&#39;s already good to go. Next.js even allows for fetching of dynamic data at build time. While this doesn&#39;t work great for data this constantly updating, it works great for a site like this. Jdnordstrom really only gets new data when I add a new writing. So, it&#39;s easy to have Next.js rebuild and redeploy the all HTML with the updated content.</p>
<h3 id="2-the-dev-environment-requires-minimal-configuration">2. The dev environment requires minimal configuration</h3>
<p>No need to mess with Webpack or Babel or server setup. Next.js comes with all of this pre-built. It even comes Typescript ready, which if you haven&#39;t used Typescript and benefited from the glories of static type checking... it&#39;s the best thing ever and if you aren&#39;t using it yet, you should be. I worked with it for the first time on Nautilus and I&#39;m a convert and you should be as well.</p>
<p>Simply yarn (or npm if you&#39;re still into that) install next.js create a pages directory, add an index.tsx file and you&#39;re on your way.</p>
<h3 id="3-deployment-with-vercel-is-simple-and-jamstack-compliant">3. Deployment with Vercel is simple and JAMStack compliant</h3>
<p><a href="https://jamstack.org/">JAMStack</a> or JavaScript, APIs and Markdown is a philosophy about web development. The idea is that your website is only comprised of these three techs. This is achieved by serving all content from a CDN, serving only static assets and leveraging available APIs to do the heavy lifting work a server would normally do.</p>
<p>Vercel, created by the makers of Next.js, functions as a light weight CI/CD tool that webhooks into your GitHub repo. It builds and deploys the website to a production like environment on all PRs. And then deploys into production on merges into the default branch. It&#39;s integrated with Next.js which makes the configuration minimal and a simple solution.</p>
<h2 id="the-bad">The Bad</h2>
<h3 id="1-its-still-a-react-app">1. It&#39;s still a React app</h3>
<p>What I mean by this is that all of the React files still accompany a Next.js website and these files are comparatively large to the rest of the application. By itself, React weighs in around <a href="https://reactjs.org/blog/2017/09/26/react-v16.0.html#reduced-file-size">106kb</a>. This is large by comparison--the HTML for the home page here is a measly 6.26kb and uses minimal CSS and JavaScript (not accounting for the React ecosystem). What this means is that this website would be significantly faster without React and Next.js.</p>
<p>Most static websites don&#39;t need React running in the background. While this does come with certain benefits, it still feels a bit too heavy for the simplicity of many static webpages (this one being a prime example).</p>
<h3 id="2-time-to-interactivity-still-slow">2. Time to interactivity still &quot;slow&quot;</h3>
<p>I want to caveat this by saying that &quot;slow&quot; is a relative term; we&#39;re talking about milliseconds here. But in web development, the faster the website the better UX, which means higher returning user rater, which means greater profit.</p>
<p>The time to first paint is lightning fast because of the pre-rendering powers of Next.js. Yet as mentioned in the point above, the JavaScript file is large. This means the time to webpage responsiveness is the same speed as a React site. While the time to first paint is a huge benefit, Next.js only goes halfway in boosting the speed of your webpage.</p>
<p>And we&#39;re back to the fact that writing in plain JavaScript, HTML and CSS will be the fastest when it comes to a static site. This leads to a question of whether or not these negatives out weight the benefits of developing in React. Vanilla web development is a lot of copy and pasting. React improves the dev environment so much so that it&#39;s a worthy trade-off.</p>
<h2 id="a-quick-note-about-design">A Quick Note about Design</h2>
<p>Minimal and old school internet modernized are the design goals for this website. In order to achieve this, the two step process of designing and then implementing were a growth inducing challenge.</p>
<p>Graphic design is a whole field of expertise that I&#39;ve only dabbled in as an amateur. I usually design by starting out with a vision and then changing it based on what looks good once I see it. But, envisioning and then implementing in CSS at the same time is laborious. Ideally, I&#39;d learn adobe one day.</p>
<p>CSS is easy to learn, but difficult to master. In the past, I&#39;ve turned to styling libraries such as Bootstrap and Material UI to make CSS less scary. But, I felt these libraries stunting my growth as a frontend developer. This website is all home-brew CSS. Here&#39;s what I learned: there&#39;s a lot that can be achieved with CSS sans JavaScript and the transition property is hard.</p>
<h2 id="final-thoughts">Final Thoughts</h2>
<p>This website was a journey in exploring the new (or rather the reskinned) technology of server-side rendering and a study on static website optimization. I learned a lot as a software engineer, had fun, and am proud of the end product. Programming excites me. I am constantly iterating upon projects and expanding my sphere of knowledge. <a href="https://jdnordstrom.com">jdnordstrom.com</a> will continue to evolve as I evolve as a software engineer.</p>
<p>P.S. If you want to see the magic that makes it happen, here&#39;s <a href="https://github.com/jdnordy/joshuadavidnordstrom">this</a> (the website&#39;s github repo).</p>
]]></description><pubDate>Wed, 13 May 2020 00:00:00 GMT</pubDate><link>https://jdnordstrom.com/writings/this-website</link><guid isPermaLink="true">https://jdnordstrom.com/writings/this-website</guid></item></channel></rss>