<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Caitlin's Blog]]></title><description><![CDATA[DC-based front-end engineer, motivated by the power of technology as a force for good]]></description><link>https://blog.caitlinfloyd.com</link><generator>RSS for Node</generator><lastBuildDate>Sat, 06 Jun 2026 11:38:56 GMT</lastBuildDate><atom:link href="https://blog.caitlinfloyd.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Learning to Code as a Form of Language Learning]]></title><description><![CDATA[Before I became a programmer, I worked in language access - first in English language education, then in nonprofit management running the Language Access and Proficiency program at a refugee resettlement agency. When I made the transition into softwa...]]></description><link>https://blog.caitlinfloyd.com/learning-to-code-as-a-form-of-language-learning</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/learning-to-code-as-a-form-of-language-learning</guid><category><![CDATA[learn coding]]></category><category><![CDATA[programming languages]]></category><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Tue, 29 Nov 2022 03:51:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/OyCl7Y4y0Bk/upload/v1669692847856/uRa81jJyNQ.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before I became a programmer, I worked in language access - first in English language education, then in nonprofit management running the Language Access and Proficiency program at a refugee resettlement agency. When I made the transition into software development, I was excited to see how much overlap there was between the two seemingly unrelated fields. The overlaps most obvious to me revealed themselves when I was first learning my programming languages and approached the learning process through the lens of second language acquisition.</p>
<p>As developers, we refer to the tools we use as 'programming languages,' but we don't always think of learning to code as a form of language learning. There are of course differences between natural languages and programming languages, but humans have been learning natural languages for hundreds of thousands of years longer than we've been learning programming languages, and there are lots of insights we can glean from the field of second language acquisition.</p>
<p>Below I'll outline three concepts from the field of Second Language Acquisition and how they can be applied to learning to code - computer language acquisition, if you will. Some terms I'll be using throughout this article:</p>
<ul>
<li><strong>Second Language Acquisition (SLA)</strong> - a sub-discipline of applied linguistics that studies the process by which language learners acquire any language other than their native language(s)</li>
<li><strong>natural language</strong> - a spoken or signed language that has evolved naturally through usage in human communication (e.g. English, Japanese, Arabic)</li>
<li><strong>programming language</strong> - a system of notation used by programmers to develop computer programs (e.g. Python, Javascript, Java)</li>
</ul>
<h2 id="heading-comprehensible-input">Comprehensible input</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1669692954664/8aBJDvSVy.jpg" alt="victor-barrios-yjygDnvRuaI-unsplash.jpg" />
Comprehensible input in the field of SLA refers to language input that is just slightly above the level of the learner. Language input generally refers to receptive skills like listening or reading, whereas language output refers to productive skills like speaking or writing.</p>
<p>According to Stephen Krashen, comprehensible input is "the only true cause of second language acquisition" (64). It's often represented as <code>i + 1</code> (or <code>i++</code> for all you programmers), where <code>i</code> is the learner's current level. To further translate that into programming speak,</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt;= fullProficiency; i++) {
    <span class="hljs-keyword">const</span> comprehensibleInput = i + <span class="hljs-number">1</span>
    practiceLanguage(comprehensibleInput)
}
</code></pre>
<p>Generally, the idea is that learners should encounter language beyond what they have already learned so as to challenge them, but not so far beyond what they've learned as to completely discourage them.</p>
<h3 id="heading-comprehensible-input-applied-to-coding">Comprehensible input applied to coding</h3>
<p>Gaining exposure to code just slightly above your comprehension ability will help you to expand the limits of your knowledge. There are a  few places we can look to find comprehensible inputs in programming. Documentation, courses, and tutorials can all serve as excellent sources of comprehensible input.</p>
<p>For those that are already familiar with at least one programming language, a less obvious source of comprehensible input that I really love to use is code review! If you work with any team members that use different programming languages than you, have any friends that do, or even know of any open source projects that do, I encourage you to do your best to review their code. You won't understand everything, and might not be able to provide high-value feedback at first, but if you already have context around the project they're working on, that's a great starting point to build from. Depending on the context, you might even be able to ask questions to learn more about the code they wrote.</p>
<h2 id="heading-making-mistakes-is-a-critical-skill">Making mistakes is a critical skill</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1669693176429/GVmNoAZDT.jpg" alt="visuals-JpTY4gUviJM-unsplash.jpg" />
One of the biggest hurdles for most adult language learners is getting over the fear of failure or of being wrong. This limitation delays many adult language learners from progressing at the rate of many juvenile language learners. This is because many adult learners are so debilitated by a fear of using language incorrectly that they barely use the language at all.  </p>
<blockquote>
<p>It has been suggested that inhibition discourages risk-taking, which is necessary for progress in language learning. (Lightbrown and Spada, 61)</p>
</blockquote>
<p>Counterintuitively, getting comfortable with making mistakes is one of the best ways to make progress as a language learner. Focusing on the goal of communicating instead of on the goal of producing grammatically perfect sentences allows a learner to gain practice using new vocabulary, which will help them better remember it; and using new grammar structures, which will help them gain intuition for when and how to use them.</p>
<blockquote>
<p>Sometimes language acquisition is reflected in a decrease in the use of a correct form that was based on rote memorization or chunk learning. New errors may be based on an emerging ability to extend a particular grammatical form beyond the specific items with which it was first learned. In this sense, an increase in error may be an indication of progress. (Lightbrown and Spada, 77)</p>
</blockquote>
<p>I love this idea that mistakes can be a sign of progress, and think it can be a very helpful reminder for folks who get discouraged when they make mistakes.</p>
<h3 id="heading-making-mistakes-applied-to-coding">Making mistakes applied to coding</h3>
<p>It's important not to be so afraid of making mistakes as to never write any code in the first place. Try not to be afraid of a blank page - start with a 'Hello World,' add some complexity, and correct when necessary.</p>
<p>Making mistakes will be a natural part of the process of applying new knowledge, and it's important not to get discouraged when mistakes occur. Instead, see mistakes as an essential part of the process of gaining proficiency and an opportunity to learn. Get comfortable with reading error messages, debugging code, and asking for help. These are some of the most important skills for leveling up as a developer.</p>
<h2 id="heading-scaffolding">Scaffolding</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1669693263729/nmx8_X8pk.jpg" alt="reto-simonet-WN9QRESOu5c-unsplash.jpg" />
As you might expect, one of the fastest and most effective ways of learning a language is to actually use that language. Using language productively to create meaning is infinitely better practice than simply reading or listening to someone else use language. </p>
<p>In the field of education, scaffolding refers to the strategy of gradually progressing students toward increased independence in the learning process. In a language classroom, this could look like:</p>
<ol>
<li>The teacher introduces a new grammar concept to the class</li>
<li>Students read a short passage and identify all instances of the new grammar structure</li>
<li>Students then complete an exercise where they complete sentences by filling in the blank with a verb conjugated using the new grammar structure</li>
<li>Students think of and write three sentences using the new grammar structure</li>
<li>Students converse with a partner using a prompt designed to elicit the new grammar structure naturally</li>
</ol>
<p>In this process, students begin with lots of support (or scaffolding) from the teacher, but as they gain familiarity with a concept, they are able to demonstrate more and more independence until they are finally able to use the new concept independently and could even use the new concept outside the classroom. Working toward productive language use is generally always the goal in a natural language classroom because it is the most effective way for learners to internalize information about a language.</p>
<h3 id="heading-scaffolding-applied-to-coding">Scaffolding applied to coding</h3>
<p>Similarly, reading coding tutorials is a great way to start learning a new coding concept, but we should work to scaffold our learning with the ultimate goal of writing code and working on real life projects. In the context of learning to code, scaffolding could look like:</p>
<ol>
<li>Reading documentation about a programming concept</li>
<li>Watching a course on the new concept and perhaps completing small challenges if they exist in the course</li>
<li>Following along with a tutorial using the programming concept</li>
<li>Working independently (i.e. not through a tutorial) on a project applying the programming concept</li>
</ol>
<p>If you're feeling overwhelmed while learning something new, a great way to set yourself up for success is to first think about how you ultimately want to apply your knowledge, then work backwards to build up some scaffolding for yourself.</p>
<h2 id="heading-tldr-how-can-i-be-a-more-effective-computer-language-learner">TL;DR - How can I be a more effective (computer) language learner?</h2>
<ol>
<li>Start with input that is just slightly beyond your current level.</li>
<li>Embrace mistakes as part of the process.</li>
<li>Give yourself support as needed, but make it a goal to work towards independently developing projects.</li>
</ol>
<hr />
<h2 id="heading-works-cited">Works Cited</h2>
<p>Brown, H. Douglas. <em>Principles of Language Learning and Teaching: A Course in Second Language Acquisition</em>. Pearson Education, 2007.</p>
<p>Krashen, Stephen. “Immersion: Why It Works and What It Has Taught Us.” <em>Language and Society</em>, 1984, p. 64.</p>
<p>Lightbown, Patsy M, and Nina Spada. <em>How Languages Are Learned</em>. Oxford University Press, 2006.</p>
]]></content:encoded></item><item><title><![CDATA[Collab Lab Retrospective]]></title><description><![CDATA[For two months earlier this year, I had the privilege of working with a team of three other developers and three mentors during the spring 2021 cohort of Collab Lab. If you’re not familiar with the Collab Lab, according to their website they provide ...]]></description><link>https://blog.caitlinfloyd.com/collab-lab-retrospective</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/collab-lab-retrospective</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Sat, 19 Jun 2021 01:18:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084823016/ul6HzP7tz.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For two months earlier this year, I had the privilege of working with a team of three other developers and three mentors during the spring 2021 cohort of <a target="_blank" href="https://the-collab-lab.codes/">Collab Lab</a>. If you’re not familiar with the Collab Lab, according to their website they provide participants with an opportunity to “gain practical experience by working remotely on real world projects with other early-career developers.” It was an amazing experience, and I learned so much during my time there.</p>
<p>Our team of four software developers met weekly with our mentors as we <a target="_blank" href="https://github.com/the-collab-lab/tcl-22-smart-shopping-list">worked to develop</a> a <a target="_blank" href="https://tcl-22-shopping-list.web.app/">smart shopping app</a>. Our mentors, experienced software engineering professionals, led learning modules on topics like code review, pair programming, communication for developers, and accessibility. During the week, we would pair program to meet the acceptance criteria on GitHub issues for our project, submit PRs, and provide code reviews to our teammates. In our weekly meetings, we shared demos of our feature work, and participated in retrospectives with the team.</p>
<p>Through it all, I learned so much about how to be a good software engineering team member. Here are some of my biggest takeaways:</p>
<h2 id="heading-write-clear-documentation">Write clear documentation</h2>
<p>Especially as an early-career developer, it can be tempting to try to make your skills look more impressive by adding complexity for the sake of complexity. This is completely the wrong instinct. Your priority should be on making your code easy to understand.</p>
<p>How can you do this? Write clean code, but also <em>write clear documentation</em>! Before my experience with The Collab Lab, I always thought of documentation as just <a target="_blank" href="https://developer.mozilla.org/en-US/">MDN</a>, and the official documentation of widely used libraries and frameworks. That’s just the tip of the iceberg! Documentation also encompasses everything from descriptive PRs and commit messages to thoughtful comments in your code. As a developer, basically anything you write for people instead of computers is documentation. Make sure you’re writing it to be as helpful as possible.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084819994/rkeZ_tkgA.jpeg" alt="A laptop with a text editor open to a code file sits on a white desk with a desktop computer, speakers, headphones, a coffee mug, and a cell phone" /></p>
<h3 id="heading-descriptive-prs-and-commit-messages">Descriptive PRs and commit messages</h3>
<p>One thing I really loved was that Collab Lab created a template for us to use when creating pull requests. All of our PRs included a description of the change, a list of the acceptance criteria, a checklist of the types of changes made, before and after screenshots or screen recordings of our app, and the testing steps/QA criteria. While this meant that we had to spend a little extra time creating the PRs, the benefit was twofold: 1) the process of creating the PR could help us catch errors before sending the code to be reviewed and 2) code review was <em>so</em> much easier when everyone had a clear understanding of what had been changed and why.</p>
<p>Similarly, writing meaningful commit messages makes code review much easier on your team, and it also makes it easier down the line for yourself and others to understand why changes have been made.</p>
<h3 id="heading-thoughtful-comments-in-your-code">Thoughtful comments in your code</h3>
<p>I had been under the impression that code comments were a mark of weakness, and to be avoided at all costs. That is, until one of our mentors, Luis, shared this fantastic video from Sarah Drasner on <a target="_blank" href="https://www.youtube.com/watch?v=yhF7OmuIILc">“The Art of Comments,”</a> that was an eye-opener for me.</p>
<iframe src="https://www.youtube.com/embed/yhF7OmuIILc?feature=oembed" width="700" height="393"></iframe>

