<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cole Turner</title>
    <description>The latest articles on DEV Community by Cole Turner (@coleturner).</description>
    <link>https://dev.to/coleturner</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F74234%2F43cba5be-d19b-4887-96cc-2c6a66698af2.jpg</url>
      <title>DEV Community: Cole Turner</title>
      <link>https://dev.to/coleturner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coleturner"/>
    <language>en</language>
    <item>
      <title>Lessons Learned in Freelancing</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Sun, 20 Sep 2020 19:34:47 +0000</pubDate>
      <link>https://dev.to/coleturner/lessons-learned-in-freelancing-36fd</link>
      <guid>https://dev.to/coleturner/lessons-learned-in-freelancing-36fd</guid>
      <description>&lt;p&gt;From 2004 to 2018, I was a freelance web developer and worked on dozens of projects in spaces including tech, retail, advertising, community engagement, software development, and more. These spaces have taught me a lot about how the internet has become the center of our lives and the people who run them. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is freelance web development?
&lt;/h2&gt;

&lt;p&gt;Freelance web development is when a software engineer performs a web development service on-demand, without committing to a full-term engagement. Developers working in freelance are self-employed and have the flexibility to organize their contracts and schedule at their own discretion. These contracts are an agreement between the freelancer and the client, to perform the job at agreed-upon terms. It can be an empowering experience that allows you to have an impact on a variety of projects.&lt;/p&gt;

&lt;p&gt;If you're thinking of becoming a freelance web developer or learning more about freelance, then this article is for you. In this post, I'll share with you the lessons that I've learned and how to have a great time as a freelancer. Moreover, I'll tell you how to work more effectively with clients, deal with complications, and what red flags to keep in mind. Here are the lessons that I've learned in my freelancing career.&lt;/p&gt;

&lt;h2&gt;
  
  
  #1 - Always Sign a Contract
&lt;/h2&gt;

&lt;p&gt;A contract provides guarantees for both the freelancer and the client. Those guarantees include the scope of the work performed, the terms of payment, deadlines for delivery, and any additional maintenance or followup. As a freelancer, you want to over-clarify every aspect of the work performed and the work not performed, in order to have a healthy relationship with your client. Any ambiguity can cause tension, as these aspects are more difficult to negotiate later on. When I was a freelancer, I used Bonsai (&lt;a href="https://www.hellobonsai.com/"&gt;hellobonsai.com&lt;/a&gt;) to create contracts and send them to clients for signing. Another option is &lt;a href="https://stuffandnonsense.co.uk/projects/contract-killer"&gt;Stuff &amp;amp; Nonsense's Contract Killer&lt;/a&gt;, an open-source contract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember to include in your contracts:&lt;/strong&gt;&lt;br&gt;
1 Work you will perform.&lt;br&gt;
2 Clarify explicit tasks that are out of scope.&lt;br&gt;
3 Terms of payment including deposits, termination fees, delivery of payment, and late payment fees.&lt;br&gt;
4 Responsibilities and liabilities for both parties, including if either party changes their mind.&lt;br&gt;
5 Ownership, intellectual property, copyright, or other legal concerns. Upon full payment of services.&lt;/p&gt;

&lt;p&gt;A contract is going to make the biggest difference in your relationship with clients, and how effective you are as a freelancer. These stipulations protect both you and the client and guarantee you'll have a good time. If you're unsure about your contract, reach out to lawyers and go for consultations. A lawyer who specializes in intellectual property and information technology can provide better guidance, and many offer free consultations. &lt;/p&gt;




&lt;h2&gt;
  
  
  #2 - Be Clear about Work (Not) Performed
&lt;/h2&gt;

&lt;p&gt;When negotiating a contract with a client, the work performed should be clearly outlined. As part of this process, you will also want to rule out any ambiguity and clarify the work that will &lt;em&gt;not&lt;/em&gt; be performed. This is for your protection in the event that later down the line, the client makes a request that is outside of the scope of the contract.&lt;/p&gt;

&lt;p&gt;A previous client of mine brought me on to clean up the front-end design for a project. It was a reasonable project that I could deliver in the short-term, about a month and a half. Two weeks later, I started receiving requests to develop new features. This would have delayed the time to complete the contract and made it impossible for me to begin a contract I had already queued up thereafter. Using the contract as a reference, I denied the request as it was outside of the scope that I was able to perform to deliver in time.&lt;/p&gt;




&lt;h2&gt;
  
  
  #3 - Charge More
&lt;/h2&gt;

&lt;p&gt;Freelancers are self-employed which has additional costs than a full-time employee. They pay self-employment taxes which is about 15.3%. Moreover, freelancers must pay for their own health insurance. The market rate for a freelance job should be at least one and a half times (1.5x) what a full-time employee would make. This will cover your additional expenses. &lt;/p&gt;

&lt;p&gt;Your rate will largely depend on what you're able to negotiate. Freelance jobs depend on supply and demand, and what value you're able to bring to a job. A client is paying you for more than your time: they're paying for your experience too. So while it may take 8 hours to create a webpage, your rate also takes into account the years of experience you have in honing your craft.&lt;/p&gt;




&lt;h2&gt;
  
  
  #4 - Deposit is Non-Negotiable
&lt;/h2&gt;

&lt;p&gt;Deposits are protections for both freelancers and clients. They also help cover expenses to smooth out time in between paydays. A contract deposit is an insurance that the client is able to pay you for performing the work. For these reasons, I've learned that a deposit is non-negotiable.&lt;/p&gt;

&lt;p&gt;Clients should want to pay you a deposit because it also demonstrates your commitment to getting the job done. A client that does not want to pay the deposit, will give you trouble later. If they try to negotiate, they will give you trouble later. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In conclusion:&lt;/strong&gt;&lt;br&gt;
1 The deposit is non-negotiable.&lt;br&gt;
2 The deposit is non-negotiable.&lt;br&gt;
3 The deposit is non-negotiable.&lt;/p&gt;




&lt;h2&gt;
  
  
  #5 - Always Have a Next Next Plan
&lt;/h2&gt;

&lt;p&gt;Freelancing carries an additional responsibility to manage the pipeline for contracts. You will want to have another contract lined up before your current contract ends. When it's time to start the next contract, you will want to have already made plans for thereafter.&lt;/p&gt;

&lt;p&gt;Sometimes a contract doesn't work out. There may come a time when a freelancer finds themselves wanting to void or otherwise not renew a contract. In this situation, it's helpful to have a backup plan to bridge the gap. Short term contracts that are easy to pick up and complete are a great way to fulfill periods of time in between contracts.&lt;/p&gt;




&lt;h2&gt;
  
  
  #6 - Know When to Walk Away
&lt;/h2&gt;

&lt;p&gt;Money does not replace happiness. When a job doesn't feel right, trust your gut and instincts. If the terms of a contract are not happening as expected, there are a few options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Talk to the client to try and resolve the situation.&lt;/li&gt;
&lt;li&gt;Absolving the contract amicably.&lt;/li&gt;
&lt;li&gt;Seek legal consultation.&lt;/li&gt;
&lt;li&gt;Walk away.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's important to understand that above all, communication is important. Talking to the client to resolve the situation requires deep introspection into what is working and what is not working. If there is a shared sense of wanting to absolve the contract amicably, that requires communication. Ideally, there's no need to involve legal representation. The legal route requires balancing the potential loss in the contract stipends versus the loss from time spent in the legal process. When all other options are exhausted, sometimes the best option is to walk away.&lt;/p&gt;




&lt;h2&gt;
  
  
  #7 - Know When to Run
&lt;/h2&gt;

&lt;p&gt;Knowing when to walk away from a contract is important, but knowing when to run from a bad client is even more important. There are some behaviors I've observed in my freelancing career that are definite red flags. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to know all the red flags to watch out for?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cole.codes/posts/lessons-learned-in-freelancing#know-when-to-run"&gt;Continue reading about Lessons Learned in Freelancing, and all the red flags to watch out for when you're freelancing.&lt;/a&gt;&lt;/p&gt;







&lt;h2&gt;
  
  
  Bon Voyage
&lt;/h2&gt;

&lt;p&gt;These are the lessons that I've learned from my freelancing career. I hope this advice was helpful. Freelancing is a great way to earn money and build a business on your own terms. The most important takeaway is to have an effective contract. Be clear about the work performed (and the work not performed). Charge more for your work than you would if you were a full-time employee. Deposits are non-refundable or negotiable. Freelancing requires being proactive, and so you should have a plan for what to do next. And lastly, it's important to know when to walk away and how to avoid a bad contract or client. In all of these endeavors, trust your gut when your lizard brain is telling you that something feels right, and when it doesn't. &lt;/p&gt;

