<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kim Heidorn</title>
    <description>The latest articles on Forem by Kim Heidorn (@knheidorn).</description>
    <link>https://forem.com/knheidorn</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%2F144545%2F68024856-175e-41d4-a5e4-47775ed6b7ad.jpg</url>
      <title>Forem: Kim Heidorn</title>
      <link>https://forem.com/knheidorn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/knheidorn"/>
    <language>en</language>
    <item>
      <title>To Code, or Not to Code on Vacation: That is My Question</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Sat, 24 Aug 2019 19:17:17 +0000</pubDate>
      <link>https://forem.com/knheidorn/to-code-or-not-to-code-on-vacation-that-is-my-question-4bio</link>
      <guid>https://forem.com/knheidorn/to-code-or-not-to-code-on-vacation-that-is-my-question-4bio</guid>
      <description>&lt;p&gt;I just got back from a 2 week vacation. This was my first long vacation since I really have sunk my teeth into passion projects, and I found myself coding more than I anticipated. &lt;/p&gt;

&lt;p&gt;Personally, I &lt;em&gt;plug in&lt;/em&gt; when I code. I don the oversized headphones, listen to my focus music of choice, and zone out trying to solve problems. When I am home, I rarely set time limits for myself, and I continued that pattern on vacation. Something to note, I find coding therapeutic. I get to stretch my creativity, and I’m a bit of an introvert so coding gives me a chance to recharge from social interactions that I can find draining at times. &lt;/p&gt;

&lt;p&gt;Inadvertently on this vacation, I isolated myself from my friends and family.&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%2Fmedia3.giphy.com%2Fmedia%2FxUOwGlB5HeAI0yG54A%2Fgiphy.gif%3Fcid%3D790b7611f2ed4764f06cff5741cbeecec9a554eddcb6d555%26rid%3Dgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2FxUOwGlB5HeAI0yG54A%2Fgiphy.gif%3Fcid%3D790b7611f2ed4764f06cff5741cbeecec9a554eddcb6d555%26rid%3Dgiphy.gif" alt="Know that I'm not happy about it"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;While everyone seemed content and made no mention of my absence, I could not help but feel like I was missing out on the intention of &lt;em&gt;vacation&lt;/em&gt;.  Instead of immersing myself in my book or chatting with people in lawn chairs, I spent time in front of my computer screen. Really nothing had changed from my day to day activities other than the setting and that I was working on fun problems by choice. Now that I am back, I am regretting limiting my screen time. I think there is this notion that vacation is supposed to be about reconnecting with people, strengthening existing relationships while also finding some &lt;em&gt;me time&lt;/em&gt; away from the blue screen light. I cannot help this gnawing feeling that I missed out on some valuable parts of my vacation.&lt;/p&gt;

&lt;p&gt;So my questions to the community, do you code while on vacation? If so, when do you find time to code? How do you feel when you code around people? &lt;/p&gt;

&lt;p&gt;Selfishly, I do not want to stop coding when I’m on vacation. So, what tips do you have to help avoid my guilty feelings on future trips? &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2FwHd6y7EUkSKxpaEBbA%2Fgiphy.gif%3Fcid%3D790b761159881bd04b9c5018ff41f874a096a58c3631cefe%26rid%3Dgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2FwHd6y7EUkSKxpaEBbA%2Fgiphy.gif%3Fcid%3D790b761159881bd04b9c5018ff41f874a096a58c3631cefe%26rid%3Dgiphy.gif" alt="I feel so bad about it"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>help</category>
    </item>
    <item>
      <title>9 Interview Questions to Uncover Startup Red Flags</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Sat, 17 Aug 2019 17:02:22 +0000</pubDate>
      <link>https://forem.com/knheidorn/9-interview-questions-to-uncover-startup-red-flags-421j</link>
      <guid>https://forem.com/knheidorn/9-interview-questions-to-uncover-startup-red-flags-421j</guid>
      <description>&lt;p&gt;Startups are notorious for being risky. Anyone can do a quick search to find several articles dedicated to startup horror stories. The company has run out of money, seemingly out of nowhere, and you show up for work only to find shuttered doors, an empty garage or warehouse, and no notice you are out of a job. If these sorts of stories interest you, I suggest reading &lt;a href="https://blog.usejournal.com/the-4-red-flags-i-missed-as-the-startup-imploded-around-me-be120dc390cb"&gt;this article&lt;/a&gt; by Jonathan Solórzano-Hamilton. He writes about his personal hellish experience that started at with a coffee shop interview and ends in high-speed police chase. Not kidding. &lt;/p&gt;

&lt;p&gt;I am lucky enough to have some in my network who are running successful start ups, and I asked their opinion about what questions to ask in a job interview. I want to pass along this information to help anyone avoid their own horror story.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the company's burn rate?
&lt;/h2&gt;

&lt;p&gt;High burn rates usually mean high overhead costs and expenses. For most startups, this is a huge red flag. Startups usually are not raking in the revenue month after month and the high burn rate usually means they are bleeding cash, fast. There can be valid explanations for high burn rates, and you should ask additional questions to determine if it is a signal for poor growth in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the company's main source of funding? When was the last funding round?
&lt;/h2&gt;

&lt;p&gt;If the company went through one round of funding but is having trouble getting investors for subsequent rounds, this is usually another red flag. There are &lt;strong&gt;many&lt;/strong&gt; reasons investors shy away from additional funding rounds, and it's imperative that you understand why. It could be as simple as a particular investor does not have the available capital at that time, which is no fault of the startup. But it could be a good indication of other more serious problems. Investors may not have faith in the business model, lost trust with the founder(s) or can see market trends that make the product obsolete or redundant.&lt;/p&gt;

&lt;p&gt;Funding should be something to consider when it comes to negotiating your salary. Likely, the startup will offer you less than market rate and will supplement your income with stock options. But you may never see that money in the event of an exit. Say the company has raised $500 mil over 6 rounds of investing. That means there are &lt;strong&gt;six&lt;/strong&gt; different rounds of investors that get their money &lt;em&gt;before&lt;/em&gt; you see a dime. &lt;/p&gt;

&lt;p&gt;One thing to note, if the interviewer does not know the answers to these questions, and/or refuses to get you answers, &lt;strong&gt;run&lt;/strong&gt;. If the company is not being transparent with you, they are likely not being fully transparent with their current employees, and in general, it is a bad sign for future growth.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Does the company have customers? If so, who are they?
&lt;/h2&gt;

&lt;p&gt;This is slightly tied to the burn rate question in that you are probing what the main revenue source is for the company and if the product is viable. If the company has some recognizable names as customers, that can bode well for the growth potential for the company. Additionally, if the company has a few smaller, loyal clients, and has a clear plan for growing the customer pool, there is still lots of growth potential and can signal a healthy company. Customers also signals that people see a use for the product and are actively implementing or engaging with it. All of which are great signs for future growth. &lt;/p&gt;

&lt;p&gt;If they do not have current customers, it opens the door for a whole other host of additional questions. Is there a clear marketing strategy in place to attract and retain customers? How has the company been defining revenue in lieu of customers? Is the current source of revenue viable for long term growth? No customers can be a red flag, but its up to you to ask those follow-up questions to know if you should run from the interview or stick with the company while they get those first crucial clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  What value does the role you are interviewing for bring to customers?
&lt;/h2&gt;

