<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Annie Liao</title>
    <description>The latest articles on DEV Community by Annie Liao (@liaowow).</description>
    <link>https://dev.to/liaowow</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%2F287175%2Ff359c660-3618-479f-b412-3de36d5b1d8c.jpeg</url>
      <title>DEV Community: Annie Liao</title>
      <link>https://dev.to/liaowow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liaowow"/>
    <language>en</language>
    <item>
      <title>3 Solid Video Tutorials to Get You Started on D3 Data Visualization</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Thu, 04 Mar 2021 17:29:58 +0000</pubDate>
      <link>https://dev.to/liaowow/3-solid-video-tutorials-to-get-you-started-on-d3-data-visualization-48ai</link>
      <guid>https://dev.to/liaowow/3-solid-video-tutorials-to-get-you-started-on-d3-data-visualization-48ai</guid>
      <description>&lt;p&gt;D3.js is a beast. As &lt;strong&gt;the&lt;/strong&gt; JavaScript library for data visualization, its mesmerizingly powerful toolset can seem intimidating even for senior developers.&lt;/p&gt;

&lt;p&gt;While not a seasoned developer yet, I have long been interested in D3.js since its initial release in 2011 (wait, it's been 10 years already?!)&lt;/p&gt;

&lt;p&gt;Below are three video tutorials that I found to be very helpful in understanding, utilizing, and appreciating this dataviz giant called D3.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;a href="https://youtu.be/2LhoCfjm8R4" rel="noopener noreferrer"&gt;D3 Data Visualization&lt;/a&gt; by Curran Kelleher
&lt;/h4&gt;

&lt;p&gt;Part of freeCodeCamp's free resource, this recently-updated (February 2021), 17-hour YouTube tutorial is a course for everyone, ranging from code newbies to JavaScript veterans. &lt;/p&gt;

&lt;p&gt;My favorite feature of this course is the ability to pick and choose between sections. There is no need to follow in order. If you expand on the description field, you can see how the course is constructed and simply scrub to the part that works for you:&lt;br&gt;
&lt;a href="https://media2.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%2F0wdo0p6gbcniw4mohzs8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0wdo0p6gbcniw4mohzs8.png" alt="Curran d3 demo" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I took &lt;a href="https://youtu.be/_8V5o2UHG0E" rel="noopener noreferrer"&gt;the original 2020 version&lt;/a&gt; and truly enjoyed the hands-on experience. It is impressive how Curran makes it quick and easy to build simple D3 data visualizations, especially when you use the 2x playback speed 😉&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;a href="https://youtu.be/rQroxWLZiCo" rel="noopener noreferrer"&gt;D3 Coding Train&lt;/a&gt; ft. Shirley Wu
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Frwaef35416vj2toco19u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Frwaef35416vj2toco19u.png" alt="Shirley d3 demo" width="800" height="440"&gt;&lt;/a&gt;&lt;br&gt;
This is a recorded live interview/demo session between the Coding Train host Daniel Shiffman and D3.js master artist Shirley Wu.&lt;/p&gt;

&lt;p&gt;Amidst the fun and lively conversation, Shirley explained the concept of data binding in D3.js, and walked us through her process of building her signature art project.&lt;/p&gt;

&lt;p&gt;The 2-part series also inspired me to create &lt;a href="https://dev.to/liaowow/when-art-meets-data-flowers-as-visual-metaphor-1ekl"&gt;my very first D3 project&lt;/a&gt;. Nuff said.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;a href="https://www.newline.co/courses/fullstack-d3-masterclass/" rel="noopener noreferrer"&gt;Fullstack D3 Masterclass&lt;/a&gt; by Amelia Wattenberger
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7kxgvhrm4pnbxue9stfl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7kxgvhrm4pnbxue9stfl.jpg" alt="Amelia course screenshot" width="600" height="317"&gt;&lt;/a&gt;&lt;br&gt;
To be honest, I was on the fence about this course, as it comes with a hefty price tag and, depending on your learning style, might not be the best bang for your buck.&lt;/p&gt;

&lt;p&gt;That being said, Amelia is one of the most admired D3.js developers, so it is definitely worth the effort coding along as she unwraps the intricacy of data visualization -- both technically and aesthetically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwvfwtaznb1iyrswj8co8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwvfwtaznb1iyrswj8co8.png" alt="Amelia d3 demo" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I am barely halfway through the courses listed above, and there are still many core concepts that require further investigation on my end. Hope this post still gives you a solid reference point if you ever felt like entering the complex yet magical world of D3.js.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>codenewbie</category>
      <category>dataviz</category>
    </item>
    <item>
      <title>What I Learned from a 2-Hour Crash Course on GraphQL and TypeScript</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Fri, 23 Oct 2020 15:15:03 +0000</pubDate>
      <link>https://dev.to/liaowow/what-i-learned-from-a-2-hour-crash-course-on-graphql-and-typescript-5e1l</link>
      <guid>https://dev.to/liaowow/what-i-learned-from-a-2-hour-crash-course-on-graphql-and-typescript-5e1l</guid>
      <description>&lt;p&gt;As someone with a solid understanding of JavaScript and Ruby but not much of other programming languages, I've always wanted to learn more about a toolset many JavaScript developers are praising: &lt;strong&gt;TypeScript&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Another relatively new tool I have noticed being thrown around in the dev world is &lt;strong&gt;GraphQL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With very little bandwidth to dive deep into both tools, I was delighted to find a comprehensive FREE video tutorial that covers both topics: &lt;br&gt;
&lt;a href="https://www.newline.co/courses/the-newline-guide-to-building-your-first-graphql-server-with-node-and-typescript/" rel="noopener noreferrer"&gt;Building Your First GraphQL Server with Node and TypeScript&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcz7pa2bfk2klrsna7anu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcz7pa2bfk2klrsna7anu.png" alt="course poster" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even though the course is 2.5 hours long, it actually took me at least double the amount of time to complete. And it was time well spent.&lt;/p&gt;

&lt;p&gt;In addition to getting the gist of TypeScript and GraphQL, you would also be greeted with a beginner-friendly walkthrough of code environment setup and some Node package configurations.  &lt;/p&gt;

&lt;p&gt;Here are 4 key takeaways from my journey with the course: &lt;/p&gt;

&lt;h3&gt;
  
  
  TypeScript is a Typechecker for JavaScript
&lt;/h3&gt;

&lt;p&gt;Simply put, TypeScript is a &lt;em&gt;typed&lt;/em&gt; extension of JavaScript. &lt;/p&gt;

&lt;p&gt;Because JavaScript is &lt;strong&gt;weakly&lt;/strong&gt; (or dynamically) typed, e.g. one variable can be reassigned to different data types, it helps to have a &lt;strong&gt;strongly&lt;/strong&gt;-typed superset to reduce production issues where data types were misplaced.&lt;/p&gt;

&lt;p&gt;TypeScript is that superset. Introduced by Microsoft in 2012, it serves as a development tool to help JavaScript developers avoid painful bugs and make code easier to follow. &lt;/p&gt;

&lt;p&gt;TypeScript will eventually be transformed into valid JavaScript during the compilation process, as clients and servers do NOT recognize TypeScript.&lt;/p&gt;

&lt;h3&gt;
  
  
  GraphQL Playground is Powerful
&lt;/h3&gt;

&lt;p&gt;As the course creator eloquently puts it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GraphQL is a query language for making requests to APIs. With GraphQL, the client tells the server &lt;em&gt;exactly what it needs&lt;/em&gt; and the server responds with the data that has been requested.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not only that, I was blown away by the smooth, intuitive, modernly-designed interface of the &lt;a href="https://github.com/graphql/graphql-playground" rel="noopener noreferrer"&gt;GraphQL Playground&lt;/a&gt;. Here are some screenshots, but I encourage you to try it out and witness its power:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnc8wnb91bqf4ijylco3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnc8wnb91bqf4ijylco3m.png" alt="Alt Text" width="800" height="468"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3l7j55mvt5vqyuejs0j7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3l7j55mvt5vqyuejs0j7.png" alt="Alt Text" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Monokai Pro is Beautiful
&lt;/h3&gt;

&lt;p&gt;During the initial environment setup of the code editor, I was introduced to a lovely VS Code extension called &lt;a href="https://monokai.pro/" rel="noopener noreferrer"&gt;Monokai Pro&lt;/a&gt;. As a visual learner, it also helps to code along with the course using the same editor/color scheme.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node Problem? No Problem!
&lt;/h3&gt;

&lt;p&gt;OK, I admit this catchy tagline might be a bit confusing. What I meant to say was I personally have very limited knowledge of NodeJS. Sure, I use &lt;code&gt;npm&lt;/code&gt; to install various JavaScript libraries, but coming from a Rails background, I had not yet built a Node server before taking the course.&lt;/p&gt;

&lt;p&gt;If you share a similar background, fear no more. This tutorial actually starts by introducing Node. You even get to build a simple Node:Express server!&lt;/p&gt;




&lt;p&gt;Overall, I benefitted greatly from this tutorial and highly recommend it to anyone who is pressed for time but just wants to see the power of TypeScript and GraphQL.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>graphql</category>
      <category>javascript</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>What You Can Achieve with 30 Days of JavaScript30 Challenge</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Sat, 10 Oct 2020 17:27:46 +0000</pubDate>
      <link>https://dev.to/liaowow/what-you-can-achieve-after-30-days-of-javascript30-challenge-39nh</link>
      <guid>https://dev.to/liaowow/what-you-can-achieve-after-30-days-of-javascript30-challenge-39nh</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fibunvefphkr79qsx6gef.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fibunvefphkr79qsx6gef.png" alt="JS30 cover" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is more to vanilla JavaScript than meets the eye. &lt;/p&gt;

&lt;p&gt;At least that's what I discovered after completing Wes Bos' &lt;a href="https://javascript30.com/" rel="noopener noreferrer"&gt;JavaScript30 Challenge&lt;/a&gt; in 30 days.&lt;/p&gt;

&lt;p&gt;If you have not heard of JavaScript30 Challenge, it is a &lt;strong&gt;FREE&lt;/strong&gt; video tutorial consisting of 30 coding exercises/challenges, each of which focuses on a specific JavaScript feature.&lt;/p&gt;

&lt;p&gt;So, what can you achieve by completing these challenges? Here are 7 key takeaways from my own rewarding experience:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Save Time and Money
&lt;/h3&gt;

&lt;p&gt;Did I mention this tutorial is &lt;strong&gt;100% free&lt;/strong&gt;? Also, most videos are less than 20 minutes long -- you can even build a cool-looking feature within 5 minutes of code-along! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm6e4isilb4lezhzzmlaz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm6e4isilb4lezhzzmlaz.png" alt="JS30 course list" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Laugh Along with Wes Bos
&lt;/h3&gt;

&lt;p&gt;Laughter is contagious. Couple that with Wes Bos' enthusiastic tone throughout the tutorials, you are bound to have an enjoyable coding journey.&lt;/p&gt;

&lt;p&gt;As a side note, it was through this tutorial that I found out about the &lt;a href="http://bada55.io/" rel="noopener noreferrer"&gt;"BADASS" CSS colors&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Build on Top of Beautiful Design
&lt;/h3&gt;

&lt;p&gt;Speaking of CSS, every course comes with unique pre-built CSS styling, which makes each feature already visually appealing before you start coding.&lt;/p&gt;

&lt;p&gt;This is an irresistible bonus for visual learners out there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm6qc8ov6wj70d0bny5yu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm6qc8ov6wj70d0bny5yu.png" alt="JS30 demo1" width="800" height="565"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2l05n6yjb3ue5uf7qd7y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2l05n6yjb3ue5uf7qd7y.png" alt="JS30 demo2" width="800" height="511"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkt2znnqa34pur4lxr17e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkt2znnqa34pur4lxr17e.png" alt="JS30 demo3" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Create Console Magic
&lt;/h3&gt;

&lt;p&gt;Remember &lt;a href="https://dev.to/liaowow/beyond-console-log-3-ways-to-format-console-outputs-in-javascript-236p"&gt;my previous post&lt;/a&gt; on multiple ways to format console outputs beyond &lt;code&gt;console.log&lt;/code&gt;? Well, I wouldn't have known about all that were it not for JavaScript30 tutorials. &lt;/p&gt;

&lt;p&gt;Here's a quick demo of &lt;code&gt;console.table()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;┌─────────┬─────────────┬───────────────┬──────┬────────┐&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="nx"&gt;first&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;     &lt;span class="nx"&gt;last&lt;/span&gt;      &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="nx"&gt;passed&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;├─────────┼─────────────┼───────────────┼──────┼────────┤&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;0&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Albert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Einstein&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1879&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1955&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;1&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Isaac&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Newton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1643&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1727&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;2&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Galileo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Galilei&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1564&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1642&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;3&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Marie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Curie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1867&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1934&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;4&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Johannes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kepler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1571&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1630&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;5&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nicolaus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Copernicus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1473&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1543&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;6&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Max&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Planck&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1858&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1947&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;7&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Katherine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Blodgett&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1898&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1979&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;8&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lovelace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1815&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1852&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;9&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sarah E.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Goode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1855&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1905&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="mi"&gt;10&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lise&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Meitner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1878&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1968&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="mi"&gt;11&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hanna&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hammarström&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1829&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1909&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;└─────────┴─────────────┴───────────────┴──────┴────────┘&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Move beyond Keyboard and Mouse Clicks
&lt;/h3&gt;

&lt;p&gt;Did you know that you can create a selfie maker, a webcam camera booth, or a voice changer using plain-old vanilla JavaScript?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F864irnnfs4q2hicot6kd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F864irnnfs4q2hicot6kd.png" alt="JS30 webcam fun" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Witness the Power of Window Object
&lt;/h3&gt;

&lt;p&gt;Sure, you can browse through &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window" rel="noopener noreferrer"&gt;the documentation&lt;/a&gt; on this powerful Web API. But nothing beats putting those objects and properties in practical use and watching them shine.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Explore Journeys of Coders around the World
&lt;/h3&gt;

&lt;p&gt;Born and raised in Taiwan, I was delighted to see some Taiwanese flags🇹🇼 among the &lt;a href="https://github.com/wesbos/JavaScript30" rel="noopener noreferrer"&gt;list of contributors/fellow learners&lt;/a&gt;. It was also interesting to see how others used different approaches to the same challenge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcpaum4caz2oq6xjmaxhz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcpaum4caz2oq6xjmaxhz.png" alt="JS30 repo" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;As someone who sped through JavaScript fundamentals and hopped on the fancy world of JavaScript frameworks, the 30-day challenge has truly made me appreciate the power of vanilla JavaScript.&lt;/p&gt;

&lt;p&gt;Most importantly, it gave me a pleasant change of scenery after weeks of grokking algorithms and data structures.&lt;/p&gt;

&lt;p&gt;A big shout-out to Wes Bos and those who share their journeys as featured in the &lt;a href="https://github.com/wesbos/JavaScript30" rel="noopener noreferrer"&gt;JavaScript30 GitHub repo&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>Understanding the Sliding Window Technique in Algorithms</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Tue, 29 Sep 2020 21:19:37 +0000</pubDate>
      <link>https://dev.to/liaowow/understanding-the-sliding-window-technique-in-algorithms-206o</link>
      <guid>https://dev.to/liaowow/understanding-the-sliding-window-technique-in-algorithms-206o</guid>
      <description>&lt;p&gt;Aside from the &lt;a href="https://dev.to/liaowow/using-two-pointer-technique-to-optimize-algorithm-solutions-hn2"&gt;two-pointer technique&lt;/a&gt; demonstrated in my previous post, I have been grokking another popular algorithmic mental model: the &lt;strong&gt;sliding window&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;If you have never heard of the sliding-window technique, I strongly recommend watching &lt;a href="https://www.youtube.com/watch?v=MK-NZ4hN7rs" rel="noopener noreferrer"&gt;this video tutorial&lt;/a&gt; before diving into the example below. Even if you don't have 36 minutes to spare, be sure to watch the first 8 minutes, which contain multiple well-executed animations.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the sliding window technique?
&lt;/h3&gt;

&lt;p&gt;As its name suggests, this technique involves taking a subset of data from a given array or string, expanding or shrinking that subset to satisfy certain conditions, hence the &lt;strong&gt;sliding&lt;/strong&gt; effect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F083uadwx1ldawxgsexpo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F083uadwx1ldawxgsexpo.gif" alt="sliding window demo" width="800" height="414"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;(⬆️ image via &lt;a href="https://www.youtube.com/watch?v=MK-NZ4hN7rs" rel="noopener noreferrer"&gt;The Simple Engineer video&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  When can we use it?
&lt;/h3&gt;

&lt;p&gt;Generally speaking, the sliding window technique is useful when you need to keep track of a &lt;strong&gt;contiguous&lt;/strong&gt; sequence of elements, such as summing up the values in a subarray.&lt;/p&gt;

&lt;p&gt;Here's a classic example (courtesy of &lt;a href="https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/" rel="noopener noreferrer"&gt;Colt Steele's Udemy course&lt;/a&gt;):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given an array of positive integers and a positive integer,&lt;br&gt;
write a function that returns the &lt;strong&gt;minimal length&lt;/strong&gt; of a contiguous subarray, &lt;br&gt;
where the sum is greater than or equal to the integer being passed in.&lt;br&gt;
If there isn't one, return 0.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And here are some test cases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;minSubArrayLen&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 2 -&amp;gt; [4, 3] is the smallest subarray&lt;/span&gt;
&lt;span class="nf"&gt;minSubArrayLen&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 1 -&amp;gt; [62] is the smallest subarray&lt;/span&gt;
&lt;span class="nf"&gt;minSubArrayLen&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To implement the sliding window technique for this challenge, we need to first figure out the range of the window. In this case, we "open up" the window from the left.&lt;/p&gt;