&lt;p&gt;I'd love to hear from you. Let me know what lessons you've learned by sharing with me on Twitter (&lt;a href="https://twitter.com/coleturner"&gt;@coleturner&lt;/a&gt;).&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>motivation</category>
      <category>freelance</category>
    </item>
    <item>
      <title>How to Grow as a Software Engineer</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Thu, 27 Aug 2020 03:24:18 +0000</pubDate>
      <link>https://dev.to/coleturner/how-to-grow-as-a-software-engineer-25oo</link>
      <guid>https://dev.to/coleturner/how-to-grow-as-a-software-engineer-25oo</guid>
      <description>&lt;p&gt;Software engineers will spend years looking at code, without thinking about their communication skills. However, software engineering is more than just programming. The reality is that technical ability can only take someone so far. Once you hit the technical ceiling, it becomes about communication.&lt;/p&gt;

&lt;p&gt;In this post, I'm going to talk about communication and why it's important. I'll share with you the three domains of communication and decision-making. These domains will give you the tools to take your problem-solving skills and apply them to matters of communication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does Communication Matter?
&lt;/h2&gt;

&lt;p&gt;Of course! An engineer can only get so far with technical ability alone. When we look at a job description from Google for a Software Engineer, we see the following:&lt;br&gt;
1 Degree or equivalent practical experience&lt;br&gt;
2 Experience in working with the following: ...&lt;br&gt;
3 Working proficiency and communication skills in ...&lt;/p&gt;

&lt;p&gt;Now let's look at the added requirements for a Staff Software Engineer position:&lt;br&gt;
1 Experience architecting and developing distributed systems design.&lt;br&gt;
2 Hands on technical leadership experience leading project teams and setting technical direction.&lt;/p&gt;

&lt;p&gt;From these postings, we can see that technical ability can only get you halfway there. Communication skills are required for basic tasks like code reviews and collaboration. These are just the minimum skills required.&lt;/p&gt;

&lt;p&gt;Beyond entry-level tasks, higher-level tasks require more strategic and tactical communication. Architecture requires strategizing a systems design through research, implementation, and working with others to oversee the process. Technical leadership requires essential communication skills to be able to direct and influence the group. Without developing these skills, an engineer can only go so far.&lt;/p&gt;

&lt;p&gt;That's why we need communication: to grow. We need communication to take our technical abilities to new heights. These essential skills increase our ability to work with others and broaden our impact. To build these skills, we need to be more thoughtful, and we need to know which domains to think over.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Domains of Engineering Thoughtfulness
&lt;/h2&gt;

&lt;p&gt;Thoughtfulness and decisionmaking for software engineers can be broken down into three domains:&lt;br&gt;
1 &lt;strong&gt;Technical&lt;/strong&gt;&lt;br&gt;
2 &lt;strong&gt;Organizational&lt;/strong&gt;&lt;br&gt;
3 &lt;strong&gt;Operational&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Engineers are already familiar with the technical domain. Many find their ceilings here because it's easy to be distracted by matters of code. However,  to break past that ceiling, an engineer needs to exercise critical thinking in all three domains. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmuaq3agbigv2xkrik6g0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmuaq3agbigv2xkrik6g0.jpg" alt="A laptop with a code editor open."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Domain
&lt;/h3&gt;

&lt;p&gt;Writing code is easy, but figuring out which code to write is not. For any given feature, we could write it a hundred different ways. And while there is no "right" way to write it, we can strive towards &lt;a href="https://cole.codes/posts/hard-to-read-coding-with-communication" rel="noopener noreferrer"&gt;writing code that is easier to read and maintain&lt;/a&gt;. Every line is a choice that makes tradeoffs to strive towards a healthier codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what makes a healthy codebase?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clarity&lt;/li&gt;
&lt;li&gt;Direction&lt;/li&gt;
&lt;li&gt;Consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A healthy codebase has &lt;strong&gt;clarity&lt;/strong&gt;, where new changes are easy to implement against a known path. Implementing new routes, creating new interfaces, and deploying new APIs; tasks like these are straightforward. Struggles in clarity happen when a codebase has too many layers of redirection, multiple mechanisms for the same task, or insufficient tooling and documentation. These together can help make the codebase more accessible to all contributors.&lt;/p&gt;

&lt;p&gt;A healthy codebase has a path forward, called **direction. **When considering _tech debt, _the deferred cost of a short-term solution, a healthy codebase is well-documented and guarded by tooling that helps the developer to be productive. A good sense of direction is when tech debt is easy to silo so that it does not impact the rest of the codebase. &lt;/p&gt;

&lt;p&gt;Lastly, a healthy codebase has &lt;strong&gt;consistency&lt;/strong&gt; in its use of patterns. This means that what happens in one place of the codebase, is expected to happen elsewhere. Consistency is a spectrum where patterns align together. When there are many contributors over time, multiple patterns can emerge. Inconsistencies can also emerge when introducing new tooling or patterns. On the other hand, these are only problems when there is a lack of clarity or direction in the codebase.&lt;/p&gt;

&lt;p&gt;A healthy codebase has a healthy balance of all three devices: clarity, direction, and consistency. When talking through the technical domain, these devices are useful tools for expressing the impact of technical decisions. However, engineers also need to think beyond the codebase. After all, the choices we make have an impact on the whole team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0umpvdn4peckt3ge5cpd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0umpvdn4peckt3ge5cpd.jpg" alt="An empty office with a dozen office chairs lined in cubicles."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Organizational Domain
&lt;/h3&gt;

&lt;p&gt;An &lt;em&gt;organization&lt;/em&gt; is a group of people or a company. In engineering, an organization could mean multiple groups of people: the whole company, a specific team, or a group of code owners. The decisions that engineers make affect more than the codebase — they affect these groups of people too. Being thoughtful about the organization is helpful for making better decisions to benefit these groups.&lt;/p&gt;

&lt;p&gt;The **organizational domain **is where thoughtfulness and decisionmaking can impact these groups. An engineer exercises this domain when starting inward and reflecting outward on how decisions impact their peers and collaborators. Consider a codebase as a product of its own. Reflect on the users of this product, contributors to the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To reflect in this domain, we can ask the following questions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who will maintain this decision in the short-term?&lt;/li&gt;
&lt;li&gt;How will this decision be adopted by external contributors?&lt;/li&gt;
&lt;li&gt;What impact does this decision have to make future decisions?&lt;/li&gt;
&lt;li&gt;When is the right time to make this decision?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final question to ask, considering the inputs above, is: &lt;em&gt;why?&lt;/em&gt; When we ask why we're considering the tradeoffs being made in the organizational domain. Finally, when we ask this question we also need to ask the inverse: &lt;em&gt;why not?&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Thinking through these problems is how engineers elevate their problem-solving skills to the organization. Reflecting on how decisions impact these groups of people, is how engineers become more effective. The organizational domain is how engineers apply their problem-solving skills to the needs of the group. This takes us into our next domain, where we apply problem-solving skills to operations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjpi46axf1y917cea0fp3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjpi46axf1y917cea0fp3.jpg" alt="A chart demonstrating growth."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Operational Domain
&lt;/h3&gt;

&lt;p&gt;The final domain we will cover is &lt;strong&gt;the operational domain&lt;/strong&gt;. This domain is where problem-solving skills are applied to the impact on &lt;em&gt;processes&lt;/em&gt;. The previous domains (technical and organizational) have so far focused on &lt;em&gt;things&lt;/em&gt; and &lt;em&gt;people&lt;/em&gt;. In this domain, we focus on the impact on things and people over time.&lt;/p&gt;

&lt;p&gt;When working in product development, we often talk about &lt;a href="https://cole.codes/posts/the-minimum-viable-product-mvp" rel="noopener noreferrer"&gt;how to build a minimum viable product.&lt;/a&gt; The first process is the one in which we brainstorm and plan before building. In this process, we talk about the &lt;em&gt;scope&lt;/em&gt; of the development, meaning what's included. In this process, it's also helpful to ask: what's not included? Through this process, engineers collect a list of &lt;em&gt;requirements&lt;/em&gt;, the needs of the development to fulfill the scope. Together, scope and requirements are useful tools for talking about the development process.&lt;/p&gt;

&lt;p&gt;What about the processes that happen after the code is written? Writing the code is easy, however, &lt;strong&gt;engineers should be mindful of the following technical process that happen afterward:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code Review&lt;/li&gt;
&lt;li&gt;Building and Deployment&lt;/li&gt;
&lt;li&gt;Integration into the Mainline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to these processes, our thoughtfulness and decisions can have latent effects that impact how we implement and integrate in the future. &lt;strong&gt;Moreover, there can be effects on the organizational and operational processes, such as:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who needs to be involved in the decision-making process?&lt;/li&gt;
&lt;li&gt;How does the scope today affect the requirements for tomorrow?&lt;/li&gt;
&lt;li&gt;What requirements can better prepare any incremental efforts?&lt;/li&gt;
&lt;li&gt;Are there opportunities to generalize the approach to scale for other initiatives?&lt;/li&gt;
&lt;li&gt;After the decision is settled, who needs to be informed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Questions like these are effective tools for communication and reflection.&lt;/strong&gt; When communicating in product development, asking these questions can help make an engineer more effective in the process. Reflecting on these answers will also make you a more critical thinker that can influence others at the table.&lt;/p&gt;

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