&lt;p&gt;More importantly, and selfishly, you are trying to suss out how the position you are interviewing for fits into the bigger picture and health of the company. For example: Say you absolutely &lt;em&gt;hate&lt;/em&gt; customer facing positions, the company relies on customers using their product, and you come to find out that a majority of your work will be troubleshooting customers' concerns. Not only will you be unhappy with your job, but the company's revenue will likely suffer from a poor customer experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the product decision making process like?
&lt;/h2&gt;

&lt;p&gt;For most startups, there is minimal management staff. The companies are usually small, and everyone pitches in to help. In these scenarios, product design decisions often come from the CEO, CTO or another Founder directly. Hopefully, they value collaboration and expect input from their team. Some don't. Employees and businesses alike can thrive in both these structures, and both have their own pros and cons. It is more about personal preference. &lt;/p&gt;

&lt;p&gt;But like everyone else at the company, these high-ranking individuals also wear many hats, and will often be unavailable to answer questions from the product team(s). In these scenarios, it is important to know what the decision making process is in their absence. This will help to prevent bottlenecks and  allow for the continuation of fast decisive action. &lt;/p&gt;

&lt;p&gt;If there is not a structure in place and the interviewer cannot answer this basic question, it likely is a signal for more substantial organizational issues. These scenarios of inaction likely bubble up more frequently, which could lead to unnecessary frustrations at work and create a less than ideal company culture. &lt;/p&gt;

&lt;h2&gt;
  
  
  What does success look like?
&lt;/h2&gt;

&lt;p&gt;Founders often have a clear vision and general direction they want to drive the company. While this is not the only factor in success of a company, it can help you as a prospective employee get a better glimpse into the company's future. Often times, this question can help illuminate the end goals or the exit strategy that the Founders envision. If say the barometers of success are all goals that could be achieved within a year, it may signal that there is a desire to be acquired sooner rather than build a robust stand-alone company. This, again, does not mean that the company is a dumpster fire, and you should avoid them. It might just mean that this may not be a long term position you will have 5 years down the road. &lt;/p&gt;

&lt;h2&gt;
  
  
  How does the customer story tie to the mission statement of the company?
&lt;/h2&gt;

&lt;p&gt;This is a key question that not only helps to suss out what &lt;em&gt;success&lt;/em&gt; means at the company but also can give you a snapshot of the company culture. A company that finds its customers expendable and does not value retention may have the same mindset for its employees. This is not always the case, but asking more probing follow-up questions can help decide if this is the company for your work style. Do they value employee engagement such as hosting company-wide events or continued education opportunities? &lt;/p&gt;

&lt;p&gt;When you leave the interview, you should have a very clear understanding of the customer story and company culture. If the company does not have a clear mission statement, this can also indicate that they have more serious structural issues that, again, can lead to a frustrating and disorganized work environment. &lt;/p&gt;

&lt;h2&gt;
  
  
  For junior roles, what is the guidance structure?
&lt;/h2&gt;

&lt;p&gt;This may seems like a pretty basic question that is redundant given the decision making process question. But this is a separate issue entirely and should always be asked. More often than not, a developed company will have a clear hierarchy where the junior role directly reports to a senior dev, CTO, CEO or another Founder. It helps to know who exactly will be available to answer questions and will be reviewing code that will be pushed forward to the product. A developed company structure often is setup for long term company growth and help ease the growing pains from a small company to a medium sized company. I have heard stories where startups hire only junior devs without a senior dev or experienced team lead. This more often than not turns into a complete sh!tshow as the Founders naively think that a large team of cheap labor will get the company up and running. Be wary if this is the scenario you are stepping into as a senior dev because it may be incumbent on you to clean up the mess the Founders created. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is the testing framework? What are the guidelines for issues or debugging code?
&lt;/h2&gt;

&lt;p&gt;Again, this is a super straight-forward question, but one that can highlight issues within the product. There is plenty of debate about whether TDD is overrated or overused. So do not write off the company if they do not have a testing framework currently in place. Most startups have tight budgets that make getting a product out the door crucial to stabilize the revenue stream. In this case, testing frameworks are often costly and cut from the initial product design. All this means is that you need ask follow-up questions. How do they know their product works and how does the product team find issues prior to customers pointing them out? It may be that they do unit testing and have plans to build out a testing framework once the company has the available capital to do so. Who knows, you may be the person that leads this effort. &lt;/p&gt;

