<?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: CallmeHongmaybe</title>
    <description>The latest articles on DEV Community by CallmeHongmaybe (@callmehongmaybe).</description>
    <link>https://dev.to/callmehongmaybe</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%2F371690%2F613bfeee-96a0-4447-bf7e-3e3f0f5e5cc6.jpg</url>
      <title>DEV Community: CallmeHongmaybe</title>
      <link>https://dev.to/callmehongmaybe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/callmehongmaybe"/>
    <language>en</language>
    <item>
      <title>Cheatsheet for frontend interviews</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Fri, 11 Aug 2023 04:21:25 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/cheatsheet-for-frontend-interviews-1n7b</link>
      <guid>https://dev.to/callmehongmaybe/cheatsheet-for-frontend-interviews-1n7b</guid>
      <description>&lt;p&gt;For coding interviews, I think the biggest problem would be encountering unfamiliar questions (I guess this should be obvious) and deciding on which approach works best given the time constraints. &lt;/p&gt;

&lt;p&gt;What I am trying to accomplish in this article is to lay out patterns that occurs in certain sets of questions, so that when we deal with its derivative questions in the future, we can at least don't have to do too much guesswork before we even start talking about solutions.&lt;/p&gt;

&lt;p&gt;Before we start, I want to mention that this only focuses on Javascript coding questions only, not UI questions since they can be varied and difficult to discern patterns. &lt;/p&gt;

&lt;p&gt;As I'm preparing for my upcoming interviews, here is a tentative list of different question types with concepts and possible patterns. &lt;/p&gt;

&lt;h2&gt;
  
  
  Promise programming
&lt;/h2&gt;

&lt;p&gt;Like the title suggests, this tests our ability to do async programming, by reinventing the wheels like &lt;code&gt;Promise.any&lt;/code&gt; and &lt;code&gt;Promise.all&lt;/code&gt; so that we know how it works under the hood. &lt;/p&gt;

&lt;h3&gt;
  
  
  Patterns:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In all cases you will loop through the iterables
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;promiseAny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// function similar to Promise.any&lt;/span&gt;
&lt;span class="nx"&gt;promiseAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// similar to Promise.all&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;promiseAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// ... &lt;/span&gt;
   &lt;span class="nx"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;iterable&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="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; 
        &lt;span class="c1"&gt;// if function is promiseAny instead then resolve(value) &lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;// ....&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the pseudocode would be as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;promiseAll(iter) or promiseAny(iter) { 
    for each element in `iter`, wait for it to load
    if you return all promises, transform the input with results fetched from the elements 
    else resolve the iter as soon as it's fetched
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rewriting &lt;code&gt;Array.prototype&lt;/code&gt; methods
&lt;/h2&gt;

&lt;p&gt;The goal of this part is really for us to get used to the workflow of the function. &lt;/p&gt;

