<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>xuanze.sol Blog</title>
        <link>https://aaronangxz.github.io/blog</link>
        <description>xuanze.sol Blog</description>
        <lastBuildDate>Tue, 06 Sep 2022 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Interviewing with OKX (Backend Software Engineer)]]></title>
            <link>https://aaronangxz.github.io/blog/interviewing-with-okx</link>
            <guid>interviewing-with-okx</guid>
            <pubDate>Tue, 06 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[OKX]]></description>
            <content:encoded><![CDATA[<p><img loading="lazy" alt="OKX" src="data:image/jpeg;base64,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oQVCCoQVCCoQ7MFQgqIgqIgqIgqIgqIgqIgpYKhBURBURBURBURBURBURBdmCoQVEQVEQVEQVEQVEQVEQX+GP//aAAwDAQACAAMAAAAQ8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888MMMMMMMMMMMMU8MMMI888skMMc8oEMMM088osMMY888888888888U8888o8888U8888oU888U88o888o888888888888U8888o8888U8888oU888U88o888o8888wwww8888U8888o4wwwQwww8sYwwwYwwg4wwk8888sMMcU888U8888s8884kMMc88MMMMc884MMMM88888888U888U88888888oU888888888888o888888888888U888U88888888oU888888888888o888888880888U888U88888888sU888888884888o8888888888888888U8888oMMMM088s8oU88skMMY888o888888888888U8888o8888U8888oU888U88o888o888888888888U8888o8888U8888oU888U88o888o888888888888U8wwwg8888c8888sU888c88o088s88888888888888c88s8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAFBEBAAAAAAAAAAAAAAAAAAAAkP/aAAgBAwEBPxBIP//EABQRAQAAAAAAAAAAAAAAAAAAAJD/2gAIAQIBAT8QSD//xAAoEAABAwMDAwUBAQEAAAAAAAABAFHwESDBIaHxMDGxQEFhcZFQgZD/2gAIAQEAAT8Q/wCQAVIa8egCtBoAo3lRvKjeVG8qN5Ubyo3lRvKjeVG8qN5Ubyo3lRvKjeVG8qN5Ubyo3lRvKjeVG8oAXYawOvYgmhB9wdChiADQdqkDYYVMADroAaAAaUCjeVG8qN5Ubyo3lRvKKOg1MAqKgJoQWKprAgo5Fby62ID/AAVRD71KQGugCtAAwUbyo3lRvKjeVG8qN5QDksEKuoCaEEaUsE+CGg+5AJRLa3aAVNAFaAD2AUbyo3lRvKjeVG8qN5Q+8OREGhINCCD2KpLhW8C4IKD7kAlE7vNSAqewFdAwCjeVG8qN5Ubyo3lRvK0U8gKggJoQQT6g5sPlSzLJp75pwpll8y5Tj37NZIOU498WxbNfGO/gdDmw+VLMsmnvmnCmWXzLlOPfs1kg5Tj3xbFs18Y7+B0ObD5Usyyae+acKZZfMuU49+zWSDlOPfFsWzXxjv4HQ5sPlSzLJp75pwpll8y5Tj37NZIOU498WxbNfGO/gdDmw+VLMsmnvmnCmWXzLlOPfs1kg5Tj3xbFs18Y7+B0ObD5Usyyae+acKZZfMuU49+zWSDlOPfFsWzXxjvQ9DlU0PvUK5OuTrk65OuTrk6HVDOQdDYfKlmWTT3zThbD2xcHXB1wdcHXB1wdEKHgAD3FET1iH2J1+lydcnXJ1ydcnXJ0GLBDoNe5PsB3Jsota3OQQjPCGAg1XJ1ydcnXJ1ydcnQZ0gAOg0VJPsA5RGEwHsBcHXB1wdcHXB1wdCGlWlVCQQif1mQJBcnXJ1ydcnXJ1ydVufdDoASQ+wABPROa8OPlAkEakkkqOYUcwo5hRzCjmFHMIueYtQV9waaFVWdVGBAX7D5Usyyae8Eg1HdAIoBiHuoplRTKimVFMqKZUUyu9XBIAqKgiuoLKhuUkiLs5Ucwo5hRzCjmFHMKOYRPT+lQFT/LfZFNEX6Qo5hRzCjmFHMKOYUcwhSHhFVQV9kQOQ0ANewFdAFFMqKZUUyoplRTKimUHwClSACAnUEaI5csH6Qo5hRzCjmFHMKOYUcwionaEgLbonJxvQjX37D5UsyyafrwLFON6ODctyvjGehOTjehGvv2HypZlk0/XgWKcb0cG5blfGM9CcnG9CNffsPlSzLJp+vAsU43o4Ny3K+MZ6E5ON6Ea+/YfKlmWTT9eBYpxvRwbluV8Yz0Jycb0I19+w+VLMsmn68CxTjejg3Lcr4xnoTk43oRr79h8qWZZNP14FinG9HBuW5XxjPQnDDoJOpAAD2IIIIvPv8AAQAADla6tXmJEX7D5Usyyafrgyp1A0BBJLADUnsETvIAP56PWVFfsghCN1TQgg3kPW0AqAASwANSfQnPnkKtX4o5lRzKjmVHMqOZUcygMXGoBAr/AL0Nh8qWZZNPfqq9swWx1MXBlwZcGXBlwZcGWnycArQVTH0ICpoAroAyjmVHMqOZUcyo5lRzKPuoGqjUFaEEaWCfBDQXAJRZI3sBU0AFdAGUcyo5lRzKjmVHMqOZQbmZDUSoCaEFaSm0ICH6FHMKOYUcwo5hRzCjmFpA/vVQE60RjiSGgKnsBXQfCjmVHMqOZUcyo5lRzKGiV8QqCCuoofUHNh8qWZZNPfNOFMsvmXKce/ZrJBynHvi2LZr4x38Doc2HypZlk09804Uyy+Zcpx79mskHKce+LYtmvjHfwOhzYfKlmWTT3zThTLL5lynHv2ayQcpx74ti2a+Md/A6HNh8qWZZNPfNOFMsvmXKce/ZrJBynHvi2LZr4x38Doc2HypZlk09804Uyy+Zcpx79mskHKce+LYtmvjHfwOhzYfKlmWTT3zThTLL5lynHv2ayQcpx74ti2a+Md0ehDJNgEmQT3BBB9OJ/kQLv3+vlUmtNnAA2ag7IgBU0J7guuVLlS5UuVLlS5Uh+/QWaCoqSwDqmLVFHApefsFH2RRAM3EioVOocF7w6YAMaK9zAPZRY1ucghHvpEB7nX6+b9LumYgKKksA6pPdQUvpmgFq5BCOP+cECD4+bxwUTIQMSSewABRJ3AP2Fxi4xcYuMXGLjFxi4xcYuMXGLjFxi4xcYuMXGLjFxi4xcYuMQAagAfq0ge4B/wAXxPxfE/F8T8XxPxfE/F8T8QAdgB/nRJDUgfsLjFxi4xcYuMXGIA7AD6FpIakCfpcYuMXGLjFxi4xAHYAfQ6JIdQJ+lxi4xcYuMXGLjEAdgB9D/hj/AP/Z" width="640" height="320" class="img_E7b_"></p><h2 class="anchor anchorWithStickyNavbar_mojV" id="introduction">Introduction<a class="hash-link" href="#introduction" title="Direct link to heading">​</a></h2><p>OKX is a large-ish crypto exchange that is hiring in Singapore. However, they do not have
presence in SG and US.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="tldr">TLDR<a class="hash-link" href="#tldr" title="Direct link to heading">​</a></h2><div class="codeBlockContainer_I0IT theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-text codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">Overall Experience: Okay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Difficulty: Hard</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Received Offer: No</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><h2 class="anchor anchorWithStickyNavbar_mojV" id="first-round-senior">First Round (Senior)<a class="hash-link" href="#first-round-senior" title="Direct link to heading">​</a></h2><ul><li>Talk about hash map implementation</li><li>Hash function, probing, collisions</li><li>If a hashmap only has a few buckets populated, what can we optimize</li><li>Error handling</li><li>How is error handling being done</li><li>Benefits of catching exceptions</li><li>Coding </li><li>🔴 <a href="https://leetcode.com/problems/strong-password-checker/" target="_blank" rel="noopener noreferrer">420. Strong Password Checker</a></li></ul>]]></content:encoded>
            <category>interviews</category>
        </item>
        <item>
            <title><![CDATA[Interviewing with MatrixPort (Backend Software Engineer)]]></title>
            <link>https://aaronangxz.github.io/blog/interviewing-with-matrixport</link>
            <guid>interviewing-with-matrixport</guid>
            <pubDate>Fri, 02 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[MatrixPort]]></description>
            <content:encoded><![CDATA[<p><img loading="lazy" alt="MatrixPort" src="data:image/png;base64,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" width="528" height="95" class="img_E7b_"></p><h2 class="anchor anchorWithStickyNavbar_mojV" id="introduction">Introduction<a class="hash-link" href="#introduction" title="Direct link to heading">​</a></h2><p>Matrixport is a very promosing SG company with a fresh $100M funding from Series-C last year.
And they also have plans to go public in the next few years. The exchange under MatrixPort is called bit.com.
However, note that all interviews were conducted in Chinese.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="tldr">TLDR<a class="hash-link" href="#tldr" title="Direct link to heading">​</a></h2><div class="codeBlockContainer_I0IT theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-text codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">Overall Experience: Good</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Difficulty: Medium -&gt; Medium-Hard</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Received Offer: No</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><h2 class="anchor anchorWithStickyNavbar_mojV" id="first-round">First Round<a class="hash-link" href="#first-round" title="Direct link to heading">​</a></h2><ul><li>Previous Experiences</li><li>Concurrency related:
-- Function spawns several goroutines, wait groups implemented.</li><li>How should we implement it if we want to abort all threads whenever one of it fails.</li><li>Ans: Implement channels. In each goroutines, check for channel status. When it fails, close the channel.</li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="second-round">Second Round<a class="hash-link" href="#second-round" title="Direct link to heading">​</a></h2><ul><li>How does database transactions work under the hood</li><li>When to use transactions</li><li>Considerations during DB / Cache interactions</li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="third-round">Third Round<a class="hash-link" href="#third-round" title="Direct link to heading">​</a></h2><ul><li>Docker file</li><li>How to perform deadlock using goroutines</li><li>Regular expressions</li><li>Shell command to check process</li><li>Memory stacks of process</li><li>Kernel vs core</li><li>Debugging tool</li></ul>]]></content:encoded>
            <category>interviews</category>
        </item>
        <item>
            <title><![CDATA[Interviewing with TikTok (Testing Software Engineer)]]></title>
            <link>https://aaronangxz.github.io/blog/interviewing-with-tiktok</link>
            <guid>interviewing-with-tiktok</guid>
            <pubDate>Fri, 26 Aug 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[TikTok]]></description>
            <content:encoded><![CDATA[<p><img loading="lazy" alt="TikTok" src="/assets/images/tiktok_logo-931b1483d76a2e3d6423aafad2789c4c.png" width="2560" height="748" class="img_E7b_"></p><h2 class="anchor anchorWithStickyNavbar_mojV" id="introduction">Introduction<a class="hash-link" href="#introduction" title="Direct link to heading">​</a></h2><p>TikTok has been the most popular choice among ex-colleagues that left Shopee. A quick check on LinkedIn Jobs also shows
that they are hiring very aggressively (STILL). The role isn't that bad too, so why not give it a try.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="tldr">TLDR<a class="hash-link" href="#tldr" title="Direct link to heading">​</a></h2><div class="codeBlockContainer_I0IT theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-text codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">Overall Experience: Very Good, very friendly interviewers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Difficulty: Easy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Received Offer: Yes</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><h2 class="anchor anchorWithStickyNavbar_mojV" id="first-round-senior">First Round (Senior)<a class="hash-link" href="#first-round-senior" title="Direct link to heading">​</a></h2><ul><li>Previous experiences in automation</li><li>How to structure automation cases</li></ul><p>2 fairly easy coding questions:</p><ul><li>🟢 <a href="https://leetcode.com/problems/first-unique-character-in-a-string/" target="_blank" rel="noopener noreferrer">387. First Unique Character in a String</a></li><li>🟡 <a href="https://leetcode.com/problems/validate-binary-search-tree/" target="_blank" rel="noopener noreferrer">98. Validate Binary Search Tree</a></li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="second-round-senior">Second Round (Senior)<a class="hash-link" href="#second-round-senior" title="Direct link to heading">​</a></h2><ul><li>Previous experiences in automation</li><li>How to perform backend API test (via REST / RPC)</li><li>Tools used for manual backend testing</li><li>Tools used for automated backend testing</li><li>How to handle race condition during automation testing</li></ul><p>1 fairly easy coding question:</p><ul><li>🟢 <a href="https://www.hackerrank.com/challenges/two-strings/problem" target="_blank" rel="noopener noreferrer">Two Strings</a></li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="third-round-hiring-manager">Third Round (Hiring Manager)<a class="hash-link" href="#third-round-hiring-manager" title="Direct link to heading">​</a></h2><ul><li>There are 100 rocks of the same weight, except one. Most efficient way to find the different weighted rock. Time complexity &amp; further optimisation.</li><li>Pros and Cons between testing in live / test environment.</li><li>Workflow of building automation cases.</li><li>The most challenging feature you have tested before</li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="fourth-round-hr">Fourth Round (HR)<a class="hash-link" href="#fourth-round-hr" title="Direct link to heading">​</a></h2><ul><li>Reason for leaving</li><li>How to resolve internal / external conflicts</li><li>Proudest achievement in the current role</li><li>Future plans</li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="fifth-round-hr">Fifth Round (HR)<a class="hash-link" href="#fifth-round-hr" title="Direct link to heading">​</a></h2><ul><li>Offer &amp; package</li></ul>]]></content:encoded>
            <category>interviews</category>
        </item>
        <item>
            <title><![CDATA[Interviewing with Grab (Backend Software Engineer)]]></title>
            <link>https://aaronangxz.github.io/blog/interviewing-with-grab</link>
            <guid>interviewing-with-grab</guid>
            <pubDate>Sat, 25 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Grab]]></description>
            <content:encoded><![CDATA[<p><img loading="lazy" alt="Grab" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAwLjA5NTgiIGhlaWdodD0iMzU1LjE5NjQxIiB2aWV3Qm94PSIwIDAgMTAwMC4wOTU3IDM1NS4xOTY0MSI+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzAwYjE0ZjtmaWxsLW9wYWNpdHk6MSIgZD0iTTMzMi41IDE0OTUuNjIyOWMtNzcuMzY5NzgtNi44ODAzLTE0NS4wODQ1OS0zNy41Mjg2LTE5Ni41MjQ3Ni04OC45NDktNDguNTc2NzQ0LTQ4LjU1OC03OC4zODM0NDgtMTEwLjE4OTgtODguNTEzMDU3LTE4My4wMTk5LTIuNDg5NDU2LTE3Ljg5ODgtMy4wNDQwNy01OS45NDc1LTEuMDM5NzIyLTc4LjgyOCA2LjUwNDE4Ni02MS4yNjc2IDI4LjgxMDQ5My0xMTYuMDEyOSA2Ni40ODU1NTktMTYzLjE3MjAxIDEwLjE1MzMzLTEyLjcwOTI3IDMxLjI1MDUzLTM0LjI1ODU3IDQzLjM5NzgtNDQuMzI3NzkgNjQuMzg5NjMtNTMuMzc0NDQgMTQ1LjY2NTA1LTc5LjM3NjA3IDIzMy42Mzc3MS03NC43NDUzNiA0MS41MDUwMSAyLjE4NDc0IDcwIDcuMjgwNDggMTAxLjg4OTM5IDE4LjIyMDgxIDIyLjEzMTE3IDcuNTkyNTYgNTMuOTM4MTEgMjMuNjU1NzcgNjMuNzUgMzIuMTk1MTZsMi40Nzg2NCAyLjE1NzE4LS4yODA3OCAyNC4xMzU0NC0uMjgwNzggMjQuMTM1NDQtMTAuNS02LjQ2MjM2Yy00OC4xNjk5Mi0yOS42NDY3Ny0xMDkuMjcxNTQtNDUuMzM3NTEtMTc2LjM5NTIyLTQ1LjI5NzgxLTU2Ljg5MDcuMDMzNi0xMDkuMzk5IDE1LjI3NTU4LTE1NC4xMDQ3OCA0NC43MzMwNS00NS45OTc4OSAzMC4zMDg4Ni04MC42NTYwMyA3My4wOTUyNS0xMDAuOTQ1NDQgMTI0LjYxOTg1LTI3LjQ2NzE5MSA2OS43NTI1LTIzLjIxNzE4MiAxNTQuOTg1MiAxMS4xNTg4OCAyMjMuNzg4MiAzOS4xODc4NyA3OC40MzM3IDExMS4zODI2MSAxMjguODk2OSAyMDAuOTUyOTkgMTQwLjQ2MzQgMjYuMzU1OTEgMy40MDM1IDY1LjIyNDM3IDEuODU0IDkyLjgzMzU3LTMuNzAwOCA5MC4zNDM3NC0xOC4xNzY1IDE0Ny4wMzUzNS03OS45NjQ0IDE1OS4xMTExMS0xNzMuNDE0NCAxLjI1OTk4LTkuNzUwNSAxLjcwNi0yMS40OTg3IDEuNzg0MzktNDdsLjEwNDUtMzQtMTA2Ljc1LS4yNTQ1LTEwNi43NS0uMjU0NlYxMTM4LjY1NGgyNjFsLS4wMDkgNDMuMjVjLS4wMTAyIDQ4Ljc2ODYtMS4wNzQ2NSA3NC4yOS0zLjk0OTg1IDk0LjcwMzctOC42ODE5NCA2MS42NDEzLTMxLjYzNjEzIDExMC43MDgzLTY5LjUwNzYgMTQ4LjU3OTgtMzguMzgxNTcgMzguMzgxNS04Ny41MDA1MyA2MC44OTc3LTE1MC41MzM1NSA2OS4wMDQ3LTE0LjcxMDg5IDEuODkyLTU3Ljc1OTU1IDIuNzQxNi03Mi41IDEuNDMwN3pNMTU1MCA5MjIuNzc2NDNWODE3LjY1Mzk5aDQ5djE3Ny42OTYyNWwtNC4yMzUxIDEuOTAxODhjLTguNzU1OCAzLjkzMTk4LTIxLjE3MjcgMTIuNDAxMDgtNDMuNTE0OSAyOS42ODAwOC0uOTk4Mi43NzItMS4yNS0yMC4yMDg5LTEuMjUtMTA0LjE1NTc3ek0xNDc2IDk2MC44NTM5OXYtMTQzLjJoNDl2MjI5LjIyMDkxbC03LjY1OCA4LjEzOTVjLTcuODQzNCA4LjMzNjctMjEuOTQyMyAyNC45MDk2LTMzLjI5NjkgMzkuMTM5Ni0zLjUxMDkgNC40LTYuNzU3MyA4LjQyNzUtNy4yMTQzIDguOTUtLjQ1NjkuNTIyNS0uODMwOC02My40OS0uODMwOC0xNDIuMjUwMDF6IiB0cmFuc2Zvcm09Im1hdHJpeCguNTIzMjUgMCAwIC41MjMyNSAtMjMuNjUzNDIwOCAtNDI3Ljg0MDA0MjIzKSIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiMwMGIxNGY7ZmlsbC1vcGFjaXR5OjEiIGQ9Ik0zNDUuNSAxNDIxLjA0ODljLTYxLjUzMjAyLTQuODM4OC0xMTMuMzQ1OTgtMjguNTg4Ni0xNTQuMTM2NzQtNzAuNjUxNC0xMS45ODAxMi0xMi4zNTM4LTE4Ljg4NTg1LTIwLjkzMzYtMjguMDkzNS0zNC45MDQxLTM0LjEyMDMyLTUxLjc2OTktNDcuMzg4MzctMTE5LjM4MzYtMzUuNzY0NzQtMTgyLjI1NjUgMTQuOTAyMjktODAuNjA3NCA3MC41MzMzMy0xNDcuNTIzMSAxNDguNDUyNTgtMTc4LjU2NjAyIDE5LjgxNDExLTcuODkzOTEgNDQuMjYyNzgtMTMuNzE2MzQgNjcuNDk0NzgtMTYuMDczODMgMTUuMDc1MTctMS41Mjk3NiA1NS41NjA2MS0uNjczODMgNzEuNTQ3NjIgMS41MTI2NCA1MS40NzQzNiA3LjAzOTg5IDk3LjQyNjI5IDIyLjk0MjY1IDEzNC4yNDUyMyA0Ni40NTg3Nmw4Ljc0NTIyIDUuNTg1NTQuMDA1IDIzLjcxNDgxYy4wMDQgMjEuNjEyNS0uMTUxMTkgMjMuNzk4My0xLjc1NDQ4IDI0LjY1NjMtMS4zNzY1OS43MzY4LTQuNDc2MS0uNzgwNS0xNC4yNS02Ljk3NTktMzguNTY1NjEtMjQuNDQ1Mi03OS42MjMyLTM4LjcyNTE5LTEyNy45OTA5Ny00NC41MTU1Ni0xOC40MzE4My0yLjIwNjU4LTU4LjI1NTI0LTIuNDkwMy03Mi0uNTEyOTctODguMzg0OTQgMTIuNzE1MTMtMTUxLjM0NjE5IDc2LjI5MzYzLTE2Mi41Mzk5MSAxNjQuMTMzMzMtMy4wNDcwNCAyMy45MTA4LS45NzQ2IDU3LjYyNSA0Ljk3OTE1IDgxIDEzLjI5NjE0IDUyLjIwMiA0NS40MjY4IDk0LjY1MTQgODguNDQzNDYgMTE2Ljg0NjkgMjkuMTg5MjcgMTUuMDYxIDU0Ljg1NTI0IDIxLjE1MzEgODkuMTE3MyAyMS4xNTMxIDQ3Ljk3MjY0IDAgODYuNTU4NTEtMTMuNjQxNCAxMTMuMDI0ODItMzkuOTU3OSAxNy4xNTUzNy0xNy4wNTgzIDI3LjE3OTYxLTM3Ljc0MzQgMjkuNDYwNjYtNjAuNzkyMWwuNzE3NS03LjI1SDM2OHYtNTFoMTg4djIwLjM5NGMwIDMxLjQ1ODQtMi41MTI1NiA1MC4xNTI1LTkuNTc5NjQgNzEuMjc1My0xNC4zMjE1NyA0Mi44MDU1LTQ0LjY5MDQzIDc2Ljc4NzUtODYuNDIwMzYgOTYuNzAyLTI3LjE0MDIxIDEyLjk1MTktNTYuMDI1ODcgMTkuMjUxNy05MS44NTI2OCAyMC4wMzIyLTkuNzA2MDMuMjExNS0xOS44OTczMi4yMDc2LTIyLjY0NzMyLS4wMXpNMTcwNi42OTM2IDE0MjEuNTkzN2MtMzguODc2Ny0zLjQ0OTctNzMuMTAzOC0yMC41OTkxLTEwMi4zMjI2LTUxLjI2ODQtMjAuOTQ3NS0yMS45ODc1LTM1Ljc5MDYtNDguMjIxNy00Mi4yNDgyLTc0LjY3MTMtMy43NDE1LTE1LjMyNDctNC45MTktMTIuMzMyMSAxNi40MzQ0LTQxLjc3MDEgMTAuNDE4NS0xNC4zNjMxIDE5LjIzNy0yNi4xNDA2IDE5LjU5NjYtMjYuMTcyMy4zNTk1LS4wMzIuOTQ2MiA0Ljc3OTkgMS4zMDM3IDEwLjY5MjQuOTA0NiAxNC45NjEgMi4yNTExIDI0LjEyMDUgNS4yNTU4IDM1Ljc1IDEzLjM0MTIgNTEuNjM3OSA1MC44NDI0IDg4Ljk1MjggOTcuNjE2IDk3LjEzMSAxMi40MTY2IDIuMTcxIDMzLjc1MzUgMS4zODEzIDQ1LjY3MDctMS42OTAzIDQzLjA3Mi0xMS4xMDE3IDcxLjcxNDEtNDMuNjU4MSA4Mi42NDYzLTkzLjk0MDcgMi42Mzk4LTEyLjE0MTYgMi42NTg1LTQ3LjgxMTcuMDMxLTU5Ljc2ODItNS4zNTUxLTI0LjM3MTgtMTUuODA4NC00NC45NDE1LTMwLjkyNjktNjAuODU3NC0yMS42MDMtMjIuNzQyNy00OS45NDI4LTM0LjM3NDQtODMuNzUwNC0zNC4zNzQ0LTQzLjM4OTUgMC03NC45NTA4IDE3LjYwMTctMTE2LjU4MTggNjUuMDE3My00MC43MDE2IDQ2LjM1NzMtMTA4LjI5NiAxMzIuMjY1NS0xNDIuMjc5OCAxODAuODI4N0wxNDQ1IDEzODMuODQ1OXYtODAuNjkxOWwxNy4yODMyLTIzLjVjOS41MDU4LTEyLjkyNSAyNi4xNjI0LTM0Ljk3NSAzNy4wMTQ3LTQ5IDEwLjg1MjMtMTQuMDI1IDI1LjkxMDgtMzMuNTk3NyAzMy40NjMyLTQzLjQ5NDggMzQuNzAxOS00NS40NzUyIDU3LjA5MTYtNjguMjkxIDg1LjUzODMtODcuMTY2NCA1OC42Nzk3LTM4LjkzNjEgMTM1Ljg5ODQtMzkuOTE2NyAxOTEuODk5NC0yLjQzNjcgNTcuMTQ4NyAzOC4yNDggODQuNjEwNCAxMTMuMDQ4OSA2OS4yODc0IDE4OC43MjY2LTEyLjM2MTMgNjEuMDUwMy01MS40NTg1IDEwOC4xNTYyLTEwNS41NSAxMjcuMTcwNy0xMS43MDE4IDQuMTEzNS0yNS4xNTQxIDYuODg3NS0zOS40NDMzIDguMTMzNS0xMy4xNzc1IDEuMTQ5MS0xNC45Mjc4IDEuMTQ5Ni0yNy44MDY0LjAxek0xMjk3IDEzNTYuNTMyM2MwLTEwOC43NjMtLjIxMzMtMTI3LjU1ODQtMS41NTAxLTEzNi41NjEtNC44OTQ0LTMyLjk2MjMtMjAuMTE1LTYwLjQyNTMtNDMuMDEzNi03Ny42MTEtMTQuODQ3LTExLjE0MjktMzEuNTAwNy0xOC4wNjczLTUxLjI4MDMtMjEuMzIxOS0xNC4xNzIzLTIuMzMyLTM1LjM0MDEtMS40MjEzLTQ4LjY1NiAyLjA5MzItNDQuNDY0NiAxMS43MzU4LTc2LjQzNDYgNDcuOTUyMy04Ni4wODc3IDk3LjUyMjQtMi43NTQyIDE0LjE0MzItMi41MTY5IDQwLjgyNjMuNDg5MSA1NSA5Ljg5NTMgNDYuNjU3NSAzOS40ODg3IDgwLjM0NyA4MS4wOTg2IDkyLjMyMzQgMzYuNjI0MSAxMC41NDE0IDg3LjA5NTQgMi42NDMgMTE4LjI2Ny0xOC41MDc5bDUuNzY3LTMuOTEzMS0uMjY3IDI1Ljc3NTctLjI2NyAyNS43NzU2LTEwIDUuMjI5NGMtMjUuMjk5NCAxMy4yMy02NC45NTQ1IDIxLjY3MjEtOTMgMTkuNzk4Ni01My42ODc2LTMuNTg2NC05Ni44OTYxLTI3Ljk1OTktMTI1LjY0Ny03MC44NzYyLTMwLjYwNjktNDUuNjg3LTM4LjQzMTItMTExLjk5MDktMTkuODE0Ni0xNjcuOTExNyAyNC41OTMyLTczLjg3MzEgOTMuNTUzOC0xMTguOTk0OCAxNzIuMjExNi0xMTIuNjgwMSA0Mi42NTEgMy40MjQxIDc0LjY4MzMgMTcuNzMyNCAxMDIuNzg4MyA0NS45MTM4IDI1Ljk4MDQgMjYuMDUxMSAzOS45MTQzIDU0LjE4MTEgNDYuNTk3OCA5NC4wNzI1IDEuNjAyOCA5LjU2NyAxLjc5IDIyLjExODUgMi4xMDY1IDE0MS4yNWwuMzQ3MyAxMzAuNzVIMTI5N1pNNzM2LjAxNDgzIDEzNTMuNDA0Yy4wMTUyLTEzMi41NjIzLjQzNDY2LTE1MC4zMjc0IDMuOTU3NTktMTY3LjYxNDYgOS4wNDg5MS00NC40MDM4IDM1LjM4ODI2LTc5LjcyMDcgNzMuODk0Ny05OS4wODEyIDkuMTE1MTMtNC41ODI5IDI4LjA1OTU3LTEwLjYzMDMgMzkuMTMyODgtMTIuNDkxOCAzMy4zNzg4Ni01LjYxMTQgNjguMDcxOTktLjUzODEgOTIuNzA4NzUgMTMuNTU3MWw1LjIwODc0IDIuOTgwMS00LjEyNDI4IDYuNzAwMmMtMi4yNjgzNSAzLjY4NTEtNy4yMzA4OSAxMy4xMTI3LTExLjAyNzg4IDIwLjk1MDItMy43OTY5OCA3LjgzNzUtNi45ODQ5OSAxNC4yNDk5LTcuMDg0NDcgMTQuMjQ5Ny0uMDk5NS0uMDAwMi00LjQ1NTg2LTEuNTI1NC05LjY4MDg2LTMuMzg5NC0yMi4zNTYwOS03Ljk3NTMtNDIuNzg3NTEtOS4yNjgtNjMuNjc4MzEtNC4wMjg4LTE5LjU1OTQ3IDQuOTA1My0zNy4zNzgzMiAxNi40NTk5LTQ4LjkxNTYyIDMxLjcxOTMtNi40MzY2IDguNTEzMS0xMy44NzgyNiAyNC4yMTI3LTE3LjE1ODUzIDM2LjE5OTJsLTIuNzM2NjQgMTAtLjI4MjIxIDEzOS43NS0uMjgyMjIgMTM5Ljc1SDczNloiIHRyYW5zZm9ybT0ibWF0cml4KC41MjMyNSAwIDAgLjUyMzI1IC0yMy42NTM0MjA4IC00MjcuODQwMDQyMjMpIi8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzAwYjE0ZjtmaWxsLW9wYWNpdHk6MSIgZD0iTTY2My4wMDA4NCAxMzQ0LjkwNGMuMDAwODMtMTM3LjY1NzQuMjM3NjYtMTQ4Ljc4NzUgMy42MDEzOS0xNjkuMjUgMTAuMzY3Mi02My4wNjY2IDQzLjM3Mzk4LTExNC41Mjk4IDkyLjYzODIyLTE0NC40Mzg5IDQ2LjgzMDY0LTI4LjQzMTUgMTA4Ljk2MDY3LTM4LjE1OTUzIDE2OC43NTk1NS0yNi40MjM1IDIxLjI5NzUxIDQuMTc5OSA0Ny43NzI5NCAxNC40OCA2NC4wOTQ1MSAyNC45MzU4bDYuNTk0NTEgNC4yMjQ1LTExLjY5OTM3IDExLjYwMWMtNi40MzQ2NiA2LjM4MDYtMTMuNzMwMDUgMTQuMDAwMi0xNi4yMTE5NyAxNi45MzI0bC00LjUxMjU5IDUuMzMxMy01Ljg4MjU0LTIuOTY3Yy0xOS42NDk1LTkuOTEwOC01Mi44OTQxNi0xNy4xOTU2LTc4LjQ3MzE4LTE3LjE5NTYtODAuNDQ3MzYgMC0xNDMuMTg4NjEgNDYuNzA2OC0xNjIuODQzNDQgMTIxLjIyNjUtNi43NTE3OCAyNS41OTg4LTYuNDM5MzIgMTcuNjU4OS02LjgwOTAzIDE3My4wMjM1bC0uMzM0OTQgMTQwLjc1SDY2M1pNMTY5OSAxNDk2LjAzNTNjLTc1LjA2NDQtNi44NDA4LTEzNy4yNDc2LTQyLjg3MDUtMTc1LjQ2MDItMTAxLjY2MzgtNi4wMjg1LTkuMjc1My0xNi41MTA2LTMwLjM2Ny0xOC41Nzc2LTM3LjM4MTFsLTEuMjI3LTQuMTYzNiAxNy4zODI0LTIzLjY0NDUgMTcuMzgyNC0yMy42NDQ2Ljg4MDUgMy4zMDgyYzExLjI1MDEgNDIuMjY1NSAzNS45MjA3IDc4LjIxNzIgNzAuNjk5NiAxMDMuMDI4MiAxMC44MTMzIDcuNzE0MiAzMC40NjQyIDE4LjE1MjMgNDMuNDgyOCAyMy4wOTcxIDMyLjY3NzggMTIuNDExOCA2OC44OTQyIDE1LjM5OTUgMTA0LjE2NDYgOC41OTMgMjIuOTQ1Mi00LjQyOCA1MC4xOTM1LTE2LjA4OTcgNjkuMjcyNS0yOS42NDcyIDExLjczNDQtOC4zMzg0IDMzLjQ5MjUtMjkuOTMyIDQxLjQwODktNDEuMDk1OCAxOS4zNTc2LTI3LjI5ODEgMzIuMDk3NS01OS43NDU3IDM3LjIyNzItOTQuODE0NiAyLjM1MDktMTYuMDcxNiAyLjM3MTQtNDguNDk5Ni4wNDEtNjQuNDExLTguMTMyOC01NS41MjI0LTMzLjQwNjYtMTAwLjE5NjMtNzQuMTc2OC0xMzEuMTE0Ny0zNC4zMTM3LTI2LjAyMjEtODIuNjUxNy0zOS41MjQtMTI4Ljc2NTItMzUuOTY3Mi02OS44MjA4IDUuMzg1NC0xMTcuOTMyMyAzNy4xNDI1LTE4Ny4xNDM1IDEyMy41MjgzLTcuMDk5OCA4Ljg2MTYtMjUuNzI1IDMzLjIxMi00MS4zODk0IDU0LjExMnMtMjguNjQzIDM4LjE4NzUtMjguODQxMyAzOC40MTY3Yy0uMTk4My4yMjkxLS4zNjA2LTE1Ljk4MDctLjM2MDYtMzYuMDIxOXYtMzYuNDM4NmwxNi43Njc4LTIzLjQ3ODFjMzUuNTQyNS00OS43NjYgNTAuOTIyNy02OC43ODI2IDc1LjE5ODctOTIuOTc4MSAyNS4yODE3LTI1LjE5NzcgNDUuNTExMy00MC4xMjMgNzIuNTMzNS01My41MTQ1IDIyLjcwNDctMTEuMjUxOSA0NC41MzAzLTE4LjAxNzggNzEuNS0yMi4xNjQ5MyAxNi4xODE0LTIuNDg4MjEgNTUuODE4Ni0yLjQ4ODIxIDcyIDAgNTUuMTI0MSA4LjQ3NjQzIDk4Ljk4OTEgMzAuODE5NTMgMTM2IDY5LjI3MzIzIDM2LjI0NjIgMzcuNjU5MiA1Ny45NDkgODQuMzc4IDY2LjE1MzUgMTQyLjQwNjIgMS44MDE4IDEyLjc0MzYgMS44MDY4IDU5LjIwMjYuMDEgNzItNS44MzQgNDEuNDk4OC0xOS4yOTA1IDc4LjczMjctMzkuNTczOCAxMDkuNS0zNy42NDYyIDU3LjEwNDYtOTIuNDg3NiA5Mi4zOTQ3LTE2MC4wODc0IDEwMy4wMTUzLTkuNjY5OCAxLjUxOTItNDYuODM2MSAyLjc0NjctNTYuNSAxLjg2NnpNMTE1NiAxNDk1LjUxMjJjLTEwOC4zNjk0LTkuOTIzNC0xOTIuMDI3NDgtODYuMDk2OC0yMTIuOTA2MjktMTkzLjg1ODItMy45NTM3Ni0yMC40MDY1LTQuNTkzNzEtMjguMDY4Ni00LjU5MzcxLTU1IDAtMzIuOTg0MiAyLjIyMzM3LTUwLjAxODEgMTAuMDUyODYtNzcuMDE4MyAyMC40OTYyNy03MC42ODE3IDcyLjU2MjE0LTEyOS4yNjQ1IDEzOC45NDcxNC0xNTYuMzM4NiAzMS43MDk4LTEyLjkzMjMgNTkuMjM3OS0xOC4xMzUxIDk1LjUtMTguMDQ5MzkgMzUuMTY4Ny4wODMxIDYxLjA3ODIgNC42NDEwNyA5MC41IDE1LjkyMDU5IDMxLjQwMDMgMTIuMDM4IDU2Ljc2MTcgMjguNzYxNiA4MC41ODAzIDUzLjEzNTQgMzQuNjQ1MSAzNS40NTI2IDU1LjI3NTQgNzguMTIyNyA2NC4xOTg1IDEzMi43ODI0IDIuMDkwMyAxMi44MDUgMi4xNCAxNS44MDg2IDIuNDY3NCAxNDkuMzE3OWwuMzM0MiAxMzYuMjVIMTM3MWwtLjAxLTEyNS4yNWMtLjAxLTc3Ljc2MzMtLjQwMjQtMTI5Ljc5OTYtMS4wNDQ1LTEzNy4yNS00LjI2MDktNDkuNDQyNi0yNC40MTA1LTkzLjAzMTEtNTcuNDY3Mi0xMjQuMzE2LTM3LjA4Ny0zNS4wOTktOTEuNDIxOS01My42MTU5LTE0NC43MjgtNDkuMzIyMi05MS41ODEzIDcuMzc2OC0xNTkuNjQ1NyA3MC4xNzI5LTE3NS43NDA2NCAxNjIuMTM4Mi00LjQ5MTc5IDI1LjY2NTctMy43MDQ1NSA1OS44OTczIDIuMDMwMjggODguMjgyMiA0LjEzNTY2IDIwLjQ2OTcgMTQuNTk5ODYgNDcuNDI0IDI0LjkyMDY2IDY0LjE5MiAyMS41Nzg3IDM1LjA1ODcgNTMuMzUyMSA2MC42NTY5IDkyLjM1OTcgNzQuNDA5NCAzMy40MTU0IDExLjc4MDkgNzEuNjc1IDE0Ljc2MTYgMTA0LjI0NjggOC4xMjE1IDE4LjYwOTUtMy43OTM3IDQwLjc1NzUtMTIuMzE2IDUxLjg2MTQtMTkuOTU1N2w0LjU3MTgtMy4xNDU1VjE0NzAuMjI2NGwtNS43NSAzLjc5MmMtMTYuMzY3IDEwLjc5MzQtNDAuNDMyIDE4LjY5NTYtNjUuNzUgMjEuNTkwMi0xMC40NTUgMS4xOTUzLTMwLjg3NjYgMS4xNTExLTQ0LjUtLjA5NnoiIHRyYW5zZm9ybT0ibWF0cml4KC41MjMyNSAwIDAgLjUyMzI1IC0yMy42NTM0MjA4IC00MjcuODQwMDQyMjMpIi8+Cjwvc3ZnPgo=" width="1000" height="355" class="img_E7b_"></p><h2 class="anchor anchorWithStickyNavbar_mojV" id="introduction">Introduction<a class="hash-link" href="#introduction" title="Direct link to heading">​</a></h2><p>As another unicorn in Singapore, although Grab isn't the company with the best prospects ($GRAB LUL), but the engineering aspects seem to be pretty decent.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="tldr">TLDR<a class="hash-link" href="#tldr" title="Direct link to heading">​</a></h2><div class="codeBlockContainer_I0IT theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-text codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">Overall Experience: Good, some interviewers can be very uptight</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Difficulty: Easy -&gt; Medium-ish</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Received Offer: No</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><h2 class="anchor anchorWithStickyNavbar_mojV" id="first-round-hr">First Round (HR)<a class="hash-link" href="#first-round-hr" title="Direct link to heading">​</a></h2><ul><li>What do you look at when you choose a company to join</li><li>Why did you choose Grab</li><li>Expected Salary</li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="second-round-codility-test">Second Round (Codility Test)<a class="hash-link" href="#second-round-codility-test" title="Direct link to heading">​</a></h2><p>2 Questions, similar to:</p><ul><li>🟡 <a href="https://leetcode.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one/" target="_blank" rel="noopener noreferrer">1404. Number of Steps to Reduce a Number in Binary Representation to One</a></li><li>🟢 Number of movements for light bulbs to shine where the bulbs in front needs to be powered up first to light up</li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="third-round-coding">Third Round (Coding)<a class="hash-link" href="#third-round-coding" title="Direct link to heading">​</a></h2><ul><li>🟢 <a href="https://leetcode.com/problems/valid-anagram/" target="_blank" rel="noopener noreferrer">242. Valid Anagram</a></li><li>🟡 Implement a data structure that has Add(), Remove(), Search(), RandomRemove() in O(1). Similar to <a href="https://leetcode.com/problems/insert-delete-getrandom-o1/" target="_blank" rel="noopener noreferrer">380. Insert Delete GetRandom O(1)
</a></li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="fourth-round-system-design">Fourth Round (System Design)<a class="hash-link" href="#fourth-round-system-design" title="Direct link to heading">​</a></h2><ul><li>Top level design</li><li>DB schema design</li><li>API schema design</li></ul><ol><li>Design an online movie ticketing system</li></ol><ul><li>Big cinema with multiple locations across the country</li><li>Each location has multiple screening halls</li><li>Site has to display movie information, showtimes, bookings, payment</li><li>Not neccesary to implement payment system (via 3rd party gateway)</li><li>Handle race condition</li></ul><ol start="2"><li>Design a meeting room booking system</li></ol><ul><li>Big MNC with many offices across the globe</li><li>Should support create / update / delete of meeting rooms</li><li>Ability to book a meeting room with specified duration, and cancel booking</li><li>Block booked slots to avoid duplicated bookings</li></ul>]]></content:encoded>
            <category>interviews</category>
        </item>
        <item>
            <title><![CDATA[How long is a second?]]></title>
            <link>https://aaronangxz.github.io/blog/how-long-is-a-second</link>
            <guid>how-long-is-a-second</guid>
            <pubDate>Fri, 17 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_mojV" id="introduction">Introduction<a class="hash-link" href="#introduction" title="Direct link to heading">​</a></h2><p>What the hell am I talking about? You might say. Well yea it sounded crazy but <strong>how long is a second</strong> exactly?!</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="what-happened">What Happened<a class="hash-link" href="#what-happened" title="Direct link to heading">​</a></h2><p>As I was writing some unit tests for my shiny Redis Set implementation, somethign weird caught my attention.</p><div class="codeBlockContainer_I0IT theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-text codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">TestSendPotentialUsers | Successful | Written 80687641:-18230398344540846 to potential_user set</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><h1><em>Excuse me?</em></h1><p>For context, the Redis key was constructed using:</p><div class="codeBlockContainer_I0IT language-go theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-go codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">toWrite </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">u</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">":"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Unix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">common</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ONE_MONTH</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">common</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ONE_DAY</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><p>After some digging around, I realised that in my <code>common.ONE_HOUR</code>:
<img loading="lazy" alt="PascalTriangleAnimated" src="/assets/images/how-long-is-a-second-4a0aab75a3dade9cb3217caf24b85542.png" width="1626" height="718" class="img_E7b_"></p><p>Why didn't I think of that, it is in milliseconds!
And my <code>common.ONE_MONTH-common.ONE_DAY</code> will effectively become 18144000000000000 - 6048000000000000 🤣</p><p>One quick fix is:</p><div class="codeBlockContainer_I0IT language-go theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-go codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">    ONE_HOUR  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">int64</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">60</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">int64</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Second</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><p>And noice, it finally makese sense now.</p><div class="codeBlockContainer_I0IT theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-text codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">TestSendPotentialUsers | Successful | Written 93737927:1637229666 to potential_user set</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div>]]></content:encoded>
            <category>projects</category>
            <category>go</category>
        </item>
        <item>
            <title><![CDATA[Redis SET or HASH]]></title>
            <link>https://aaronangxz.github.io/blog/redis-set-or-hash</link>
            <guid>redis-set-or-hash</guid>
            <pubDate>Fri, 17 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_mojV" id="introduction">Introduction<a class="hash-link" href="#introduction" title="Direct link to heading">​</a></h2><p>So I was working on <a href="https://github.com/aaronangxz/SeaDinner" target="_blank" rel="noopener noreferrer">SeaHungerGamesBot</a>,
