<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Candys Page]]></title><description><![CDATA[A place to talk about web development, coding, side projects and Pooh!]]></description><link>https://blog.candys.page</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1625583644509/t6W4qjjiLa.png</url><title>Candys Page</title><link>https://blog.candys.page</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Apr 2026 15:56:03 GMT</lastBuildDate><atom:link href="https://blog.candys.page/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Pointers in Go - When to use the ampersand and the asterisk?]]></title><description><![CDATA[Looking back, this might be a dumb question, but that’s what blog notes are for 🤣
tl;dr

&: Used as an operator to get the address of a variable

* in Type: Used to define the type as a pointer (e.g., *int)

* in Expression: Used as an operator to d...]]></description><link>https://blog.candys.page/pointers-in-go-when-to-use-the-ampersand-and-the-asterisk</link><guid isPermaLink="true">https://blog.candys.page/pointers-in-go-when-to-use-the-ampersand-and-the-asterisk</guid><category><![CDATA[golang]]></category><category><![CDATA[pointers in Go]]></category><category><![CDATA[pointers]]></category><category><![CDATA[Go Language]]></category><dc:creator><![CDATA[Candy]]></dc:creator><pubDate>Wed, 29 Oct 2025 10:57:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761732507208/75871f55-8619-44bf-b76b-5b731946566d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Looking back, this might be a dumb question, but that’s what blog notes are for 🤣</p>
<h2 id="heading-tldr">tl;dr</h2>
<ul>
<li><p><code>&amp;</code>: Used as an <strong>operator</strong> to get the address of a variable</p>
</li>
<li><p><code>*</code> <strong>in Type</strong>: Used to <strong>define the type</strong> as a pointer (e.g., <code>*int</code>)</p>
</li>
<li><p><code>*</code> <strong>in Expression</strong>: Used as an <strong>operator</strong> to dereference</p>
</li>
</ul>
<p>In short <code>*</code> does two things and <code>&amp;</code> can only to that one thing.</p>
<h2 id="heading-example">Example</h2>
<p>Can be run here: <a target="_blank" href="https://go.dev/play/p/XdA4_qdt7lR">https://go.dev/play/p/XdA4_qdt7lR</a></p>
<pre><code class="lang-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> <span class="hljs-string">"fmt"</span>

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
    value := <span class="hljs-number">42</span> <span class="hljs-comment">// The original data</span>

    <span class="hljs-comment">// --- 1. &amp; gets the address ---</span>
    address := &amp;value
    fmt.Printf(<span class="hljs-string">"1. &amp; Action: get Address: %p\n"</span>, address)

    <span class="hljs-comment">// --- 2. * defines the Pointer Type ---</span>
    <span class="hljs-comment">// 'p' is declared as the TYPE '*int' (a pointer type).</span>
    <span class="hljs-keyword">var</span> p *<span class="hljs-keyword">int</span> = address
    fmt.Printf(<span class="hljs-string">"2. Type Definition: 'p' is of TYPE %T\n"</span>, p)

    <span class="hljs-comment">// --- 3. * dereferences ---</span>
    <span class="hljs-comment">// The '*' operator reads the value at the address stored in 'p'.</span>
    retrievedValue := *p
    fmt.Printf(<span class="hljs-string">"3. * Operator: Value retrieved via dereference: %d\n"</span>, retrievedValue)
}
</code></pre>
<h2 id="heading-the-struggle-will-the-ampersand-show-up-in-type-definition">The struggle - Will the ampersand show up in type definition?</h2>
<p><strong>NO, the ampersand will never be used in type definitions</strong>, because it only does one thing, it gets the address of the variable. For type definitions we use <code>*</code>.</p>
<pre><code class="lang-go"><span class="hljs-comment">// 1. * used for type definition</span>
<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">updateScore</span><span class="hljs-params">(p *<span class="hljs-keyword">int</span>)</span></span> {
    *p = <span class="hljs-number">99</span> <span class="hljs-comment">// 2. * used for dereference and change the value at that address</span>
}
</code></pre>
<h2 id="heading-good-reads">Good Reads</h2>
<p>If <code>*p = 99</code> feels confusing, read this article: <a target="_blank" href="https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money-back">https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money-back</a></p>
]]></content:encoded></item><item><title><![CDATA[Learn Indonesian with ReadIndo!]]></title><description><![CDATA[It's Candy Again!
Hello Hashnoders! After having so much fun building MoodPraiser for the #harperdbhackathon, and here I am again for the #auth0hackathon!
Big thanks to Hashnode for hosting these events and this time 'round I even persuaded friends t...]]></description><link>https://blog.candys.page/learn-indonesian-with-readindo</link><guid isPermaLink="true">https://blog.candys.page/learn-indonesian-with-readindo</guid><category><![CDATA[Auth0]]></category><category><![CDATA[Auth0Hackathon]]></category><category><![CDATA[React]]></category><category><![CDATA[Next.js]]></category><dc:creator><![CDATA[Candy]]></dc:creator><pubDate>Mon, 30 Aug 2021 17:18:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1630228715215/1TSms0AB9.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="its-candy-again">It's Candy Again!</h2>
<p>Hello Hashnoders! After having so much fun building <a target="_blank" href="https://moodpraiser.candys.page">MoodPraiser</a> for the <a target="_blank" href="https://townhall.hashnode.com/announcing-harperdb-hackathon-on-hashnode">#harperdbhackathon</a>, and here I am again for the <a target="_blank" href="https://townhall.hashnode.com/auth0-hackathon">#auth0hackathon</a>!</p>
<p>Big thanks to Hashnode for hosting these events and this time 'round I even persuaded friends to join in the fun. 🎉 Hopefully we'll get to see their articles soon!</p>
<h2 id="what-is-readindo">What is ReadIndo?</h2>
<p><a target="_blank" href="https://readindo.candys.page/">ReadIndo</a> is a tool to help you learn Indonesian through reading text and videos of <strong>your choice!</strong></p>
<p><a target="_blank" href="https://readindo.candys.page">Live Demo</a> / <a target="_blank" href="https://github.com/candy02058912/readindo">GitHub Repository</a></p>
<h2 id="why-readindo">Why ReadIndo?</h2>
<h3 id="goal">Goal</h3>
<p>Fill in the gaps for Indonesian learners by bringing our own content to the table.</p>
<h3 id="the-story">The story</h3>
<p>I started to learn Indonesian in 2020 because I wanted to chat with <a class="user-mention" href="https://hashnode.com/@hjades">Jade Suntoro 宋玉美</a> in Indonesian. Compared to the popular languages, such as English, German, Japanese, etc., there are comparably fewer resources to learn Indonesian.</p>
<p>Why not build a tool that benefits all Indonesian learners? So here we are!</p>
<h2 id="tech-stack">Tech Stack</h2>
<ul>
<li><a target="_blank" href="https://auth0.com/">Auth0</a> - User authentication that's <strong>super easy</strong> to integrate!</li>
<li><a target="_blank" href="https://www.mongodb.com/">MongoDB</a> - The database.</li>
<li><a target="_blank" href="https://nextjs.org/">Next.JS</a> - The React framework for production.</li>
<li><a target="_blank" href="https://chakra-ui.com/">Chakra UI</a> - UI development that's just deadly simple.</li>
<li><a target="_blank" href="https://vercel.com/">Vercel</a> - Deployment for the app, where the app lives.</li>
</ul>
<h2 id="features-and-usage">Features and Usage</h2>
<h3 id="bring-your-own-content">📖 Bring your own content</h3>
<p>Paste free text to get started:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342245613/wam7bkR4F.gif" alt="Bring your own content" /></p>
<p>Or paste a YouTube URL:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342276434/zJWHVI7Ie.gif" alt="paste a YouTube URL" /></p>
<h3 id="use-our-content">📚 Use our content</h3>
<p>Don't know what to read about? ReadIndo got you covered with 5 daily articles!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342315934/Q7piCb95P.gif" alt="Use our content" /></p>
<h3 id="save-and-export-word-list-to-anki">💾 Save and export word list to Anki</h3>
<h4 id="step-1-save-words">Step 1 Save words</h4>
<p>From articles:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342344167/E_8mwEeQL.gif" alt="Save words from articles" /></p>
<p>From videos:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342376620/pp6G139CR.gif" alt="Save words from videos" /></p>
<h4 id="step-2-export-word-list">Step 2 Export word list</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342403245/lR86-_2u2.png" alt="image.png" /></p>
<h4 id="step-3-import-to-ankihttpsappsankiwebnet">Step 3 Import to <a target="_blank" href="https://apps.ankiweb.net/">Anki</a></h4>
<p><a target="_blank" href="https://apps.ankiweb.net/">Anki</a> is a program that makes remembering things easy! Best of all, it's <strong>free</strong> and has been <strong>one of the best solutions</strong> for studying vocabulary with spaced repetition.</p>
<p>Just go ahead and click on "Import File", select the CSV and follow the screenshot below and you're good to go!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342439165/6wSSpjqMt.png" alt="Anki settings" /></p>
<h3 id="supports-dark-and-light-modes">🌓 Supports dark and light modes</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342875820/Ug-0H7Azc.png" alt="Supports dark and light modes" /></p>
<h3 id="responsive-on-all-devices">📱 Responsive on all devices</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342900339/jw-aNO-zt.png" alt="Responsive on all devices" /></p>
<h2 id="challenges-and-tidbits">Challenges and Tidbits</h2>
<h3 id="auth0-integration">Auth0 Integration</h3>
<p>Auth0 has the <strong>best documents</strong> when it comes to integration! I was using Next.js and it directly leads you to their <a target="_blank" href="https://auth0.com/docs/quickstart/webapp/nextjs/01-login">quickstart guide</a>. All you need to do is follow the steps and within 5 minutes, you're all set up. <strong>Auth0 provides everything you need</strong> and the developer experience was super smooth.</p>
<h3 id="performance-issues-with-the-interactive-transcripts">Performance issues with the interactive transcripts</h3>
<h4 id="tldr-reactmemo-to-the-rescue">TL;DR - <code>React.memo</code> to the rescue</h4>
<p>One of the main features of ReadIndo is interactive transcripts when watching videos. How do we know which line to highlight? The case here was that the code checks the video duration every 200ms and checks for the correct line to display. The UI had a small lag so I decided to tick the "Highlight updates when components render." box in React Developer Tools and was amazed at what I saw.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342921257/feTgnd9wR.png" alt="React developer tools" /></p>
<p>The whole transcript is re-rendering every 200ms! Even when <strong>the same line was highlighted</strong>, the component kept re-rendering!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342955121/IMp0Luxm9.gif" alt="react.no.memo.gif" /></p>
<p>So here I encountered the perfect case where <code>React.memo</code> could make all the difference. </p>
<pre><code class="lang-tsx">export default React.memo(
  // One line of transcript
  TranscriptElement,
  (prevProps, nextProps) =&gt; prevProps.isPlaying === nextProps.isPlaying
);
</code></pre>
<p>If the current line is playing in the video, then <code>isPlaying</code> will be <code>true</code>. Pretty straightforward and obvious. 🤣 </p>
<p>So we only need to re-render when <code>isPlaying</code> changes, and voila, instant improvement as we can see below.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630342987562/X8j_KTBCo.gif" alt="react.memo.gif" /></p>
<h3 id="code-quality">Code quality</h3>
<p>Maintaining high standards of code quality has always been hard in hackathons due to the time limit. I kept it minimal by choosing the right languages and tools.</p>
<p><strong>TypeScript</strong> definitely has been the game-changer:</p>
<ul>
<li>TypeScript keeps everything defined and explicit</li>
<li>TSLint to keep the coding style consistent</li>
</ul>
<p><strong>Vercel</strong> has been the gatekeeper as it will actually run the lint command during the build and make sure everything passes before deploying. So if the build fails, then no new deploys. Therefore, we definitely have to get it fixed in order to ship a new version.</p>
<h2 id="faq">FAQ</h2>
<h3 id="is-readindo-for-me">Is ReadIndo for me?</h3>
<p>If you're interested in learning Indonesian, then yes!</p>
<h3 id="will-readindo-support-languages-other-than-indonesian">Will ReadIndo support languages other than Indonesian?</h3>
<p>The short answer is no.</p>
<p>A case that might be possible is I'm using it to learn other languages but don't worry, all of the code is open-sourced, and feel free to go ahead and extend the project to your needs!</p>
<h3 id="is-my-data-secure">Is my data secure?</h3>
<p>The only thing we currently save is your word list. Passwords go through Google if you choose Google login and Auth0 if you register an account with them. ReadIndo doesn't store any user data.</p>
<p>Feel free to ask about anything in the comments below!</p>
<h2 id="roadmap-and-user-wishlist">Roadmap and User Wishlist</h2>
<ul>
<li>Save words with context - Save the word with the current sentence to help users understand it better.</li>
<li>Video catalog - Sometimes we just don't know what to watch, so having a catalog is useful.</li>
<li>Community features - Learning alone is not as fun as learning with a community, just like writing blogs isn't fun unless we're doing it together on <a target="_blank" href="https://hashnode.com/">Hashnode</a>!</li>
<li>Multi-language support - Support languages other than Indonesian, but this one definitely will be a wait because the goal of this project was to help Indonesian learners since resources are more limited.</li>
</ul>
<h2 id="contribution-and-beyond">Contribution and Beyond</h2>
<p>ReadIndo is an open-source project and licensed under the terms of the MIT license. You're more than welcome to contribute ideas, report issues or send in pull requests.</p>
<p>Feel free to take it to the next level if needed! Extend ReadIndo to other languages you're learning by forking the project and share with me all the cool things you've added!</p>
<p><a target="_blank" href="https://github.com/candy02058912/readindo">GitHub Repository</a></p>
<h2 id="thats-all-folks">That's All Folks!</h2>
<p>If you read this far, you must have some interest to learn Indonesian, right? 🥺</p>
<p>Let's learn a language other than JavaScript or Python today at <a target="_blank" href="https://readindo.candys.page">ReadIndo</a>! </p>
<p>Leave your thoughts or feedback about the project and don't forget to check out all the other amazing projects for the <a target="_blank" href="https://townhall.hashnode.com/auth0-hackathon">#auth0hackathon</a>! You'll be amazed at what the Hashnode community can build in a month.</p>
<p>That's it for now and I'll see you in another Hashnode blog post. Thanks for reading and supporting me through my blogging journey!</p>
]]></content:encoded></item><item><title><![CDATA[Why We Should Listen to Lightning Talks - Starting with RailsConf 2021]]></title><description><![CDATA[What is a Lightning Talk?
Stealing this from Wikipedia:

Lightning talks are designed to be short presentations between five and ten minutes long, but are usually capped at five minutes.

Lightning talks usually accept sign-ups after the conference h...]]></description><link>https://blog.candys.page/why-we-should-listen-to-lightning-talks-starting-with-railsconf-2021</link><guid isPermaLink="true">https://blog.candys.page/why-we-should-listen-to-lightning-talks-starting-with-railsconf-2021</guid><category><![CDATA[Ruby on Rails]]></category><category><![CDATA[software development]]></category><category><![CDATA[Git]]></category><category><![CDATA[Ruby]]></category><dc:creator><![CDATA[Candy]]></dc:creator><pubDate>Fri, 13 Aug 2021 03:45:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1628826092409/UZUZNyd1b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-what-is-a-lightning-talk">What is a Lightning Talk?</h1>
<p>Stealing this from Wikipedia:</p>
<blockquote>
<p>Lightning talks are designed to be short presentations between five and ten minutes long, but are usually capped at five minutes.</p>
</blockquote>
<p>Lightning talks usually accept sign-ups <strong>after the conference has started</strong>, so they can't be found in the conference schedule. Even if the recordings have been uploaded, this is what you'll usually see when trying to find out about them:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628824393371/a6pjNh2qC.png" alt="image.png" /></p>
<p>Eh! Super hard to know what they're actually talking about. Still, I'd recommend you to watch them!</p>
<h2 id="heading-why-should-i-care-about-lightning-talks">Why should I care about lightning talks?</h2>
<p>They're short! If you're spending hours on YouTube already, please just give it 5 more minutes.</p>
<p>Lightning talks compress months and years of knowledge into less than 5 minutes. Super time-efficient way to learn or hear about something new.</p>
<p>You'll definitely like it because you like reading on Hashnode and you clicked on this article! 😆</p>
<p>Since they're so short and packed with content, it's never boring!</p>
<h1 id="heading-lightning-talks-from-railsconf-2021">Lightning Talks from RailsConf 2021</h1>
<p>To get things rolling, let's start by looking at the Lightning Talks from <a target="_blank" href="https://railsconf.org/">RailsConf</a> 2021.</p>
<ul>
<li><a class="post-section-overview" href="#should-you-create-a-new-rails-app-as-api-only-steffani-brasil">Should You Create a New Rails App as API-Only? - Steffani Brasil</a></li>
<li><a class="post-section-overview" href="#programming-logbooks-robson-port">Programming logbooks - Robson Port</a></li>
<li><a class="post-section-overview" href="#pair-programming-as-a-mentorship-emily-harber">Pair Programming as a Mentorship - Emily Harber</a></li>
<li><a class="post-section-overview" href="#isolate-packages-with-packwerkhttpsgithubcomshopifypackwerk-dorian-marie">Isolate Packages with Packwerk - Dorian Marie</a></li>
<li><a class="post-section-overview" href="#inertiajshttpsinertiajscom-brandon-shar">Inertia.js - Brandon Shar</a></li>
<li><a class="post-section-overview" href="#renewables-rails-sarah-sausan">Renewables + Rails - Sarah Sausan</a></li>
<li><a class="post-section-overview" href="#my-teams-recent-gitastrophy-lauren-billington">My Team's Recent Gitastrophy - Lauren Billington</a></li>
</ul>
<h2 id="heading-should-you-create-a-new-rails-app-as-api-only-steffani-brasil">Should You Create a New Rails App as API-Only? - Steffani Brasil</h2>
<h4 id="heading-when-should-i-choose-rails-api">When should I choose Rails API?</h4>
<ul>
<li>Does your client (SPA, mobile native app, etc) render all HTML pages?</li>
<li>Does your client create all user interfaces</li>
<li>Does Rails API only need to serve JSON responses to your client</li>
</ul>
<p>If the above questions end with a yes ⇒ Rails API was built for this!</p>
<p>It's also possible to turn it back into a full-fledge Rails project, so don't need to worry about it!</p>
<p>Talk slides and cheatsheet: <a target="_blank" href="https://www.stefannibrasil.me/railsconf/">https://www.stefannibrasil.me/railsconf/</a></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/H8JYqk1_zBY">https://youtu.be/H8JYqk1_zBY</a></div>
<h2 id="heading-programming-logbooks-robson-port">Programming logbooks - Robson Port</h2>
<h3 id="heading-what-is-a-logbook">What is a logbook?</h3>
<p>A personal and professional reference, mainly used by engineers, about everything related to a project</p>
<h3 id="heading-why-is-it-useful">Why is it useful?</h3>
<ul>
<li>Divide and conquer: breaking big problems down so it's easier to fix</li>
<li>Reduces context switching: stuff you need already written down</li>
<li>Creates an audit trail</li>
</ul>
<h3 id="heading-what-to-write-in-it">What to write in it?</h3>
<ul>
<li>Write down the initial problems</li>
<li>Describe</li>
<li>Write down discoveries or how it was resolved</li>
</ul>
<h3 id="heading-example">Example</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628824875708/9PnNNaq2o.png" alt="image.png" /></p>
<ul>
<li>App used: <a target="_blank" href="https://joplinapp.org/">JoplinApp</a> (Open source note taking app)</li>
<li>What to write:<ul>
<li>Link to ticket</li>
<li>Engineering detail</li>
</ul>
</li>
</ul>
<h3 id="heading-my-thoughts">My thoughts</h3>
<ul>
<li><p>Why not just Jira tickets / or any ticketing system?</p>
<p>  Might have other roles other than developers looking at it, so the logs might be a bit too much for them.</p>
</li>
<li><p>Maybe we could use Slack as a logbook?</p>
</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/Naf9FByIZ2U">https://youtu.be/Naf9FByIZ2U</a></div>
<h2 id="heading-pair-programming-as-a-mentorship-emily-harber">Pair Programming as a Mentorship - Emily Harber</h2>
<h3 id="heading-about-emily">About Emily</h3>
<ul>
<li>Early Career Developer at Shopify</li>
<li>Self-taught</li>
<li>Started to experience pair-programming at bootcamps</li>
<li>3 months after graduating, Emily went into Shopify</li>
</ul>
<h3 id="heading-how-can-pair-programming-help">How can pair programming help?</h3>
<ul>
<li>Build confidence</li>
<li>Practice skills</li>
<li>Share knowledge real-time</li>
<li>Everyone knows something you don't know yet</li>
</ul>
<h3 id="heading-my-thoughts">My thoughts</h3>
<ul>
<li>It's also a good practice for interviewing!</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/jeFXFom1fHo">https://youtu.be/jeFXFom1fHo</a></div>
<h2 id="heading-isolate-packages-with-packwerkhttpsgithubcomshopifypackwerk-dorian-marie">Isolate Packages with <a target="_blank" href="https://github.com/Shopify/packwerk">Packwerk</a> - Dorian Marie</h2>
<h3 id="heading-what-is-packwerk">What is Packwerk?</h3>
<p>A Shopify project that enforces boundaries and modularizes Rails applications.</p>
<p>Check the one-minute demo out: <a target="_blank" href="https://www.youtube.com/watch?v=NwqlyBAxVpQ&amp;feature=youtu.be">https://www.youtube.com/watch?v=NwqlyBAxVpQ</a></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/Hiw4lJChDz0">https://youtu.be/Hiw4lJChDz0</a></div>
<h2 id="heading-inertiajshttpsinertiajscom-brandon-shar"><a target="_blank" href="https://inertiajs.com/">Inertia.js</a> - Brandon Shar</h2>
<p>If you want a Rails back end and a React / Vue / Svelte front end?</p>
<p>Get started with Inertia.js here: <a target="_blank" href="https://youtu.be/03EjkPaCHEI">https://youtu.be/03EjkPaCHEI</a></p>
<h3 id="heading-my-thoughts">My thoughts</h3>
<p>If you've been a past user of Django, Laravel, or Rails, definitely take a look at the project!</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/j2sch-hCBUA">https://youtu.be/j2sch-hCBUA</a></div>
<h2 id="heading-renewables-rails-sarah-sausan">Renewables + Rails - Sarah Sausan</h2>
<h3 id="heading-sarahs-story">Sarah's Story</h3>
<ul>
<li>A story on how she fell in love with Ruby &amp; Rails<ul>
<li>Ruby is super fun</li>
<li>To make something useful, we don't need to know <em>everything</em> about it</li>
<li>An opportunity to attend RailsConf</li>
</ul>
</li>
<li>Geologist caring about Geothermal topics</li>
<li>Wanted to make data available to the public by using Rails</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/UU5vYp26D6A">https://youtu.be/UU5vYp26D6A</a></div>
<h2 id="heading-my-teams-recent-gitastrophy-lauren-billington">My Team's Recent Gitastrophy - Lauren Billington</h2>
<ul>
<li>Rebasing vs merge</li>
<li><code>git pull</code> vs <code>git merge</code></li>
<li>Story on recovering from breaking production with rebasing and <code>git pull</code></li>
</ul>
<h3 id="heading-my-thoughts">My thoughts</h3>
<p>We all might have encountered this before, but sharing it in a lightning talk let us all know we've been in the same shoes once.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/UMH8eU3Ubdw">https://youtu.be/UMH8eU3Ubdw</a></div>
<p>That's all for now and we've taken a look at 7 wonderful topics related to software development. Isn't that fast? You can find all of the talks from RailsConf in this <a target="_blank" href="https://youtube.com/playlist?list=PLbHJudTY1K0c8N1-PPyiQxlHNzJIzyJv6">playlist</a>.</p>
<p>Last but not least, for those who are curious about "Is Ruby Dead", you'll find the answer at <a target="_blank" href="https://isrubydead.com/">https://isrubydead.com/</a>.</p>
<p>Love to know your thoughts about lightning talks as well! Please leave them in the comments!</p>
]]></content:encoded></item><item><title><![CDATA[Stuff I Install When Setting Up a Mac]]></title><description><![CDATA[Lately, I've been setting up my new Mac and thought that it would be a good chance to log down what I needed to install for future reference. This post will be updated from time to time as I install back all the apps that I use daily.
Must-to-have ap...]]></description><link>https://blog.candys.page/stuff-i-install-when-setting-up-a-mac</link><guid isPermaLink="true">https://blog.candys.page/stuff-i-install-when-setting-up-a-mac</guid><category><![CDATA[macOS]]></category><category><![CDATA[mac]]></category><category><![CDATA[macbook]]></category><category><![CDATA[setup]]></category><category><![CDATA[Developer Tools]]></category><dc:creator><![CDATA[Candy]]></dc:creator><pubDate>Thu, 15 Jul 2021 17:24:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1626369759890/o2tWf0Yym.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Lately, I've been setting up my new Mac and thought that it would be a good chance to log down what I needed to install for future reference. This post will be updated from time to time as I install back all the apps that I use daily.</p>
<h2 id="heading-must-to-have-apps-to-make-life-easier">Must-to-have apps to make life easier</h2>
<ul>
<li><a target="_blank" href="https://www.google.com/chrome/">Chrome</a>: I just can't live without it 🤣</li>
<li><a target="_blank" href="https://github.com/rxhanson/Rectangle">Rectangle</a>: Move and resize windows the easiest way.</li>
<li><a target="_blank" href="https://pilotmoon.com/scrollreverser/">Scroll Reverser</a>: You'll probably need this when using an external mouse. It controls your mouse/trackpad scroll the way you want it to be.</li>
<li><a target="_blank" href="https://github.com/Clipy/Clipy">Clipy</a>: Clipboard extension for mac. I use it to store stuff I copy and paste a lot.</li>
<li><a target="_blank" href="https://github.com/pqrs-org/Karabiner-Elements">Karabiner Elements</a>: Map keyboards the way you want them to be. Super useful when using a non-mac keyboard to adjust the order of the keys to be the same as on Mac.</li>
<li><a target="_blank" href="https://staticz.com/soundcontrol/">Sound Control</a>: Mac's built-in sound control isn't that great you know. You can control the volume through your Mac even if it's connected to an HDMI output.</li>
</ul>
<h2 id="heading-for-development">For development</h2>
<ul>
<li><a target="_blank" href="https://www.docker.com/">Docker</a></li>
<li><a target="_blank" href="https://iterm2.com/">iTerm2</a>: Better than the native Terminal<ul>
<li><a target="_blank" href="https://ohmyz.sh/">oh-my-zsh</a><ul>
<li><a target="_blank" href="https://github.com/zsh-users/zsh-autosuggestions">zsh-autosuggestions</a>: Remembers your commands for you!</li>
</ul>
</li>
<li><a target="_blank" href="https://brew.sh/">homebrew</a>: Package manager for Mac.</li>
<li><a target="_blank" href="https://github.com/nvm-sh/nvm">nvm</a>: Version manager for node.js</li>
<li><a target="_blank" href="https://yarnpkg.com/">yarn</a>: The faster npm</li>
</ul>
</li>
<li><a target="_blank" href="https://code.visualstudio.com/">VSCode</a>: Where I write code. Settings sync is super useful!</li>
</ul>
<h2 id="heading-others">Others</h2>
<ul>
<li><a target="_blank" href="https://zoom.us/download">Zoom</a>: Choose the Silicon chips version for M1</li>
<li><a target="_blank" href="https://slack.com/">Slack</a></li>
<li><a target="_blank" href="https://www.notion.so/">Notion</a>: Probably relying on it more than I should?</li>
</ul>
<p>What are your favorite must have apps / tools? Please share them with me! I'd love to know!</p>
]]></content:encoded></item><item><title><![CDATA[Installing Ubuntu 20.04 on Raspberry Pi 4b]]></title><description><![CDATA[Super excited to finally own a Raspberry Pi! Extremely cute with the pink 3D-printed case and is a total match with my Piglet, hence the name, Raspberry Pi(glet)! This series is dedicated to Piglet, my first ever Raspberry Pi (4b)!
Official Guide
The...]]></description><link>https://blog.candys.page/installing-ubuntu-2004-on-raspberry-pi-4b</link><guid isPermaLink="true">https://blog.candys.page/installing-ubuntu-2004-on-raspberry-pi-4b</guid><category><![CDATA[Raspberry Pi]]></category><category><![CDATA[Ubuntu]]></category><dc:creator><![CDATA[Candy]]></dc:creator><pubDate>Wed, 07 Jul 2021 23:21:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699632107/RYvADoIi3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Super excited to finally own a Raspberry Pi! Extremely cute with the pink 3D-printed case and is a total match with my Piglet, hence the name, Raspberry Pi(glet)! This series is dedicated to Piglet, my first ever Raspberry Pi (4b)!</p>
<h2 id="official-guide">Official Guide</h2>
<p>There's no place better to get started by going to the <a target="_blank" href="https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up">official guide</a>! The official guide leads to installing the recommended OS, Raspberry Pi OS (formerly: Raspbian, Raspberry Pi + Debian).</p>
<h2 id="ubuntu-2004-kubuntu-desktop">Ubuntu 20.04 + Kubuntu Desktop</h2>
<p>I'd like a little something different for Piglet rather than the recommended OS from the official guide. We'll be going with Ubuntu 20.04 + Kubuntu desktop. Not sure about the performance yet, but it's super easy to change the OS if it doesn't work out.</p>
<p>Unfortunately, Ubuntu 20.04 is only available with the <strong>server version</strong> in Raspberry Pi Imager, so it means will need to deal with the black tty screen in a bit. I didn't notice I installed the server version until I looked back at the screenshots I took.</p>
<p>The reason for choosing this is because Ubuntu 20.04 has LTS (long term support) whereas Ubuntu 21.04 Desktop (the only desktop version available in Raspberry Pi Imager at the time of writing) will only be supported until 2022. Below is a snapshot from Ubuntu's website. That being said, it doesn't really matter much which option we choose because as said earlier, switching OS is extremely easy. I just wanted to feel good with Piglet by logging down a reason. 🤣</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699837122/I_Nz1rVRn.png" alt="image.png" /></p>
<h3 id="useful-links">Useful links</h3>
<p><a target="_blank" href="https://ubuntu.com/download/raspberry-pi">Install Ubuntu on a Raspberry Pi | Ubuntu</a></p>
<p><a target="_blank" href="https://ubuntu.com/about/release-cycle">Ubuntu release cycle | Ubuntu</a></p>
<h2 id="step-by-step-screenshots">Step-by-step Screenshots</h2>
<h4 id="1-raspberry-pi-imager-on-mac-click-on-choose-os">1. Raspberry Pi Imager on Mac. Click on "CHOOSE OS"</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699731929/ygzXe8HQJ.png" alt="image.png" /></p>
<h4 id="2-select-other-general-purpose-os">2. Select "Other general purpose OS"</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699759332/kTRBGqO9F.png" alt="image.png" /></p>
<h4 id="3-select-ubuntu">3. Select "Ubuntu"</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699791511/cNEoepv1g.png" alt="image.png" /></p>
<h4 id="4-select-ubuntu-server-20042-lts">4. Select "Ubuntu Server 20.04.2 LTS"</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699863944/Hz6H7gsVg.png" alt="image.png" /></p>
<h4 id="5-select-the-sd-card">5. Select the SD card</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699877365/FFIi2CROU.png" alt="image.png" /></p>
<h4 id="6-all-set-and-click-on-write">6. All set and click on "WRITE"</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699893800/F9Sgi_sT0.png" alt="image.png" /></p>
<h4 id="7-yes-we-want-to-continue">7. "YES" we want to continue</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699911524/zIlT9ci8a.png" alt="image.png" /></p>
<h4 id="8-here-we-go">8. Here we go</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699925418/GeRXEeTed.png" alt="image.png" /></p>
<h4 id="9-writing">9. Writing...</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699939891/OZts-Uts_.png" alt="image.png" /></p>
<h4 id="10-almost-there">10. Almost there</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699953074/ZLIg-BjaZ.png" alt="image.png" /></p>
<h4 id="11-yay-and-weve-prepared-the-sd-card">11. Yay and we've prepared the SD card</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625699964900/QmxYvsK4S.png" alt="image.png" /></p>
<h4 id="12-insert-the-sd-card">12: Insert the SD card</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625700320824/bxKeeIieL.png" alt="image.png" /></p>
<h2 id="next-steps">Next Steps</h2>
<p>We're all set so let's plug in Piglet and start it up!</p>
<h3 id="switch-to-tty2">Switch to tty2</h3>
<p>Since tty1 will be stuck letting you know that Piglet is running fine, so we'll need to switch to tty2 to run the commands. Switching is easy by using <code>ctrl+alt+F2</code>.</p>
<h3 id="install-kubuntu-desktop">Install Kubuntu Desktop</h3>
<pre><code class="lang-bash">sudo apt install kubuntu-desktop
</code></pre>
<h2 id="troubleshooting">Troubleshooting</h2>
<h3 id="gui-not-running">GUI not running</h3>
<pre><code class="lang-bash">startx
</code></pre>
<h3 id="black-borders">Black borders</h3>
<pre><code class="lang-bash"><span class="hljs-comment"># open /boot/firmware/usercfg.txt</span>
disable_overscan=1
</code></pre>
<h3 id="useful-links">Useful links</h3>
<p><a target="_blank" href="https://wiki.ubuntu.com/ARM/RaspberryPi">Ubuntu Wiki</a></p>
<h2 id="conclusion">Conclusion</h2>
<p>I might need to switch to Raspberry Pi OS in the future (lol). I think a lot of extra effort is needed to run everything smoothly on Kubuntu. I tried watching YouTube videos after getting it running and it felt super stuck.</p>
<p>The temperature was around 70+ degrees Celcius when running Kubuntu. If we're only running the server and not connected to a monitor, it was around 60 degrees. Room temperature should be around 27 degrees. Not sure if this is too hot but I did see the overheating icon when I was in Kubuntu.</p>
<p>That's it for now and I'll probably stick to using the server itself via ssh so that I don't overheat Piglet.</p>
<p>Piglet: Hello world!</p>
]]></content:encoded></item><item><title><![CDATA[How I Failed My Senior Front End Interviews]]></title><description><![CDATA[I felt it very important to log this down because I tend to forget things easily. There was definitely a lot to learn from through the experience of this round of interviews. 2021 hasn't been great with the pandemic around, but really glad I summoned...]]></description><link>https://blog.candys.page/how-i-failed-my-senior-front-end-interviews</link><guid isPermaLink="true">https://blog.candys.page/how-i-failed-my-senior-front-end-interviews</guid><category><![CDATA[Interviews]]></category><category><![CDATA[interview]]></category><category><![CDATA[Technical interview]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Candy]]></dc:creator><pubDate>Mon, 05 Jul 2021 01:05:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1622161120316/g9-H5YXNk.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I felt it very important to log this down because I tend to forget things easily. There was definitely a lot to learn from through the experience of this round of interviews. 2021 hasn't been great with the pandemic around, but really glad I summoned up the courage to take this step out.</p>
<h2 id="navigation">Navigation</h2>
<ul>
<li><a class="post-section-overview" href="#start-of-the-journey">Start of the Journey</a></li>
<li><a class="post-section-overview" href="#preparation">Preparation</a></li>
<li><a class="post-section-overview" href="#the-interview-journey">The Interview Journey</a></li>
<li><a class="post-section-overview" href="#receiving-the-mid-level-badge">Receiving the Mid-level Badge</a></li>
<li><a class="post-section-overview" href="#thoughts-on-junior-mid-level-and-senior">Thoughts on Junior, Mid-level, and Senior</a></li>
<li><a class="post-section-overview" href="#to-be-continued">To Be Continued</a></li>
</ul>
<h2 id="start-of-the-journey">Start of the Journey</h2>
<p>It’s been over 3 years since I joined my current company after graduation. I thought it was time and an opportunity to see if I was still competitive in the job market. Hence, the start of my interviewing journey.</p>
<h3 id="background">Background</h3>
<p>I would probably fall in the "<strong>made a transition</strong>" category due to my non-CS background. Below is a brief background information:</p>
<ul>
<li>Majored in Marketing and Biotechnology (Biomedical Engineering)</li>
<li>3-4 years of experience<ul>
<li>70% front end / 30% back end &amp; other stuff</li>
<li>Built products with over a million users</li>
<li>Built web applications from 0 to 1</li>
<li>Deployed and maintained existing applications</li>
</ul>
</li>
<li>Front End Stack: JavaScript, HTML, CSS, React, Vue.js</li>
</ul>
<h3 id="senior-front-end-engineer">Senior Front End Engineer</h3>
<p>After gaining some real-world experience, I decided to take on the challenge and apply for senior positions. Unfortunately, as the title states, I didn't get the offer I was aiming for. On the other hand, I got the chance to face up and see where my weak spots were.</p>
<p>Let's see how far I survived!</p>
<h2 id="preparation">Preparation</h2>
<ul>
<li>Resume</li>
<li>Cover letter</li>
</ul>
<p>End.</p>
<p>I admit I was lazy. Well, I still had a decent job in case all fails. There's nothing to lose, right?</p>
<p>My first interview was a disaster. In addition to my laziness, the past <strong>3 months before interviewing, I was doing 90% DevOps and barely wrote any React for half a year</strong>. So believe me, when I say <em>disaster</em>, I mean it literally!</p>
<p>Getting back to the topic of preparation, I took notes right after each interview when the awfulness was still vivid and looked up everything immediately. Believe it or not, <strong>the same questions get asked over and over again</strong>.</p>
<p>I definitely suggest reading articles on interviewing including the one you're reading right now.😊</p>
<h2 id="the-interview-journey">The Interview Journey</h2>
<p>Here we go!</p>
<p>No company names will be mentioned here since I'd appreciate some anonymity.</p>
<h3 id="resume-and-cover-letter">Resume &amp; Cover Letter</h3>
<p>After all, <strong>I only prepared my resume and cover letter</strong>, this was the part I am the most confident. <strong>80% of my applications got a chance to move to the next stage of the interview.</strong> All except one were applied <strong>without a referral</strong>, so a well-crafted resume and cover letter can go a long way. Let's not forget that moving forward to the initial interview turns the odds of getting an offer from impossible to possible.</p>
<p>This was probably the only thing I did right this time around.</p>
<h3 id="assignments">Assignments</h3>
<p>Assignments were <strong>super common</strong> for the front end interviews that I've gone through. Assignments have always been quite a controversial aspect of the interview process. I'm not going to deny the fact that assignments consume (waste) a lot of time and you had to put that much in while still far away from an offer. However, it offers a way of evaluating the candidate more thoroughly in my opinion.</p>
<p>I spent around 6-12 hours on each assignment, trying my best to make a good impression. After turning in the assignment, there would be a one-hour call to discuss it. The majority of the 1-hour call would be around these aspects:</p>
<ul>
<li>Architecture<ul>
<li>Why is your code structured this way?</li>
<li>Why did you choose method A and not method B?</li>
<li>What are your criteria for splitting components?</li>
<li>Object-oriented programming (OOP) principles</li>
</ul>
</li>
<li>Testing</li>
</ul>
<p>The feedback I received <strong>before</strong> we started the one-hour call were:</p>
<blockquote>
<p>Project has good architecture and structure.
Code is very easy to understand and get around.</p>
</blockquote>
<p>Wow! That's the good impression I was aiming for!</p>
<p>But! But! But!</p>
<p>I did a poor job at talking about my architecture and design decisions which probably threw me out of the "senior" window. In retrospect, I relied on my guts when making these decisions. If I couldn't even persuade myself why structuring code this way would be easier to maintain and test, there's no reason that other people should be convinced, right?</p>
<p>Despite my weak performance, I got lucky and moved forward for every assignment I had done. Huge relief since I spent an enormous amount of time doing it!</p>
<p><strong>Be prepared to have your thought process laid out and convey your architecture designs clearly to the interviewer.</strong></p>
<h3 id="technical-interview">Technical Interview</h3>
<p>Since this is the most prevailing part of the interview process, here's the list of the most common stuff that I was asked about:</p>
<p><strong>JavaScript</strong></p>
<ul>
<li>Asynchronous</li>
<li>Closure</li>
<li>Event loop</li>
<li>Promise</li>
<li>Hoisting</li>
<li>When choosing a library / tool to use, how do you evaluate it?</li>
</ul>
<p><strong>React</strong></p>
<ul>
<li>Why React hooks? What benefit does it bring?</li>
<li>Performance: <code>useMemo</code> vs. <code>useCallback</code></li>
<li>Reconciliation</li>
<li>Class components / Functional components</li>
</ul>
<p><strong>CSS</strong></p>
<ul>
<li>Centering elements</li>
<li>Styled-components</li>
</ul>
<p><strong>Web</strong></p>
<ul>
<li>What happens when you input <a target="_blank" href="https://google.com">https://google.com</a> in the browser?</li>
<li>TCP/IP</li>
<li>HTTP</li>
</ul>
<p><strong>Live Coding / Whiteboarding</strong></p>
<p>As for the dreaded coding test, I faced it only twice. Definitely less than I expected. One was to implement a debounce function and the other was a LeetCode medium problem. </p>
<p>The two surviving tactics for live coding or whiteboarding are to <strong>ask clarification questions</strong> and <strong>think out loud</strong>. By applying them, I got to know right away whether I was in the right direction by observing the reactions of the interviewer. Also, it became an excellent chance to demonstrate my communication skills.</p>
<p>There were no twists and turns for the questions during the technical interviews. They were not hard and preparation will pay off big time! I paid the price for not preparing by ruining the first two interviews and got better eventually.</p>
<p><strong>Common interview questions aren't called common for no reason!</strong></p>
<p>Good reads on Hashnode for JavaScript:</p>
<p><a target="_blank" href="https://rajatgupta.xyz/js-interview-2">🎯 JS Interview Checklist - Part 2 (Advanced)</a></p>
<p><a target="_blank" href="https://blog.yogeshchavan.dev/tricky-javascript-code-snippets-asked-in-the-interview-1">Tricky Javascript Code Snippets Asked In the Interview</a></p>
<h3 id="meeting-the-team-behavioral-interview">Meeting the Team / Behavioral Interview</h3>
<p>Yay! The most non-technical part of the interview!</p>
<p>After going through it a couple of times, here's the list of "common" questions.</p>
<p><strong>Collaboration / Communication</strong></p>
<ul>
<li>You would like to introduce a new library / framework into the project / company, how would you communicate with the team about it?</li>
<li>What would you do if you disagree with the designer?</li>
<li>If given a task you've never done before, how would you approach it? How will you be confident that you can come up with a solution?</li>
</ul>
<p><strong>Personal / Motivation / Goals</strong></p>
<ul>
<li>Received an assignment to learn an unfamiliar skill and give output about it in 30 minutes.</li>
<li>What is your career goal / personal goal?</li>
<li>What motivates you during work?</li>
<li>Why do you want to join us?</li>
<li>Why do you want to leave your current company?</li>
<li>How do you see yourself in 3 years?</li>
</ul>
<p><strong>Some of these questions were answered while crafting my resume</strong>, so I guess I somehow prepared for it.</p>
<h2 id="receiving-the-mid-level-badge">Receiving the Mid-level Badge</h2>
<p>I didn't get that senior front end role as mentioned from the title, so here's what happened in the end. I received the <strong>mid-level</strong> badge from multiple parties.</p>
<p>All of the companies that I interviewed with replied that they would still move me forward if I could accept a mid-level position.</p>
<p>One company that rejected me before also reached out after a month, saying that there was a new position opened for mid-level engineers. They said that if I was still interested, I could keep going with the interview process without starting all over.</p>
<p>All in all, it wasn't as bad as I thought and there were no hard rejections.</p>
<h2 id="thoughts-on-junior-mid-level-and-senior">Thoughts on Junior, Mid-level, and Senior</h2>
<p>Instead of mentioning how many years of experience is expected like a typical job description, here are my two cents of their differences.</p>
<p>Note: This is only my point of view that I wanted to log down for reference so please don't view this as a standard.</p>
<h3 id="junior">Junior</h3>
<p>I started coding to solve problems and it just works. Period. At this stage, I could implement features for our projects, but sometimes I get really stuck and need help from more senior members.</p>
<ul>
<li>Build stuff that <strong>works</strong> and fulfills given tasks</li>
<li>Might not have a good understanding of why it works</li>
</ul>
<h3 id="mid-level-im-here">Mid-level (I’m here 👋)</h3>
<p>It's a bit awkward to get stuck somewhere in the middle, but here I am.</p>
<p>Implementing features independently usually isn't a problem, unless it involves complicated algorithms and math calculations. It is the <strong>how to implement it to make life easier for the team</strong> as a whole that bothers me. Reaching more into the fundamentals will definitely help with the process.</p>
<p>On the other hand, I started to mentor junior members as well as pay more attention to code reviews (but did an awful job looking back). As the codebase grows, I experienced how testing became a "must to have" instead of a "nice to have". Situations such as code changes meant to fix B accidentally break A started to happen a lot more frequently. Also, I discovered how crucial architecture and structure became because it encouraged coding style and practices for newcomers, no matter their seniority.</p>
<p>In short, <strong>the need to collaborate</strong> forced me to care about aspects beyond making things work. </p>
<ul>
<li>Build stuff and fulfills tasks <strong>efficiently</strong></li>
<li>Better understanding of why it works</li>
<li>Code in a more <strong>collaborative</strong> sense<ul>
<li>Architecture</li>
<li>Testing</li>
<li>Mentoring</li>
<li>Code review</li>
</ul>
</li>
</ul>
<h3 id="senior">Senior</h3>
<p>I'm not here yet, so this is what I'm hoping to achieve for the next milestone.</p>
<p>The ultimate goal is to be able to <strong>accelerate collaboration</strong> and be a <strong>multiplier</strong> for the team.</p>
<ul>
<li>Expertise in the fundamentals</li>
<li>Architect and enforce coding standards<ul>
<li>Identify the trade-offs for decisions</li>
<li>Confidence for code quality</li>
</ul>
</li>
<li>Mentor and encourage a positive culture</li>
<li>Cross-team collaboration</li>
</ul>
<p>As for going beyond the senior level, I imagine the actual time spent in writing code will become less and less evident. The focus would be switching to communication, planning, and architecting the project with reference to past experiences and the ability to draw thoughts from others. It's kind of like how CEOs don't really do much of the daily work, but everything that they do will have an enormous impact compared to us.</p>
<p>These are just my thoughts for now. I’m still learning along with my career and would love to know your thoughts on the different levels too!</p>
<h2 id="to-be-continued">To Be Continued</h2>
<p>I wanted to write this down as a reference for my future self because this time around I didn’t take up a front end job. If you ask me what happened? Well, that’s another story.</p>
<p>All in all, I do see myself staying in the field for the long run (let's say at least 10 years), so there definitely will be new chapters written. After this experience, I believe putting yourself into the job market every 1 to 2 years is a healthy thing to do. Not only do we get to know if we're still competitive, but it is also a great opportunity to see how are we growing in our career with a totally different set of eyes. We don't actually need to be "looking for a job" to do it.</p>
<p>That's the end of my first post on Hashnode? It was supposed to be the first post until the <a target="_blank" href="https://townhall.hashnode.com/announcing-harperdb-hackathon-on-hashnode">HarperDB Hackathon</a> came along and snagged my priorities! Shameless plug here for <a target="_blank" href="https://candys.page/moodpraiser-fun-habit-tracker-to-keep-everyone-accountable?guid=a212dca9-fea8-4ac0-922f-72f8032681e1&amp;deviceId=eaf65ac3-3344-4f5d-b24d-98803d28c4d9">MoodPraiser</a>, the project I built for the hackathon.</p>
<p>What's your interview story? Please share in the comments and I'd be more than happy to read about it!</p>
]]></content:encoded></item><item><title><![CDATA[MoodPraiser - Fun habit tracker to keep everyone accountable]]></title><description><![CDATA[Hello Hashnoders!
I'm Candy. Super excited to share MoodPraiser with y'all! Huge thanks to the #harperdbhackathon to keep me motivated throughout the month. It definitely wasn't easy to pick up the keyboard after work every day.
What is MoodPraiser?
...]]></description><link>https://blog.candys.page/moodpraiser-fun-habit-tracker-to-keep-everyone-accountable</link><guid isPermaLink="true">https://blog.candys.page/moodpraiser-fun-habit-tracker-to-keep-everyone-accountable</guid><category><![CDATA[Web Development]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[habits]]></category><category><![CDATA[Hashnode]]></category><category><![CDATA[HarperDB Hackathon]]></category><dc:creator><![CDATA[Candy]]></dc:creator><pubDate>Wed, 30 Jun 2021 15:19:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1625059504295/1nKX7kmu4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="hello-hashnoders">Hello Hashnoders!</h2>
<p>I'm Candy. Super excited to share <a target="_blank" href="https://moodpraiser.candys.page">MoodPraiser</a> with y'all! Huge thanks to the <a target="_blank" href="https://townhall.hashnode.com/announcing-harperdb-hackathon-on-hashnode">#harperdbhackathon</a> to keep me motivated throughout the month. It definitely wasn't easy to pick up the keyboard after work every day.</p>
<h2 id="what-is-moodpraiser">What is MoodPraiser?</h2>
<p>MoodPraiser is a simple, useful and fun habit tracker that keeps you and your friends accountable for each other by giving praises y'all deserve to reach your goal!</p>
<p><a target="_blank" href="https://moodpraiser.candys.page">Live Demo</a> / <a target="_blank" href="https://github.com/candy02058912/moodpraiser">GitHub Repository</a></p>
<h2 id="the-story-behind-moodpraiser">The Story Behind MoodPraiser</h2>
<p>Guess what? This wasn't intended to be a habit tracker in the first place! The project name gives itself away as a "mood" praiser. Yup! It was supposed to be a mood tracker. What happened?</p>
<p>I've always wanted to build a super simple mood tracker so I came up with the name during early June. Then I left the name and the project there to hang until I realized I wouldn't be able to complete it in time because I wasn't working on it. 😂</p>
<p>I believe a lot of people are like me:</p>
<ol>
<li>Start a new habit</li>
<li>Execute it for a few days</li>
<li>Forget about it</li>
<li>Back to step 1</li>
</ol>
<p>Let's call this the deadly "start a new habit" loop.</p>
<p>In order to escape the loop, MoodPraiser became a habit tracker with me being the first user. Here I am, <strong>participating in a hackathon with a project to make sure I complete the hackathon</strong>. How hilarious! 😂</p>
<p>To make things more fun, a praise feature was implemented so that we can receive praises from friends and families to keep ourselves going. Also, it's a good chance to get them to signup and get themselves out of the loop!</p>
<p>That's the story of how MoodPraiser turned into a habit tracker to keep everyone out of the deadly "start a new habit" loop!</p>
<h2 id="tech-stack">Tech Stack</h2>
<ul>
<li><a target="_blank" href="https://harperdb.io/">HarperDB</a> - The Database known for simplicity without sacrifice!</li>
<li><a target="_blank" href="https://auth0.com/">Auth0</a> - User authentication that's super easy to integrate</li>
<li><a target="_blank" href="https://nextjs.org">Next.JS</a> - The React framework for production</li>
<li><a target="_blank" href="https://chakra-ui.com/">Chakra UI</a> - UI development that's just deadly simple</li>
<li><a target="_blank" href="https://vercel.com">Vercel</a> - Deployment for the app, where the app lives</li>
</ul>
<h2 id="features-and-usage">Features and Usage</h2>
<h3 id="supports-dark-and-light-modes">🌓 Supports dark and light modes</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625059897328/_ooRGx5ji.gif" alt="Screenshot - Supports dark and light modes" /></p>
<h3 id="responsive-on-all-devices">📱 Responsive on all devices</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625059951657/I5fp_9Xrhk.png" alt="Screenshot - Responsive on all devices" /></p>
<h3 id="track-your-habits-and-moods">✏ Track your habits and moods</h3>
<h4 id="create-habit">Create habit</h4>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625059991296/7FnsGny5X.gif" alt="Screenshot - Create habit" /></p>
<h4 id="track-your-mood-and-habits">Track your mood and habits</h4>
<p>Yay the mood part is still alive, tied together with the habit tracking!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625060043075/LBHaG0fx-.gif" alt="Screenshot - Track your mood and habits" /></p>
<h3 id="earn-praises-by-sharing-the-praiser-link">🥰 Earn praises by sharing the praiser link</h3>
<p>Step 1: Copy the praiser link</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625060065719/R8mKbb6Gm.gif" alt="Screenshot - Copy praiser link" /></p>
<p>Step 2: Share it with your friends</p>
<p>Step 3: Praise your friends back</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625060145528/9OOrblyNH.gif" alt="Screenshot - Praise your friends" /></p>
<h2 id="hurdles-along-the-way">Hurdles Along The Way</h2>
<p>After having the project idea in mind with some basic features, it's time for implementation! It's my first time <strong>releasing a side project to the public with the front end and back end all built on my own.</strong></p>
<h3 id="choosing-the-stack">Choosing the stack</h3>
<ul>
<li>Database - Easy choice and you know why! HarperDB to the rescue!</li>
<li>Authentication - I didn't feel comfortable going through sensitive information, so I chose a trustworthy Auth0 which also supports login with third-party services such as Google.</li>
<li>Front End &amp; Back End - I wanted to use TypeScript for everything and manage APIs easily. Loved using React and also heard about the Next.JS for quite some time. <strong>Next.JS fulfills all my wishes so I definitely should try it out.</strong></li>
<li>Deployment - Since I chose Next.JS, Vercel as the main contributor behind it supports deployment for it like no one else. <strong>Only a few clicks away from deploying the app's front end and back end automatically.</strong> Super easy to setup!</li>
</ul>
<h3 id="database">Database</h3>
<p>HarperDB exposes a REST API along with example code and a Postman collection to start out, it was super easy to follow. I didn't find the need to use a wrapper library. CRUD operations can be called easily without much hassle.</p>
<p>Below is the how I structured the database to save all the data I needed for MoodPraiser to work.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625064772743/zIza7FIpF.png" alt="MoodPraiser entity-relationship diagram (ERD)" /></p>
<p>One thing that I'd like to mention was when I was altered the database schema, such as removing columns from a table, sometimes I was <strong>unable to delete rows in the database</strong> after that. Due to the project hasn't been released yet, my tentative solution was reconstructing the table.</p>
<h3 id="querying">Querying</h3>
<p>I'm awful with SQL queries and have always wanted to practice it in a real project instead of following tutorials. Truly love the HarperDB Studio since we can try out queries directly from the GUI. Although complicated queries are not supported, but it fulfills most of my use cases in the project.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625066237610/IJFE8B95O.png" alt="Screenshot - HarperDB Studio" /></p>
<h3 id="code-quality">Code quality</h3>
<p>Currently going live with absolutely 0 tests written. Here's what I'm relying on currently:</p>
<ul>
<li>Linter to keep coding style consistent</li>
<li>Relying on TypeScript types to get the parameters right</li>
</ul>
<p>Will be planning to add tests and run CI with GitHub actions in the future.</p>
<h2 id="faq">FAQ</h2>
<h3 id="who-is-suitable-for-moodpraiser">Who is suitable for MoodPraiser?</h3>
<p>Anyone and everyone! You can use it by yourself and praise yourself, or let your friends join in the fun as well!</p>
<h3 id="where-is-my-data-saved">Where is my data saved?</h3>
<p>Application data such as user profiles, habits and praises are saved in HarperDB. Passwords goes through Google if you choose Google login and Auth0 if you register an account with them. MoodPraiser don't have access to all passwords.</p>
<p>Feel free to ask about anything in the comments below!</p>
<h2 id="whats-next">What's Next?</h2>
<ul>
<li>Reminders - Email reminders so that you won't forget to log your accomplishments.</li>
<li>Edit profile - Ability to change the display name, add an avatar, etc.</li>
<li>Badges - Gamify MoodPraiser! Some ideas in mind are: creating your first habit, getting your first praise, etc.</li>
<li>More statistics - Show if you've been praised today, more history stats, etc.</li>
<li>Internationalization - Hopefully I can support many languages in the future. For now, planning to support Chinese since it's my mother tongue.</li>
<li>You name it - Feel free to comment on what features you would like to see!</li>
</ul>
<h2 id="contributing">Contributing</h2>
<p>MoodPraiser is an open source project so you're more than welcome to contribute ideas, report issues or send in pull requests!</p>
<p><a target="_blank" href="https://github.com/candy02058912/moodpraiser">GitHub Repository</a></p>
<p>Kudos for reading this far! Love to know what you think about the article and the project.</p>
<p>This is also is my first post on Hashnode! Extremely thrilled that I joined in time to participate in the hackathon.</p>
<p>Shameless plug: <a target="_blank" href="https://moodpraiser.candys.page">Moodpraiser</a></p>
]]></content:encoded></item></channel></rss>