</description>
      <category>career</category>
      <category>jobsearch</category>
      <category>advice</category>
    </item>
    <item>
      <title>Unrolling Matrix Walkthrough - JS</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Fri, 09 Aug 2019 20:06:13 +0000</pubDate>
      <link>https://forem.com/knheidorn/unrolling-matrix-walkthrough-js-2d52</link>
      <guid>https://forem.com/knheidorn/unrolling-matrix-walkthrough-js-2d52</guid>
      <description>&lt;p&gt;As I’ve been starting my job search, I have been grinding LeetCode problems, tackling all the algorithm practice I can to ease my nerves going into technical interviews. I have been coding in JavaScript and have been doing my best to master the “Matrix” problems. Below are the steps I took to traverse the matrix in an &lt;em&gt;unrolling&lt;/em&gt; fashion.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Input: [[1, 2, 3, 4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]&lt;br&gt;
Assume that Input will always be an even matrix, (i.e. 2 x 2, 3 x 3, 6 x 6, etc.)&lt;/p&gt;

&lt;p&gt;Output: “1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10”&lt;/p&gt;
&lt;h3&gt;
  
  
  Brute Force Option and Big O
&lt;/h3&gt;

&lt;p&gt;The first step, for me, is to always follow my first instinct and get the brute force option to work. I knew from a previous project that I had built a grid (aka matrix) using two nested &lt;code&gt;for-loops&lt;/code&gt; to step through each cell. While this is clearly not the best solution (runtime: O(n^2)), I knew it to be the first way to solve it. Had the runtime Big O been O(n), I likely would have continued down this path, but I wanted to try to solve this problem with a more unique solution. &lt;/p&gt;
&lt;h3&gt;
  
  
  Refactor Code
&lt;/h3&gt;

&lt;p&gt;Now, I had not really written any code for the above &lt;em&gt;brute force&lt;/em&gt; option, so the title is a bit deceiving, but had I been in a real technical interview, I would have definitely wanted to refactor my &lt;em&gt;brute force&lt;/em&gt; code. Instead, since this was just practice, I decided to really analyze the problem. The code wanted me to return the entire first row in the same order, the last index of the middle rows, the entire last row in reverse order, and finally, the first index of the middle rows. If I were to augment the original matrix and remove the values above, I would be left with an internal matrix that was reduced entirely by 2. For the example input above, the 4 x 4 matrix after the required removals would leave me with a 2 x 2 matrix. This new matrix would then need to be treated in a similar manner. Essentially, I had stumbled into a great recursive function exercise. It would still result in O(n^2) runtime, but at least more interesting from a challenge perspective. &lt;/p&gt;
&lt;h3&gt;
  
  
  Break Up the Steps
&lt;/h3&gt;

&lt;p&gt;I had a general game plan, but decided to start coding out the basic skeleton to my solution.&lt;/p&gt;

&lt;p&gt;I knew with recursive functions I need to start with a &lt;code&gt;base case&lt;/code&gt; aka a case that tells my function to stop, and ending function that would call the function on itself. Also, I knew that the output was not an array, but instead a string. Thus, I need an &lt;code&gt;ending&lt;/code&gt; variable that initially was an empty string. Given that this was a recursive function, the string would also need to be an argument I would pass into the function, but would have an initial value of &lt;code&gt;“”&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function unroll(matrix, endResult = “”) {
    //base case
    if (matrix.length === 0) {
      return endResult
    }

    //call itself
    return unroll(matrix, endResult)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Not bad, but I realized pretty quickly I was missing on crucial detail, the &lt;code&gt;,&lt;/code&gt; to chain my recursive strings!&lt;/p&gt;

&lt;p&gt;This made the new code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function unroll(matrix, endResult = “”) {
    //base case
    if (matrix.length === 0) {
      return endResult
    }

    //call itself
    return unroll(matrix, endResult + “, ”)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now it was time to start traversing the matrix. Again, I knew I should take this into individual steps. The first part would be to just printing the first row exactly as is. Given this was a nested array, I could either write &lt;code&gt;matrix[0]&lt;/code&gt; or &lt;code&gt;matrix.shift()&lt;/code&gt;. Personally, I wanted to get more comfortable using methods in my whiteboarding problems, so I went with the &lt;code&gt;matrix.shift()&lt;/code&gt; option. Now to convert this removed array to a string, I used &lt;code&gt;.join(“, ”)&lt;/code&gt; remembering that I need to add in the correct punctuation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function unroll(matrix, endResult = “”) {
    //base case
    if (matrix.length === 0) {
      return endResult
    }

    //top
    endResult += (matrix.shift().join(“, ”))

    //call itself
    return unroll(matrix, endResult + “, ”)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Next would be to get the last two elements, or right elements, for &lt;strong&gt;only&lt;/strong&gt; the middle rows. This would require a &lt;code&gt;for-loop&lt;/code&gt; in order to traverse into these nested arrays. There was no way I could solve this without it. In this scenario, since I am only taking individual inputs at one time, I did not need to add the &lt;code&gt;.join( “, ”)&lt;/code&gt; method, and instead would need to add the required punctuation prior to adding the element. Also, since I wanted to continue using the method process, I used &lt;code&gt;.pop()&lt;/code&gt; to remove the last element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function unroll(matrix, endResult = “”) {
    //base case
    if (matrix.length === 0) {
      return endResult
    }

    //top
    endResult += (matrix.shift().join(“, ”))

    //right
    for (let i = 0; i &amp;lt; matrix.length - 1; i++) {
        endResult += “, ” + (matrix[i].pop())
    }

    //call itself
    return unroll(matrix, endResult + “, ”)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The script for the bottom row was similar to the top row, but instead of &lt;code&gt;shift()&lt;/code&gt;, I need to use &lt;code&gt;pop()&lt;/code&gt; and &lt;code&gt;reverse()&lt;/code&gt; to reverse the resulting array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function unroll(matrix, endResult = “”) {
    //base case
    if (matrix.length === 0) {
      return endResult
    }

    //top
    endResult += (matrix.shift().join(“, ”))

    //right
    for (let i = 0; i &amp;lt; matrix.length - 1; i++) {
        endResult += “, ” + (matrix[i].pop())
    }

    //bottom
    endResult += “, ” + (matrix.pop().reverse().join(“, ”))

    //call itself
    return unroll(matrix, endResult + “, ”)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;To add the first elements of the middle rows to the &lt;code&gt;endResult&lt;/code&gt; string, I need to use a &lt;code&gt;for-loop&lt;/code&gt;. However, this time I need to do a &lt;code&gt;reverse for-loop&lt;/code&gt; counting down until the value of &lt;code&gt;i&lt;/code&gt; is equal to 0. I also need to use &lt;code&gt;shift()&lt;/code&gt; to remove the first element of the array I am iterating over.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function unroll(matrix, endResult = “”) {
    //base case
    if (matrix.length === 0) {
      return endResult
    }

    //top
    endResult += (matrix.shift().join(“, ”))

    //right
    for (let i = 0; i &amp;lt; matrix.length - 1; i++) {
        endResult += “, ” + (matrix[i].pop())
    }

    //bottom
    endResult += “, ” + (matrix.pop().reverse().join(“, ”))

    //left
    for (let i = matrix.length -1; i &amp;gt;= 0; i--) {
        endResult += “, ” + (matrix[i].shift())
    }

    //call itself
    return unroll(matrix, endResult + “, ”)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I thought I was done, but I found an error in my script. The resulting string had two extra characters of &lt;code&gt;,&lt;/code&gt; that need to be removed. Using &lt;code&gt;.substring()&lt;/code&gt; and setting the arguments at &lt;code&gt;(0, endResult.length - 2)&lt;/code&gt; isolates and removes the last two characters to return the desired output.&lt;br&gt;
The final script is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function unroll(matrix, endResult = “”) {
    //base case
    if (matrix.length === 0) {
      return (endResult.substring(0, endResult.length - 2))
    }

    //top
    endResult += (matrix.shift().join(“, ”))

    //right
    for (let i = 0; i &amp;lt; matrix.length - 1; i++) {
        endResult += “, ” + (matrix[i].pop())
    }

    //bottom
    endResult += “, ” + (matrix.pop().reverse().join(“, ”))

    //left
    for (let i = matrix.length -1; i &amp;gt;= 0; i--) {
        endResult += “, ” + (matrix[i].shift())
    }

    //call itself
    return unroll(matrix, endResult + “, ”)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Voila! The matrix is unrolled! Hope you enjoyed the walkthrough and feel free to give input for improved methods!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Troubleshooting? Don't over ReactJS!</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Sat, 08 Jun 2019 03:59:51 +0000</pubDate>
      <link>https://forem.com/knheidorn/troubleshooting-don-t-over-reactjs-5c1a</link>
      <guid>https://forem.com/knheidorn/troubleshooting-don-t-over-reactjs-5c1a</guid>
      <description>&lt;p&gt;For my capstone project at Flatiron School, I decided to build a scaled down version of &lt;em&gt;The Price is Right&lt;/em&gt; in React. Simplifying the functionality of the game was essential to complete the project in three weeks. As with any game, logic dominated a majority of the page rendering, and I relied on &lt;code&gt;React Router&lt;/code&gt; to dynamically navigate through my various pages. This did not cause any issues until I had a &lt;code&gt;fetch PATCH&lt;/code&gt; request in an &lt;code&gt;onClick&lt;/code&gt; within a Link. I had a button element wrapped by a Link so I could style it to my satisfaction. Within the button, I passed the &lt;code&gt;fetch&lt;/code&gt; request function to the component in props. However, the function required &lt;code&gt;event.preventDefault()&lt;/code&gt;.  Someone who is more familiar with &lt;code&gt;React Router&lt;/code&gt; would have seen the issue with how I had setup my code. I, being a novice, could not understand why the link would not redirect. The &lt;code&gt;fetch PATCH&lt;/code&gt; request would complete as would internal &lt;code&gt;console.log()&lt;/code&gt;. The issue clearly was with the Link. &lt;/p&gt;

&lt;p&gt;After reading the &lt;code&gt;React Router&lt;/code&gt; documents, I learned that the &lt;code&gt;event.preventDefault()&lt;/code&gt; was preventing the Link from redirecting the user to the correct page.  In order to properly redirect and keep the function, I needed to access the session &lt;code&gt;history&lt;/code&gt; prop for &lt;code&gt;React Router&lt;/code&gt; to redirect the user to the correct route. I was unsure how to do this, but thankfully &lt;a href="https://stackoverflow.com/questions/48294737/how-to-use-onclick-event-on-link-reactjs"&gt;StackOverflow&lt;/a&gt; and &lt;a href="https://tylermcginnis.com/react-router-programmatically-navigate/"&gt;this blog by Tyler McGinnis&lt;/a&gt; helped direct the correct step to take. Seeing as the redirect was not being rendered by &lt;code&gt;React Router&lt;/code&gt;, I had to wrap the component in &lt;code&gt;withRouter&lt;/code&gt; to access &lt;code&gt;history.push&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export default withRouter(SpinningWheel )&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Once &lt;code&gt;history.push&lt;/code&gt; was accessible, I created a callback function within the wrapped component to force the redirect to my desired page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;goHome = () =&amp;gt; {
   this.props.history.push('/')
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So, I had the callback function written, but I needed to hook it up to the &lt;code&gt;fetch&lt;/code&gt; request. Calling this callback function beforehand would be useless as the &lt;code&gt;fetch PATCH&lt;/code&gt; updated the user’s score upon completion of the game. I only wanted to redirect the user once the score had been saved properly. The &lt;code&gt;fetch&lt;/code&gt; function was on my main component page, and thus, I had to pass &lt;code&gt;goHome&lt;/code&gt; as a parameter and add a callback function to the &lt;code&gt;fetch&lt;/code&gt; request. For brevity, I referenced this as &lt;code&gt;cb&lt;/code&gt; in my code.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;withRouter(&amp;lt;Component&amp;gt;)&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Link to="/"&amp;gt;
   &amp;lt;button className="Start-button"
      onClick={(ev) =&amp;gt; saveMoney({ totalMoney }, ev, this.goHome)}&amp;gt;
      Go Home
   &amp;lt;/button&amp;gt;
&amp;lt;/Link&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In &lt;code&gt;App.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;saveMoney = (money, event, cb) =&amp;gt; {
   event.preventDefault()

   cb &amp;amp; cb()

   let { gameId } = this.state
   let url = "http://localhost:3000/games/" + gameId

   let config = {
      headers:{
         'Content-Type': 'application/json'
       },
      method: 'PATCH',
      body: JSON.stringify({
         score: money.totalMoney
      }
   }

   fetch(url, config)
      .then(response =&amp;gt; response.json())
      .then(data =&amp;gt; {() =&amp;gt; {
         this.getScores()
         cb &amp;amp; cb()
      })
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Finally, I can now redirect the user without altering the code too much, and without causing a reload effect for the user, aka using React properly.&lt;/p&gt;

&lt;p&gt;Truthfully, this was one of many challenges I had with my React game. My 3D spinning wheel turned out to be my toughest issue, unsurprisingly. Next week, I’ll be writing and sharing my code (and love!) for a vertical carousel. Stay tuned!&lt;/p&gt;

&lt;p&gt;Learn more about &lt;a href="https://reactjs.org/docs/higher-order-components.html"&gt;&lt;code&gt;withRouter&lt;/code&gt; and other higher-order components (HOC)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Make Your Resume Work for You</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Tue, 21 May 2019 17:56:26 +0000</pubDate>
      <link>https://forem.com/knheidorn/make-your-resume-work-for-you-43jd</link>
      <guid>https://forem.com/knheidorn/make-your-resume-work-for-you-43jd</guid>
      <description>&lt;p&gt;Arguably, the most effective job search starts with steller networking skills. It is typically how most will land the first interview with a company. But after you land that critical first interview, an effective resume will help you stand out from the interviewed crowd. I am in the process of refining my own resume, and thought I would pass along some handy tricks I have learned in the process.&lt;/p&gt;

&lt;h3&gt;
  
  
  One Page vs Two Pages
&lt;/h3&gt;

&lt;p&gt;Once your resume gets past the AI blockers and into the hands of a real life human, it is important to remember that the hiring manager will likely still read a substantial amount of resumes. Like anyone else reading 20+ pages in one sitting after a days work, these individuals will get fatigued. I have previously worked in HR and know all too well the many cups of coffee required while reviewing resumes. With that in mind, many adhere to that imphamous &lt;em&gt;one-page max&lt;/em&gt; mantra. I believe that a resume should be &lt;strong&gt;two-pages max&lt;/strong&gt; with your more relevant career information on the first page. Your resume is meant to be a guide and reference for your conversation with the hiring manager(s). As careers build, it becomes important to describe key accomplishments in addition to highlighting applicable skills, which will likely lengthen your resume, but it is best to not list every single task. It will always be a fine balance to highlight your accomplishments while not giving all the information on a page. I have come across some companies that do put a hard limit of &lt;strong&gt;one-page&lt;/strong&gt; on the resume. In these cases, it is imperative that you distill all of your best work and professional experience. This is just something that you will need to work through given the job your applying to and make note what is being left off your resume so that you can speak to these accomplishments in your interview.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep it Readable
&lt;/h3&gt;

&lt;p&gt;Initially, I had my contact information stacked in a column with my name written in the top in bold. While it may be aesthetically more appealing, it does not follow the natural reading pattern of left to right reading. Again, hiring managers get tired, so anything to help make the contact information more logical and readable helps. I also included links to my GitHub and LinkedIn accounts in the same line as my phone number and email address. I felt it would be easiest for the hiring manager reviewing my resume to just have all my points of contact right at the top. Again, I recommend having someone else look at your own resume to see what they find the most natural when reading it, which brings me to font size. I think most people with tiny font and odd margins are trying to condense all their material in &lt;em&gt;one page&lt;/em&gt;.  Since we have already touched on that point, it is best to leave left and right margins as close to the 1” default as possible. Also, it is important to leave the font to a reasonable and readable size and style. Again, hiring managers get tired and if the font is too illegible, they likely will skim more and miss key details.&lt;/p&gt;

&lt;h3&gt;
  
  
  Substance Over Form
&lt;/h3&gt;

&lt;p&gt;I am stealing an accounting principle here, but it is relevant when talking about a resume. The concept is that you want to give a complete and accurate snapshot of your experience, both technically and professionally, rather than filler lines below a project or job title. This means, use metrics to tangibly demonstrate skills. Often times it is hard to try and determine valid metrics for what you may see as a meaningless project or task. One example is debugging or refactoring already deployed code. You might think, “Well, I just wrote 50 lines of code that was part of &amp;gt;1000 lines. So, I’ll just put that down.” A way to describe this same task would be “Refactored 100 lines of code down to 50 lines, while maintaining and/or improving code efficiency for over 40,000 clients.” Any time you can help the hiring manager understand your impact with metrics helps and will make your resume a more interesting read.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;I know that specific jobs will require different types of resumes. Someone who is looking for a design job may need to have a more stylized resume, whereas someone working in data science will use more metrics. Again, these resume tips are just that, tips. They should not be considered hard and fast rules for how you work through your own resume. Also, it is important to remember that this is a living, breathing, document. Often your resume will need to be custom tailored to the company and job for which you are applying. You should always have a &lt;strong&gt;long&lt;/strong&gt; version of the resume that can be redesigned for each new application. Best of luck in the job search!&lt;/p&gt;

</description>
      <category>career</category>
      <category>jobsearch</category>
      <category>beginners</category>
      <category>advice</category>
    </item>
    <item>
      <title>My Top Mistakes with Web Accessibility</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Wed, 08 May 2019 16:47:12 +0000</pubDate>
      <link>https://forem.com/knheidorn/my-top-mistakes-with-web-accessibility-29lh</link>
      <guid>https://forem.com/knheidorn/my-top-mistakes-with-web-accessibility-29lh</guid>
      <description>&lt;p&gt;As I am wrapping up my time at Flatiron, I am getting more free time to explore my personal interests, and subsequently, figure out what I do not know &lt;strong&gt;before&lt;/strong&gt; the inevitable job search and technical interview. While nerve racking in and of itself, I often try to break-up the necessary subjects with broader topics that are relevant but of more interest to me. One area I always seem to focus on is web accessibility. I am sure many are aware of &lt;a href="https://www.w3.org/" rel="noopener noreferrer"&gt;World Wide Web Consortium (W3C)&lt;/a&gt; and &lt;a href="https://a11yproject.com/" rel="noopener noreferrer"&gt;The A11Y Project&lt;/a&gt;. Rather than give a summary of these two organizations, I highlight below three key points that I found the most interesting and applicable to my own coding experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start from the Top, Literally: Page Titles
&lt;/h3&gt;

&lt;p&gt;I often overlook giving topical page titles. When I was first starting to build my own projects, I would title the page something generic and had little relevance to my own web page. Naively, I thought it cheeky to make it something funny and the more random made my webpage seem more humorous. Little did I know that this is the &lt;strong&gt;first&lt;/strong&gt; item screen readers grab. So naming the page titles properly is critical for accessibility. Moving forward, I am trying to write these with literally only the unique title of my actual web page. It seemed logical to me, but I have no experience using a screen reader. I would love to hear ways to improve the UX for this!&lt;/p&gt;

&lt;h3&gt;
  
  
  See the Difference: Color Contrast
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2FSKGo6OYe24EBG%2Fgiphy.gif%3Fcid%3D790b76115cd2fb0858644644322077a6%26rid%3Dgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2FSKGo6OYe24EBG%2Fgiphy.gif%3Fcid%3D790b76115cd2fb0858644644322077a6%26rid%3Dgiphy.gif" alt="Spongbob Rainbow Gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For my pet projects, I love the freedom to design the pages how I want, which often includes picking pastels that I find easy on my eyes. &lt;strong&gt;Big no-no!&lt;/strong&gt; I had no idea that web pages should have a minimum contrast of at least 4.5:1. Higher contract helps those with visual impairments read and use your webpage more easily. W3C gives a step-by-step guide on how to check contrast with &lt;a href="https://www.w3.org/WAI/test-evaluate/preliminary/#contrast" rel="noopener noreferrer"&gt;&lt;em&gt;IE WAT&lt;/em&gt;&lt;/a&gt;. Honestly, I have not used Internet Explorer in ages so I found an alternative website, &lt;a href="https://webaim.org/resources/contrastchecker/" rel="noopener noreferrer"&gt;WebAIM&lt;/a&gt;, that provides a much more intuitive system for checking contrast. &lt;/p&gt;

&lt;h3&gt;
  
  
  Keep It Simple: Keyboard Compatibility
&lt;/h3&gt;

&lt;p&gt;This is essentially that all functionality of the webpage can be usable with only a keyboard. This means that someone who has physical limitations to be unable to use a mouse can use keystrokes to navigate the page, and complete and submit forms. While my current designs are relatively simplistic, before now I have never tested my designs for keyboard only functionality. Personally, I am partial to a good Modal and have made a habit of removing the default close button usually located in the Footer. Again, this is poor practice on my part. I am now going through and re-adding these buttons to make my Modals more accessible. Another item to note that I was not previously aware of, native HTML controls are inherently keyboard accessible. However, custom CSS and scripts often need to have this functionality built-out. W3C has some &lt;a href="https://www.w3.org/WAI/perspective-videos/keyboard/" rel="noopener noreferrer"&gt;additional useful information&lt;/a&gt; along with user stories, which I found particularly interesting. &lt;/p&gt;

&lt;h3&gt;
  
  
  Bring It on Home
&lt;/h3&gt;

&lt;p&gt;At this point, I am doing my best to implement good web accessibility practices in my own coding as I write. I have also been trying to go back through old projects to improve already published code, which I have found is no easy task. Luckily, W3C has a quick &lt;a href="https://www.w3.org/WAI/test-evaluate/preliminary/" rel="noopener noreferrer"&gt;checklist&lt;/a&gt; readily available to help guide newbies, like myself, through the process. Beyond just changing CSS styling, it sometimes requires changing the actual functionality of an entire page, making the whole process more tedious than initially anticipated. It is, however, a small price to pay for a more usable and overall smoother UX.&lt;/p&gt;

&lt;p&gt;Thanks again for reading! Now enjoy this cute baby cheering for our accessible webpages.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2F4xpB3eE00FfBm%2Fgiphy.gif%3Fcid%3D790b76115cd30326374f49552e47eaf3%26rid%3Dgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2F4xpB3eE00FfBm%2Fgiphy.gif%3Fcid%3D790b76115cd30326374f49552e47eaf3%26rid%3Dgiphy.gif" alt="Baby Raising Arms Gif"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>a11y</category>
      <category>design</category>
    </item>
    <item>
      <title>Making a Calendar in Vanilla Javascript</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Tue, 16 Apr 2019 19:11:07 +0000</pubDate>
      <link>https://forem.com/knheidorn/making-a-calendar-in-vanilla-javascript-48j8</link>
      <guid>https://forem.com/knheidorn/making-a-calendar-in-vanilla-javascript-48j8</guid>
      <description>&lt;p&gt;Arguably, time is the best and worst built-in function in Javascript.  For my most recent project, I had the idea to make a bastardized Google calendars.  I naively figured that making a general, functional calendar would be straightforward and allow me plenty of time to build out my site. I &lt;strong&gt;so&lt;/strong&gt; was wrong. &lt;/p&gt;

&lt;h3&gt; Where to Start? &lt;/h3&gt;

&lt;p&gt;Pretty early on, with guidance from my instructor, I decided to hard code a month into the HTML. This allowed me to build out the general structure and style I wanted for my calendar. There was conflicting literature on whether using &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; would be better practice. I ultimately decided to go with a table. &lt;/p&gt;

&lt;p&gt;If you have ever taken the time to really study a month calendar, the structure is pretty simple. There is a header at the top, usually, that indicates the month and year. Below that are 7 columns outlining the individual days of the week. Finally, there is a maximum of 6 rows to populate the number of days for a given month. &lt;/p&gt;

&lt;p&gt;Below is a snapshot of my hardcoded HTML.&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%2Fuploads%2Farticles%2Ftrq2541eu0vrqsfdnef5.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%2Fuploads%2Farticles%2Ftrq2541eu0vrqsfdnef5.jpg" alt="Hard-coded HTML Calendar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Again, this allowed me to mess with the CSS style sheet to render the overall look and feel I wanted for my calendar.&lt;/p&gt;

&lt;h3&gt; Harnessing the Power of Time &lt;/h3&gt;

&lt;p&gt;Now came the hard part. I needed to use the built-in time function to populate the accurate number of days in a given month and year. After doing some research, I learned that Javascript will return a number that corresponds to a months relative index in a year: i.e. January is 0, February is 1, etc.  This can be called using the &lt;code&gt;getMonth()&lt;/code&gt; function built-in to Javascript.&lt;/p&gt;

&lt;p&gt;Javascript also does the same thing with days of the week and starts with Sunday. That makes Sunday - 0, Monday - 1, etc. This is called using the &lt;code&gt;getDay()&lt;/code&gt; function from Javascript.&lt;/p&gt;

&lt;p&gt;So, the question became how do I use this two crucial pieces of information: 1. How do I figure out what day of the week is the start of the month? 2. How do I calculate how many days are in a month?&lt;/p&gt;

&lt;p&gt;Answering the first questions was simple enough. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date" rel="noopener noreferrer"&gt;Javascript literature&lt;/a&gt; helped outline the various options for built-in functions. Miraculously, &lt;code&gt;new Date(year, month)&lt;/code&gt; is incredibly powerful and will automatically render the first day of a given year and month argument. Using the &lt;code&gt;.getDay()&lt;/code&gt; function on this allowed me to get the day index for the start of the month.&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%2Fuploads%2Farticles%2Fztig863l1ffgd0avwjfv.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%2Fuploads%2Farticles%2Fztig863l1ffgd0avwjfv.jpg" alt="Start of Month Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I needed to get the number of days in a given month. Again, I used the all-powerful &lt;code&gt;new Date()&lt;/code&gt; to get me started, and using some high school algebra, I reverse engineered a way to calculate the total days. The &lt;code&gt;new Date()&lt;/code&gt; function can accept a large number of arguments, down to the millisecond. I did not need to get granular with my calendar, but thought I could use the month, year and day arguments. Given that the maximum number of days in any month is 31, putting in 32 days into &lt;code&gt;new Date()&lt;/code&gt; would give me the relative date that would actually be in the next month. For example, July(index 6 of a year) has 31 days in a month. If I entered &lt;code&gt;new Date(2019, 6, 32)&lt;/code&gt; into my console, I would expect the console to return August 1, 2019.&lt;br&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%2Fuploads%2Farticles%2Fhgk7wxcj16cbpjfu4bj6.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%2Fuploads%2Farticles%2Fhgk7wxcj16cbpjfu4bj6.jpg" alt="July Snapshot of Console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;new Date()&lt;/code&gt; function also has a &lt;code&gt;getDate()&lt;/code&gt; function that will return the day number from a given date. Using this returned number, I subtracted this from 32 to get the accurate number of days in a given month. &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%2Fuploads%2Farticles%2Fbmthl03dhg5p8e042rrn.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%2Fuploads%2Farticles%2Fbmthl03dhg5p8e042rrn.jpg" alt="End of Month Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To further prove my concept, I used February 2019 in my console. Passing in 2019 for year, 1 for month, and 32 for days, I should expect the above equation to return 28, as there were 28 days in February 2019.&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%2Fuploads%2Farticles%2F7cenolm6xa5aphh5kr0j.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%2Fuploads%2Farticles%2F7cenolm6xa5aphh5kr0j.jpg" alt="Feb Snapshot Console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One hurdle down, now I had to use this data to populate and render my table.&lt;/p&gt;

&lt;h3&gt; Populating the Beast &lt;/h3&gt;

&lt;p&gt;After removing the hardcoded HTML data from my table, I needed to populate the &lt;em&gt;month&lt;/em&gt; span and the &lt;em&gt;year&lt;/em&gt; span with the currently rendered month and year. This was fairly straightforward as I left a majority of my HTML code in the header. After finding the individual span elements using &lt;code&gt;document.findElementById()&lt;/code&gt;, I changed the &lt;code&gt;textContent&lt;/code&gt; to the given &lt;em&gt;month&lt;/em&gt; and &lt;em&gt;year&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryx1vtw5ee5g6ycqffa6.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%2Fuploads%2Farticles%2Fryx1vtw5ee5g6ycqffa6.jpg" alt="Populating Month Year"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After grabbing the table element, again using &lt;code&gt;document.getElementById()&lt;/code&gt;, I then needed to add some &lt;code&gt;for&lt;/code&gt; loops to render my rows and columns. I also knew that I would need to print the actual day number on the calendar. For obvious reasons, I started the count at 1 and assigned this 1 to a usable variable called &lt;code&gt;renderNum&lt;/code&gt;. (Note: This variable will be incremented up by one with each column loop. But I’ll get to that in a bit)&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%2Fuploads%2Farticles%2Fovdb8a7xhj5a8jibucpp.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%2Fuploads%2Farticles%2Fovdb8a7xhj5a8jibucpp.jpg" alt="Get The Variables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I generated the row &lt;code&gt;for&lt;/code&gt; loop, as this was going to hold all the individual date tiles. (To be more proper, I will append my row &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; with my table data &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; elements.) Since I knew that I would need at maximum 6 rows, I started my &lt;code&gt;for&lt;/code&gt; loop at the traditional 0 and had it stop when &lt;em&gt;i&lt;/em&gt; reached 6. Seeing as there was no text content for the row, all I needed was to create the &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; element and assign this to a usable variable.&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%2Fuploads%2Farticles%2F4eps10wekfpjjvr04p6e.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%2Fuploads%2Farticles%2F4eps10wekfpjjvr04p6e.jpg" alt="First For Loop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As stated before, I wanted to append each row with 7 table data elements. This meant that I needed a nested &lt;code&gt;for&lt;/code&gt; loop. This 2nd &lt;code&gt;for&lt;/code&gt; loop also started at 0 and ended when the count (c in this case) reached 7. This was simple enough, but the next step took some logical reasoning. Remembering that the &lt;code&gt;new Date(month, year).getDay()&lt;/code&gt; gave me the index of day of the week, I needed to setup empty &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt;s so that the count and calendar rendering started on the correct day. To do this, I added an &lt;code&gt;if&lt;/code&gt; statement in my column &lt;code&gt;for&lt;/code&gt; loop that would check if: 1. The loop was on the first row (aka &lt;code&gt;i===0&lt;/code&gt;), and 2.  The value of count loop was less than the &lt;code&gt;new Date(month, year).getDay()&lt;/code&gt; value (aka &lt;code&gt;c &amp;lt; startOfMonth&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;If both those conditions were true, I wanted the loop to create a &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; element, add an &lt;em&gt;empty&lt;/em&gt; class to the newly rendered &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; and append this to the current row element. &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%2Fuploads%2Farticles%2Fge87eghr4l3pe7k91sch.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%2Fuploads%2Farticles%2Fge87eghr4l3pe7k91sch.jpg" alt="Empty Column Data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I wanted to make sure that I was populating the correct day number on each one of the new table data elements. Modifying my &lt;em&gt;empty td element&lt;/em&gt; method, I added a &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; element for each new day, added the &lt;code&gt;textContent&lt;/code&gt;, and appended the row. The &lt;code&gt;textContent&lt;/code&gt; in this case would be the &lt;code&gt;renderNum&lt;/code&gt; variable defined earlier. To make sure that the &lt;code&gt;renderNum&lt;/code&gt; printed the correct date, I incremented the variable by 1. &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%2Fuploads%2Farticles%2Fnsxngwngxy8fz5zoc7pg.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%2Fuploads%2Farticles%2Fnsxngwngxy8fz5zoc7pg.jpg" alt="Populated Column Data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the power of &lt;em&gt;truthiness&lt;/em&gt;, I used an &lt;code&gt;else if&lt;/code&gt; statement to stop the calendar from incrementing and adding data past the last day of the month. &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%2Fuploads%2Farticles%2Fj13bb9ti7zgq4skcrss3.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%2Fuploads%2Farticles%2Fj13bb9ti7zgq4skcrss3.jpg" alt="Else If Statement"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once I reached the &lt;code&gt;break&lt;/code&gt; and was out of the &lt;code&gt;for&lt;/code&gt; loops, I needed to make sure that to append the table body with the newly formed and populated row. (&lt;em&gt;I did rearrange and group the code according to variables, and my personal preference. Obviously, this is not necessary. It was just a personal preference.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr00oekljiv829ejeqhdp.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%2Fuploads%2Farticles%2Fr00oekljiv829ejeqhdp.jpg" alt="Final Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, I added &lt;code&gt;EventListeners&lt;/code&gt; on the click of the arrows to toggle to the month before and after a calendar snapshot. Given the length of this post already, I will spare you. But there is plenty of &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener" rel="noopener noreferrer"&gt;literature on &lt;code&gt;EventListeners&lt;/code&gt;&lt;/a&gt; that I recommend reading if you have trouble with that step.&lt;/p&gt;

&lt;p&gt;Below is a snapshot of the rendered calendar. I will be sure to update this post with the github link, once the project is complete.&lt;/p&gt;

&lt;p&gt;Next up, appointments, time zones and scheduling. Wish me luck!&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%2Fuploads%2Farticles%2F6d8o2eb9ihhpurbt241x.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%2Fuploads%2Farticles%2F6d8o2eb9ihhpurbt241x.jpg" alt="Final Calendar"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Rails Crash Course: Building Follower/Following Relationship</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Thu, 28 Mar 2019 17:18:59 +0000</pubDate>
      <link>https://forem.com/knheidorn/rails-crash-course-building-follower-following-relationship-4kjl</link>
      <guid>https://forem.com/knheidorn/rails-crash-course-building-follower-following-relationship-4kjl</guid>
      <description>&lt;p&gt;Like many newbie coders, I wanted to stretch my newly learned Rails skills and thought building a simple travel review/social media site would be best. Building the basic MVCs for Users, Reviews, Destinations was pretty straight forward. The real trouble started when I tried to give users the ability to follow and unfollow on another. I struggled (longer than I care to admit) to build out this feature, and I figured I couldn’t be the only one. My hope is that this step by step guild will help others breakthrough the same issues I experienced and in the process, selfishly, help me to solidify what I learned.&lt;/p&gt;

&lt;h3&gt; Step 1: Make a Relationships Table&lt;/h3&gt;

&lt;p&gt;The basic setup for the Relationships table is pretty straightforward: two columns for the foreign keys titled &lt;em&gt;follower_id&lt;/em&gt; and &lt;em&gt;followed_id&lt;/em&gt;. Naturally, both columns will contain integers. The labeling of these columns is relative to your project as these keys will both truly be User ids. However, they do need to be labeled something unique to avoid conflict as they will be used throughout the project, specifically in a &lt;code&gt;has_many:&lt;/code&gt; relationships in the User model. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jv50fjd60g7z0hzn3c7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jv50fjd60g7z0hzn3c7.jpg" alt="Relationships Table" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt; Step 2: Modify the User Model  &lt;/h3&gt;

&lt;p&gt;The next step focuses on relating the User model to the Relationship model with a has_many, belongs_to structure, respectively. The User will have many Relationships via the foreign keys labeled in the first step (&lt;em&gt;follower_id&lt;/em&gt; and &lt;em&gt;followed_id&lt;/em&gt;). For this project, I want the User to be able to follow another User without forcing a symbiotic follow relationship. Also, since the two foreign keys are actually the same type of entity (User-User) entering into the Relationship, I need to provide these relations with a unique label, while telling the User model that these are instances of the Relationship class. Rails provides a convenient way to find the relationships between records in the database. In this project, I labeled the two different instances as &lt;code&gt;:active_relationship&lt;/code&gt; and &lt;code&gt;:passive_relationship&lt;/code&gt;, where the &lt;code&gt;:active_relationship&lt;/code&gt; is related to the &lt;em&gt;follower_id&lt;/em&gt; and the &lt;code&gt;:passive_relationship&lt;/code&gt; is matched with the &lt;em&gt;followed_id.&lt;/em&gt; Again, these labels are relative and can be called whatever makes the most sense to your project. If you notice in the code below, I did add &lt;code&gt;dependent: :destroy&lt;/code&gt; to the end of the code. This ensures the data from the Relationship table is deleted if a User deletes their profile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51fvg1mo34enu96wv9f9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51fvg1mo34enu96wv9f9.jpg" alt="User Relationship" width="800" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt; Step 3: Build the Relationship Model  &lt;/h3&gt;

&lt;p&gt;Now the Relationship model needs to be told which user is following and which user is being followed. To do that, we need to build out two &lt;code&gt;belongs_to:&lt;/code&gt; statements relative to two different instances of the User class. In this project, I titled these &lt;em&gt;follower_user&lt;/em&gt; and &lt;em&gt;followed_user&lt;/em&gt;, but again, these are arbitrary. As with the User &lt;code&gt;has_many:&lt;/code&gt; statements, I need to make sure the Relationships model knows which foreign key is associated with the different instances. As you may have guessed, the &lt;em&gt;follower_user&lt;/em&gt; is related to the &lt;em&gt;follower_id&lt;/em&gt; and the &lt;em&gt;followed_user&lt;/em&gt; is related to the &lt;em&gt;followed_id&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdw5gj9tr81v5nbjlwa7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdw5gj9tr81v5nbjlwa7.jpg" alt="Relationship Model" width="800" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt; Step 4: Modify the User Model, Again &lt;/h3&gt;

&lt;p&gt;I now need to add the ability to find these &lt;em&gt;follower_users&lt;/em&gt; and &lt;em&gt;followed_users&lt;/em&gt; through the Relationship model. The code added to the User model is nearly identical to that written in the Relationship model. The main difference is that the User knows about these instances through either the &lt;em&gt;active_relationships&lt;/em&gt; or &lt;em&gt;passive_relationships&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfgsdko7yk1va4awsf8d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfgsdko7yk1va4awsf8d.jpg" alt="User Through" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt; Step 5: Build the Relationship Controller &lt;/h3&gt;

&lt;p&gt;Before I even touch the controller part, I want to add routes to map out the actions I want to use. For my project, the Relationship Controller will only need &lt;code&gt;:create&lt;/code&gt;, &lt;code&gt;:destroy&lt;/code&gt; and &lt;code&gt;:index&lt;/code&gt;. The first two are pretty intuitive since I want someone using my site to be able to follow and unfollow other users. The &lt;code&gt;:index&lt;/code&gt; is to give me the ability to listing the user’s relationships on their profile. Again, make sure that the routes you add make sense to your overall project.&lt;/p&gt;

&lt;p&gt;Finally, I can build out the controller. The most straightforward method is the &lt;em&gt;index&lt;/em&gt;. I have a helper method in my Application Controller called &lt;em&gt;current_user&lt;/em&gt;, which finds the user using the &lt;code&gt;session[:user_id]&lt;/code&gt;. I won’t go into more detail here, but there is plenty of literature online outlining the basic structure behind this method. Using this helper method, I want to find all the &lt;em&gt;active_relationships&lt;/em&gt; and &lt;em&gt;passive_relationships&lt;/em&gt; for the current user and save these to variables that I can then access in my Views.&lt;/p&gt;

&lt;p&gt;Next, I add the &lt;em&gt;destroy&lt;/em&gt; method as this, to me, is another fairly straightforward method. First, I need to find the relationship I want to delete using the &lt;code&gt;:id&lt;/code&gt; and save that to a variable. To give my code some layer of protection, I want to ensure that the &lt;em&gt;current_user&lt;/em&gt; matches the &lt;em&gt;follower_user&lt;/em&gt; in this relationships. Once that is verified, I then delete the instance from my table and give the user a message stating that the action was successful. For my project, this action will be done on the &lt;em&gt;followed_user&lt;/em&gt; profile, and I want the current user to have that same page reload, i.e. &lt;em&gt;redirect_to&lt;/em&gt; to the same page. &lt;/p&gt;

&lt;p&gt;Finally, I want to build out the &lt;em&gt;create&lt;/em&gt; method that will allow a user to follow someone. This one, for me, is the most challenging logic wise, but again, is fairly similar to other &lt;em&gt;create&lt;/em&gt; methods I used in my project. Initially, I need to find &lt;em&gt;followed_user&lt;/em&gt; and assign it to a variable. This variable will be used to assign the &lt;em&gt;followed_id&lt;/em&gt; and for the &lt;em&gt;redirect_to&lt;/em&gt; path. Next, I want to build the active_relationship from the &lt;em&gt;current_user&lt;/em&gt; and again, assign this to a variable to be used in the Views. Again, to give the user feedback, if the relationship can be saved, the user will see the message "Follow Successful." Otherwise, the user will see "Follow Unsuccessful."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1upawwy09b9iw0b0rqm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1upawwy09b9iw0b0rqm.jpg" alt="Relationship Controller" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The only thing left to do is add these methods to my Views. As I am still in the process of refining the look and feel of these individual pages, I will end my walkthrough here. Again, there is additional literature available online as to how people gave different buttons or links the functionality to use these methods. As I have found, there is more than one way to do things in Rails. Thanks for reading and I would love to hear more thoughts or insight into how others built out their own social website. Cheers!&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Barriers in Coding for Non-Native English Speakers</title>
      <dc:creator>Kim Heidorn</dc:creator>
      <pubDate>Mon, 18 Mar 2019 13:46:09 +0000</pubDate>
      <link>https://forem.com/knheidorn/barriers-in-coding-for-non-native-english-speakers-2c65</link>
      <guid>https://forem.com/knheidorn/barriers-in-coding-for-non-native-english-speakers-2c65</guid>
      <description>&lt;p&gt;Before I joined the coding community, I worked primarily in the service industry, more specifically house cleaning and roofing. Working in HR and management in both these industries, I focused  on making on-boarding and training documentation accessible to people who’s native language was something other than English. Not only did having a clear description of their role help define and manage employee/employer expectations, the individual felt more included in the work environment.  It opened these same people to ask more questions about almost every aspect of the business, from what our sales documentation said to asking about advancement opportunities at the company. It gave these people more power and ownership in their work that I am not sure they had at other companies. Once I started learning the basics of Ruby syntax, I could not help but notice that it seemed English dominate. I knew that this had to be a larger barrier faced by non-native English speakers trying to break into the technology sector, and wanted to learn more about what I could do to help bridge that gap.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are some common issues?
&lt;/h3&gt;

&lt;p&gt;It’s no secret that English continues to be the dominate language for science and technology. Most popular programming languages and their corresponding official documentation are almost always written or designed in English. This even is seen in popular discussion sites, like Stack Overflow, and English continues to be the official language of many open-source educational software available for free online. From my &lt;a href="https://temochka.com/blog/posts/2017/06/28/the-language-of-programming.html"&gt;research&lt;/a&gt;, there are translations available, but these are perceived from the end user as lower quality than the source material. A &lt;a href="http://pgbovine.net/publications/non-native-english-speakers-learning-programming_CHI-2018.pdf"&gt;survey&lt;/a&gt; conducted by Professor Philip J. Guo at UC San Diego confirmed as much. The survey also highlighted that traditional communication barriers with general reading comprehension greatly effect a person’s ability to grasp concepts, especially so if the text became more colloquial. As one native French respondent noted, &lt;em&gt;“The technical vocabulary linked to programming can be complicated to assimilate, especially in the middle of explanatory sentences if you don’t know the equivalent word in your native language. Sometime a single technical word can blur the meaning of an entire sentence (Guo 5).”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Another common issue for most non-native speakers is English grammar, specifically the &lt;a href="https://www.youtube.com/watch?v=fsn6buk-BtE&amp;amp;feature=youtu.be"&gt;subject-verb-object relationship&lt;/a&gt;. Words like &lt;em&gt;if, unless, while, until&lt;/em&gt; are prevalent in most complex computer programming languages, but are often difficult for non-native speakers to fully grasp as there is not often a literal translation. This can also cause issues for non-native speakers to fully grasp the difference between core coding concepts such as the difference between objects, classes and instances. This also leads to issues with colloquial variable naming conventions. As noted in Professor Guo’s survey, &lt;em&gt;“I’ve seen folks struggle with the naming of variables – opting for simple names like ‘a’ or meaningless (or worse misleading names) like ‘table’. Otherwise the folks I’ve seen who are not native English speakers but are coders tend to do quite well with the structures and grammar of coding. It is where the natural human language meets the code that there are issues... :-) (6).”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For more first-hand insight, I recommend checking out the video below from a talk regarding 3 working programmers personal experiences.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fsn6buk-BtE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  What can English speakers do to help?
&lt;/h3&gt;

&lt;p&gt;Non-native speakers often have to simultaneously learn programming concepts and English, and often rely heavily on translation programs like Google to actively work out what individual words mean. To help mitigate this, English speakers can avoid using slang or local expressions that are not easily understood outside of that individuals culture. Also using more complete variable naming conventions can help alleviate comprehension issues. An example would be to avoid shorthand such as num_list for a numbered list. Also writing in short, and direct sentences in comments can help non-native speakers to fully understand the function of the program. Again, it is important to avoid using colloquial phrases in comments. &lt;/p&gt;

&lt;p&gt;More broadly, it is important to understand if someone on your team has language limitations and at what level. Without fully understanding the starting point, it is hard to build a strong learning path and likely difficult for those individuals to feel fully integrate into the team. These learning paths also should be custom tailored to the individual. No two people learn or comprehend material the same way, and one technique that worked from someone in the past may not be effective for someone who speaks a different language or come from a different cultural background. &lt;/p&gt;

&lt;p&gt;Professor Guo also took the time prior to this survey to build out a coding visualizer called &lt;a href="http://pythontutor.com/"&gt;Python Tutor&lt;/a&gt;. This innovative platform not only helps non-native speakers to understand what each line of code does, it also has a live help chat feature that can bring together individuals of different backgrounds to troubleshoot code issues. It is a fascinating tool that I used early on to help solidify core concepts like how certain operators work. Below is a quick tutorial video to help understand how this service works.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/McYTtgl8ogI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you are as interested in this topic as I am, I strongly encourage checking out Guo’s &lt;a href="http://www.pgbovine.net/"&gt;research and current advancements in the industry&lt;/a&gt;. I also would greatly appreciate hearing from people actively working in the industry with their own thoughts on this topic!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>discuss</category>
      <category>career</category>
      <category>tips</category>
    </item>
  </channel>
</rss>