&lt;p&gt;Then, we need to store the sum of the values in the enclosed subarray/window, and compare it against the target integer.&lt;/p&gt;

&lt;p&gt;If the sum meets the condition (greater than or equal to the integer), we record the length of the current window range and keep shrinking the window, as we need to find the &lt;strong&gt;minimal&lt;/strong&gt; length.&lt;/p&gt;

&lt;p&gt;If the sum does not meet the condition, then we keep expanding the right panel of the window (because we are iterating from the left).&lt;/p&gt;

&lt;p&gt;If the sum never meets the target, we break out of the loop and return 0 instead.&lt;/p&gt;

&lt;p&gt;Putting it together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;minSubArrayLen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;minLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;Infinity&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// store the current minimal length&lt;/span&gt;
      &lt;span class="nx"&gt;minLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;minLength&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;right&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;left&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="c1"&gt;// shrink the window: &lt;/span&gt;
      &lt;span class="c1"&gt;// (1) subtract the value at left idx&lt;/span&gt;
      &lt;span class="c1"&gt;// (2) move the left panel one index further to the right&lt;/span&gt;
      &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;left&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="nx"&gt;left&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;right&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// expand the window:&lt;/span&gt;
      &lt;span class="c1"&gt;// (1) sum up the current value&lt;/span&gt;
      &lt;span class="c1"&gt;// (2) move the right panel one index further to the right&lt;/span&gt;
      &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;right&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="nx"&gt;right&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;minLength&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;Infinity&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;minLength&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;By using the sliding window technique, we are able to solve the problem above with O(n) time complexity, eliminating the need for duplicate iterations. Hats off to the person/team who came up with this powerful tool!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>codenewbie</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Using Two-Pointer Technique to Optimize Algorithm Solutions</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Sat, 26 Sep 2020 00:06:49 +0000</pubDate>
      <link>https://dev.to/liaowow/using-two-pointer-technique-to-optimize-algorithm-solutions-hn2</link>
      <guid>https://dev.to/liaowow/using-two-pointer-technique-to-optimize-algorithm-solutions-hn2</guid>
      <description>&lt;p&gt;When dealing with strings and arrays in the context of algorithm challenges, our first instinct usually revolves around built-in methods. &lt;/p&gt;