<p>While commented-out code (or as Sarah refers to it, “hoarders, but for code” 💀) can certainly clutter up your files, intentional and considered comments can improve the quality of your code.</p>
<p>If you have an unintuitive solution to a tricky bug, it could be helpful to leave a comment explaining why it’s necessary. If you found a solution on Stack Overflow, it could be helpful to leave a comment with a link to the page.</p>
<h2 id="heading-inclusion-necessitates-accessibility">Inclusion necessitates accessibility</h2>
<p>One of my favorite things about The Collab Lab was the emphasis on accessibility. The apps we built were expected to be accessible, one of our learning modules was dedicated to accessibility, and throughout the spring cohort we were sent a wealth of accessibility resources and articles through Slack.</p>
<p>To me, an emphasis on accessibility is a natural extension of Collab Lab’s mission:</p>
<blockquote>
<p>The Collab Lab increases access to web development jobs for early-career developers and, in particular, people in under-represented groups in tech by providing experiential skills training in software team collaboration and career management.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084821221/VEVeFEW10.jpeg" alt="A man in a beige plaid shirt uses a braille screen reader set up in front of a traditional keyboard" /></p>
<p>A mission that prioritizes bringing opportunity to under-represented groups in tech speaks to a desire for a more inclusive tech world. One facet of this is of course bringing more diversity to the teams developing technology. Another is to ensure that the tech we are building is built for everyone, which means making it accessible.</p>
<p>If you’re interested in learning more about accessibility, I’d recommend starting with <a target="_blank" href="https://uxdesign.cc/the-little-book-of-accessibility-a9b59d82b412">this article</a> written by the former head of accessibility at the BBC, or the <a target="_blank" href="https://www.a11yproject.com/">A11y Project</a> (a11y is a <a target="_blank" href="https://en.wikipedia.org/wiki/Numeronym">numeronym</a> for accessibility, if you haven’t come across that term before).</p>
<p>I learned so much and am so grateful for my time at The Collab Lab, and highly encourage fellow early-career developers to apply! Tomorrow is the deadline for the <a target="_blank" href="https://the-collab-lab.codes/apply/">summer 2021 cohort</a>, and if you’re reading this after June 19, 2021 you can follow the Collab Lab on <a target="_blank" href="https://twitter.com/_collab_lab">Twitter</a> to find out about upcoming cohorts!</p>
]]></content:encoded></item><item><title><![CDATA[Job Hunting as a Junior Developer]]></title><description><![CDATA[I recently started my first software engineering job at a company and on a team that I’m really excited about. While I was job hunting, one small mindset shift made a huge difference for me:

View the job interview process primarily as a learning exp...]]></description><link>https://blog.caitlinfloyd.com/job-hunting-as-a-junior-developer</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/job-hunting-as-a-junior-developer</guid><category><![CDATA[job search]]></category><category><![CDATA[Junior developer ]]></category><category><![CDATA[Interview tips]]></category><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Thu, 03 Jun 2021 23:50:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084815416/8rDPeJIyM.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently started my first software engineering job at a company and on a team that I’m really excited about. While I was job hunting, one small mindset shift made a huge difference for me:</p>
<blockquote>
<p><strong>View the job interview process primarily as a learning experience, and secondarily as an opportunity to get a job.</strong></p>
</blockquote>
<p>This is of course much easier said than done, and not everyone has the luxury of approaching the job hunt this way; but in my experience the more I was able to make this mindset shift, the happier and more successful I was in my job hunt.</p>
<h2 id="heading-why-should-you-try-to-make-this-mindset-shift">Why should you try to make this mindset shift?</h2>
<h3 id="heading-1-mentalemotional-well-being"><strong>1. Mental/emotional well-being</strong></h3>
<p>Job hunting is extremely stressful and emotionally draining. There is so much pressure to get a job, that it is difficult not to take rejection personally. On top of this, the outcome of a job interview is ultimately out of your hands, and the lack of autonomy can be extremely anxiety-inducing.</p>
<p>By making it the primary objective of your job interview to learn something, you are reclaiming autonomy and putting yourself back in control of your own success.</p>
<h3 id="heading-2-success-in-the-job-hunt">2. Success in the job hunt</h3>
<p>Ironically, in slightly de-prioritizing the hiring outcome of a job interview, you can also make yourself more appealing to employers.</p>
<p>When employers hire junior developers, if they know what they’re doing, they’re not looking for the candidate with the most technical skills. If that’s what they wanted, they would be hiring for a more senior position. Instead, they are looking for a candidate with the most capacity to learn technical skills. If you make learning your priority (and if you are able to effectively demonstrate this to the employer), you will make yourself a very attractive candidate for the position.</p>
<h2 id="heading-how-can-you-begin-to-make-this-mindset-shift">How can you begin to make this mindset shift?</h2>
<h3 id="heading-1-look-for-opportunities-to-learn-new-ideas-and-technologies">1. Look for opportunities to learn new ideas and technologies</h3>
<p>A great way to do this is to look at the company’s tech stack and try to learn more about the technologies they use, especially if you are unfamiliar with those technologies. If they have a tech blog, read it and discuss it in your interview! If you’re working on a take-home assignment, try to incorporate part of their tech stack. If you’re doing a code review, talk about how you might refactor to utilize a technology they use on the team. If an interviewer mentions a term or technology you’re unfamiliar with, read up on it after your interview and mention what you learned in your follow-up/thank you email.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084814032/bfEY3uKXa.jpeg" alt="A woman sitting cross-legged and barefoot on a bed while on a laptop and referencing multiple open books splayed around the bed" /></p>
<p>It might not be realistic to learn a new framework or language for every job you apply to, but demonstrating a passion for learning will go far in a job interview, and hopefully it will also make the process more fun or interesting for you.</p>
<p>Of course the hope is that you’ll be able to impress the hiring manager with your newfound skills and demonstrated ability to learn, but even if you don’t get the job you’ll have a new skill to put on your resume or a new concept you can talk about in future interviews!</p>
<h3 id="heading-2-ask-questions-that-demonstrate-your-curiosity-and-desire-to-learn">2. Ask questions that demonstrate your curiosity and desire to learn</h3>
<p>I was a hiring manager in my previous (non-tech) career, and I noticed that something a lot of entry-level job applicants forget is that a job interview really should be a two-way conversation. Don’t be afraid to ask questions! In my experience, the more I remember this, the less scary job interviews are. Not only this, but an interesting conversation will be a lot more enjoyable for the hiring manager and you’ll leave a much better impression on them. Job interviews can be stressful and/or draining for hiring managers too, and they’ll really appreciate an engaging conversation.</p>
<p>As a junior developer, in the interview process you will almost certainly be speaking with developers who are much more experienced than you are. Take advantage of this! There is so much you can learn from them — about the company’s tech stack, about their personal career path, and about the tech industry in general. Even if a job offer doesn’t come out of the interview, you could be making a connection that will help you in the future.</p>
<p>I hope this tiny hack helps you the way that it helped me, and I wish you the best of luck in the job hunt!</p>
]]></content:encoded></item><item><title><![CDATA[Building a Wedding Website]]></title><description><![CDATA[Amidst the craziness of 2020, on top of the craziness of a career change, a job hunt (and adopting a puppy for good measure), I got married! For the health of our loved ones, my husband and I had a very small ceremony with only immediate family membe...]]></description><link>https://blog.caitlinfloyd.com/building-a-wedding-website</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/building-a-wedding-website</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Wed, 23 Dec 2020 19:05:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084834161/u6sB3FVwX.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Amidst the craziness of 2020, on top of the craziness of a career change, a job hunt (and adopting a puppy for good measure), I got married! For the health of our loved ones, my husband and I had a very small ceremony with only immediate family members, but we still wanted to include those friends and family that couldn’t join us in person. We decided we should make a wedding website to share our day with our friends and family. Since our needs were so specific, rather than using a wedding website service, I decided to code it myself!</p>
<h2 id="heading-getting-started">Getting Started</h2>
<p>Since we wanted our website up and running as soon as possible, and since I was splitting my attention between building the website and planning a wedding, I decided to start with a Gatsby starter. There aren’t any Gatsby starters specifically intended to be used as wedding websites, so while browsing the <a target="_blank" href="https://www.gatsbyjs.com/starters/">Gatsby starter library</a>, I was looking for a starter that was minimal enough to allow me room for customization. Before starting, I knew the primary function of our website would be to direct our virtual guests to the livestream of our ceremony. We also wanted space to share details about the big day and stories about our relationship. We were also considering adopting the website after the ceremony to share wedding pictures with friends and family.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084829256/nt_xBG0Pk.gif" alt="A screenshot of the original Gatsby starter template this project was built from - the heading reads &quot;Welcome To Our Studio! It's nice to meet you&quot; above a background image of everyday carry items such as headphones, a watch, sunglasses, and a wallet" />
<em>The original Gatsby starter</em></p>
<p>I ultimately chose the <a target="_blank" href="https://github.com/thundermiracle/gatsby-startbootstrap-agency">startbootstrap-agency starter</a> from Thundermiracle. This starter was designed to be a business landing page, but I liked that it had a clean design that would look good in both mobile and desktop views; it had a call to action button that I could use to direct our virtual guests to the livestream, and the “portfolio” section looked like something I could adapt to display our wedding photos. As a bonus, the “about” section featured a timeline that I could use to share details of our relationship.</p>
<h2 id="heading-adding-functionality">Adding Functionality</h2>
<p>Upon selecting a starter, I first set to work reorganizing and deleting unnecessary sections and updating images and content within the preexisting framework. I also updated theme colors and fonts to match our aesthetic. In order to have a minimally viable product, I added a message at the top of the page, as well as a link to our livestream.</p>
<p>The MVP wedding website</p>
<p>Once I had a minimally viable product, I began building out additional features for the site. First, I added a countdown feature to the site. This was both a feature to build anticipation of the event, and a way to customize the display depending on when the user was accessing it. By using a countdown feature, which I implemented using the react-countdown library, I was able to build multiple versions of the page: one version for our page’s visitors in the days and weeks leading up to the event, another version for visitors on the day of the ceremony.</p>
<h2 id="heading-using-react-libraries-to-optimize-user-experience">Using React Libraries to Optimize User Experience</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084831142/bg66lRo1L.gif" alt="A demo of the implementation of React libraries - clicking the wedding hashtag copies the text to the user's clipboard so they can use it on social media, and clicking the &quot;add to calendar&quot; button gives the user the option to create a calendar event in Apple, Google, Outlook, or Yahoo" /></p>
<p><em>Some of the additional features: copy-to-clipboard and add-to-calendar</em></p>
<p>After looking over the page I had built, my husband and I came up with some additional features that would make the page more useful for our guests. He had the great idea of adding an “add to calendar” button at the top of our page, to help our virtual guests remember to log on for the livestream. To do this, I utilized the react-add-to-calendar library, and customized the display to blend in with the rest of our page. I also reused the react countdown library so that I could display the add-to-calendar button leading up to the ceremony, but hide it once the day had arrived, as its functionality would no longer be useful at that time. On the day of the ceremony, the “add to calendar” button would be replaced by a “watch the ceremony” button.</p>
<p>Like any good millennial couple, we also had a wedding hashtag for our virtual guests to use if posting to social media. I turned all references to this hashtag into a clickable button that would copy the text to the user’s clipboard. To do this, I utilized the react copy-to-clipboard library, as well as the react toast-notifications library for an aesthetically pleasing way to alert the user to the action taken.</p>
<h2 id="heading-challenges">Challenges</h2>
<p>What surprised me about this project was that the most challenging part of coding it was not adding new features, but rather tweaking existing ones. As a Gatsby starter, the code was written to allow for some superficial customization very easily. The text and images displayed on the page were intended to be replaced, so it was easy to find where to edit this information in the code.</p>
<p>The rest of the code was not written to be easy to navigate, but rather to allow a user to easily make those superficial changes, and have those changes automatically permeate throughout the code. I wanted to write user-friendly code that could potentially be used by others looking to make a similar wedding website, which ruled out the option of hard-coding my adjustments as a workaround to integrating them deeper into the code.</p>
<p>Some features that I anticipated being difficult to implement, like the countdown feature and time-sensitive displays, came down to a matter of carefully reading the documentation for various React libraries.</p>
<p>Other features that seemed much simpler in theory, like turning images into links in the “giving” section, were much more difficult. Because this change required making adjustments to existing code, I needed a comprehensive understanding of how that code worked. I realized in the process that the codebase relied often on mapping through arrays and passing props through many generations. Keeping a clear mental image of the data flow was difficult but crucial for making these deceptively simple tweaks to the website.</p>
<h2 id="heading-next-steps">Next Steps</h2>
<p>Now that the wedding ceremony has happened, the purpose of our wedding website has shifted slightly. Instead of directing our friends and family to the livestream of the ceremony, it will be a place to share photos, videos, and highlights from our wedding. I will add a gallery and/or carousel to highlight wedding photographs.</p>
<p>I will also be further cleaning up the code in order to make it as user-friendly as possible for future users who might want to use it as a template for their own wedding websites. Stay tuned for the final product!</p>
<p><strong>•</strong> <a target="_blank" href="https://github.com/cafloyd/wedding"><strong>Wedding website code</strong></a></p>
<p><strong>•</strong> <a target="_blank" href="https://github.com/thundermiracle/gatsby-startbootstrap-agency"><strong>Gatsby starter</strong></a></p>
]]></content:encoded></item><item><title><![CDATA[Couch Potato Retrospective]]></title><description><![CDATA[This article was originally published as part of the Building Couch Potato blog series.

Working on Couch Potato was a huge learning opportunity for our team. It was one of our first times developing a project from scratch, without any kind of starti...]]></description><link>https://blog.caitlinfloyd.com/couch-potato-retrospective</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/couch-potato-retrospective</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Thu, 20 Aug 2020 13:01:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084891040/nWf8XPSmd.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>This article was originally published as part of the Building Couch Potato blog series.</p>
</blockquote>
<p>Working on Couch Potato was a huge learning opportunity for our team. It was one of our first times developing a project from scratch, without any kind of starting template. To face such a daunting challenge and be able to create a product we can stand behind and use regularly was extremely rewarding and empowering.</p>
<h2 id="heading-successes">Successes</h2>
<p>Overall, the single feature we are proudest of is the synchronized play/pause across Couch Potato users. As Grace mentioned in her <a target="_blank" href="https://medium.com/building-couch-potato/comparing-couch-potato-to-hulu-watch-party-5e0458a239ba">comparison of Couch Potato to Hulu Watch Party</a>, even Hulu’s official social distance viewing solution does not include this feature. This feature undoubtedly took us the most time to work out, but it is also the one that brings the most value to our extension. It’s what gives our extension an edge when compared to the other messaging systems on the market while streaming video with friends.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084884949/Z8GexOFNe.png" alt="A screenshot from the Chrome web store page for Couch Potato, showing a five star rating and 110 users" /></p>
<p>In addition to the technical challenges we overcame, we also consider it a huge success to have our product deployed, and being used by real people. As of today, there are 110 users of our extension.</p>
<p>On a personal note, I’ve also found it extremely rewarding to have helped develop a tool that I actually use regularly. Since shelter-in-place measures have gone into effect, my family has had weekly virtual dinner and movie nights. Whenever we watch content on Hulu, Couch Potato is the tool that we use to make this possible.</p>
<h2 id="heading-possible-improvements">Possible Improvements</h2>
<p>While we are extremely proud of our product and the work we put into it, we can also learn a lot by reflecting critically on the process and decisions we made along the way.</p>
<p>One decision we made early on was to create a web app that allowed users to chat in private rooms (or “couches”), then to create an extension that loaded that web app into the user’s browser window through an iframe. We took this approach because it allowed us to break down a huge challenge into more manageable pieces. We would start by creating a web app (something we had experience doing), then incorporate socket.io (a new-to-us technology) to allow for real-time chat, then finally bundle it into a Chrome extension (another new-to-us technology) via an iframe.</p>
<p>If we were to refactor our extension, we would consider doing so in a way so that Couch Potato would load directly onto the user’s browser, rather than through an iFrame. This could remove a layer of complexity from the process and optimize our extension for speed.</p>
<p>As we have not faced any issues with the speed of our extension, and since we have a relatively small user base for now, we have not yet seen a need to refactor Couch Potato. For now, we’re watching the comments on the Chrome extensions page to hear feedback from our users.</p>
<h2 id="heading-future-features">Future Features</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084889763/hhd5HBqkP.jpeg" alt="A reclined woman watching TV, holding a remote control, and laughing while eating popcorn" /></p>
<p>In the future, if we decide to revisit Couch Potato, one of our first orders of business will be to add support for additional video streaming services, such as Netflix, Amazon Prime, or Disney+. This is the feature that would most benefit our users, as it would drastically increase the amount of content they could access while using Couch Potato. In order to implement this feature, we will have to familiarize ourselves with these video streaming platforms in order to be able to manipulate the DOM effectively.</p>
<p>One of our favorite features of Couch Potato is the drinking game button, as it brings a more social element to watching movies and TV remotely with friends. In the future, we would consider additional features that seek to bridge the distance between our users and further incorporate social interaction into the viewing experience. For example, while we currently allow users to react with emoji in the chat window, we would consider making these emoji reactions more dynamic by making them float across the screen. We could also add a “popcorn button” that simulates throwing popcorn at the screen (which users could do, for example, when the horror movie protagonists decide to split up, or when the rom-com lead’s ex tries to start drama).</p>
<p>Have you tried <a target="_blank" href="https://chrome.google.com/webstore/detail/couch-potato/aheloceipokicgchednkbmlaejgcpllo?hl=en-US">Couch Potato</a>? What do you like about it, and what would you like us to improve? Leave a comment below!</p>
<p>This is the last installment of our blog series, for now at least. We’ve loved having the opportunity to reflect on this project with you, and hope you’ve enjoyed following along. If you’ve missed any blog posts, you can find them all <a target="_blank" href="https://medium.com/building-couch-potato">here</a>.</p>
<p>If you’d like to keep up with us around the web, here’s where you can find us:</p>
<h3 id="heading-dani-meyer">Dani Meyer</h3>
<p><a target="_blank" href="https://medium.com/@dani.meyer.nd">Medium</a> | <a target="_blank" href="https://github.com/dlm19">Github</a> | <a target="_blank" href="https://www.linkedin.com/in/meyer-dani/">LinkedIn</a> | <a target="_blank" href="https://twitter.com/DaniMeyer_ND">Twitter</a></p>
<h3 id="heading-caitlin-floyd">Caitlin Floyd</h3>
<p><a target="_blank" href="https://medium.com/@caitlinfloyd">Medium</a> | <a target="_blank" href="https://github.com/cafloyd">Github</a> | <a target="_blank" href="https://www.linkedin.com/in/caitlinfloyd/">LinkedIn</a> | <a target="_blank" href="https://twitter.com/caitlinfloyd">Twitter</a></p>
<h3 id="heading-june-hwang">June Hwang</h3>
<p><a target="_blank" href="https://medium.com/@joonybejoy">Medium</a> | <a target="_blank" href="https://github.com/joonybejoy">Github</a> | <a target="_blank" href="https://www.linkedin.com/in/eunjoon-hwang/">LinkedIn</a> | <a target="_blank" href="https://twitter.com/joonybejoy">Twitter</a></p>
<h3 id="heading-grace-murray">Grace Murray</h3>
<p><a target="_blank" href="https://medium.com/@gkmurray124">Medium</a> | <a target="_blank" href="https://github.com/gkmurray124">Github</a> | <a target="_blank" href="https://www.linkedin.com/in/gracekmurray/">LinkedIn</a> | <a target="_blank" href="https://twitter.com/gkmurray124">Twitter</a></p>
<p><em>Interested in learning more about Couch Potato? Start this blog series</em> <a target="_blank" href="https://medium.com/building-couch-potato/welcome-to-couch-potato-a-chrome-extension-to-watch-stuff-with-friends-db2dc66b133a?sk=26bab8ab22ad363f31a1e66237b2750b"><em>from the beginning</em></a><em>! And don’t forget to</em> <a target="_blank" href="https://chrome.google.com/webstore/detail/couch-potato/aheloceipokicgchednkbmlaejgcpllo"><em>download Couch Potato</em></a> <em>from the Chrome store so you can start watching shows with friends now!</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Use GitHub as a Portfolio]]></title><description><![CDATA[For software engineers (and particularly for those that are job hunting), it can be helpful to have a portfolio to highlight noteworthy projects. For developers that enjoy front-end work, this can be a fun project in itself. But for those that aren’t...]]></description><link>https://blog.caitlinfloyd.com/how-to-use-github-as-a-portfolio</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/how-to-use-github-as-a-portfolio</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Mon, 20 Jul 2020 17:11:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084851178/_vRalLK2P.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For software engineers (and particularly for those that are job hunting), it can be helpful to have a portfolio to highlight noteworthy projects. For developers that enjoy front-end work, this can be a fun project in itself. But for those that aren’t interested in creating their own website, GitHub’s new profile readme feature provides a great alternative.</p>
<p>Before getting started, make sure you have optimized your GitHub profile as it currently exists. Edit your profile to include a brief bio, and some additional information such as your city and a relevant link (such as your LinkedIn profile). Add a professional profile picture if you’re so inclined. By default, GitHub will display six recent or popular repos on your profile. Highlight projects you’re proud of by pinning up to six of them to be displayed instead.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084839421/Los6-HQC8.gif" alt="Default selected 'popular' repositories displayed on a Github profile" /></p>
<p>GitHub recently unveiled a new feature that allows users to highlight a readme file at the top of their profile. To enable this feature, simply create a repository with the same name (and casing) as your GitHub username. Be sure to also initialize the repo with a readme.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084841137/XFmeKH7OP.gif" alt="Customized pinned repositories displayed on a Github profile" /></p>
<p>When you edit the readme file, GitHub provides suggestions of the types of information you may want to include. In addition to these suggested insights (such as what you’re working on, what you’re learning, your pronouns), you may want to include information about what languages or frameworks you’re familiar with, your non-coding interests, or information about your background and education.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084842705/3u9vvpI4r.png" alt="Default Github readme content, beginning with &quot;Hi there&quot; and with suggestions such as &quot;I'm currently working on...&quot;, &quot;I'm currently learning...&quot;, and &quot;I'm looking to collaborate on...&quot; " /></p>
<p>If you want to finish here, you’ll have turned your GitHub profile into a portfolio in as little as 5–10 minutes!</p>
<p>Because this highlighted file is a <a target="_blank" href="https://www.markdownguide.org/">markdown file</a>, and it supports HTML tags, there is also a lot of additional room for creativity. Think of ways to make information more visual, with images or tables. (<a target="_blank" href="https://www.canva.com/">Canva</a> is a great resource for easily creating images.) Include any links you think are relevant, such as links to social media accounts or to live projects. While videos can’t be embedded into a markdown file (you’ll have to externally link them instead), gifs can. Consider recording a short video of your project to convert into a gif that can be displayed on your profile.</p>
<p>With this new ability to personalize your profile, you are only limited by your own creativity. If you need inspiration, consider browsing <a target="_blank" href="https://twitter.com/search?q=github%20readme&amp;src=typeahead_click">Twitter</a> to see what others have shared.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084845487/B8ol9Dcri.gif" alt="A screenshot of my Github profile, which includes a banner image with my name; links to my portfolio, LinkedIn, Twitter, and blog; a brief bio; and some highlighted projects" /></p>
<p>Feel free to check out <a target="_blank" href="https://github.com/cafloyd">my GitHub profile</a> for ideas!</p>
<p>Have you taken advantage of this new GitHub feature? Leave a comment with a link to your profile — I would love to check it out!</p>
]]></content:encoded></item><item><title><![CDATA[Optimizing for UX]]></title><description><![CDATA[This article was originally published as part of the Building Couch Potato blog series.

In our last post, we outlined our process for collecting feedback from users of our Chrome extension, Couch Potato. How did we then incorporate this feedback int...]]></description><link>https://blog.caitlinfloyd.com/66dd93dfd670</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/66dd93dfd670</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Thu, 16 Jul 2020 13:01:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084863521/MkSjvKlM6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>This article was originally published as part of the <a target="_blank" href="https://medium.com/building-couch-potato">Building Couch Potato</a> blog series.</p>
</blockquote>
<p>In <a target="_blank" href="https://medium.com/building-couch-potato/gathering-ux-feedback-451888d88056">our last post</a>, we outlined our process for collecting feedback from users of our Chrome extension, Couch Potato. How did we then incorporate this feedback into our product?</p>
<p>Based on the feedback from our users, we identified a few areas for potential improvement. First of all, while some users found our extension to be intuitive to use, others were less confident and felt they could have benefitted from more explicit instructions. While reviewing this feedback, we realized there were actually two separate problems being described. Some users were unfamiliar with Chrome extensions in general, and others were confused by our specific Chrome extension. During the feedback process, we also noticed that some parts of the user experience were not as seamless as we would have hoped, so we made it our goal to remove any inconveniences we could for the user in order to make their experience as pleasant as possible.</p>
<p>Once we had identified these problems, we began brainstorming how to solve them. For users who were unfamiliar with Chrome extensions, we decided to utilize a Chrome popup notification that would instruct users on how to initialize the extension whenever they were on a supported domain. This had the added benefit of reminding all users that they were on a supported domain and could use Couch Potato.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084855456/QQSYEin54E.gif" alt="Chrome notification" /></p>
<p><em>Chrome notification</em></p>
<p>For users who needed further instruction on how to use Couch Potato after initializing it, we wanted to add instructions to our homepage without adding clutter for users who didn’t need instructions. To accomplish this goal, we added a React component that would only display detailed instructions if the user required them.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084858074/M1gXjRPbS.gif" alt="Instructions in a React component" /></p>
<p><em>Instructions in a React component</em></p>
<p>In order to selectively display components on our homepage, we added indicators to the state that would dictate whether or not the component should be displayed. When the user clicked on a button, it would change the corresponding state, thus triggering a rerender of the page. Clicking the button again would reverse this state change and again rerender the page.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HomePage</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Component</span> </span>{
  <span class="hljs-keyword">constructor</span>() {
    <span class="hljs-built_in">super</span>();
    <span class="hljs-built_in">this</span>.state = {
      <span class="hljs-attr">showJoin</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">showStart</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">showInstructions</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">showHelpButton</span>: <span class="hljs-literal">true</span>
    };
    <span class="hljs-built_in">this</span>.toggleJoinPopup = <span class="hljs-built_in">this</span>.toggleJoinPopup.bind(<span class="hljs-built_in">this</span>);
    <span class="hljs-built_in">this</span>.toggleStartPopup = <span class="hljs-built_in">this</span>.toggleStartPopup.bind(<span class="hljs-built_in">this</span>);
    <span class="hljs-built_in">this</span>.toggleInstructions = <span class="hljs-built_in">this</span>.toggleInstructions.bind(<span class="hljs-built_in">this</span>);
  }

  toggleJoinPopup() {
    <span class="hljs-built_in">this</span>.setState({
      <span class="hljs-attr">showStart</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">showJoin</span>: !<span class="hljs-built_in">this</span>.state.showJoin
    });
  }

  toggleStartPopup() {
    <span class="hljs-built_in">this</span>.setState({
      <span class="hljs-attr">showJoin</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">showStart</span>: !<span class="hljs-built_in">this</span>.state.showStart
    });
  }

  toggleInstructions() {
    <span class="hljs-built_in">this</span>.setState({
      <span class="hljs-attr">showInstructions</span>: !<span class="hljs-built_in">this</span>.state.showInstructions
    });
  }
</code></pre>
<p><em>A portion of our code that allowed us to selectively display components on the home page</em></p>
<p>In order to further streamline the user experience, we wanted to make it easier for users to share their couch ID with their friends. To do this, we utilized two React libraries; react-copy-to-clipboard, and react-notify-toast. React-copy-to-clipboard allowed us to turn the user’s couch ID into a clickable link that would automatically copy their couch ID to their clipboard. To make sure the user knew this action had been successful, we utilized a toast notification confirming that the ID had been copied.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084862226/hIpXlI-D9.gif" alt="React-copy-to-clipboard and react-notify-toast demo" /></p>
<p><em>React-copy-to-clipboard and react-notify-toast in action</em></p>
<p>Beta testing and collecting user feedback was an essential part of our process. It forced us to take a step back from our code and center the user. Not only were we able to respond directly to user feedback, but we were also empowered to think creatively of further features our users might enjoy. Stay tuned for <a target="_blank" href="https://medium.com/building-couch-potato/couch-potatos-additional-functionality-1ddf9edeb45e">our next post</a> when we will dive into some of these additional features.</p>
<p><em>Interested in learning more about Couch Potato? Start this blog series</em> <a target="_blank" href="https://medium.com/building-couch-potato/welcome-to-couch-potato-a-chrome-extension-to-watch-stuff-with-friends-db2dc66b133a?sk=26bab8ab22ad363f31a1e66237b2750b"><em>from the beginning</em></a><em>! And don’t forget to</em> <a target="_blank" href="https://chrome.google.com/webstore/detail/couch-potato/aheloceipokicgchednkbmlaejgcpllo"><em>download Couch Potato</em></a> <em>from the Chrome store so you can start watching shows with friends now!</em></p>
]]></content:encoded></item><item><title><![CDATA[Collaborating Remotely]]></title><description><![CDATA[This article was originally published as part of the Building Couch Potato blog series.

So far in this blog series, we have detailed the technical challenges we faced in creating Couch Potato, the Chrome Extension we developed allowing users to stre...]]></description><link>https://blog.caitlinfloyd.com/collaborating-remotely-46588598ed5a</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/collaborating-remotely-46588598ed5a</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Thu, 09 Jul 2020 21:06:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084872200/785hDMoe1.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>This article was originally published as part of the <a target="_blank" href="https://medium.com/building-couch-potato">Building Couch Potato</a> blog series.</p>
</blockquote>
<p>So far in this blog series, we have detailed the technical challenges we faced in creating Couch Potato, the Chrome Extension we developed allowing users to stream video content together remotely. We wanted to pause now to address the physical challenge we faced in unexpectedly having to develop our project remotely.</p>
<p>Our team (and the rest of our cohort) had signed up for a 13-week in-person coding bootcamp. At the end of the eighth week, we were told that we would temporarily be going remote in response to public health concerns. Ultimately we were forced to complete the remainder of our course remotely, which meant that the entirety of our Couch Potato project was also done remotely.</p>
<p>When collaborating with other software engineers, team members’ communication and collaboration skills can be just as important as their software engineering abilities. As much of the world has discovered while working from home this year, these skills become even more essential when working remotely. When we began our project, before anything else — before even discussing the content we wanted to develop — we discussed our individual expectations and set our team routines.</p>
<p>We decided to err on the side of over-communicating to make sure everyone was on the same page and no one was going rogue or getting left behind. We would have stand-up meetings first thing in the morning to confirm what everyone had been working on, what challenges they were facing, and what they planned to work on that day. We also checked in with one another after lunch to make sure everything was progressing as anticipated. At the end of the day, we would regroup to review our code changes, push the code to the main branch of our repository, handle merge conflicts, and have a “pull party” to ensure that every member of our team was working with the most up-to-date code.</p>
<p>Another decision we needed to make as a team was the extent to which we wanted to pair program. We came to the decision that while we wanted to develop an awesome product, our top priority was learning from this project. This led us to decide to pair program for as much of our project as we possibly could, and to even mob-code as a group for earlier portions of our project. While this meant sacrificing some of the efficiency that might have been gained from coding independently, it also meant that every member of our team was able to contribute more holistically to our project, feel more of a sense of ownership over the project, and understand the different nuances of our code.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084870925/Stoobkjbt.jpeg" alt="A screenshot of a zoom call between &quot;Karsten Winegeart&quot; and &quot;Toshi&quot;, both represented by closeup images of dogs" /></p>
<p>An important skill for software engineers is knowing the proper tools to use for a given situation. We came to rely very heavily on video conferencing and instant messaging platforms to communicate with one another throughout the day. Screen sharing was also extremely valuable for long-distance pair programming. This might be an unpopular opinion, but I think making the choice to turn on our cameras for our calls made a huge difference in our group dynamic and the effectiveness of our collaboration. In our stand up meetings and when pair programming, we almost always had our cameras on. I think this small detail made our team feel more familiar, and made us more willing to request and offer help to one another.</p>
<p>While collaborating remotely was certainly an unanticipated challenge for us, ultimately it proved to be an excellent learning experience. We experienced firsthand the importance of many of the coding habits we had been building. Writing clean code, proactively communicating with one’s team, and knowing how to look for information were essential skills for us as a remote team, but they are also crucial habits that we developed and will be able to rely on throughout our careers as software engineers.</p>
<p>Stay tuned <a target="_blank" href="https://medium.com/building-couch-potato/gathering-ux-feedback-451888d88056">next week</a> as we address some of our UX challenges and how we addressed them!</p>
<p><em>Interested in learning more about Couch Potato? Start this blog series</em> <a target="_blank" href="https://medium.com/building-couch-potato/welcome-to-couch-potato-a-chrome-extension-to-watch-stuff-with-friends-db2dc66b133a?sk=26bab8ab22ad363f31a1e66237b2750b"><em>from the beginning</em></a><em>! And don’t forget to</em> <a target="_blank" href="https://chrome.google.com/webstore/detail/couch-potato/aheloceipokicgchednkbmlaejgcpllo"><em>download Couch Potato</em></a> <em>from the Chrome store so you can start watching shows with friends now!</em></p>
]]></content:encoded></item><item><title><![CDATA[Adding Functionality to React]]></title><description><![CDATA[This article was originally published as part of the Building Couch Potato blog series.

After working through the challenges of converting our code to React, we were eager to incorporate all the additional functionality that React allowed.
To begin,...]]></description><link>https://blog.caitlinfloyd.com/adding-functionality-to-react</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/adding-functionality-to-react</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Thu, 25 Jun 2020 13:01:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084867653/3DFDOKDHx.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>This article was originally published as part of the <a target="_blank" href="https://medium.com/building-couch-potato">Building Couch Potato</a> blog series.</p>
</blockquote>
<p>After working through <a target="_blank" href="https://medium.com/building-couch-potato/couch-potato-converting-to-react-55aae5179de9">the challenges of converting our code to React</a>, we were eager to incorporate all the additional functionality that React allowed.</p>
<p>To begin, we created React components to allow users to start or join “couches” (chat rooms) upon launching the extension. Utilizing React components for this purpose allowed for more modular and cleaner code. Notably, it also allowed users to navigate to their target couch through a single page application-style div element. By avoiding the need to navigate through separate pages in this way, we prevented any unnecessary interruptions to the user’s web player.</p>
<p>We designed our “home page” component to include basic instructions for users and options to either start or join a couch. Depending on which option the user selected, their state would change and trigger a re-render of the page, displaying either a “join” or “start” component with the appropriate user input fields. Users that selected to start a couch would be asked for their name, and to select an avatar before creating a couch. Users that had chosen to join a couch would be asked for the ID number of the couch they were joining, as well as their name and an avatar.</p>
<p>For the dual purposes of preventing backend errors and improving user interface, we added several layers of form validation. Users would not be able to submit the form unless all text fields were completed. (If no avatar was selected, a default option would be assigned.) If the user was asked for a couch ID number, only a numerical input with the expected number of digits would be accepted. Unless all these criteria were met, the submit button would be disabled, and a warning message would display over the relevant input fields to alert the user of the issue.</p>
<p>Upon submitting their information, all users would be redirected to a final “chat” component with the appropriate couch ID number (either the one provided by the user choosing to join an existing couch, or a randomly generated ID for the user creating a new couch).</p>
<p>At this stage, we were not yet ready to incorporate additional React libraries into our code, but had already begun identifying which of our planned features could be implemented with the use of React libraries. For example, we knew that we would eventually want to allow users to use emoji in the chat or to edit their user information, and we felt React would likely be useful in addressing these issues. <a target="_blank" href="https://medium.com/building-couch-potato/deploying-couch-potato-to-heroku-fa6c7ac256e6">Stay tuned</a> to hear how our journey continued, and how we utilized some of these React libraries to solve problems we encountered.</p>
<p><em>Interested in learning more about Couch Potato? Start this blog series</em> <a target="_blank" href="https://medium.com/building-couch-potato/welcome-to-couch-potato-a-chrome-extension-to-watch-stuff-with-friends-db2dc66b133a?sk=26bab8ab22ad363f31a1e66237b2750b"><em>from the beginning</em></a><em>! And don’t forget to</em> <a target="_blank" href="https://chrome.google.com/webstore/detail/couch-potato/aheloceipokicgchednkbmlaejgcpllo"><em>download Couch Potato</em></a> <em>from the Chrome store so you can start watching shows with friends now!</em></p>
]]></content:encoded></item><item><title><![CDATA[Getting Started with Couch Potato]]></title><description><![CDATA[This article was originally published as part of the Building Couch Potato blog series.

So you’ve decided to create a piece of technology that lets people watch shows together from the comfort of their own homes and chat while doing so. Where do you...]]></description><link>https://blog.caitlinfloyd.com/getting-started-with-couch-potato</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/getting-started-with-couch-potato</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Thu, 11 Jun 2020 13:01:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084880513/992GSC7Nf.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>This article was originally published as part of the <a target="_blank" href="https://medium.com/building-couch-potato">Building Couch Potato</a> blog series.</p>
</blockquote>
<p>So you’ve decided to create a piece of technology that lets people watch shows together from the comfort of their own homes and chat while doing so. Where do you start? That’s the daunting question we faced when deciding to create Couch Potato for our bootcamp’s Capstone project.</p>
<p>Once we had a clear vision of what we wanted our product to be, we knew pretty immediately that we would be most effective with a Chrome extension, since this would allow us to overlay the chat next to the user’s streaming content and also pull information about the user’s streaming activity. With some cursory research, it also became clear that if we wanted to incorporate real-time chat features, socket.io was the way to go.</p>
<p>Since we didn’t have experience with either socket.io or Chrome extensions, we decided to tackle the technologies one at a time and begin by creating a web app that incorporated socket.io. Before we could do any coding on our project, we needed to research, watch tutorials, and read articles about socket.io. In addition to reading the official <a target="_blank" href="https://socket.io/docs/">socket.io documentation</a>, we also came across the below video and <a target="_blank" href="https://github.com/WebDevSimplified/Realtime-Chat-App-With-Rooms">corresponding repo</a> which helped us to understand some of the mechanics of socket.io.</p>
<iframe src="https://www.youtube.com/embed/UymGJnv-WsE?feature=oembed" width="700" height="393"></iframe>