and one major pain point was: when a certain user started the conversation, but did not proceed from there. (probably due to the hassle of copy-pasting the API key?)</p><p>Since my current goal is to have as many active users as possible, that was a wasted opportunity.
So my objective was to keep track of the users that started pressing some commands, but backed off and disappear afterwards.
I call them the <code>potential users</code>.</p><h2 class="anchor anchorWithStickyNavbar_mojV" id="whats-the-plan">What's the Plan<a class="hash-link" href="#whats-the-plan" title="Direct link to heading">​</a></h2><p>The initial plan is:</p><div class="codeBlockContainer_I0IT theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-text codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token plain">Remind users to use the Bot if:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- They have chatted with it before </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- It happened in the past month</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- They still did not provide their key in the past month</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><ul><li><p>For such users, store their <code>user_id</code> and the time they call the commands.
This can be achieved easily since all <code>anonymous users</code> (aka. those that did not provide their keys) will get routed through
a <code>CheckKey</code> function, and if it does not exist in DB, they will be urged to provide their key in the next step in order to proceed with other features.</p></li><li><p>The reason we store the <code>time</code> is because we want to have a "cool down" period before we annoy them again. E.g. A user chatted on 1st Jan,
we will not send him the cold message until at least 1st Feb.</p></li><li><p>If we did send him on 1st Feb, we reset the time to 1st Feb and the next message will be sent on 1st March. So on and so forth.</p></li><li><p>And if the user provide their key between 1st Feb and 1st March, we remove them from the pool and they will not receive this anymore.</p></li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="cool-now-what">Cool, Now What?<a class="hash-link" href="#cool-now-what" title="Direct link to heading">​</a></h2><h3 class="anchor anchorWithStickyNavbar_mojV" id="technical-implementation">Technical Implementation<a class="hash-link" href="#technical-implementation" title="Direct link to heading">​</a></h3><h3 class="anchor anchorWithStickyNavbar_mojV" id="1-naive">1. Naive<a class="hash-link" href="#1-naive" title="Direct link to heading">​</a></h3><p>The naive solution is to have a cache key, something like <code>potential_user:&lt;user_id&gt;</code> with the value as <code>time</code>. Since it is pretty straight forward, and we can <code>GET</code>
or <code>SET</code> the value easily.</p><p><strong>Pros</strong></p><ul><li>Easy peasy</li></ul><p><strong>Cons</strong></p><ul><li>Kinda messy</li></ul><h3 class="anchor anchorWithStickyNavbar_mojV" id="2-slightly-more-elegant">2. Slightly more elegant?<a class="hash-link" href="#2-slightly-more-elegant" title="Direct link to heading">​</a></h3><p>Then I thought of Redis Sets, and it is kinda what I prefer it to be. We can have a set called <code>potential_user</code>, and inside the set, we have list of keys <code>&lt;user_id&gt;:&lt;time&gt;</code>.</p><p><strong>Pros</strong></p><ul><li>Very organized, i love it</li></ul><p><strong>Cons</strong></p><ul><li>Need to store all the information in the <code>key</code>, hence delimiter is needed.</li><li>Have to parse the key to get the relevant information.</li><li>Since they are not key-value pairs, in order to update the <code>time</code>, we have to <code>SREM</code> the old key and <code>SADD</code> new one afterwards.</li></ul><h3 class="anchor anchorWithStickyNavbar_mojV" id="3-most-recommended">3. Most recommended?<a class="hash-link" href="#3-most-recommended" title="Direct link to heading">​</a></h3><p>I read up on <code>HASH</code>, and it seems pretty decent (overkill maybe?) for this use case. And probably a refactor is neede to make it clean.</p><p>The key can be just <code>&lt;user_id&gt;</code>, and contains field such as <code>&lt;user_key&gt;</code> (since we cache the keys to minimize DB calls), <code>&lt;time&gt;</code> etc.</p><p><strong>Pros</strong></p><ul><li>Treat it as an object, and we do not need any extra keys anymore</li></ul><p><strong>Cons</strong></p><ul><li>When we need to find user that has <code>time</code> (not everyone will have this field), we have to probably check one by one.</li></ul><h2 class="anchor anchorWithStickyNavbar_mojV" id="so">So..<a class="hash-link" href="#so" title="Direct link to heading">​</a></h2><p>I went with option 2, and implement a set. Only thing that I don't really like is the update part.
Need to remove first -&gt; then re-write the updated time.</p><div class="codeBlockContainer_I0IT language-go theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-go codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//Remove the old key and update with the new time in Set</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//As long as users do not give us the key, they will always be in the pool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//We continuously update the time after each cold message to avoid annoyance</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> processors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RedisClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SRem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">POTENTIAL_USER_SET</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pair</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SendPotentialUsers | Error while writing to redis: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SendPotentialUsers | Successful | Removed %v from potential_user set"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pair</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">toWrite </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">userID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">":"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Unix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> processors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RedisClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SAdd</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">POTENTIAL_USER_SET</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> toWrite</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SendPotentialUsers | Error while writing to redis: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SendPotentialUsers | Successful | Written %v to potential_user set"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> toWrite</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><p>I guess I will leave it as it is for now, until I can think of a better solution.</p>]]></content:encoded>
            <category>projects</category>
            <category>redis</category>
        </item>
    </channel>
</rss>