&lt;p&gt;Let's take a look at this seemingly easy problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Description:
Given a sorted (ascending) array of integers, 
write a function that returns a sorted (ascending) array 
which contains the square of each number.
*/&lt;/span&gt;

&lt;span class="c1"&gt;// Examples:&lt;/span&gt;
&lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; [0, 1, 4, 9, 16, 25])&lt;/span&gt;

&lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; [4, 9, 9, 49, 121] &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Like many others, my immediate reaction was to make use of &lt;code&gt;sort()&lt;/code&gt; method after mapping out (&lt;code&gt;map()&lt;/code&gt;) the squared version of each integer, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While my solution above achieves the desired result, its somewhat brute-force approach leads to a not-so-performant &lt;code&gt;O(n log(n))&lt;/code&gt; time complexity.&lt;/p&gt;

&lt;p&gt;So how can we improve the runtime complexity?&lt;/p&gt;

&lt;p&gt;This is where a popular and effective strategy, &lt;strong&gt;Two-Pointer Technique&lt;/strong&gt;, comes into play.&lt;/p&gt;

&lt;p&gt;When iterating over an array or string, we can set two pointers to search and/or compare two elements. There are three common ways to set the pointers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start both pointers at the beginning of the iteration &lt;/li&gt;
&lt;li&gt;Start both pointers at the end of the iteration&lt;/li&gt;
&lt;li&gt;Start one pointer at the beginning, the other at the end, both moving toward each other and meeting in the middle.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's how it works in our &lt;code&gt;square()&lt;/code&gt; example:&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 0:
&lt;/h4&gt;