&lt;p&gt;This framework of thinking is effective for software engineers to become more thoughtful and productive. Being thoughtful about the technical, organizational, and operational domains — will give you the tools to level up as a developer. Effective engineering is not writing the perfect code, but rather identifying how to apply problem-solving skills throughout the entire process. Harnessing communication in your career will help you become more impactful and influential beyond technical ability. The T.O.O framework reconciles these two areas to help you think through the domains and harness communication as a skill.&lt;/p&gt;

&lt;p&gt;Photos by &lt;a href="https://unsplash.com/@goshua13" rel="noopener noreferrer"&gt;Joshua Aragon&lt;/a&gt;, &lt;a href="https://unsplash.com/@kate_sade" rel="noopener noreferrer"&gt;Kate Sade&lt;/a&gt; and &lt;a href="https://unsplash.com/@isaacmsmith" rel="noopener noreferrer"&gt;Isaac Smith&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Should I become a Web Developer?</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Mon, 17 Aug 2020 06:02:10 +0000</pubDate>
      <link>https://dev.to/coleturner/should-i-become-a-web-developer-57eb</link>
      <guid>https://dev.to/coleturner/should-i-become-a-web-developer-57eb</guid>
      <description>&lt;p&gt;So you want to know more about web development, or how to become a web developer. Web development (and design) can be a rewarding career for many who enjoy building applications that serve the entire world. Here's what you want to know about web development, whether it's a good career path, and when's the best time to break in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is web development?
&lt;/h2&gt;

&lt;p&gt;Web development is a kind of software engineering where the product is an application that is made to be run in a web browser. In contrast to back-end engineering, web development is an umbrella of front-end and sometimes back-end engineering, where the application needs to run against a variety of clients (Chrome, Firefox, Safari, etc).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You might find yourself asking: is web development just HTML, CSS, and JavaScript?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those are the programming languages that are used in web development, however the facets of web development span multiple categories. Those categories include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cole.codes/blog/user-interface"&gt;User interface&lt;/a&gt; and &lt;a href="https://cole.codes/blog/user-experience"&gt;User Experience&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cole.codes/blog/accessibility"&gt;Accessibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cole.codes/posts/search-engine-optimization-essentials-for-web-developers"&gt;Search Engine Optimization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;API, such a &lt;a href="https://cole.codes/blog/graphql"&gt;GraphQL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bundling and Delivery (Webpack, Serverless, etc)&lt;/li&gt;
&lt;li&gt;Performance and &lt;a href="https://cole.codes/blog/testing"&gt;Testing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;and more!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You don't need to be an expert in all of these categories&lt;/strong&gt;, however, having an understanding of how each category factors in the scope of building web apps can broaden your skillset and impact.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZSPdsax0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p9qdgaojhah524vnc4lx.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZSPdsax0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p9qdgaojhah524vnc4lx.jpeg" alt="A markup joke that shows the different realms of web development as HTML tags."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User interface and experience&lt;/strong&gt; are the processes of designing and developing how a user makes meaning from your web application. The structures and flow of the interface come together to guide the user to where we want them to go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility&lt;/strong&gt; is how we make our interfaces easier to use by everyone. This is essential for creating applications that can be used by people with various impairments, including: visual, auditory, cognitive, and motor impairments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search Engine Optimization&lt;/strong&gt; is the process of making web pages more accessible by a certain kind of user: robots! This area of expertise is centered around helping crawlers better understand how to index content in your web application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API is the way in which your web application gathers data&lt;/strong&gt; from external sources, and how it interfaces with the services that power the application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bundling and delivery&lt;/strong&gt; are the domains that deal with how the web application reaches the client from the server. This includes packaging the HTML, CSS, and JavaScript. Understanding this domain will also have an impact on how well your web application reaches a global audience, where some users may have limited bandwidth or hardware. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance and Testing&lt;/strong&gt; include some of the topics listed above, however, I've called it out as a separate category. To be effective in these categories requires some deeper understanding of the entire picture - from broad strokes to fine details. These areas of knowledge help keep our applications running smoothly and easier to maintain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4krnifSy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/blg3ynw0npc3c5kg8zs6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4krnifSy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/blg3ynw0npc3c5kg8zs6.png" alt="A woman and a man pair programming."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Does web development have a good career path?
&lt;/h2&gt;

&lt;p&gt;Folks worry too much about whether they should start out as a front-end engineer, back-end engineer, or try to make the leap to full-stack. &lt;a href="http://localhost:3000/posts/ask-me-anything-front-end-edition#what-are-your-thoughts-on-gpt-3-potentially-making-a-lot-harder-for-developers-to-get-jobs-in-the-future"&gt;Other folks worry whether Machine Learning or GPT-3 will put us all out of business&lt;/a&gt;. There is an understandable concern about whether &lt;a href="https://cole.codes/posts/ask-me-anything-career-development#do-you-think-front-end-development-is-hard-to-break-into-for-someone-who-has-just-started-should-i-focus-on-full-stack"&gt;front-end development is hard to break into&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, it's always been difficult to break into this industry. Up until just recently, having a computer science degree was a requirement for many job postings (and it still is sometimes). Job postings will also say they accept equivocal years of experience in the industry. If you are a self-taught engineer or don't have some kind of educational background in the industry - then finding that first job is a struggle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To break into the industry today, there are several paths:&lt;/strong&gt;&lt;br&gt;
1 Have a computer science degree, or relevant education (bootcamp, internship, etc).&lt;br&gt;
2 Build a portfolio of freelance or contract projects&lt;br&gt;
3 Work in open source or community developer relations&lt;/p&gt;

&lt;p&gt;All three of these paths take a lot of hard work. Newcomers are often afraid of these options because the hustle requires a large upfront investment. You don't need a degree, or to go to a bootcamp, to make that happen. Try taking a few online courses for free to gauge your interest. There's a lot of work that you can do on your own.&lt;/p&gt;

&lt;p&gt;Once you get that first job, it becomes easier and easier over time. Similar to any other industry, web development is a mixed bag of really great jobs to not-so-great jobs. I spent a lot of time in the realms of freelance, contracting, startups, and now corporate development. Any of these realms can be rewarding, depending on what you're looking for and the effort you put in.&lt;/p&gt;

&lt;p&gt;The trouble is that many of the not-so-great jobs are front-loaded, which discourages many bright minds from continuing into more rewarding roles. Once you move past that junior role, your compensation can increase by anywhere from 50% to 100%. Everyone starts as a junior. &lt;/p&gt;

&lt;p&gt;What I love about web development are the challenges, the rewards, and the impacts. Building a web application is a thoughtful process as described in &lt;em&gt;&lt;strong&gt;What is Web Development?.&lt;/strong&gt;&lt;/em&gt;_ _That process opens the door for a web application to reach millions to billions of people around the world. It's a very rewarding process when you build a web application that reaches people and has an impact on their lives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d6W9u62E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cu45yc0lv4980091at47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d6W9u62E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cu45yc0lv4980091at47.png" alt="A coder on an old computer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the right age to start a career in web development? Am I too old?
&lt;/h2&gt;

&lt;p&gt;The tech industry often attracts a younger crowd because as an industry, it often contributes to the evolving cultural moment. Tech fuels our lives: from shopping to entertainment, health and fitness, and the world around us. But there's no upper limit on breaking into the industry. People join the industry in their 30's, 40's, 50's, 60's. The world's oldest programmer, Masako Wakamiya, &lt;a href="https://observer.com/2019/12/apple-ceo-tim-cook-visit-japan-meet-world-oldest-youngest-app-developer/#:~:text=On%20his%20first%20day%20in,the%20youngest%20in%20her%20profession."&gt;was 82 when she released her first app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Maturity will be your compass, and will actually help you stand out from some of the younger developers who require more experience in communication and essential skills. While there are some jobs that bias towards younger crowds (because youth can be exploited), the paths described above still apply to anyone.&lt;/p&gt;

&lt;p&gt;That first job will still take some hustling, and so choosing a path that aligns with your goals and expectations will help guide you. People of all ages expect that when they get a job in the industry, they will start somewhere in the mid to senior levels. They expect this because they are following the folks who have already broken that first ceiling. Patience and persistence will get you where you want to go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every age is the right age to start a career in web development.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why become a web developer?
&lt;/h2&gt;

&lt;p&gt;If you've made it this far into this post, then it's likely that you are on the fence and leaning towards becoming a web developer. That's the first step. If you're still deciding, here are some great reasons to become a web developer:&lt;br&gt;
1 You enjoy learning and solving problems.&lt;br&gt;
2 You want to create things that are used by people around the world.&lt;br&gt;
3 It's a good source of income and livelihood.&lt;/p&gt;