&lt;h3&gt;
  
  
  Patterns:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Callback functions accept at most four parameters &lt;code&gt;prev, curr, index, array&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Callbacks in &lt;code&gt;Array.prototype.filter&lt;/code&gt; and  &lt;code&gt;Array.prototype.map&lt;/code&gt; will return a &lt;code&gt;Boolean&lt;/code&gt; in order to transform the array calling the methods (denoted as &lt;code&gt;this&lt;/code&gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callbackFn&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;copyArr&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;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;continue&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;callbackFn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thisArg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt; 
          &lt;span class="nx"&gt;copyArr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;For &lt;code&gt;Array.prototype.reduce&lt;/code&gt; the callback function will return a callback result based on previous callback result.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// in Array.prototype.reduce function &lt;/span&gt;
&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;myReduce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callbackFn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initVal&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;startingIndex&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;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startingIndex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&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="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt; 
      &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;callbackFn&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="k"&gt;this&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="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;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 general pseudocode for doing such questions would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;arrayMethod = function (prev, curr, index, array){ 
   declare vars 
   for each element in this list
&lt;span class="p"&gt;       -&lt;/span&gt; for reduce update &lt;span class="sb"&gt;`prev`&lt;/span&gt; value using the callback function every time taking current &lt;span class="sb"&gt;`prev`&lt;/span&gt;value as input
&lt;span class="p"&gt;       -&lt;/span&gt; for others transform &lt;span class="sb"&gt;`this`&lt;/span&gt; array 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rewriting DOM APIs
&lt;/h2&gt;

&lt;p&gt;Even though front end interview questions put less emphasis on data structures and algorithms, a handful of such questions still remain for us, such as rewriting &lt;code&gt;getElementsByTagName&lt;/code&gt; and &lt;code&gt;getElementsByClassName&lt;/code&gt; using DOM traversal and the likes of it. &lt;/p&gt;

&lt;h3&gt;
  
  
  Patterns:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Using the function &lt;code&gt;traverse(element)&lt;/code&gt; recursively for the elements and its offspring to check the condition of each element, for both
&lt;code&gt;getElementsByTagName&lt;/code&gt; and &lt;code&gt;getElementsByClassName&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tagNameParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tagName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tagNameParam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&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;element&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&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;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tagName&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;tagName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// recursing through its children&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// recursing through its root children &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;elements&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;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="nx"&gt;isSubset&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&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;every&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;value&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;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getElementsByClassName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;classNames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;classNamesSet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;classNames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&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;element&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isSubset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;classNamesSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&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;const&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&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;elements&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;Hence the closest pseudocode describing the commonality between the two DOM APIs would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;getElementsByAttr(rootElement, tagName = undefined, classNames = undefined) { 
     declaring empty list of elements 
     traverse(el) { 
        check if el satisfies a condition, for ex. its tag name matches or is contained by classNames
        if so push it to the new el list
        traverse every child of el and its descendants 
     }
     traverse through root elements' offsprings 
     return updated list of elements
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Functional programming
&lt;/h2&gt;

&lt;p&gt;Coding questions would come in all forms and shapes, but they  will demonstrate the same set of concepts including closures, &lt;code&gt;this&lt;/code&gt; keyword, using &lt;code&gt;setTimeout&lt;/code&gt;/&lt;code&gt;setInterval&lt;/code&gt; and Invoking functions via &lt;code&gt;Function.prototype.apply()&lt;/code&gt;/&lt;code&gt;Function.prototype.call()&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Patterns:
&lt;/h3&gt;

&lt;p&gt;For debounce/throttle questions, you might image the test cases to look like this. Sort of like when you try to press the elevator button and after a certain time passed since you last pressed it, the door finally shuts itself. As for throttling, you use it when you want to prevent rage clicking, meaning that you could only click once every x seconds. Just like in Discord's slowmode chat.&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;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;val&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;debouncedIncrement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;debounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;increment&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="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;throttledIncrement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;throttle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;increment&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="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// t = 0&lt;/span&gt;
&lt;span class="nx"&gt;debouncedIncrement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// i = 0&lt;/span&gt;
&lt;span class="nx"&gt;throttledIncrement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// j = 1&lt;/span&gt;

&lt;span class="c1"&gt;// t = 50: i is still 0 because 100ms have not passed, throttled remains moot until t=100ms&lt;/span&gt;
&lt;span class="nx"&gt;debouncedIncrement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// i = 0&lt;/span&gt;
&lt;span class="nx"&gt;throttledIncrement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// j = 1 &lt;/span&gt;

&lt;span class="c1"&gt;// t = 150: Because 100ms have passed since the last debouncedIncrement() at t = 50, increment was invoked and i is now 1&lt;/span&gt;
&lt;span class="nx"&gt;throttledIncrement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// j = 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that in 2 functions, the variable &lt;code&gt;timeoutId&lt;/code&gt; can only be assessed and modified through &lt;code&gt;debouncedIncrement&lt;/code&gt; or simply &lt;code&gt;debounce(increment(i), 100)()&lt;/code&gt;. Closure hides variables behind a veil and prevent outside actors to play with it unless they know the keyword (namely which function) to access it.&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;debounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;timeoutId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeoutId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;timeoutId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;wait&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;throttle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wait&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;canBeToggledAgain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canBeToggledAgain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;canBeToggledAgain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="nx"&gt;setTimeout&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;canBeToggledAgain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wait&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without further ado, here's the pseudocode for the 2 function s above &lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
md
function throttle || debounce () { 
  set timeoutId or toggle boolean 
  return function if timeout ends ( clear timer if necessary ) or when condition to do so is right
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>frontend</category>
      <category>career</category>
      <category>interview</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I once built a open source project like Google Trends</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Thu, 27 Jul 2023 08:06:11 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/i-once-built-a-open-source-project-like-google-trends-37mp</link>
      <guid>https://dev.to/callmehongmaybe/i-once-built-a-open-source-project-like-google-trends-37mp</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/r28vX4bQKks"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the features that make it unique ? How is it compared to existing products ?
&lt;/h2&gt;

&lt;p&gt;There’s nothing inherently unique about this project, given that I borrowed a huge deal of inspiration from Google Trends, ProductHunt and DEV to some extent.&lt;/p&gt;

&lt;p&gt;In detail, I’d say it’s a combination of the leaderboard from Google Trends and upvoting scheme in ProductHunt. I'd say that mods are able to filter out bad poll submissions and trending items just like in DEV.&lt;/p&gt;

&lt;p&gt;As for how it really works, the business logic of the app is as follows: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anyone can see the trending leaderboard and nomination poll for movies and games for each country but cannot cast votes&lt;/li&gt;
&lt;li&gt;A registered user can cast votes in the leaderboard but cannot cast vote for nomination polls unless they are from the country of the poll. &lt;/li&gt;
&lt;li&gt;A moderator has all the privileges of a normal user, plus the ability to remove inappropriate content from the polls and leaderboards ( still in the works ) &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  May I know how this is built ?
&lt;/h2&gt;

&lt;p&gt;I start building this project around the onset of COVID-19 ( circa spring of 2020 ). It was built primarily in the first 4 months where I learned to fit the business logic of the project with Next.js and Tailwind CSS.&lt;/p&gt;

&lt;p&gt;I remember myself making React polls for the first time and doing all sorts of CRUD operations with MongoDB/Mongoose.&lt;/p&gt;

&lt;p&gt;About authentication, I record hashed passwords in the DB and compare the input password with it. Then my cookies will record the JWT token of the account info once they are signed in. &lt;/p&gt;

&lt;h2&gt;
  
  
  How did you test your site ? And are there still bugs on your site ?
&lt;/h2&gt;

&lt;p&gt;As far I as know, console logs are the most reliable way to get feedback from Next.js, but I'm curious to know how e2e testing tools like Cypress makes the project better.&lt;/p&gt;

&lt;p&gt;ATM there aren't any majors bugs and mostly visual bugs here and there. For example the carousel looks ugly before it loads completely.&lt;/p&gt;

&lt;p&gt;The project would be more complete if I have the resource to finish the all the use cases distinct to moderator users.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why you may enjoy contributing to this open source project
&lt;/h2&gt;

&lt;p&gt;I can say there are some benefits for contributing to this: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The problems are basic to moderate in difficulty and all of the heavy work in the project is already done. &lt;/li&gt;
&lt;li&gt;You don't have to wait for days or weeks just to get replies about your PRs &lt;/li&gt;
&lt;li&gt;Suitable for fellow frontend developers who are either looking for frontend projects to contribute to regularly, or wanting to do side projects but unable to find time and resources to build from scratch&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Introducing Climatology</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Sat, 06 May 2023 09:20:17 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/introducing-climatology-14o6</link>
      <guid>https://dev.to/callmehongmaybe/introducing-climatology-14o6</guid>
      <description>&lt;h3&gt;
  
  
  What I built
&lt;/h3&gt;

&lt;p&gt;Essentially I built a search engine of climate data for over 120,000 locations. &lt;/p&gt;

&lt;h3&gt;
  
  
  Category Submission:
&lt;/h3&gt;

&lt;p&gt;Due to the sheer amount of people NOT using this, this would definitely qualify as a Wacky Wildcard project. &lt;/p&gt;

&lt;h3&gt;
  
  
  App Link
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://climatology.vercel.app/"&gt;Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;I have no good screenshots but I hope a video would suffice. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yeHLRCVXFKk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Description
&lt;/h3&gt;

&lt;p&gt;Climatology is a web app that provides comprehensive climate and weather data for over 120,000 locations around the world with a population of over 1,000. The app features three main sections: Climate, Monthly Averages, and Basic Forecast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/YourUsername/Climatology"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://choosealicense.com/licenses/mit/"&gt;MIT License&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;The fascination with cold weather inspired me to build an app that simulates how weather patterns can affect an area. My goal was to create a catalog of meteorological information for every location in the world that has a population over 1,000, providing users with an alternative to other weather apps on the market.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I built it
&lt;/h3&gt;

&lt;p&gt;I built Climatology using Next.js, MongoDB, Python, and R for data processing. GitHub Actions and Codespaces played a significant role in streamlining the development process, allowing me to test design ideas and REST APIs quickly.&lt;/p&gt;

&lt;p&gt;During the development process, I learned a great deal about Next.js, MongoDB, using Postman for API testing, and scientific computing. I also improved my skills in handling Git version control and working with geolocation features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources/Info
&lt;/h3&gt;

&lt;p&gt;For more detailed information about the development process and the journey I took to create Climatology, you can read my 4-part blog series describing the project's conception and final product.&lt;/p&gt;

</description>
      <category>githubhack23</category>
    </item>
    <item>
      <title>Introducing Browser Flashcards</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Wed, 03 May 2023 14:25:57 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/introducing-browser-flashcards-2kj1</link>
      <guid>https://dev.to/callmehongmaybe/introducing-browser-flashcards-2kj1</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;What I built is an automatically generated flashcard repository for language learners, that lives in their browsers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Category Submission:
&lt;/h3&gt;

&lt;p&gt;No doubt this is gonna be a Wacky Wildcards submission, and possibly Phone Friendly since the app will adapt its layout accordingly to each screen size, even though it's not yet qualified as a PWA yet.  &lt;/p&gt;

&lt;h3&gt;
  
  
  App Link
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://lingohelper.vercel.app/"&gt;https://lingohelper.vercel.app/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Will change the domain name soon in accordance with the new name &lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rFpf4lry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o599l4bsy3h0hs9z6100.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rFpf4lry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o599l4bsy3h0hs9z6100.png" alt="Image description" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For your better understanding, you can check out the videos below: &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/LlbAFDLhAZ4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1Q_Q1tLpmtc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Description
&lt;/h3&gt;

&lt;p&gt;Browser Flashcards (formerly Lingohelper ) is an automatic flashcard generator for language learners, designed to live right in your browser. You can input a short paragraph or a comma-separated list of words, and the app will take you to a flashcard editor where you can make edits before saving to your browser storage. The project was born out of a desire to provide an efficient vocabulary learning tool that doesn't require a subscription or registration.&lt;/p&gt;

&lt;p&gt;No signup required, no ads, no cookies, no paywall, just flashcards. For your own benefit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/CallmeHongmaybe/browser-flashcards"&gt;https://github.com/CallmeHongmaybe/browser-flashcards&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License
&lt;/h3&gt;

&lt;p&gt;The project's license is Apache 2.0 &lt;/p&gt;

&lt;h2&gt;
  
  
  Background (What made you decide to build this particular app? What inspired you?)
&lt;/h2&gt;

&lt;p&gt;Aside from my day job as a dev, one of my lesser known side hustle is teaching people languages online. By studying their learning experience and preferences, I thought it might be cool if there is an app that can help them learn vocabulary efficiently without having to pay for a subscription in Quizlet and without any registration whatsoever. &lt;/p&gt;

&lt;h3&gt;
  
  
  How I built it (How did you utilize GitHub Actions or GitHub Codespaces? Did you learn something new along the way? Pick up a new skill?)
&lt;/h3&gt;

&lt;p&gt;I built this project using Next.js, Tailwind CSS and Dexie.js  (Which is React wrapper for IndexedDB, the kind of database that lives in browsers) &lt;/p&gt;

&lt;p&gt;Obviously the project is hosted on Vercel, which I'm grateful for due to the seamless hosting experience provided without charge. &lt;/p&gt;

&lt;p&gt;One thing I liked about this project is the amount of technical creativity I've never got to express before in any of my past personal projects, through management of mouse events and state management between different components inside the flashcard editor. &lt;/p&gt;

&lt;p&gt;Like when you click a star button, the flashcard's gonna turn gold. Or when you add a new card, the input fields will reset to empty and the deck will be scrolled to the position of the new card.   &lt;/p&gt;

&lt;p&gt;I knew sometime before that GitHub Codespace is very similar to Gitpod, and I'd only need to tell Codespace which repo to host on its cloud. &lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources/Info
&lt;/h3&gt;

&lt;p&gt;The sortation and categorization of English words comes from a library/npm package called &lt;code&gt;natural&lt;/code&gt;. &lt;/p&gt;

</description>
      <category>githubhack23</category>
    </item>
    <item>
      <title>Removing clunky node_modules folder with Terminal</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Wed, 15 Mar 2023 15:15:08 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/removing-clunky-nodemodules-folder-with-terminal-18f6</link>
      <guid>https://dev.to/callmehongmaybe/removing-clunky-nodemodules-folder-with-terminal-18f6</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt; - node_modules takes a good chunk of your disk space ( up to the tunes of 10s of GBs ) and given a set of commands I believe I'm able to turn the situation around. &lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation for removing clunky node_modules
&lt;/h2&gt;

&lt;p&gt;So, a little bit of backstory...I tried contributing to FreeCodeCamp's codebase, but the current macOS version I'm in doesn't allow me to upgrade node to the version I'd wanted. Therefore, to make the backup process as swiftly as possible, I decided to take the tedious work of removing storage space. &lt;/p&gt;

&lt;p&gt;It took days of tedium to make sense why the disk space always seem to miscalculate system storage size. At one point it bloated to over 77 GB, and I scoured my computer drive for bulky folders. &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%2Fg76ao9avjamjxwaahhbx.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%2Fg76ao9avjamjxwaahhbx.png" alt="Image description" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even after deleting a bunch of junk folders out, the figure still hovers at around 50 something GBs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I realized it's time to remove those clunky folders
&lt;/h2&gt;

&lt;p&gt;Among all of those burdensome clusters of data, I just found just how cluttered npm storage has become. Turns out there are node_modules all over my projects folder. All of this contributed a whopping 3.38 GBs. &lt;/p&gt;

&lt;p&gt;So I concentrated all archived projects into one folder called &lt;code&gt;web projs &amp;amp; stuff&lt;/code&gt;, and then I did two things: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove package-lock.json, because those files are being contained inside node_modules &lt;/li&gt;
&lt;li&gt;Then proceed with node_modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;find ./Desktop/"web projs &amp;amp; stuff" -type d -name "node_modules"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;find ./Desktop/"web projs &amp;amp; stuff" -type f -name "package-lock.json"&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;code&gt;!! -exec rm -rf '{}' +&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;After that it drops down to 1.52 GB. &lt;/p&gt;

</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Is it helpful to talk about your Stack Overflow reputation during job interviews ?</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Thu, 02 Feb 2023 10:47:49 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/is-it-helpful-to-talk-about-your-stack-overflow-reputation-during-job-interviews--1kan</link>
      <guid>https://dev.to/callmehongmaybe/is-it-helpful-to-talk-about-your-stack-overflow-reputation-during-job-interviews--1kan</guid>
      <description>&lt;p&gt;Also: Is it helpful to include in your Stack Overflow reputation along with the profile link on your CV ? &lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>How do you guys deal with wandering mind at work ?</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Thu, 02 Feb 2023 06:53:04 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/how-do-you-guys-deal-with-wandering-mind-at-work--2im4</link>
      <guid>https://dev.to/callmehongmaybe/how-do-you-guys-deal-with-wandering-mind-at-work--2im4</guid>
      <description>&lt;p&gt;When it comes to tackling hard coding questions or hard tasks at work, I often find my mind wandering somewhere else.&lt;br&gt;
In situations like these, I could only hold about 5-10 minutes max, and every time I wander I often feel guilty and even anxious. That my performance would drop because of it. &lt;br&gt;
I looked around my colleagues and all of them seemed to be attuned with their work. But I guess they wouldn't survive a day without cups of coffee on their desks. &lt;br&gt;
But do any of you feel the same way and how do you stay focused when confronted by difficult work ? &lt;/p&gt;

</description>
      <category>offers</category>
      <category>web3</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Is it normal to fail QC after you submitted your task ?</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Mon, 30 Jan 2023 03:14:12 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/is-it-normal-to-fail-qc-after-you-submitted-your-task--2b26</link>
      <guid>https://dev.to/callmehongmaybe/is-it-normal-to-fail-qc-after-you-submitted-your-task--2b26</guid>
      <description>&lt;p&gt;Do people expect you to pass all the tests as a junior developer and are people as forgiving when you only get some points wrong ? &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Dealing with possible job termination/layoff (part 1)</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Wed, 25 Jan 2023 05:36:30 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/dealing-with-possible-job-terminationlayoff-part-1-3dn6</link>
      <guid>https://dev.to/callmehongmaybe/dealing-with-possible-job-terminationlayoff-part-1-3dn6</guid>
      <description>&lt;p&gt;People say layoffs is a universal constant that keeps the modern economy mathematically valid, but yet we try to distance ourselves from thinking about it as much as possible.&lt;/p&gt;

&lt;p&gt;For one reason or another, if judgment day becomes imminent, we scramble to put things back together and correct every possible little things that may and will contribute to our fall from grace. &lt;/p&gt;

&lt;p&gt;So I turned off Netflix, sat myself in a corner, silently reflecting the ways to "cushion the blow" after the New Year holiday is over. &lt;/p&gt;

&lt;h3&gt;
  
  
  Emotionally dealing with the problem
&lt;/h3&gt;

&lt;p&gt;Needlessly, I self-questioned everything from hard skills to my own sanity, procrastinated over the chain of mistakes and errors leading to my downfall. Yet, I reminisced the times when conversations with the manager were lighter and the initial optimism after probation period ends successfully. &lt;/p&gt;

&lt;p&gt;In truth, I have better days checkered with worse days. And the impermanence of things in life teaches me there is always an end to the start, regardless of performance and luck. Counterintuitive that it may sound, it is the obsession of control, not perfection, that gets to me. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's really easy to apply self help content from people on the same boat as you are, and while I can't deny that it's mental medicine, I'm not impervious to events that can invalidate everything I thought as right, and that will take a while for me to surface back up. But that's okay...at least for me.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The boring part...making a failsafe plan
&lt;/h3&gt;

&lt;p&gt;The most obvious thing I can do right now is to browse LinkedIn and every listings/job boards I can think of. &lt;/p&gt;

&lt;p&gt;But personally, the important thing to do right now is to transfer what I learned from my present job in terms of technical knowledge and soft skills to my Notion, or notebook. &lt;/p&gt;

&lt;p&gt;Once I have everything in one place, then should I start tinkering with my CV. &lt;/p&gt;

&lt;h3&gt;
  
  
  As a P/S, from The Book of Disquiet by Fernando Pessoa, he wrote:
&lt;/h3&gt;

&lt;p&gt;"Trying to attain full understanding of one self is like letting yourself fall into a bottomless rabbit hole, since you could be an entirely different person in different circumstances."&lt;/p&gt;

&lt;p&gt;"Reality is just as deluded and false as our vivid dreams we had last night. Dissolved as soon as we woke up, never to be known and thought of again." &lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>mentalhealth</category>
      <category>career</category>
    </item>
    <item>
      <title>Introducing my open source language flashcard app</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Sat, 07 Jan 2023 03:54:00 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/introducing-my-open-source-language-flashcard-app-1bkg</link>
      <guid>https://dev.to/callmehongmaybe/introducing-my-open-source-language-flashcard-app-1bkg</guid>
      <description>&lt;p&gt;TLDR; In the most basic definition, the app automatically generates flashcard decks for language learners, that lives in their browsers. You supply either a short paragraph or a comma separated list of words, and the app will redirect you to an flashcard editor where you can make further edits before saving it in browser storage. I'm looking forward to improving it, like supporting more languages and making a chrome extension for the app, but I'm not terribly sure if I can ever accomplish them all alone. &lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration behind the project
&lt;/h2&gt;

&lt;p&gt;Aside from my job, one of my lesser known side hustle is teaching people languages online. By studying their learning experience and preferences, I thought it might be cool if there is an app that can help them learn vocabulary efficiently without having to pay for a subscription in Quizlet and without any registration whatsoever. &lt;/p&gt;

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

&lt;p&gt;That's when I called the new project as Lingohelper ( Because I kinda suck at coining project names, so if you guys have a better idea, go to the comments please :) ) &lt;/p&gt;

&lt;h2&gt;
  
  
  What's inside the project
&lt;/h2&gt;

&lt;p&gt;The app is built with the tech stack I mentioned in my very first blog post, that is JAM stack plus TailwindCSS. &lt;/p&gt;

&lt;p&gt;In addition to that, I also made use of a neat React wrapper for IndexedDB called Dexie.js. &lt;/p&gt;

&lt;p&gt;UI/UX-wise, it's an app that contains the deck collections, the input to put in the words, and the editor to make customizations to the new deck. &lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;First, you create your new set of flashcards by inputting a list of new words, or a paragraph if you're particularly lazy.&lt;/p&gt;

&lt;p&gt;After pressing the Create Deck button, you'll be led to editor where you can create a new flashcard, delete or star any of the existing ones. &lt;/p&gt;

&lt;p&gt;If you make any changes to the deck, remember to press &lt;code&gt;Enter&lt;/code&gt; to make sure the changes are saved. &lt;/p&gt;

&lt;p&gt;Of course, one picture can explain more than a thousand words, and so it goes, one video can explain 60 pictures a second. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/LlbAFDLhAZ4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1Q_Q1tLpmtc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;As the project is still in its MVP stage, the Chinese translations shown in the video are by no means correct. The generated words came from a random word API that I stumbled across on Github. &lt;/p&gt;

&lt;h2&gt;
  
  
  What are the features that make it unique ? How is it compared to existing products ?
&lt;/h2&gt;

&lt;p&gt;Anki and Quizlet are the first ones that came to my mind when building it. Pretty much Lingohelper possesses the look/feel of Quizlet and the versatility of Anki. As well as its' offline uses. &lt;/p&gt;

&lt;p&gt;Quizlet charges people for importing CSV and Excel files to the deck. While Anki offers a cloud storage solution which obviously costs money.&lt;/p&gt;

&lt;p&gt;Despite the advantage of privacy and simplicity Lingohelper possesses, the largest drawback of the site is the translation API itself. &lt;/p&gt;

&lt;p&gt;DeepL apparently has a generous plans for this kind of hobby project, but since I don't live in the global North, I'd be hard pressed to find a better solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else do you need help with ?
&lt;/h2&gt;

&lt;p&gt;I wondered for a long time if I could download Anki flashcards from the saved decks. &lt;/p&gt;

&lt;p&gt;And I'd love it if there's some sort of a flipping animation whenever you edit with the contents of the card or star it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Last but not least...
&lt;/h2&gt;

&lt;p&gt;The source code is available on &lt;a href="https://github.com/CallmeHongmaybe/lingohelper" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;   &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>My favorite tech stack for building every personal project</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Mon, 02 Jan 2023 06:26:02 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/my-favorite-tech-stack-for-building-every-personal-project-3i75</link>
      <guid>https://dev.to/callmehongmaybe/my-favorite-tech-stack-for-building-every-personal-project-3i75</guid>
      <description>&lt;p&gt;TLDR - I'm talking about the tech stack that works for my life situation. I'm not a fan of working with databases, and even if I do, I'd only use it to store large amounts of data and write them. Therefore my tech stack can be described as somewhere between JAM and serverless. You decide. &lt;/p&gt;

&lt;h2&gt;
  
  
  My frustration with tech stacks
&lt;/h2&gt;

&lt;p&gt;As a preface, I'd be remiss not mentioning just how many framework out there is for us to even comprehend. Many times I had to make online trips to tech forums asking for advice on tech stacks. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kpi4Dp74--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71hzdmm0fjh0tjuoeknc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kpi4Dp74--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71hzdmm0fjh0tjuoeknc.png" alt="In case you're wondering what the name for the forum is" width="812" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's really frustrating about it is that most of the tech out there does relatively the same job, especially for the needs of my personal projects at that time. In short, it took me almost 2 weeks to find all the answers needed.  &lt;/p&gt;

&lt;p&gt;As much as I hated to admit this, but for a college freshman like me then, it's cool to have a broad knowledge of different frameworks, languages and even better, to constantly update your existing knowledge with the advent of new releases. &lt;/p&gt;

&lt;p&gt;But it was only when I was in my new job that all of my naive beliefs came into dust. &lt;/p&gt;

&lt;p&gt;You need a great product, not great technology. It is only the means to an end, while the management/technical skills you demonstrate is the end itself. &lt;/p&gt;

&lt;p&gt;It doesn't matter how you can build a clone in 12 hours with the shiniest tech stack, or how learning them can give you an edge in the job marketplace, the content always takes the &lt;br&gt;
throne. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pjObVtHN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tx3v9m1rfqd9bgiqy8p1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pjObVtHN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tx3v9m1rfqd9bgiqy8p1.png" alt="Credit: The Code Factory" width="880" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The nature of projects that I built
&lt;/h2&gt;

&lt;p&gt;The end goal of this is to show employers what I can do and how these projects stand for my interests. &lt;/p&gt;

&lt;p&gt;For example, it could be a browser side flashcard storage app, a rating app, or something as esoteric as a catalog of different climate zones.&lt;/p&gt;

&lt;p&gt;When it comes to size and scope, I expect my end product to neither be too lightweight, nor to be hindered by too much challenges. To do so, I filtered out use cases or requirements that require substantial engineering effort, like say, implementing a customized e-commerce site, or too much novelty, like simulating the impact of desert conditions on a 3D tree. &lt;/p&gt;

&lt;p&gt;I'd say it's a combination of not reinventing the wheel, but improving the spokes on the wheel. &lt;/p&gt;

&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;p&gt;In any given time of day, I'm left with only 2 to 3 hours to spare each day. &lt;/p&gt;

&lt;p&gt;That means I need a combination of tools that should be few in numbers, but diverse enough to cover most of project requirements. All without ending up with a bloated list of technology that can lengthen the time to finish the project. &lt;/p&gt;

&lt;p&gt;Usually I'd just need some endpoints, a frontend framework and browser storage to begin with. &lt;/p&gt;

&lt;p&gt;Regarding SSG/SSR frameworks, Next.js pretty much abstracts API handling while allowing you to do extra logic on server side, all without having to use databases once. &lt;/p&gt;

&lt;p&gt;As Next.js is also built along with React, it saves me from having to learn more Node.js frameworks and I can just code in React or Node in the same file. &lt;/p&gt;

&lt;p&gt;Together with TailwindCSS, I never had to switch to a new file type again. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wQw1bVxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kctqgg3393suz2owy2dg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wQw1bVxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kctqgg3393suz2owy2dg.png" alt="Image description" width="880" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the downside is that the file looks uglier and more verbose, I don't like the idea of having to switch between files to edit a specific component and strain my working memory. &lt;/p&gt;

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

&lt;p&gt;Again, this is just another piece of my mind when being asked about my favorite tech stack. What about yours ? And how does it make your development experience better ? &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Any mini web app ideas ?</title>
      <dc:creator>CallmeHongmaybe</dc:creator>
      <pubDate>Tue, 18 Aug 2020 15:35:23 +0000</pubDate>
      <link>https://dev.to/callmehongmaybe/any-mini-web-app-ideas-194f</link>
      <guid>https://dev.to/callmehongmaybe/any-mini-web-app-ideas-194f</guid>
      <description>&lt;p&gt;Long story short, I'm a Logistics and SCM student learning web development on free time. &lt;br&gt;
I still don't know much about web dev even though I've self-taught for over a year now. My skill is somewhere between&lt;br&gt;
amateur level and junior dev level. &lt;br&gt;
For the past few months I felt like going nowhere in the web dev world, and until recently I started growing fond of aerospace engineering and physics. But at the same time I was afraid of letting go of web dev. I've already made this far and I can never imagine forgetting them all. I also have to deal with the possibility of spreading myself too thin.&lt;br&gt;
So, before I give myself the green light to embark on a new journey, I need to have some bit-sized projects to remind myself web dev basics. &lt;br&gt;
Any answer is greatly appreciated ! Mad love to you guys. &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