&lt;p&gt;Initiate an empty array that will store our results.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1:
&lt;/h4&gt;

&lt;p&gt;Create two pointers, &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;j&lt;/code&gt;, where &lt;code&gt;i&lt;/code&gt; keeps track of the negative integers, while &lt;code&gt;j&lt;/code&gt; keeps track of the positives.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2:
&lt;/h4&gt;

&lt;p&gt;Iterate over the array. Keep moving &lt;code&gt;j&lt;/code&gt; forward until the element of the array (&lt;code&gt;arr[j]&lt;/code&gt;) is a positive integer.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3:
&lt;/h4&gt;

&lt;p&gt;Inside the iteration, compare the squared elements between index i and index j, push/append the smaller element to the resulting array.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4:
&lt;/h4&gt;

&lt;p&gt;After the iteration in Step 3, our resulting array will have a sorted set of integers. What remains is the element(s) at index i and index j.&lt;/p&gt;

&lt;p&gt;We can subsequently push/append the remaining elements(s) to the resulting array.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 5:
&lt;/h4&gt;

&lt;p&gt;Return the resulting array.&lt;/p&gt;

&lt;p&gt;Here's the &lt;strong&gt;two-pointer technique&lt;/strong&gt; approach (courtesy of &lt;a href="https://www.meetup.com/Women-Who-Code-San-Diego/events/272815170/" rel="noopener noreferrer"&gt;Women Who Code San Diego&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;squareTwoPointer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="c1"&gt;// create 2 pointers: i keeps track of negatives, j keeps track of positives&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
      &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
      &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The time complexity of this optimized solution is &lt;code&gt;O(n)&lt;/code&gt; because we only perform one iteration at a time and sort the elements in place.&lt;/p&gt;




&lt;p&gt;As with almost all algorithm challenges, there are multiple ways to approach this problem. The two-pointer strategy appears to be a good starting point for optimization.&lt;/p&gt;

&lt;p&gt;If you haven't applied two-pointer techniques in your problem-solving process, I hope this example boosts your confidence in coming up with more performant algorithm solutions.&lt;/p&gt;

&lt;p&gt;Onward and upward!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>codenewbie</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>A Small, Simple Trick to Make Your Text Editable via HTML</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Tue, 15 Sep 2020 20:57:52 +0000</pubDate>
      <link>https://dev.to/liaowow/a-small-simple-trick-to-make-your-text-editable-via-html-26e1</link>
      <guid>https://dev.to/liaowow/a-small-simple-trick-to-make-your-text-editable-via-html-26e1</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F98lkxs432cwq02d4z358.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F98lkxs432cwq02d4z358.gif" alt="Woah GIF" width="480" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've been following my recent tweets, you might have noticed that I am currently coding along with Wes Bos' &lt;a href="https://javascript30.com/" rel="noopener noreferrer"&gt;JavaScript30 challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While a lot of the challenges served as a refresher for my JavaScript knowledge, there were times when I had to pause the tutorial and shouted internally, "Woah, why didn't I learn about this earlier?!"&lt;/p&gt;

&lt;p&gt;I had that moment again when approaching the challenge of creating moveable text shadows.&lt;/p&gt;

&lt;p&gt;As it turns out, there is an HTML global attribute called &lt;code&gt;contenteditable&lt;/code&gt; that allows the user to edit targeted text on the browser.&lt;/p&gt;

&lt;p&gt;According to the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/contenteditable" rel="noopener noreferrer"&gt;MDN documentation&lt;/a&gt;, &lt;code&gt;contenteditable&lt;/code&gt; is an &lt;strong&gt;enumerated&lt;/strong&gt; attribute (meaning it has a list of possible values, as opposed to a &lt;em&gt;boolean&lt;/em&gt; value), where &lt;code&gt;true&lt;/code&gt; or an empty string indicates that the text is editable, and &lt;code&gt;false&lt;/code&gt; otherwise.&lt;/p&gt;

&lt;p&gt;If the attribute is not given any value, the value is treated as an empty string, which makes the text editable, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;contenteditable&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;🔥WOAH!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And just like that, you can type any text you want on your browser.&lt;/p&gt;