&lt;p&gt;Or maybe you have your own reasons. Let me know what your reasons are, or if this post was helpful. Message me on Twitter (&lt;a href="https://twitter.com/coleturner"&gt;@coleturner&lt;/a&gt;).&lt;/p&gt;

</description>
      <category>career</category>
      <category>web</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Hard to Read: Coding, with Communication</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Sat, 08 Aug 2020 22:04:17 +0000</pubDate>
      <link>https://dev.to/coleturner/hard-to-read-coding-with-communication-ada</link>
      <guid>https://dev.to/coleturner/hard-to-read-coding-with-communication-ada</guid>
      <description>&lt;p&gt;Have you ever opened your pull request and then received this comment?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is hard to read, could you change this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why has this happened to everyone?
&lt;/h2&gt;

&lt;p&gt;Source code is just like any other kind of language: it's a construct of &lt;strong&gt;&lt;em&gt;symbols&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;grammar&lt;/em&gt;&lt;/strong&gt; that make up meaning. When people say "that's hard to read," what they mean is one of a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's hard to make sense of the symbols.&lt;/li&gt;
&lt;li&gt;It's not easy to follow the grammar.&lt;/li&gt;
&lt;li&gt;This is not something I have seen before.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source code is a diverse language just like any verbal language. We each have our own code dialect. In JavaScript, we do our best to normalize the inputs through tools like ESLint, Prettier, and TypeScript. They establish a common language of symbols, grammar, and sometimes a dictionary and thesaurus. And we make sense of it all, through the use of symbols and grammar in the code.&lt;/p&gt;




&lt;h3&gt;
  
  
  Sense of Symbols
&lt;/h3&gt;

&lt;p&gt;There's a great Cingular commercial from 2007, where a mom and her kid are communicating about their texting bill. &lt;/p&gt;

&lt;p&gt;Watch &lt;a href="https://www.youtube.com/watch?v=4nIUcRJX9-o"&gt;Cingular Commercial - 'bff Jill'&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you immediately recognize the symbol &lt;strong&gt;idkmybffjill&lt;/strong&gt;, then you might not find that hard to read. On the other hand, if you've never seen that symbol before or you recognize some of the contents, you will find that symbol hard to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's look at some code examples.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hard to Read: Sense of Symbols - Variable Names&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// https://davidwalsh.name/javascript-debounce-function&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This function is hard to read because all of the meaning has been obfuscated through obtuse variable names. All of the meaning is encoded in the implementation, without any &lt;em&gt;content words.&lt;/em&gt; This confusion stems from a lack of recognition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did you guess that this function is a &lt;em&gt;throttle?&lt;/em&gt; If so, then I'm sorry because I took this opportunity to trick you. This function is actually &lt;em&gt;debounce.&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
I won't do that again! But I do want to share another example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hard to Read: Sense of Symbols - Unfamiliar Syntax&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Houseplant&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// private fields&lt;/span&gt;
  &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Untitled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;species&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unknown species&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;species&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;species&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;species&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// from upcoming tc39/proposal-record-tuple&lt;/span&gt;
  &lt;span class="nx"&gt;toRecord&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;species&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;species&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the example above, I am referencing some unusual syntax, from a new class properties functionality called &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields"&gt;Private Fields&lt;/a&gt;. The &lt;em&gt;toRecord&lt;/em&gt; function also makes use of a current proposal for &lt;a href="https://github.com/tc39/proposal-record-tuple"&gt;Records and Tuples&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Both instances are making use of the &lt;em&gt;#&lt;/em&gt; sign to represent different functionality. This is confusing, and potentially hard to read because it lacks familiarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confusion by Sense of Symbols&lt;/strong&gt; is primarily an issue for folks who are new to the industry or new to the language. Due to a lack of recognition or a lack of familiarity, they might find themselves saying &lt;em&gt;"that's hard to read."&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Sense of Grammar
&lt;/h3&gt;

&lt;p&gt;Once a developer has become more familiar with a language, the struggle with code becomes a matter of grammar. It is the same struggle with learning any kind of verbal language, where the words start to make sense and the trouble becomes acclimating to the grammar.&lt;/p&gt;

&lt;p&gt;Let's look at an example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hard to Read: Sense of Grammar - Overloaded Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;pickColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isTimeOfDay&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;evening&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;light&lt;/span&gt;
      &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;light&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When the time of day evening, when the theme is light, what is the color?&lt;/p&gt;

&lt;p&gt;For most people, it will take more than &lt;em&gt;ten seconds&lt;/em&gt; to find the answer to that question. Most developers will say this code is hard to read and repeat a tactical answer about nesting ternaries, instead of highlighting the communicative issue at hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confusion by Sense of Grammar&lt;/strong&gt; is when the structure goes against the expected rules of grammar. What one developer thinks is "&lt;em&gt;hard to read"&lt;/em&gt; is another developer's groove.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who gets to decide?
&lt;/h2&gt;

&lt;p&gt;Some might say &lt;a href="https://en.wikipedia.org/wiki/Brendan_Eich"&gt;Brendan Eich&lt;/a&gt;, who in 1995 invented the scripting language Mocha that would later be known as JavaScript. Others might say TC39, the committee that oversees the evolution of the language today. That is a view on linguistics called &lt;a href="https://en.wikipedia.org/wiki/Linguistic_prescription"&gt;&lt;em&gt;prescriptivism&lt;/em&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;But we know that a language, even for programming, is defined through its usage. Languages we have today evolved because someone made a change. This is a view called &lt;a href="https://en.wikipedia.org/wiki/Linguistic_description"&gt;&lt;em&gt;descriptivism&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The answer is...
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"It's harder to read code than to write it"&lt;/p&gt;

&lt;p&gt;—Joel Spolsky, &lt;a href="http://www.joelonsoftware.com/articles/fog0000000069.html"&gt;Things You Should Never Do, Part I&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're soloing it, then what's easy to read is whatever choices make you feel more productive. When you're a part of a team or a community - the code language is the sum of all the inputs, that which makes the group feel more productive and effective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If it cannot be enforced with tooling or documentation, then it's a &lt;em&gt;matter of preference&lt;/em&gt;&lt;/strong&gt;. That is where tools like ESLint, Prettier, and Typescript excel at what they do: enforcing consistency. They keep developers in their lanes. The code language then becomes "what made sense when we configured our tooling." Preferences aren't usually helpful to leave as a comment to someone else's work unless it can be expressed in terms of &lt;em&gt;&lt;strong&gt;semantic and cognitive weights&lt;/strong&gt;&lt;/em&gt; for our uses of symbols and grammar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most developers only talk about familiarity.&lt;/strong&gt; What matters is how much effort is spent mentally following the code. For example, abstractions (moving the symbols away) can lead to &lt;a href="https://shazow.net/posts/code-boilerplate-is-it-always-bad"&gt;disproportionate indirection&lt;/a&gt; (distributing the grammar), making it harder to follow the code. Symbols can be used in place of grammar. All of this adds up to &lt;em&gt;&lt;strong&gt;code language fluency.&lt;/strong&gt;&lt;/em&gt; This kind of feedback is something we need to grow away from, and trust in tooling and documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We should be vulnerable and empathetic instead.&lt;/strong&gt; It's on us to try to understand and trust the coder who already did the work. As reviewers, we can describe the impact it has on the &lt;em&gt;semantic and cognitive weights.&lt;/em&gt; Saying "&lt;em&gt;that's hard to read&lt;/em&gt;" is no different than telling someone their verbal language is difficult to understand. When working with others, we have to understand that the common language is the lowest common denominator among the group, not the average familiarity. &lt;/p&gt;

&lt;p&gt;Codebase language is an evolving negotiation. Sometimes boilerplate is boilerplate. Other times it's keeping the semantic and cognitive weights balanced. It's important to understand that our familiarity with syntax, symbols, and grammar — isn't dictated by who wrote the code first. It is through the continued and evolving use amongst all using that codebase language.&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@olloweb?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Agence Olloweb&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>career</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Optimize SVG images for the Web</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Thu, 06 Aug 2020 08:27:25 +0000</pubDate>
      <link>https://dev.to/coleturner/optimize-svg-images-for-the-web-4ako</link>
      <guid>https://dev.to/coleturner/optimize-svg-images-for-the-web-4ako</guid>
      <description>&lt;p&gt;Scalable Vector Graphics (SVG) images are the bee's knees, that cat's meow. For those unfamiliar with those idioms, what I mean to say is that I love to use SVG images whenever possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There are a few reasons why SVGs are great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They can be scaled up and down without distortion.&lt;/li&gt;