<p>Once we familiarized ourselves with socket.io, our first step was to create a very basic chat room. Putting fingers to the keyboard for the first time was a little intimidating for me; up until that point I had almost always worked with some sort of starter code, so facing a blank .js file was a little overwhelming. Having literally anything on the screen is a lot less scary, so if you’re feeling the same way, just get started and worry about debugging later! The initial iteration of our chat room came together relatively easily, but as you’ll hear in a future post, we definitely came back to it a lot more to add features. We knew that we eventually wanted users to be able to create private chat rooms to use with their friends, but initially, we wanted to create one universal chat room, which would allow us to have a starting point that could be incorporated into our Chrome extension.</p>
<p>To begin developing a Chrome extension, another new-to-us technology, we started by following <a target="_blank" href="https://developer.chrome.com/extensions/getstarted">the tutorial</a> in the Chrome documentation. The documentation was extremely easy to follow, and in less than twenty minutes, we had each created the basic extension outlined in the tutorial. The extension allowed us to change the background color of any website, and it was really fun to be able to implement it so quickly.</p>
<p>Incorporating our chat functionality into our Chrome extension was a little more daunting, but we did come across a video (below) and <a target="_blank" href="https://github.com/matthewlawson/lnm-socket.io">repo</a> on using socket.io within a Chrome extension. There were some key differences between the chat extension from the demo and the chat feature we were building, but it was a very helpful starting point.</p>
<iframe src="https://www.youtube.com/embed/1zVoGTQUXvs?feature=oembed" width="700" height="393"></iframe>