&lt;p&gt;No CSS, no JavaScript, and no need for an input field. Just a plain little HTML attribute. (For security-related information, feel free to check out &lt;a href="https://stackoverflow.com/questions/41623980/is-the-html5-property-contenteditable-secure" rel="noopener noreferrer"&gt;this Stack Overflow discussion&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F98lkxs432cwq02d4z358.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F98lkxs432cwq02d4z358.gif" alt="Woah GIF" width="480" height="252"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Have you used &lt;code&gt;contenteditable&lt;/code&gt; at work or for your projects? Is there any other front-end magic that you wish you found out sooner? Please share your experience in the comments, I'd love to see some practical use cases! 🙌&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>html</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Fullstack Trivia: Can You Answer These Interview Questions in 5 Minutes?</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Fri, 11 Sep 2020 22:46:22 +0000</pubDate>
      <link>https://dev.to/liaowow/fullstack-trivia-can-you-answer-these-interview-questions-in-5-minutes-4p9j</link>
      <guid>https://dev.to/liaowow/fullstack-trivia-can-you-answer-these-interview-questions-in-5-minutes-4p9j</guid>
      <description>&lt;p&gt;Technical interviews come in all shapes and sizes. Some companies go for the traditional algorithm challenges, others tend to be more creative, such as this Fullstack Engineer interview I had the other day. &lt;/p&gt;

&lt;p&gt;Toward the end of a fun, relaxing conversation, the interviewer gave me a quick challenge: Answer a series of trivia-like tech questions that involve varying levels of knowledge in software development.&lt;/p&gt;

&lt;p&gt;I got roughly a third of them right, which wasn't too bad considering the time constraints and my "freshness" in the field.&lt;/p&gt;

&lt;p&gt;During the 5-minute exercise, I also jotted down as many questions as I could in order to share with you all, my beloved DEV community.&lt;/p&gt;

&lt;p&gt;So grab a timer, fasten your seat belt, see if you can answer these 10 questions in 5 minutes.&lt;/p&gt;

&lt;p&gt;Ready, &lt;/p&gt;

&lt;p&gt;Set, &lt;/p&gt;

&lt;p&gt;Go!&lt;/p&gt;

&lt;p&gt;⏳&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions List
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What's the difference between &lt;code&gt;git fetch&lt;/code&gt; and &lt;code&gt;git pull&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;What does &lt;code&gt;git rebase&lt;/code&gt; do?&lt;/li&gt;
&lt;li&gt;In HTML, what's the difference between &lt;code&gt;div&lt;/code&gt; tag and &lt;code&gt;span&lt;/code&gt; tag?&lt;/li&gt;
&lt;li&gt;What are CSS vendor prefixes?&lt;/li&gt;
&lt;li&gt;Is JavaScript single-threaded or multi-threaded?&lt;/li&gt;
&lt;li&gt;In JavaScript, what is an arrow function?&lt;/li&gt;
&lt;li&gt;In SQL, what are primary keys and foreign keys?&lt;/li&gt;
&lt;li&gt;What is caching in terms of different layers/stages?&lt;/li&gt;
&lt;li&gt;What are generators?&lt;/li&gt;
&lt;li&gt;In unit testing, what are some quantitative metrics for testing a codebase?&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;If those questions seem easy to you, well, congratulations, you are definitely more than a junior developer! &lt;/p&gt;

&lt;p&gt;If you had trouble answering many of the questions above, worry not, here are some resources I've collected from the world wide web:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What's the difference between Git fetch and Git pull?&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git fetch&lt;/code&gt; is the command that tells your local git to retrieve the latest meta-data info from the original.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git pull&lt;/code&gt; does what &lt;code&gt;git fetch&lt;/code&gt; does AND brings (copy) those changes from the remote repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Source: &lt;a href="https://www.freecodecamp.org/news/git-fetch-vs-pull/#:~:text=git%20fetch%20is%20the%20command,changes%20from%20the%20remote%20repository." rel="noopener noreferrer"&gt;freeCodeCamp&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  2. What does Git rebase do?&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;We use &lt;code&gt;git rebase&lt;/code&gt; when we want to take all commits from our feature branch, and move them into the main branch.&lt;/p&gt;

&lt;p&gt;Rebasing is often used as an alternative to merging. Rebasing a branch updates one branch with another by applying the commits of one branch on top of the commits of another branch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Source: &lt;a href="https://medium.com/osedea/git-rebase-powerful-command-507bbac4a234" rel="noopener noreferrer"&gt;Rebase — One of the Most Powerful Git Commands&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. In HTML, what's the difference between &lt;code&gt;div&lt;/code&gt; tag and &lt;code&gt;span&lt;/code&gt; tag? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;: block-level, primarily used to organize the layout of the page.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;: inline-level, mainly used to style a part of a text.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. What are CSS vendor prefixes? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Vendor prefixes are one way browsers use to give CSS developers access to newer features not yet considered stable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Source: &lt;a href="https://flaviocopes.com/css-vendor-prefixes/" rel="noopener noreferrer"&gt;CSS Vendor Prefixes&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Is JavaScript single-threaded or multi-threaded? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Single-threaded. Here's a &lt;a href="https://medium.com/@samimyaquby/how-can-javascript-be-asynchronous-and-single-threaded-at-the-same-time-c13c99bb4703" rel="noopener noreferrer"&gt;cool explainer&lt;/a&gt; on how JavaScript can be asynchronous AND single-thread at the same time.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. In JavaScript, what is an arrow function? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;An arrow function is a part of ES6 syntax. It does NOT have its own 'this' keyword. Instead, an arrow function will use the 'this' keyword of whatever 'this' was outside the function when it was created.&lt;/p&gt;

&lt;p&gt;You can take &lt;a href="https://dev.to/liaowow/take-this-quiz-understand-how-this-works-in-javascript-44dj"&gt;"this" quiz&lt;/a&gt; (pun intended) I created to become more familiar with the &lt;code&gt;this&lt;/code&gt; keyword.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. In SQL, what are primary keys and foreign keys? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Primary key: unique ID/address of each row of the table.&lt;br&gt;
Foreign key: a set of columns in a table that refers to the primary key of another table.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. What is caching in terms of different layers/stages? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I found a caching overview on &lt;a href="https://aws.amazon.com/caching/" rel="noopener noreferrer"&gt;the AWS site&lt;/a&gt;, which has a nice diagram and table explaining the use case for each layer: client-side, DNS, Web, App, and Database.&lt;/p&gt;

&lt;p&gt;Feel free to also check out an intro to caching in &lt;a href="https://docs.djangoproject.com/en/3.1/topics/cache/" rel="noopener noreferrer"&gt;Django documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. What are generators? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;In some programming languages, e.g. Python, a generator is "an iterator in the style of iterating by need."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We won’t calculate and store the values at once but generate them on the fly when we’re iterating.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Source: &lt;a href="https://medium.com/better-programming/what-are-generators-yields-and-streams-in-python-a94072b3eb93" rel="noopener noreferrer"&gt;What Are Generators, Yields, and Streams in Python?&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  10. In unit testing, what are some quantitative metrics for testing a codebase? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;According to my interviewer, &lt;strong&gt;code coverage&lt;/strong&gt; is one way of verifying the extent to which the code has been executed.&lt;/p&gt;

&lt;p&gt;If you're interested in learning more about testing metrics, I found a post that introduces &lt;a href="https://softcrylic.com/blogs/top-25-metrics-measure-continuous-testing-process/" rel="noopener noreferrer"&gt;25 metrics&lt;/a&gt; you can use in a continuous testing process.&lt;/p&gt;




&lt;p&gt;As always, if you have other helpful resources or tutorials on any of the questions, please let me know in the comments.&lt;/p&gt;

&lt;p&gt;Happy learning!&lt;/p&gt;

</description>
      <category>git</category>
      <category>javascript</category>
      <category>career</category>
      <category>interview</category>
    </item>
    <item>
      <title>Beyond Formatting Your Console: Styling Your console.log()</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Fri, 04 Sep 2020 20:42:56 +0000</pubDate>
      <link>https://dev.to/liaowow/beyond-formatting-your-console-styling-your-console-log-13bo</link>
      <guid>https://dev.to/liaowow/beyond-formatting-your-console-styling-your-console-log-13bo</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzm9hfxgh7azeiqlcsxeh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzm9hfxgh7azeiqlcsxeh.png" alt="console styling demo" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last week I shared &lt;a href="https://dev.to/liaowow/beyond-console-log-3-ways-to-format-console-outputs-in-javascript-236p"&gt;three handy dev tools&lt;/a&gt; that let us format our console outputs beyond the plain-old &lt;code&gt;console.log()&lt;/code&gt;. Today I learned one more neat trick to "prettify" our console.&lt;/p&gt;

&lt;p&gt;This trick is so simple, all you need to do is add a special indicator inside your &lt;code&gt;console.log()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's see how it works with pure strings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add this set of characters, &lt;code&gt;%c&lt;/code&gt;, at the start of the string.&lt;/li&gt;
&lt;li&gt;Pass in an additional argument, which contains the style of the string. As you can see below, the syntax is basically the style attributes of an HTML element.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! Feel free to play around on your browser console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('%c Style me pretty 💋', 'font-family: "Impact", sans-serif; font-size: 100px; color: black; background: #ffc600;')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now to the practical use.&lt;/p&gt;

&lt;p&gt;Say you want to test how a variable, &lt;code&gt;lastChecked&lt;/code&gt;, gets reassigned inside a function. Aside from writing out the current output of the variable in your &lt;code&gt;console.log()&lt;/code&gt;, you can insert the styling as an argument, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('%c lastChecked before shiftKey: ', 'color: black; background: #BADA55;',lastChecked)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('%c lastChecked inside shiftKey: ', 'color: black; background: #FFC600;', lastChecked)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('%c lastChecked after shiftKey: ', 'color: black; background: #3EA055;', lastChecked)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just like that, you are presented with a colorful console log with clear distinctions between different stages. It is a cool alternative to organizing your console outputs, similar to the &lt;code&gt;console.group()&lt;/code&gt; method as mentioned in &lt;a href="https://dev.to/liaowow/beyond-console-log-3-ways-to-format-console-outputs-in-javascript-236p"&gt;my previous post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpihb237ad78e198wt3d2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpihb237ad78e198wt3d2.png" alt="style console with variables" width="764" height="274"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Finally, you might be wondering how I found out about those little tricks. &lt;/p&gt;

&lt;p&gt;In addition to the wonderful search engine, I have been coding along with the popular, FREE &lt;a href="https://javascript30.com/" rel="noopener noreferrer"&gt;JavaScript30 tutorial&lt;/a&gt; by Wes Bos, who kept introducing fascinating dev tools along the journey and creating a fun, delightful JavaScript learning experience. &lt;/p&gt;

&lt;p&gt;I highly recommend checking it out if you haven't already.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>codenewbie</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Beyond console.log(): 3 Ways to Format Console Outputs in JavaScript</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Fri, 28 Aug 2020 20:04:43 +0000</pubDate>
      <link>https://dev.to/liaowow/beyond-console-log-3-ways-to-format-console-outputs-in-javascript-236p</link>
      <guid>https://dev.to/liaowow/beyond-console-log-3-ways-to-format-console-outputs-in-javascript-236p</guid>
      <description>&lt;p&gt;As JavaScript developers, we intuitively use &lt;code&gt;console.log()&lt;/code&gt; to debug, print out variables, and log results of our current operations to make sure we are on the right programming path. &lt;/p&gt;

&lt;p&gt;Indeed, &lt;em&gt;console.log()&lt;/em&gt; seems powerful enough, but did you know there are other cool methods in the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Console" rel="noopener noreferrer"&gt;Console API&lt;/a&gt; that can also make your life easier?&lt;/p&gt;

&lt;p&gt;Recently I came across &lt;em&gt;console.table()&lt;/em&gt; in a tutorial, which prompted me to investigate alternative approaches to the plain-old &lt;em&gt;console.log()&lt;/em&gt;. Here are 3 formatting tools that I have added to my debugging toolkit:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;console.table()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;As the name suggests, &lt;code&gt;console.table()&lt;/code&gt; prints your output in a nicely formatted table, instead of a cluster of text from &lt;code&gt;console.log()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's say we have an array of objects, each object containing multiple key-value pairs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inventors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Albert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Einstein&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1879&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1955&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Isaac&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Newton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1643&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1727&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Galileo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Galilei&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1564&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1642&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Marie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Curie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1867&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1934&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Johannes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kepler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1571&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1630&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nicolaus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Copernicus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1473&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1543&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Max&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Planck&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1858&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1947&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Katherine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Blodgett&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1898&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1979&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lovelace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1815&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1852&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sarah E.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Goode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1855&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1905&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lise&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Meitner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1878&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1968&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hanna&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hammarström&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1829&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1909&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what they look like with &lt;code&gt;console.table(inventors)&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;┌─────────┬─────────────┬───────────────┬──────┬────────┐&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="nx"&gt;first&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;     &lt;span class="nx"&gt;last&lt;/span&gt;      &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="nx"&gt;passed&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;├─────────┼─────────────┼───────────────┼──────┼────────┤&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;0&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Albert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Einstein&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1879&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1955&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;1&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Isaac&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Newton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1643&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1727&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;2&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Galileo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Galilei&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1564&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1642&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;3&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Marie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Curie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1867&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1934&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;4&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Johannes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kepler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1571&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1630&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;5&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nicolaus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Copernicus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1473&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1543&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;6&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Max&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Planck&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1858&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1947&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;7&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Katherine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Blodgett&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1898&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1979&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;8&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lovelace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1815&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1852&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="mi"&gt;9&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sarah E.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Goode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1855&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1905&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="mi"&gt;10&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lise&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Meitner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1878&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1968&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="mi"&gt;11&lt;/span&gt;    &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hanna&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hammarström&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="mi"&gt;1829&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;  &lt;span class="mi"&gt;1909&lt;/span&gt;  &lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;└─────────┴─────────────┴───────────────┴──────┴────────┘&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;code&gt;console.group()&lt;/code&gt; and &lt;code&gt;console.groupEnd()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This pair of console methods allow you to create a hierarchical structure of your output. If you have a group of related data, you can wrap them inside &lt;code&gt;console.group()&lt;/code&gt; and &lt;code&gt;console.groupEnd()&lt;/code&gt;, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Meat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Chicken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pork&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Beef&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Meat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Veggies&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Corn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Spinach&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Carrots&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Veggies&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fruits&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Apple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Banana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tomato&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fruits&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...and you will see a beautifully grouped set of output (feel free to try on a Chrome or Firefox console, it looks even prettier in my opinion):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Meat&lt;/span&gt;
  &lt;span class="nx"&gt;Chicken&lt;/span&gt;
  &lt;span class="nx"&gt;Pork&lt;/span&gt;
  &lt;span class="nx"&gt;Beef&lt;/span&gt;
&lt;span class="nx"&gt;Veggies&lt;/span&gt;
  &lt;span class="nx"&gt;Corn&lt;/span&gt;
  &lt;span class="nx"&gt;Spinach&lt;/span&gt;
  &lt;span class="nx"&gt;Carrots&lt;/span&gt;
&lt;span class="nx"&gt;Fruits&lt;/span&gt;
  &lt;span class="nx"&gt;Apple&lt;/span&gt;
  &lt;span class="nx"&gt;Banana&lt;/span&gt;
  &lt;span class="nx"&gt;Tomato&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;code&gt;console.dir()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This one may or may not be as useful, depending on the browser you're on. Essentially, &lt;code&gt;console.dir()&lt;/code&gt; prints out a hierarchical list of properties inside the specified JavaScript project.&lt;/p&gt;

&lt;p&gt;For example, open your browser console and try &lt;code&gt;console.dir()&lt;/code&gt; by passing in the following object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;food&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Meat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Chicken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;grilled&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fried&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pork&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BBQ&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;steamed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Beef&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rare&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Veggies&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Corn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Spinach&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;regular&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;baby-size&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Carrots&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;regular&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bite-size&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fruits&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Apple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Banana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;raw&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ripe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tomato&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;big&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;small&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the Chrome console, you can see that &lt;code&gt;console.dir(food)&lt;/code&gt; makes it easier to spot the data type than does &lt;code&gt;console.log(food)&lt;/code&gt;. Whereas in Firefox, both outputs appear the same. &lt;/p&gt;

&lt;p&gt;Nonetheless, if you click on the triangle at the start of the output, both &lt;code&gt;console.dir()&lt;/code&gt; and &lt;code&gt;console.log()&lt;/code&gt; display nicely formatted JavaScript objects, neatly organized by property types and their values.&lt;/p&gt;




&lt;p&gt;If you are already familiar with those three methods, I recommend checking out the following resources, experiment on each method mentioned in the articles, and let me know which ones you plan on using regularly.&lt;/p&gt;

&lt;p&gt;Happy debugging!&lt;/p&gt;

&lt;h4&gt;
  
  
  Resources:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/how-to-get-the-most-out-of-the-javascript-console-b57ca9db3e6d/" rel="noopener noreferrer"&gt;How to get the most out of the JavaScript console&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://levelup.gitconnected.com/console-cheat-sheet-for-javascript-developers-21f0c49604d4" rel="noopener noreferrer"&gt;Console cheat sheet for JavaScript developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://levelup.gitconnected.com/moving-beyond-console-log-8-console-methods-you-should-use-when-debugging-javascript-and-node-25f6ac840ada" rel="noopener noreferrer"&gt;Moving beyond console.log() — 8 Console Methods You Should Use When Debugging JavaScript and Node&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>codenewbie</category>
      <category>productivity</category>
    </item>
    <item>
      <title>5-Step Strategy You Can Use for Your Next Coding Interview</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Fri, 21 Aug 2020 14:56:37 +0000</pubDate>
      <link>https://dev.to/liaowow/5-step-strategy-you-can-use-for-your-next-coding-interview-2kd9</link>
      <guid>https://dev.to/liaowow/5-step-strategy-you-can-use-for-your-next-coding-interview-2kd9</guid>
      <description>&lt;p&gt;Unlike coding tests, where you solve algorithm problems with a keyboard silently, coding interviews go beyond keyboard communications. &lt;/p&gt;

&lt;p&gt;It can be a daunting task, as the interviewer can see every move you make on a shared screen. &lt;/p&gt;

&lt;p&gt;And if that wasn't nerve-racking enough, you also need to speak out, expressing your thought process to not only elicit some hints from the interviewer but also keep the conversation flowing.&lt;/p&gt;

&lt;p&gt;That's why I was thrilled to see this algorithm design template when attending a coding practice hosted by &lt;a href="https://www.meetup.com/Women-Who-Code-San-Diego/" rel="noopener noreferrer"&gt;Women Who Code San Diego&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz2wdrwy05y73enfx7hpa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz2wdrwy05y73enfx7hpa.png" alt="Algo design template" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After following each step in the template during several practices, I have developed a methodology to reduce awkward silence in my coding interviews. &lt;/p&gt;

&lt;p&gt;Here's my consolidated 5-step strategy:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Clarify the Problem
&lt;/h3&gt;

&lt;p&gt;A lot of coding interviews involve writing out a function to solve the problem. Sometimes the interviewer might interpret the task differently. &lt;/p&gt;

&lt;p&gt;To ensure you are both on the same page, you can start by confirming the &lt;strong&gt;goal&lt;/strong&gt; of the problem, followed by the &lt;strong&gt;input&lt;/strong&gt; you are given, and the &lt;strong&gt;output&lt;/strong&gt; the interviewer expects to see.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Brainstorm Examples
&lt;/h3&gt;

&lt;p&gt;To further demonstrate that you understand the problem, you can also create some examples and confirm with the interviewer.&lt;/p&gt;

&lt;p&gt;If you are still not sure about the problem or instruction, now is a good time to ask for a few test cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Ask about Constraints
&lt;/h3&gt;

&lt;p&gt;To cover all the bases, you can also brainstorm some invalid inputs, and ask the interviewers if those inputs should be taken into considerations.&lt;/p&gt;

&lt;p&gt;Another follow-up question you can ask is time/space complexity, even if your initial approach will likely be brute-force.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't be afraid to ask questions.&lt;/strong&gt; There were instances where, after my clarifying questions, the interviewer realized some key portions s/he neglected to mention and modified accordingly. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Pseudocode Your Idea
&lt;/h3&gt;

&lt;p&gt;Now that you've confirmed everything you can think of, it's time to start coding!&lt;/p&gt;

&lt;p&gt;As part of my coding habits, I often start by pseudocoding or writing out my approach as comments (e.g. I will store these values as variables, this is where I will iterate over the array, and I will return the value here). &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Code, Talk, Optimize
&lt;/h3&gt;

&lt;p&gt;Once you start pseudocoding, you will formulate a more concrete idea on your approach, which gives you the confidence to code out your solution.&lt;/p&gt;

&lt;p&gt;This is where you can talk as you code, reading out loud the code you are typing. After finishing a code block, you can pause and ask the interviewer for feedback.&lt;/p&gt;

&lt;p&gt;More often than not, after you have arrived at the right solution, the interviewer will ask if you can optimize your approach.&lt;/p&gt;

&lt;p&gt;In case you can't think of any further optimization on the spot, it might be helpful to just start with a brute-force approach instead of rushing to the optimized solution in the beginning. &lt;/p&gt;




&lt;p&gt;The strategy and the template above recently led to the best coding interview I have performed. I hope they will also help you construct your own way of acing your next coding interview. &lt;/p&gt;

&lt;p&gt;Do you have any additional tips? What were the best and worst coding interviews you have experienced? Let me know in the comments!&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>codenewbie</category>
      <category>career</category>
    </item>
    <item>
      <title>How Would You Approach Systems Design Interview Questions?</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Fri, 14 Aug 2020 22:33:13 +0000</pubDate>
      <link>https://dev.to/liaowow/how-would-you-approach-systems-design-interview-questions-1neb</link>
      <guid>https://dev.to/liaowow/how-would-you-approach-systems-design-interview-questions-1neb</guid>
      <description>&lt;p&gt;As someone relatively new to software engineering and with a non-traditional background (i.e. no CS degree), I am often taken aback by the depth of knowledge required in some entry-level technical interviews. &lt;/p&gt;

&lt;p&gt;My most recent/upcoming encounter is systems design.&lt;/p&gt;

&lt;p&gt;Not to be confused with &lt;strong&gt;Design Systems&lt;/strong&gt; (which, weirdly enough, fill up &lt;a href="https://dev.to/search?q=systems%20design"&gt;DEV's search results&lt;/a&gt; 😂), &lt;strong&gt;Systems Design&lt;/strong&gt; involves the process of defining the architecture and data model for a platform, such as Twitter.&lt;/p&gt;

&lt;p&gt;After a few video tutorials and written guides, I have jotted down some general strategies, which look somewhat similar to how one approaches algorithm problems:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Clarify the problem&lt;/li&gt;
&lt;li&gt;Identify 2~3 core features&lt;/li&gt;
&lt;li&gt;Start implementing/drawing the architecture for the features&lt;/li&gt;
&lt;li&gt;Acknowledge limitation of my design&lt;/li&gt;
&lt;li&gt;Optimize my solution &lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Currently, I am most curious about Step#1, as this appears to be a key indicator of our problem-solving skills: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are some "good" clarifying questions we can ask the interviewer?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;An engineer friend suggested starting with &lt;strong&gt;scope&lt;/strong&gt;, e.g. how many users, the volume of the data, etc. &lt;/p&gt;

&lt;p&gt;What's your approach?&lt;/p&gt;

&lt;p&gt;And more generally: What advice or tips would you give to freshly-baked developers as we tackle the dreadful systems-design questions? &lt;/p&gt;

&lt;p&gt;Thanks in advance, DEV community! ❤️&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>codenewbie</category>
      <category>career</category>
    </item>
    <item>
      <title>When Recursion Comes to Rescue</title>
      <dc:creator>Annie Liao</dc:creator>
      <pubDate>Sat, 08 Aug 2020 18:48:47 +0000</pubDate>
      <link>https://dev.to/liaowow/when-recursion-comes-to-rescue-5fjj</link>
      <guid>https://dev.to/liaowow/when-recursion-comes-to-rescue-5fjj</guid>
      <description>&lt;p&gt;When practicing solving algorithm problems, we often see questions that make us wonder if we would ever encounter similar situations in the real world (e.g. spiral traversal of a matrix).&lt;/p&gt;

&lt;p&gt;This time, however, I came across an interesting algorithm challenge that makes practical sense to me.&lt;/p&gt;

&lt;p&gt;Here's the task:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You are given a list of tasks, some of which depend on others. &lt;br&gt;
Write a function &lt;code&gt;tasksInOrder&lt;/code&gt; that takes a subset of those tasks and returns an ordered list of all the tasks to run.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To illustrate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;make a sandwich&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;buy groceries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;buy groceries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;go to the store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; 
  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;go to the store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;// tasksInOrder(tasks, ["make a sandwich"])&lt;/span&gt;
&lt;span class="c1"&gt;// -&amp;gt; [ 'go to the store', 'buy groceries', 'make a sandwich' ]&lt;/span&gt;

&lt;span class="c1"&gt;// tasksInOrder(tasks, ["buy groceries", "make a sandwich"])&lt;/span&gt;
&lt;span class="c1"&gt;// -&amp;gt; [ 'go to the store', 'buy groceries', 'make a sandwich' ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We all make to-do lists in our daily lives, so I was glad to finally see a function that we can actually put to good, practical use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brute Force Approach
&lt;/h3&gt;

&lt;p&gt;As I read the challenge, the first thing that came to mind was a linked-list data structure, as each task has a dependency, or &lt;code&gt;node&lt;/code&gt;, that points to another task. &lt;/p&gt;

&lt;p&gt;With that, I was able to quickly write out a straightforward (but flawed) solution that traverses both the task list and the given subset.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;tasksInOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unshift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;sub&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;subset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The solution above does output the desired results in the two sample cases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tasksInOrder(tasks, ["make a sandwich"])&lt;/span&gt;
&lt;span class="c1"&gt;// -&amp;gt; [ 'go to the store', 'buy groceries', 'make a sandwich' ]&lt;/span&gt;

&lt;span class="c1"&gt;// tasksInOrder(tasks, ["buy groceries", "make a sandwich"])&lt;/span&gt;
&lt;span class="c1"&gt;// -&amp;gt; [ 'go to the store', 'buy groceries', 'make a sandwich' ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, this solution would fail if out task list is not in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tasksNotInOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; 
  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;buy groceries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;go to the store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; 
  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;make a sandwich&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;buy groceries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;go to the store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;// tasksInOrder(tasksNotInOrder, ["buy groceries"])&lt;/span&gt;
&lt;span class="c1"&gt;// expected -&amp;gt; [ 'go to the store', 'buy groceries' ]&lt;/span&gt;
&lt;span class="c1"&gt;// got -&amp;gt; [ 'buy groceries', 'go to the store' ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, how might we follow the dependencies of the given subset that keep &lt;strong&gt;recurring&lt;/strong&gt; in the tasks list in the right order?&lt;/p&gt;

&lt;h3&gt;
  
  
  Recursive Approach
&lt;/h3&gt;

&lt;p&gt;In order to grab all the dependencies of all the subtasks in the subset, we can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Grab all the dependencies of &lt;strong&gt;one&lt;/strong&gt; subtask&lt;/li&gt;
&lt;li&gt;Add the dependencies to an array by &lt;strong&gt;prepending&lt;/strong&gt; them, so we can put them in order&lt;/li&gt;
&lt;li&gt;Repeat step#2 until the subtask has no dependency&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since the recursive solution occurs in the subtasks, we can separate concerns by creating a helper function that focuses on recursion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;tasksInOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tasksList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;subTask&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;subset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;foundTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;taskObj&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;taskObj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;subTask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// invoke helper function&lt;/span&gt;
    &lt;span class="nf"&gt;getDependedTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;foundTask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tasksList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// helper function&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getDependedTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentTask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tasksList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// prepend the current task&lt;/span&gt;
  &lt;span class="nx"&gt;tasksList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unshift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentTask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;// base case: when we hit the task with no dependency&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lenth&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// recursive case: &lt;/span&gt;
    &lt;span class="c1"&gt;// (1) find the task which the current task depends on&lt;/span&gt;
    &lt;span class="c1"&gt;// (2) run the function recursively with the found task&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;nextTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;taskObj&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;taskObj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;currentTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;depends&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getDependedTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextTask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tasksList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And voilà! With this approach, we see an output of an orderly tasks list, no matter how disorganized the original list is.&lt;/p&gt;

&lt;p&gt;Do you see any potential flaws in the recursive approach? Can you think of any other way to tackle this challenge? As always, please let me know in the comments!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>algorithms</category>
      <category>codenewbie</category>
    </item>
  </channel>
</rss>