&lt;li&gt;Vector graphics are usually smaller in file size.&lt;/li&gt;
&lt;li&gt;The ability to use animations and transitions on layers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Optimize an SVG
&lt;/h2&gt;

&lt;p&gt;As you develop your web application, the SVG files are usually exported from programs like Sketch or Adobe Illustrator. On the other hand, you could also be using icons from websites like &lt;a href="https://www.iconfinder.com/"&gt;Iconfinder&lt;/a&gt; or &lt;a href="https://www.flaticon.com/"&gt;Flaticon&lt;/a&gt;. These files usually contain a rich set of metadata and paths that include points used by designers. Unless you are using those specific paths and points in your application, they can be optimized to further reduce the file size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is a really awesome tool called &lt;a href="https://github.com/svg/svgo"&gt;SVGO&lt;/a&gt;&lt;/strong&gt; which will process and optimize your SVG files. It can remove excessive markup and metadata, optimize and clean paths, and minify the output. It can be included in your build process, or run independently.&lt;/p&gt;

&lt;p&gt;Even better than the command line interface, is a website created by &lt;a href="https://twitter.com/jaffathecake"&gt;Jake Archibald (@jaffathecake)&lt;/a&gt;, called &lt;a href="https://jakearchibald.github.io/svgomg/"&gt;"SVGO Missing GUI" or SVGOMG&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/3Ycg8OIk4WNxrKLiFtaDVq/56fbf0a16c764ed454dfafa6d959335e/Screen_Shot_2020-08-06_at_12.49.56_AM.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/3Ycg8OIk4WNxrKLiFtaDVq/56fbf0a16c764ed454dfafa6d959335e/Screen_Shot_2020-08-06_at_12.49.56_AM.png" alt="Demo of SVGOMG optimizing an SVG image."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From here we can upload or paste our source code into the REPL, toggle the options, and easily gather the output for use in our HTML and JavaScript.&lt;/p&gt;

&lt;p&gt;In the example above, we can see how &lt;strong&gt;&lt;em&gt;it saved 68%&lt;/em&gt;&lt;/strong&gt; for such a small icon. When you're working with a lot of icons, or larger vector graphics, it can make a noticeable impact on your overall application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better bundle sizes mean your web app is faster, more responsive, and reaches more customers around the world. 68% is great!&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://jakearchibald.github.io/svgomg/"&gt;Try it for yourself!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimizing an SVG for React
&lt;/h2&gt;

&lt;p&gt;If you're building your web application with React, it is not as easy to copy and paste the SVG output into your application. React uses the naming convention from JavaScript objects to create HTML elements. Instead of &lt;strong&gt;stroke-width&lt;/strong&gt;, we use** strokeWidth** in JSX.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixing all of those attributes takes too much time, and so enter: &lt;a href="https://react-svgr.com/"&gt;React SVGR&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/6htUdj8eezTCQYUucvbhra/f1fcd3a099271edf36c55c16cc3f03ea/Screen_Shot_2020-08-06_at_1.06.17_AM.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/6htUdj8eezTCQYUucvbhra/f1fcd3a099271edf36c55c16cc3f03ea/Screen_Shot_2020-08-06_at_1.06.17_AM.png" alt="Demo of React SVGR Playground"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similarly, React SVGR is also a node API, command line client, and most importantly - &lt;a href="https://react-svgr.com/playground/"&gt;a GUI playground&lt;/a&gt;. Using this tool, we can paste our SVG output from SVGO and it will output a React component.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimize with SVGO or SVGR Playground
&lt;/h3&gt;

&lt;p&gt;In the example above, we can see that SVGR does have an integration with SVGO if you have a JSON config object on hand. However, I rarely carry that around with me as I am developing - so I generally optimize with SVGO first and then paste the output into SVGR.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copy, Paste, Copy, and Paste Again
&lt;/h3&gt;

&lt;p&gt;With these tools, you can deliver the most optimized version of vector graphics in your web application. Whether you're using React.JS, or vanilla HMTL and JavaScript - these tools have you covered.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Now we're cooking with some gas - You&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jakearchibald.github.io/svgomg/"&gt;SVGOMG Playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://react-svgr.com/playground/"&gt;SVGR Playground&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@lishakov?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Andrej Lišakov&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>ui</category>
      <category>react</category>
    </item>
    <item>
      <title>How to Write a Software Engineer Resume</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Thu, 06 Aug 2020 06:07:15 +0000</pubDate>
      <link>https://dev.to/coleturner/how-to-write-a-software-engineer-resume-51b2</link>
      <guid>https://dev.to/coleturner/how-to-write-a-software-engineer-resume-51b2</guid>
      <description>&lt;p&gt;Your resume is the key to the door for your next job. If you're looking to land that next role, here are the awesome tips you need to know to make your resume stand out from the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before You Write the Resume
&lt;/h3&gt;

&lt;p&gt;The most effective resume speaks to the audience. Before you start on your resume, ask yourself: who is my audience? In most cases, that audience is a recruiter, a hiring manager, and ... robots?&lt;/p&gt;

&lt;h3&gt;
  
  
  The Resume Funnel
&lt;/h3&gt;

&lt;p&gt;That's right, robots are reading your resume! Before a recruiter or hiring manager sees it, a robot will parse and read the resume. When you submit your resume in a form online, via LinkedIn, and even sending it via email; it all goes through a robot. It's super helpful to know how your resume makes it through the funnel so that we can optimize it to make it further.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/6G2zXs6GDWfLNrHTamoy0a/31e90dc91f9af4a6b2a92906349910b2/Screen_Shot_2020-08-04_at_10.55.40_PM.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/6G2zXs6GDWfLNrHTamoy0a/31e90dc91f9af4a6b2a92906349910b2/Screen_Shot_2020-08-04_at_10.55.40_PM.png" alt="Example Resume Funnel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This graphic visualizes just how many resumes make it from the initial submission down the funnel. When a company is hiring a software engineer, a recruiter will screen submissions using an &lt;strong&gt;Applicant Tracking System (ATS).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These systems parse a software engineer's resume to fit in the system. In addition, it will highlight the keywords that fit the job description. Recruiters have one of the hardest jobs of all, finding the best submissions. When a recruiter is trying to find software engineers, this is how they're looking for leads to reach out to:&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/2vdUsAwmg7lVcgAPk2nu1F/2fd3a37bf3d84ed944d732bf41a8af44/image.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/2vdUsAwmg7lVcgAPk2nu1F/2fd3a37bf3d84ed944d732bf41a8af44/image.png" alt="Example of Applicant Tracking System List"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wow, that's a lot of resumes!&lt;/strong&gt;&lt;br&gt;
Once your resume makes it here, it's all about the content of your resume. A recruiter will prioritize the candidates with the best resumes and set up an initial call. To get there, you will need to format and write a kickass resume.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formatting Your Resume for Success
&lt;/h3&gt;

&lt;p&gt;Software engineer resumes need to be ATS-ready. To get there, here are the top tips you will want to know:&lt;br&gt;
1 &lt;strong&gt;Use .doc format when uploading, PDF when emailing.&lt;/strong&gt;&lt;br&gt;
2 &lt;strong&gt;Avoid complicated layouts, such as tables or columns.&lt;/strong&gt;&lt;br&gt;
3 &lt;strong&gt;Use standard fonts and bullet points.&lt;/strong&gt;&lt;br&gt;
4 &lt;strong&gt;No images&lt;/strong&gt;&lt;br&gt;
5 &lt;strong&gt;One page, no more or less.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These tips will help you format your resume in a way that the ATS systems understand, to get through the top of the funnel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cdn.shopify.com/s/files/1/2461/6249/files/Sheets_Giggles_Resume_Template_3f2d35d0-b240-4975-88de-9ce2e1e8fccc.docx?v=1586136809"&gt;Here is an ATS Resume Template you should use to get started&lt;/a&gt;, created by &lt;a href="https://www.reddit.com/r/jobs/comments/7y8k6p/im_an_exrecruiter_for_some_of_the_top_companies/"&gt;an ex-recruiter who worked at top companies and screened thousands of resumes.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does a software engineer get their resume further down the funnel?&lt;/strong&gt;&lt;br&gt;
Let's talk about how you can leverage ATS-formatting, and write a kickass resume that will get you more attention from the top of the funnel, to increase your chances of getting an interview.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Write Your Resume
&lt;/h2&gt;

&lt;p&gt;This is your moment to wow the recruiter and the hiring manager. Resumes are all about selling yourself - describing your abilities and your impact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before we get into some specifics, here are some general tips you should know:&lt;/strong&gt;&lt;br&gt;
1 Use a new bullet point for each responsibility, role, or other ability you're describing.&lt;br&gt;
2 Be specific, use action verbs.&lt;br&gt;
3 Be honest! Do not embellish or lie on your resume.&lt;br&gt;
4 Include metrics or statistics that can demonstrate impact and value.&lt;/p&gt;