<p>After watching and discussing the video and examining the source code, we needed to consider: 1) how to auto-generate new rooms for users, rather than requiring them to create new rooms themselves; 2) how to keep rooms private from other users; 3) how to “garbage collect” old rooms that were no longer being used; and 4) how to embed the chat window into the browser window rather than existing as a pop-up.</p>
<p>Stay tuned to continue following our journey towards building Couch Potato! In our <a target="_blank" href="https://medium.com/building-couch-potato/creating-the-chat-website-dcb297c72521">next post</a>, we’ll take a deeper dive into our chat room and the process of converting it into React.</p>
<p><em>Interested in learning more about Couch Potato? Start this blog series</em> <a target="_blank" href="https://medium.com/building-couch-potato/welcome-to-couch-potato-a-chrome-extension-to-watch-stuff-with-friends-db2dc66b133a?sk=26bab8ab22ad363f31a1e66237b2750b"><em>from the beginning</em></a><em>! And don’t forget to</em> <a target="_blank" href="https://chrome.google.com/webstore/detail/couch-potato/aheloceipokicgchednkbmlaejgcpllo"><em>download Couch Potato</em></a> <em>from the Chrome store so you can start watching shows with friends now!</em></p>
]]></content:encoded></item><item><title><![CDATA[Hello World]]></title><description><![CDATA[I recently graduated from coding bootcamp at the Grace Hopper Program at Fullstack Academy of Code in New York City, and am now in the process of relocating to Washington, DC and looking for a job in software development. Admittedly, it’s not the gre...]]></description><link>https://blog.caitlinfloyd.com/hello-world</link><guid isPermaLink="true">https://blog.caitlinfloyd.com/hello-world</guid><dc:creator><![CDATA[Caitlin Floyd]]></dc:creator><pubDate>Sun, 03 May 2020 23:55:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662084875706/syGGegqRz.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently graduated from coding bootcamp at the Grace Hopper Program at Fullstack Academy of Code in New York City, and am now in the process of relocating to Washington, DC and looking for a job in software development. Admittedly, it’s not the greatest time to be entering the job market or moving out of state, but this experience has made me extremely grateful to be entering a growing, innovative, and resilient field which has done so much to solve unexpected problems that have arisen during this pandemic.</p>
<p>Part of what initially drew me to become a software engineer was the immense problem-solving capacity of the industry, and that quality has been on full display these last few months. I’ve been so inspired by solutions I’ve seen developed by the tech world — everything from resources to connect volunteers with the elderly and immunocompromised in need of groceries and supplies, to tools allowing for social connection in a time of physical distancing.</p>
<p>One of the most rewarding parts of my bootcamp experience was working to develop my capstone project with a team of three other software engineers. When we began our project, we had just recently transitioned from in-person to remote classes in response to the pandemic. Already beginning to feel the effects of isolating ourselves from friends and family, we wanted to create a tool to connect people from the safety of their homes. We developed <a target="_blank" href="https://chrome.google.com/webstore/detail/couch-potato/aheloceipokicgchednkbmlaejgcpllo?hl=en-US">Couch Potato</a>, a Chrome extension allowing multiple users to watch Hulu together remotely.</p>
<p>Since wrapping up with bootcamp several weeks ago, my family and I have had weekly movie nights from our respective homes by using Couch Potato. It’s been so rewarding to see the tangible results of a solution I helped engineer. While I realize it might have been a small problem we were solving, in the scheme of everything happening in the world right now, it was nonetheless a motivating and eye-opening experience. I can’t wait to continue to use my software engineering skills to create good in the world.</p>
]]></content:encoded></item></channel></rss>