&lt;p&gt;With that in mind, let's get into some really helpful specifics.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/1oXIdo7CUZqWcBm6qw8Ydb/bff91ea955573c9d884599502d7c6049/image.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/1oXIdo7CUZqWcBm6qw8Ydb/bff91ea955573c9d884599502d7c6049/image.png" alt="Star symbol cut out of a concrete wall."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The STAR Method
&lt;/h3&gt;

&lt;p&gt;When you are describing your position, you will want to use the &lt;strong&gt;STAR Method.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Situation:&lt;/strong&gt; Your role and responsibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task:&lt;/strong&gt; Demonstration of applying your expertise in that role.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; The efforts you made, whether acting alone, collaborating, or delegating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; The outcome of that action, including the value and impact it had on the team and the company or business.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using this framing method, we will extract the most value out of our resume and create meaningful statements that are great conversation points when talking to recruiters and managers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's Look at an Example:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wrote code in HTML, JavaScript, and CSS for website application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;That's a good start!&lt;/strong&gt;&lt;br&gt;
We could do better to capture the STAR power of this resume item. Almost every software engineer with a resume will have something like this on their first draft. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To add that STAR power, ask questions like:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is unique or influential about the situation?&lt;/li&gt;
&lt;li&gt;How does the task relate to the job description?&lt;/li&gt;
&lt;li&gt;What actions are the hiring manager looking for?&lt;/li&gt;
&lt;li&gt;Why does the result matter to the company I want to work for?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions will help you frame your resume items, so that you can say something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Developed a single-page front-end application using HTML, JavaScript (JS), and CSS - to optimize the responsiveness, which increased conversion rate from 2% to 7%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Much Better!&lt;/strong&gt;&lt;br&gt;
With this change of wording we can see how this stands out from the example we saw earlier. Bring STAR power to all of your experience.&lt;/p&gt;




&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/5zs6GBiB0EZyIKFI6dBB9e/c3ffeb191de1bca6fc0bf182af107c82/image.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/5zs6GBiB0EZyIKFI6dBB9e/c3ffeb191de1bca6fc0bf182af107c82/image.png" alt='Word tiles spelling "Choose your Words"'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Be Mindful of Your Language
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Mirror the Job Description Language
&lt;/h4&gt;

&lt;p&gt;When you're writing your resume, you will want to use the keywords that appear in the job description. So for example, if you are applying for a "Software Engineer" position, you will want to say that somewhere in your resume. On the other hand, if the position is titled "Web Application Developer," then you will want to incorporate that as well.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sprinkle in some Synonyms
&lt;/h4&gt;

&lt;p&gt;So from our example above, "Developed a single-page application," we will also want to expand on the word "developed." Here are some other words that you will want to capture in your descriptions to broaden the appeal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implemented&lt;/li&gt;
&lt;li&gt;Architected&lt;/li&gt;
&lt;li&gt;Engineered&lt;/li&gt;
&lt;li&gt;... and so on!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using synonyms in addition to the keywords will allow your resume to match as many job descriptions as possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  Don't Sell Yourself Short!
&lt;/h4&gt;

&lt;p&gt;A description that is too vague or too short can come across as uninspiring. When in doubt, use the STAR method. A resume doesn't need to be ten pages long, however, it does need to be long enough to evoke curiosity.&lt;/p&gt;

&lt;p&gt;If your resume is shorter than a page, you will want to create more experience before you start sending that resume out. &lt;/p&gt;

&lt;h4&gt;
  
  
  Leave Some to the Imagination
&lt;/h4&gt;

&lt;p&gt;Similar to the point above, a resume is meant to be used to match against a job description and fulfill a recruiter's requirements. From there, the purpose of a resume is to inspire and evoke curiosity from a hiring manager and the interview panel. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One Page&lt;/strong&gt; is the optimal length for a resume. You only need to highlight the last few positions that are relevant. Even if you have decades of experience, your resume needs to be compelling enough to leave an impression **within ten seconds. **When you're at the top of the funnel, that is about how long someone will glance at your resume before moving on to the next one.&lt;/p&gt;

&lt;p&gt;A description that is loaded with responsibility and impact, or runs on more than a sentence or two - can actually have the reverse effect! Too much of a description can come across as appearing to know too little or give the impression of overselling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's an example:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Designed a webpage using Photoshop, creating multiple layers and exporting them via a PNG. Collaborated with engineering to deliver the PNG in a ZIP file. Planned and coordinated the delivery before the agreed upon timelines. Communicated with the team to revise the delivery throughout the project.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A statement like this can undervalue your position. Why this happens is because when we look back at the STAR method - this description is mostly a given. It is expected that a designer would perform these tasks, and it doesn't add much value to those expectations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's look at that, with a little more STAR power:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Designed a webpage in collaboration with engineering, working cross-functionally with the project team to deliver ahead-of-time. This resulted in us reaching the market before our competition.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now that's a star! The difference here is how much value the designer brought to the role, exceeding the expectations.&lt;/p&gt;

&lt;h4&gt;
  
  
  Avoid Skills Lists
&lt;/h4&gt;

&lt;p&gt;Many of the resumes that get filtered out at the top of the funnel will have a giant cloud of keywords that are meant to fool the ATS robots. This is called &lt;em&gt;&lt;strong&gt;keyword stuffing&lt;/strong&gt;&lt;/em&gt;. What happens is that an innocent software engineer will create a skills list that they used at a position, and the robot will interpret this as keyword stuffing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Skills: React, Photoshop, Microsoft Word&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What you want to do instead is take the most important skills that are relevant to the hiring position, and express those at bullet points in your resume items.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Developed a React web application to display order inventory.&lt;/p&gt;

&lt;p&gt;Optimized web assets using Photoshop to reduce application size.&lt;/p&gt;

&lt;p&gt;Collaborated on project specifications using Microsoft Word.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In some cases, a particular skill can be so ubiquitous to the role that it's not worth including at all. If the skill is very common, it is only worth mentioning if it added value or made an impact on the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the Job
&lt;/h2&gt;

&lt;p&gt;You've written your resume, formatted it to be ATS-ready, and demonstrated your STAR power. Now it's time to submit your resume, right?&lt;/p&gt;

&lt;p&gt;Before you submit your resume, do one final check. Find the job description and compare it with your resume. You should have included similar keywords such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Job Title&lt;/li&gt;
&lt;li&gt;Situation and Action Words from the hiring position&lt;/li&gt;
&lt;li&gt;Keywords from the hiring description&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you've done that, review your resume and submit it! You've done everything right, and your resume is ready to go.&lt;/p&gt;




&lt;p&gt;If you found these tips helpful, or you have some advice you would like to add - you can &lt;a href="https://twitter.com/coleturner"&gt;reach out to me on Twitter (@coleturner).&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photos by: &lt;a href="https://unsplash.com/@markuswinkler"&gt;Markus Winkler&lt;/a&gt;, &lt;a href="https://unsplash.com/@gatismurnieks"&gt;Gatis Murnieks&lt;/a&gt;, &lt;a href="https://unsplash.com/@brett_jordan"&gt;Brett Jordan&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>performance</category>
      <category>frontend</category>
      <category>resume</category>
    </item>
    <item>
      <title>JavaScript ES6 Symbols</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Sat, 01 Aug 2020 03:37:25 +0000</pubDate>
      <link>https://dev.to/coleturner/javascript-es6-symbols-a-metaprogramming-primitive-c3b</link>
      <guid>https://dev.to/coleturner/javascript-es6-symbols-a-metaprogramming-primitive-c3b</guid>
      <description>&lt;p&gt;The JavaScript &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol"&gt;Symbol&lt;/a&gt; is a primitive data structure that has a unique value. They can be used as identifiers since no two symbols are the same. Unlike strings, Symbols can be used to create properties that don't overlap with other libraries or modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sym&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;namedSymbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;sym&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;namedSymbol&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;sym&lt;/span&gt; &lt;span class="c1"&gt;// "symbol"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;namedSymbol&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Symbol(javascript)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;namedSymbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// javascript&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Pretty neat, now our JavaScript app can uniquely identify properties without any risk of colliding with another identifier. But what if we want to share symbols across the codebase?&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared Symbols
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sym1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sym2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;sym1&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;sym2&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When we use Symbol.for we can leverage shared symbols that are available in the global symbol registry for our codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Symbols?
&lt;/h2&gt;

&lt;p&gt;Now that we understand that Symbols are unique identifiers, we can understand the potential for what a software engineer can do with them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symbols can be used for metaprogramming
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;userType&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Administrator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;administrator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Guest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;guest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;UserType&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;Administrator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cole Turner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// {id: 1, name: "Cole Turner", Symbol(userType): Symbol(administrator)}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// {"id":1,"name":"Cole Turner"}&lt;/span&gt;

&lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;UserType&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;Administrator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;UserType&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;Guest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the example above, a symbol is used to type the object. The property is only available when referenced through the symbol reflection. This is great for when we want to add properties to an object that we don't want to appear in non-symbol reflection, such as JSON formatting or object iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symbols are separate from string keys
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Extend an object without conflict&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isLocal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;localLanguages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isLocal&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Detect if we're using local or the original languages object&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;localLanguages&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isLocal&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Local languages:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Original languages:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the example above, we can extend objects without conflict with their original properties. This also means that when we are stringifying, the symbols are not included.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symbols can be used as ENUM
&lt;/h3&gt;

&lt;p&gt;A great use case for Symbols is when there is a need for enumerated values. &lt;/p&gt;

&lt;p&gt;**JavaScript Symbols - ENUM example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🌴&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Flower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🌻&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Leaf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🍁&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Mushroom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🍄&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plantTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Flower&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Leaf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Mushroom&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;createPlant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;plantTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid plant type!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here we are using Symbols to control behaviors without those properties leaking into the typical reflection, and preventing runtime errors from typos.&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript Metaprogramming with Symbols
&lt;/h2&gt;

&lt;p&gt;With Symbols we can dive deep into low-level JavaScript to change behaviors for various use cases. This lets us create powerful objects that can do more than meets the eye. Here are some examples of how we can use Symbols for JavaScript metaprogramming.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator"&gt;Symbol.asyncIterator&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tenIntegers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;asyncIterator&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;tenIntegers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;//  1&lt;/span&gt;
  &lt;span class="c1"&gt;//  ...&lt;/span&gt;
  &lt;span class="c1"&gt;//  10&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance"&gt;Symbol.hasInstance&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Loggable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;loggable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;LoggableError&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasInstance&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;instance&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;LoggableError&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Loggable&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;ApplicationError&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Loggable&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;logError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;LoggableError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/log&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;DatabaseError&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;ApplicationError&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Loggable&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator"&gt;Symbol.iterator&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cole Turner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Anonymous&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;toValuesArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// toValuesArray will now change the spread of our object&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arrayOfUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;toValuesArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



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

&lt;p&gt;The Symbol is a new primitive that can unlock a lot of potential with metaprogramming in JavaScript. They make great enumerated values, allow software engineers to extend objects without collision, and can separate concerns when working with data across the codebase.&lt;/p&gt;

&lt;p&gt;For more information, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol"&gt;check out the MDN documentation on Symbols&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>Ask Me Anything: Career Development</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Thu, 30 Jul 2020 05:07:05 +0000</pubDate>
      <link>https://dev.to/coleturner/ask-me-anything-career-development-4inb</link>
      <guid>https://dev.to/coleturner/ask-me-anything-career-development-4inb</guid>
      <description>&lt;p&gt;What questions would you like to ask a Software Engineer about Career Development? &lt;/p&gt;

&lt;p&gt;Ask your questions here:&lt;br&gt;
&lt;a href="https://cole.codes/posts/ask-me-anything-career-development"&gt;https://cole.codes/posts/ask-me-anything-career-development&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will also answer questions posted in this thread.&lt;/p&gt;

</description>
      <category>etc</category>
    </item>
    <item>
      <title>Ask Me Anything: Front-End Edition</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Tue, 28 Jul 2020 07:32:17 +0000</pubDate>
      <link>https://dev.to/coleturner/ask-me-anything-front-end-edition-1hi8</link>
      <guid>https://dev.to/coleturner/ask-me-anything-front-end-edition-1hi8</guid>
      <description>&lt;p&gt;What questions would you like to ask a Software Engineer about Frontend Web Development? I will try to answer your questions via the following URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cole.codes/posts/ask-me-anything-front-end-edition"&gt;https://cole.codes/posts/ask-me-anything-front-end-edition&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@jontyson"&gt;Jon Tyson&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>css</category>
      <category>ui</category>
      <category>graphql</category>
    </item>
    <item>
      <title>When do I need a CSS Framework?</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Mon, 27 Jul 2020 02:54:51 +0000</pubDate>
      <link>https://dev.to/coleturner/when-do-i-need-a-css-framework-414o</link>
      <guid>https://dev.to/coleturner/when-do-i-need-a-css-framework-414o</guid>
      <description>&lt;p&gt;Cascading Style Sheets (&lt;a href="https://cole.codes/blog/css"&gt;CSS&lt;/a&gt;) frameworks do the heavy lifting when you're starting your web application. There are a number of options to choose from, which begs several questions: which framework do I use? When do I need a CSS framework? How do I choose a CSS framework?&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a CSS framework?
&lt;/h2&gt;

&lt;p&gt;A CSS framework is a collection of styles that can be composed together to create a user interface. A CSS framework gives web developers the presets to handle layout, forms, buttons, theming, and common interface patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are some of the CSS frameworks you will hear about today:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://purecss.io/"&gt;Pure.CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tailwindcss.com/"&gt;Tailwind CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/troxler/awesome-css-frameworks"&gt;And so many more&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many of the presets among these frameworks will overlap. Where most CSS frameworks stand out is how the developer (you!) will use the framework. Let's look at some brief comparisons, and how they relate to markup (HTML), styles (CSS), and scripts (JavaScript).&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/5nMsEekqKLCCnFmv3aaQh8/0cee537d5d21a2085a182f5971f40f01/css-framework-vs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/5nMsEekqKLCCnFmv3aaQh8/0cee537d5d21a2085a182f5971f40f01/css-framework-vs.jpg" alt="Bootstrap vs Pure.CSS vs Tailwind CSS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The CSS Framework Showdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bootstrap vs Pure.CSS
&lt;/h3&gt;

&lt;p&gt;Both of these CSS frameworks have much in common. Bootstrap is a UI toolkit that uses markup, styles, and scripts to create re-usable interfaces. Pure.CSS, on the other hand, is mostly styles and just markup. &lt;/p&gt;

&lt;p&gt;So how do they stack up? While Bootstrap is designed to do the heavy lifting for you, Pure.CSS is designed to be a base for your common interfaces. This can make a huge difference in the amount of effort it will take for the developer. When it comes to bundling size, Bootstrap will be much larger (over 100kb) while Pure.CSS only uses less than 4kb. This can make a huge difference in your web app and how fast it will load.&lt;/p&gt;

&lt;p&gt;Most people will choose Bootstrap for user interfaces that are not accessible to the public, or otherwise when there is no need for a bespoke design. Developers will reach for Pure.CSS when they're looking for less theming and want to have more control over the UI. This is because Pure.CSS is a great starter for building styles on top of the framework defaults.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bootstrap vs Tailwind CSS
&lt;/h3&gt;

&lt;p&gt;Bootstrap and Tailwind CSS are great options that fulfill different needs. In our last comparison, we discussed how Bootstrap is designed to do the heavy lifting as a pre-designed user interface toolkit. Tailwind CSS, however, doesn't provide any user interface components.&lt;/p&gt;

&lt;p&gt;Tailwind CSS is a strictly CSS-only framework with only styles that are used for composition. It provides utilities that the developer can use to compose styles to build custom designs. Tailwind CSS also has a much smaller footprint, coming in at 37kb.&lt;/p&gt;

&lt;p&gt;When choosing between Bootstrap vs Tailwind CSS, the decision comes down to whether you need an opinionated framework or not. If you want all of the building blocks to build something bespoke, go with Tailwind CSS. Otherwise, if you need to build something quickly and the design doesn't matter, Bootstrap can help.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pure.CSS vs Tailwind CSS
&lt;/h3&gt;

&lt;p&gt;Pure.CSS and Tailwind.CSS have more in common than the previous options. Both of these frameworks are centered around building blocks, while Pure.CSS is a sorta half-way point between Bootstrap and Tailwind.CSS. &lt;/p&gt;

&lt;p&gt;Pure.CSS is a great option when you need just the basics covered. But if you find that does too much, Tailwind CSS will give you all the utility without the fuss.  Both of these frameworks have smaller footprints than most, so either choice can fit into your web application without too much bundle guilt.&lt;/p&gt;

&lt;h2&gt;
  
  
  When do I need a CSS framework?
&lt;/h2&gt;

&lt;p&gt;With plenty of choices at your disposal, the choice to use a framework will depend on the requirements, and your needs. Here are some common requirements and need to consider when you're starting your next CSS project.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS Reset
&lt;/h3&gt;

&lt;p&gt;Web browsers each have unique styles, and in order for the design to be consistent, you will sometimes need to consider a CSS Reset. This will override the browser's default styles to normalize the styles across browsers. &lt;a href="https://github.com/troxler/awesome-css-frameworks#base--reset--normalize"&gt;There are some great options for a CSS reset&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Design vs. Delivery
&lt;/h3&gt;

&lt;p&gt;This is one of the major reasons to consider a framework. A framework can do the heavy lifting and free the developer up to prototype and build. On the other hand, some frameworks are overly opinionated and can get in your way when you need to build something custom. In some cases, it can be a matter of both design and delivery. Then there is bundle size to consider. &lt;/p&gt;

&lt;h3&gt;
  
  
  Bundle Size
&lt;/h3&gt;

&lt;p&gt;Another important factor that cannot be overlooked is bundle size. Developer experience is important, but its importance is always weighed against the performance of the web application. A web app is no use if it's easy to build but cannot run adequately on target devices. So when considering a CSS framework, measure how much of the framework you would be depending on - and whether that justifies the bundle cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  You stylin'
&lt;/h2&gt;

&lt;p&gt;CSS frameworks are a great option for software engineers who want to focus on building and shipping. They can do the heavy lifting for you, or weight down your application - so choose wisely. Front-end developers in 2020 are fortunate to have a number of options, and resources to help decide which one to pick. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are some other resources if you are still deciding:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/CSS_framework"&gt;"CSS Framework" explained.&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/troxler/awesome-css-frameworks"&gt;Awesome CSS Frameworks List&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://geekflare.com/best-css-frameworks/"&gt;Best CSS Frameworks&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How I Migrated to JAMStack: Next.JS, Vercel, and Contentful.</title>
      <dc:creator>Cole Turner</dc:creator>
      <pubDate>Sun, 26 Jul 2020 22:50:00 +0000</pubDate>
      <link>https://dev.to/coleturner/how-i-migrated-to-jamstack-next-js-vercel-and-contentful-55d3</link>
      <guid>https://dev.to/coleturner/how-i-migrated-to-jamstack-next-js-vercel-and-contentful-55d3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Migrating your React web application can be painful, but JAMStack makes that easy.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fast and secure sites and apps delivered by pre-rendering files and serving them directly from a CDN, removing the requirement to manage or run web servers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jamstack.org/"&gt;https://jamstack.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've recently taken the plunge on JAMStack, using Next.JS, Vercel, and Contentful. Here's what you want to know if you're considering migrating your web app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Next.JS?
&lt;/h2&gt;

&lt;p&gt;Next.JS is an exciting framework for React. The main advantages of Next.JS include its file-system routing (for both user interface and API), automatic code splitting, data fetching, pre-rendering and server-side rendering, static exporting, the developer experience.&lt;/p&gt;

&lt;p&gt;If you aren't already drooling over Next.JS, let me tell you why I prefer it over create-react-app, and why you will want to migrate your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contentful: Flexibility without the Fuss
&lt;/h2&gt;

&lt;p&gt;Contentful is a &lt;a href="https://www.contentful.com/content-platform/"&gt;headless CMS and API&lt;/a&gt; that is used to manage content behind the scenes. It's a great platform for modeling user interfaces and content. Instead of building one-off admin panels to manage content, leveraging Contentful's platform and API is the perfect solution for building, previewing, and shipping quickly. &lt;/p&gt;

&lt;p&gt;When I want to start writing a Blog post, I open Contentful and just write. The preview mode allows me to easily view my changes before publishing. And when it's ready, I hit publish - and it's live in minutes. Almost any user interface you can dream of, can be abstracted into a model which makes it easier to re-use and innovate. &lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a React App Isn't Easy
&lt;/h2&gt;

&lt;p&gt;In 2020, there are so many options for starting your application. Do you choose JavaScript or TypeScript? Reach Router or React Router v3 (no wait, v4, err v5.. v6)? Do you start with Webpack or Parcel? This is why toolkits like create-react-app are so popular, because they aim to solve the bulk of the mental guesswork.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are starting your own application, NextJS hits that sweet spot, where it gives you enough to start and very little reason to eject as your needs evolve.&lt;/strong&gt;## Static Site Generation, Server-side Rendering, and Dynamic Routing&lt;br&gt;
Many &lt;a href="https://jamstack.org/"&gt;JAMStack&lt;/a&gt; frameworks includes these features out of the box. What makes NextJS nice to work with is the flexibility to easily customize any route to build statically, use server-side rendering, or enable dynamic routing.&lt;/p&gt;

&lt;p&gt;My new &lt;a href="http://cole.codes/"&gt;cole.codes website&lt;/a&gt;** &lt;strong&gt;is using &lt;a href="https://nextjs.org/docs/advanced-features/automatic-static-optimization"&gt;statically generated pages&lt;/a&gt;&lt;/strong&gt;.** Next will generate all the pages ahead of time and serve them from multiple CDN locations. The result: pages load instantly fast, and the critical path renders without any perceivable flicker.&lt;/p&gt;

&lt;p&gt;It does this by connecting to Contentful, which is a headless CMS. It pulls all of the blog posts to decide which pages it will need to calculate ahead-of-time. And when you do need more, Next provides APIs for using server-side rendering. This enables dynamic routing, and powers the application to render pages that have not yet been statically built. With all of that in place, I am free to write new blog posts without having to change any source code.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/WRhmW3SSsqOisOgzr9OyS/fa13dd9597362b28b91e323ee0f51d02/Screen_Shot_2020-07-20_at_1.12.33_AM.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/WRhmW3SSsqOisOgzr9OyS/fa13dd9597362b28b91e323ee0f51d02/Screen_Shot_2020-07-20_at_1.12.33_AM.png" alt="Vercel Project - Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying to Vercel
&lt;/h2&gt;

&lt;p&gt;Whenever I push to my main git branch, the continuous integration process will automatically build and deploy my website to Vercel (formerly ZEIT). This process is pretty neat, and &lt;strong&gt;takes less than a minute&lt;/strong&gt; &lt;strong&gt;for it to be live&lt;/strong&gt;, and accessible from the public internet. Super neat!&lt;/p&gt;

&lt;p&gt;The entire process from end-to-end took very little setup and configuration: initializing my project, connecting to Github, and deploying to a free placeholder host. I was able to share my new site with friends to get their feedback before finalizing the migration.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/vn9OofnGv95RzdZZPOK1B/16244397579a9ec493fc7457c7c85a4f/Screen_Shot_2020-07-20_at_1.13.10_AM.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/vn9OofnGv95RzdZZPOK1B/16244397579a9ec493fc7457c7c85a4f/Screen_Shot_2020-07-20_at_1.13.10_AM.png" alt="Vercel - Application Deployments Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple Deployments, Fast and Free
&lt;/h3&gt;

&lt;p&gt;This is by far one of my favorite features about Vercel: multiple deployments. Whenever I push a change, it creates an instant deployment that is assigned to a disposable URL. I can review a deployment, compare side-by-side, and even revert in case of an emergency. &lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/4Bgu5A6M6T96uK3SurFBFE/cb483436a4f943e0e83a9c7203561bec/Screen_Shot_2020-07-20_at_10.08.54_AM.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/4Bgu5A6M6T96uK3SurFBFE/cb483436a4f943e0e83a9c7203561bec/Screen_Shot_2020-07-20_at_10.08.54_AM.png" alt="Contentful Publishing Example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Publishing with Contentful and Vercel Hooks
&lt;/h3&gt;

&lt;p&gt;Once everything was setup, I was able to change my nameservers and move on to publishing. An important element to any dynamic JAMStack application is &lt;strong&gt;incremental builds.&lt;/strong&gt; When new content is created, the build process generates the new markup and deploys it to the web server or CDN. While Next.JS is investigating &lt;a href="https://github.com/vercel/next.js/discussions/11552"&gt;incremental static regeneration&lt;/a&gt; - there is a short term solution offered when using the Git integration through Vercel. &lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/f1aa79r6xovt/3Kf39TTvIG5mtkYXEEy4lu/29d1e20992fd8ee110ccc9d86342789b/Screen_Shot_2020-07-20_at_1.19.49_AM.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/f1aa79r6xovt/3Kf39TTvIG5mtkYXEEy4lu/29d1e20992fd8ee110ccc9d86342789b/Screen_Shot_2020-07-20_at_1.19.49_AM.png" alt="Vercel Deploy Hooks - Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Deploy Hooks, I've wired my Contentful space to ping the deploy hook everytime I publish an article. While I'm able to preview a new article anytime, after publishing it is live in less than a minute! That's super convenient.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Live in less than a minute.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;I'm a fan! The migration process was relatively painless: I moved the UI components from my old Node web app into the new NextJS app. Setting up dynamic routing and integration with Contentful was a breeze. Deploying my app to Vercel's CDN was a piece of cake. &lt;/p&gt;

&lt;p&gt;And as an added bonus, this entire process was free. For the past few years I have been paying $5/month to rent a virtual private server. Contentful and Vercel both offer free plans for personal use. You can &lt;a href="https://github.com/coleturner/portfolio"&gt;checkout the source code for my website here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.JS + Vercel + Contentful = ❤️&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>jamstack</category>
      <category>nextjs</category>
      <category>contentful</category>
    </item>
  </channel>
</rss>
