<?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[Afrie Irham – Developer who writes]]></title><description><![CDATA[Hi, I'm Afrie Irham – software developer who writes and loves creating stuff.]]></description><link>https://blog.afrieirham.com</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 13:04:32 GMT</lastBuildDate><atom:link href="https://blog.afrieirham.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Referral-Driven Job Market]]></title><description><![CDATA[The best talent comes from referrals.
So how do you convince people to share their referrals? You reward them with cash.
Problem now, how do you avoid people sharing “referrals” mindlessly? You vet them.

Reach out to your network, ask if they know s...]]></description><link>https://blog.afrieirham.com/referral-driven-job-market</link><guid isPermaLink="true">https://blog.afrieirham.com/referral-driven-job-market</guid><category><![CDATA[job search]]></category><category><![CDATA[job-market]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Sat, 05 Oct 2024 18:10:24 GMT</pubDate><content:encoded><![CDATA[<p>The best talent comes from referrals.</p>
<p>So how do you convince people to share their referrals? You reward them with cash.</p>
<p>Problem now, how do you avoid people sharing “referrals” mindlessly? You vet them.</p>
<ol>
<li><p>Reach out to your network, ask if they know someone who’s a. open to work b. they highly recommend.</p>
</li>
<li><p>Tell them they’ll get rewarded if their referrals are high quality and are a good fit.</p>
</li>
<li><p>Remind them to make sure it’s high-quality. If not, then don’t ask for referrals from them ever again.</p>
</li>
<li><p>Make sure to actually reward them when their referrals are a great fit.</p>
</li>
<li><p>Do this until you get enough pool of high-quality talents endorsed by your trusted network.</p>
</li>
</ol>
<p>Now you have the supply side sorted, it’s time to find demands.</p>
<p>This part’s easy, there’s always demand for high-quality talents.</p>
<p>The hard part is to convince the “demanders” (companies) you have the supply.</p>
<p>So reach out to companies, convince them to take a look at your talent pool. Also, tell them if they decide to hire anyone from the pool, they’ll need to pay 10% of the candidate’s first annual salary. If not a good fit, no need to pay.</p>
<p>Also vet the companies too, you need to respect the talent’s privacy. Supply them with good opportunities.</p>
<p>Build trust until you don’t need to convince companies that your talent pool is good, they’ll come if it’s good.</p>
<p>Split the 10% 55:45 with your network.</p>
<p>Your network are happy, they will want to refer more high-quality candidates.</p>
<p>Companies are happy, they will want to get more candidates from you.</p>
<p>You are happy, you’ve fixed the job market.</p>
]]></content:encoded></item><item><title><![CDATA[How to work with multiple git branches simultaneously.]]></title><description><![CDATA[If you've faced this situation before, you might want to learn this.

You're working on feature A at your work and suddenly you got a ping on Slack.
"Please fix this bug, it's causing a critical bug in production that needs fixing ASAP!!!"
You git st...]]></description><link>https://blog.afrieirham.com/how-to-work-with-multiple-git-branches-simultaneously</link><guid isPermaLink="true">https://blog.afrieirham.com/how-to-work-with-multiple-git-branches-simultaneously</guid><category><![CDATA[Git]]></category><category><![CDATA[tips]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Sun, 21 Jan 2024 17:09:57 GMT</pubDate><content:encoded><![CDATA[<p>If you've faced this situation before, you might want to learn this.</p>
<hr />
<p>You're working on feature A at your work and suddenly you got a ping on Slack.</p>
<p><em>"Please fix this bug, it's causing a critical bug in production that needs fixing ASAP!!!"</em></p>
<p>You git stash whatever changes you have right now to make sure the working directory is clean, git checkout to the master branch, make the fix, and when you're done, you git stash pop to continue your work where you left off.</p>
<p>Or worst, you git commit -m "WIP" because you don't know how to git stash. 🥲</p>
<hr />
<p>If you're perfectly happy with you current git workflow, you can stop reading here.</p>
<p>But if you want to know a better way (hopefully) to work with multiple branches in git at the same time, continue reading.</p>
<h1 id="heading-introducing-git-worktree">Introducing Git Worktree.</h1>
<p>While stashing your changes and popping them back up is a perfectly valid way to temporarily save your progress (that's how I previously did it too), I'd argue there's a better way to handle it.</p>
<p>Git worktree allows you to "spawn" a new branch that you can change, stage, and commit without ever needing to do a weird hack just to work with 2 branches at the same time.</p>
<p>Git worktree has 3 commands</p>
<ul>
<li><p><code>git worktree list</code></p>
</li>
<li><p><code>git worktree add &lt;branch name&gt;</code></p>
</li>
<li><p><code>git worktree remove &lt;branch name&gt;</code></p>
</li>
</ul>
<p>I think from the commands above, it's pretty self explanatory.</p>
<p>Now let's imagine you're in the same situation described above.</p>
<p>Knowing git worktree, you can now just run <code>git worktree add master</code> to create a new branch in your current directory.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Go ahead and try it on any of your code repository.</div>
</div>

<p>You'll notice that there's a new folder called "master" in your root directory. When you <code>cd master</code> into it in your terminal, you're now in the master branch of your same project, without ever leaving your feature branch.</p>
<p>If you're on VS Code, you'll also notice that VS Code detects there's now 2 different branches running.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705855874396/f3110215-f4e6-45ed-b437-719aa6bb2997.png" alt class="image--center mx-auto" /></p>
<p>Congratulations, you are now working on 2 different branches of the same project at the same time.</p>
<p>Feel free to spawn more branches as needed but make sure to delete them once you're down with it.</p>
<h1 id="heading-some-downsides">Some downsides.</h1>
<p>After using worktree for a while now for my work, there's 1 minor downside using git worktree that I want to highlight.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705856250625/fbc0dd38-cff3-40d2-90cd-a7931be65015.png" alt class="image--center mx-auto" /></p>
<p>As you can see, when you want to search for a snippet, the result shows both the main directory and the "new" repo you've created.</p>
<p>To solve this in VS Code, you can just exclude the "main" directory like this 👇</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705856446173/e5c60d9f-c33d-4f2d-b2d3-45e3b33c64a4.png" alt class="image--center mx-auto" /></p>
<p>Now the search only shows 1 result instead of 2.</p>
<p>This is a pretty minor downside but it's something I figured I should point out.</p>
<p>Other than that, I think git worktree is fun to use and work with and I think you should give it a try.</p>
<p>Thanks for reading!</p>
]]></content:encoded></item><item><title><![CDATA[How to get lucky, an rant from yours truly.]]></title><description><![CDATA[Before we start, please read the QRTs from both Edd and Mu'azh.


They both have presented a great point about luck

Keep working and grinding so that you're prepared to take advantage of luck when it comes.

Me however, I'm here to share about how t...]]></description><link>https://blog.afrieirham.com/how-to-get-lucky-an-rant-from-yours-truly</link><guid isPermaLink="true">https://blog.afrieirham.com/how-to-get-lucky-an-rant-from-yours-truly</guid><category><![CDATA[luck]]></category><category><![CDATA[life]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Sun, 26 Nov 2023 14:36:07 GMT</pubDate><content:encoded><![CDATA[<p>Before we start, please read the QRTs from both Edd and Mu'azh.</p>
<p><a target="_blank" href="https://twitter.com/okmuazh/status/1728647721727221845"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1701009437590/6cf93f31-a684-40ee-b725-3b4f0e9d010b.png" alt class="image--center mx-auto" /></a></p>
<p><a target="_blank" href="https://twitter.com/thegrxyvibe/status/1728678498607550921"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1701009520770/4d42d96e-266c-40c2-a998-6ac78fd0408a.png" alt class="image--center mx-auto" /></a></p>
<p>They both have presented a great point about luck</p>
<blockquote>
<p>Keep working and grinding so that you're prepared to take advantage of luck when it comes.</p>
</blockquote>
<p>Me however, I'm here to share about <em>how</em> to get lucky.</p>
<p>Yes, luck is out of our control but we can increase the chance TO get lucky.</p>
<p>I mean it's hard for luck to hit you when you're not doing anything.</p>
<p>Imagine if you only stay at home for a year, only go out when necessary, and strictly within your neighbourhood.</p>
<p>How do you think luck can happen if that's the only thing you did?</p>
<p>Also, the amount of "lucky things" that can happen in your neighbourhood is very low.</p>
<p>Yes it's possible for idk Justin Bieber to come to your house, it's very unlikely, but it's not impossible.</p>
<p>(i have no better example so bear with me)</p>
<p>It can happen tomorrow, or it can happen in the next 50 years, who knows.</p>
<p>As long as he's still alive, the possibility is not 0.</p>
<p>Now imagine you're always travelling, or you go to Justin Bieber's local area for vacation.</p>
<p>You are more likely to meet him now.</p>
<p>Yes you still can't guarantee you'll meet him but it is more likely – and that's exactly what luck is.</p>
<p>We can't control luck but we can increase the odds for lucky stuff to happen.</p>
<p>I can endorse this myself, I've been active on social media (twitter, linkedin) since 2017.</p>
<p>A lot of lucky things has happened to me because I'm "travelling the world" on the internet.</p>
<p>I've got freelance gigs, fulltime jobs opportunities, workship mentorship opportunities, and more coming left and right.</p>
<p>And I'd like to think those "lucky stuff" happens to me BECAUSE I've increase the odds.</p>
<p>I'm not saying this to brag but I'm just trying to make a point.</p>
<p>If I never shared anything here, never post a blog, never write a LinkedIn article, keep my heads down and just do my work, I don't think I'll get this lucky.</p>
<p>If you were to take anything from this rant, please remember to do interesting stuff and share it.</p>
<p>You'll never know who's watching.</p>
<p>It could be your next employer, it could be your future co-founder, it could be someone that can help you to land a job, nobody knows.</p>
<p>So if you're ever in doubt to share anything on social media, keep this in mind.</p>
<p>You can't control luck but you can make yourself more lucky.</p>
<p>You can also watch this video to better understand what I'm trying to say.</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/WizT_VdtOYM?si=-1mFHGo4aOH43ZNW">https://youtu.be/WizT_VdtOYM?si=-1mFHGo4aOH43ZNW</a></div>
]]></content:encoded></item><item><title><![CDATA[How to remove passwords in PDF]]></title><description><![CDATA[Open the PDF file in Chromium-based browsers

Print as PDF


https://twitter.com/afrieirham_/status/1681196950715088897]]></description><link>https://blog.afrieirham.com/how-to-remove-passwords-in-pdf</link><guid isPermaLink="true">https://blog.afrieirham.com/how-to-remove-passwords-in-pdf</guid><category><![CDATA[pdf]]></category><category><![CDATA[tips]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Tue, 18 Jul 2023 07:03:32 GMT</pubDate><content:encoded><![CDATA[<ol>
<li><p>Open the PDF file in Chromium-based browsers</p>
</li>
<li><p>Print as PDF</p>
</li>
</ol>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/afrieirham_/status/1681196950715088897">https://twitter.com/afrieirham_/status/1681196950715088897</a></div>
]]></content:encoded></item><item><title><![CDATA[You should do more interviews.]]></title><description><![CDATA[If you're like me, you've probably heard this advice a lot, especially in the tech industry.
"Go do more interviews, even especially if you're not actively looking."
And they're right, here's why.
You have higher leverage in negotiation when you're n...]]></description><link>https://blog.afrieirham.com/you-should-do-more-interviews</link><guid isPermaLink="true">https://blog.afrieirham.com/you-should-do-more-interviews</guid><category><![CDATA[Career]]></category><category><![CDATA[jobs]]></category><category><![CDATA[interview]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Tue, 04 Jul 2023 16:54:32 GMT</pubDate><content:encoded><![CDATA[<p>If you're like me, you've probably heard this advice a lot, especially in the tech industry.</p>
<p>"Go do more interviews, <s>even</s> especially if you're not actively looking."</p>
<p>And they're right, here's why.</p>
<p>You have higher leverage in negotiation when you're not desperate. You'll be more confident and can take up more risks.</p>
<p>Maybe you've been dreaming about working in a remote team, but you never had the chance to discuss it and now you're stuck in an office job.</p>
<p>Maybe you want to try new things. You've always wanted to learn more about crypto or even AI. And now you see companies involved in those industries are hiring.</p>
<p>Or maybe you're wondering what's the true value of your work, what's the upper ceiling? You've negotiated your offer but you were playing it safe and didn't ask enough. Now you won't know how much more you could've made.</p>
<p>And understandably, you didn't do anything about it. You like the idea of making more money (duh) or working in a remote team, but it seems like a hassle. You still remember how miserable it was when you were trying to land your current job.</p>
<p>Plus your current job is decent enough. It's not your dream job but it's getting food on the table and you're comfortable there.</p>
<p>But if you're curious to see and wanna try to go for more interviews, keep on reading.</p>
<p>First of all.</p>
<h1 id="heading-be-clear-on-why-youre-doing-interviews">Be clear on why you're doing interviews.</h1>
<p>If you're happy at your current job, it might be difficult to figure out why you want to go for interviews.</p>
<p>I mean, you're happy with the money you're making, your boss is amazing, the benefits are great, and you're learning and growing a lot, so why are you going for interviews?</p>
<p>Well, things could always be better. You'll never know what's out there unless you look for it.</p>
<p>And that is precisely the answer – <strong>you want to see what's out there.</strong></p>
<p>Sure things are great now, but what if somewhere out there, you could be making double your salary, significantly better work-life balance, have an equally amazing boss, and you can work remotely?</p>
<p>Sounds fantastic right?</p>
<p>Sure, the grass seems to be always greener on the other side. But what if it is greener?</p>
<p>You think it's too good to be true but what if it's true? What if you're one interview away to find that opportunity? Well, you'll never know unless you go look for it.</p>
<p>So go ahead, apply for that job, you're just browsing anyways.</p>
<p>You're not gonna accept the offers if it's just <em>slightly better</em>. It's not worth the time and effort. You're already content at your current workplace.</p>
<p>However, you need to remember.</p>
<h1 id="heading-honesty-is-key">Honesty is key.</h1>
<p>Being honest is by far the most important thing here. If you're applying for jobs to explore what's out there, you can't pretend to be super committed as if you're planning to move.</p>
<p>Just imagine you're in the recruiter's shoes. You've spent weeks, potentially months, interviewing candidates just for them to say that they're not actually looking to move at the last minute.</p>
<p>Wouldn't you be angry?</p>
<p>Candidate sourcing is hard. Conducting interviews is hard. Don't make it harder on them by not being upfront.</p>
<p>At best, you could get away from it because they didn't bother enough to call you out.</p>
<p>At worst, you just burned a bridge. That's the last thing you want. It's the exact opposite of what you want.</p>
<p>Going for interviews to learn more about the opportunities is a good thing but you need to be transparent about it.</p>
<p>And you need to understand that being transparent does not mean that you are entitled to that interview.</p>
<p>Employers have as much right as you are to withdraw from any interview.</p>
<p>Would you still go for the interview if the recruiter said they are not interested in hiring and they don't have any open vacancies? Instead, they just want to help their HR to polish their recruiting skills and stay up to date with the talent market.</p>
<p>You probably won't do it. It's a waste of time. Right?</p>
<h1 id="heading-unless">Unless...</h1>
<p>What if the recruiter is from a <a target="_blank" href="https://www.fastcompany.com/90790394/what-are-the-faang-companies#:~:text=FAANG%20refers%20to%20Meta%20(formerly%20Facebook)%2C%20Apple%2C%20Amazon%2C%20Netflix%2C%20and%20Alphabet%20(Google).">FAANG</a> company? (Or your dream company if FAANG is not your thing.)</p>
<p>That will change things up, probably.</p>
<p>If it were me, I would <s>kill</s> pay to get on that interview so I can get my foot in the door.</p>
<p>I'll learn so much even if I failed the interview. Plus, I've just expanded my connections with someone from my dream company.</p>
<p>Sure they are not hiring right now, but who's to say they won't be hiring for a long time?</p>
<p>They might have some openings a few months from now and if I aced the interview and be on top of their mind, they might approach me directly.</p>
<p>That is highly possible because they know me already, I've done their assessment and they think I'm good enough before. It was just not the right time.</p>
<p>I can also get in touch with them again if I'm at the stage where I'm actively looking. Getting referrals from people is highly valuable right now. <a target="_blank" href="https://erinapp.com/blog/employee-referral-statistics-you-need-to-know-for-2023-infographic/#:~:text=Employee%20Referrals%20are%C2%A05x%C2%A0more%20likely%20to%20be%20hired.">Employee referrals are 5x more likely to be hired</a>.</p>
<p>While you may think you're not planning to move from your current job anytime soon, it's a good idea to build up for referral network while you're there.</p>
<p>If you're still not convinced, go watch this video after you finish reading this. He does a better job of explaining the current job market in 2023.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=Kte-t1pQQ3I">https://www.youtube.com/watch?v=Kte-t1pQQ3I</a></div>
<p> </p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">❗</div>
<div data-node-type="callout-text">Shameless plug. If you're from Malaysia, feel free to visit <a target="_blank" href="https://CariKabel.com">CariKabel.com</a> to get access to referrers' emails from 40+ companies.</div>
</div>

<h1 id="heading-the-reality">The Reality.</h1>
<p>Being loyal and putting your trust 100% in your current company is commendable, but your job might not be as safe as you think.</p>
<p>You've probably read the news about companies doing layoffs right now, even companies like Google and Facebook.</p>
<p>Have a look at this report by TechCrunch – "<a target="_blank" href="https://techcrunch.com/2023/06/29/tech-industry-layoffs-2023/"><strong>A comprehensive list of 2023 tech layoffs</strong></a><strong>"</strong>. More than 188,000+ employees have been laid off this year (2023) alone. What makes you think you are safe from being the statistics?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1688299411785/fd044517-435a-4a84-bf42-9ec15e74b5ec.png" alt /></p>
<p>Look, companies would not hesitate to lay you off if they find out that layoffs would make them more profitable. So you need to be ready for that and take care of yourself.</p>
<p>You're not "cheating" when you go for interviews, it's just business. Don't feel like you're doing something wrong by taking care of yourself. If you feel that way, your employer probably told you that and you need to get rid of that belief ASAP.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>To recap, going for interviews while having a job is a great way to do it better.</p>
<ul>
<li><p>You're not desperate for jobs.</p>
</li>
<li><p>You can take more risks.</p>
</li>
<li><p>You might find better opportunities.</p>
</li>
<li><p>It's generally good for your career.</p>
</li>
</ul>
<p>But you need to do it properly. You'll risk burning down bridges if it went wrong. So remember:</p>
<ul>
<li><p>Be clear on why you're doing interviews.</p>
</li>
<li><p>Honesty is key.</p>
</li>
<li><p>Getting a new job is a bonus, networking and exploring is the goal.</p>
</li>
<li><p>Your job is not as <em>safe</em> as you might think.</p>
</li>
</ul>
<hr />
<p>I hope you have a clearer understanding of why and how to do interviews while having a job.</p>
<p>The next step is to go on LinkedIn and just have a look, something might catch your eye.</p>
]]></content:encoded></item><item><title><![CDATA[Stop listening to your parents.]]></title><description><![CDATA[Clickbaity title? Yes.
But hear me out.
Your parents are not perfect.
They're humans, they make mistakes, they have biases.
For context, I'm writing this because I just experience some "unsolicited advice" after I told them about me going to the gym....]]></description><link>https://blog.afrieirham.com/stop-listening-to-your-parents</link><guid isPermaLink="true">https://blog.afrieirham.com/stop-listening-to-your-parents</guid><category><![CDATA[life]]></category><category><![CDATA[General Advice]]></category><category><![CDATA[family]]></category><category><![CDATA[parents]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Sat, 10 Jun 2023 16:55:51 GMT</pubDate><content:encoded><![CDATA[<p>Clickbaity title? Yes.</p>
<p>But hear me out.</p>
<p><strong>Your parents are not perfect.</strong></p>
<p>They're humans, they make mistakes, they have biases.</p>
<p>For context, I'm writing this because I just experience some "unsolicited advice" after I told them about me going to the gym.</p>
<blockquote>
<p>"...whatever you do, don't take steroids, and don't take (powdered) protein."</p>
</blockquote>
<p>When I heard "steroids", I laughed a bit. I was like "duhh?", don't worry, I'll never do that.</p>
<p>But the second one about protein, is the reason why I'm writing this.</p>
<p>While I have no intentions of consuming powdered protein, as per my parent's advice, (if my parents reading this, don't worry 🤧) it did "trigger" me a bit.</p>
<p>I don't think there's anything wrong with proteins, I have seen a lot of people including my friends take those and are doing fine.</p>
<p>But that's when I realized, that was <em>my</em> experience and that's why <em>I</em> have those pov.</p>
<p>My parents might come from a different place. They might've saw other people take protein and ruin their bodies. They might've read or heard somewhere about how powdered protein is bad for us. Or they simply are confused and thought that powdered protein <em>is</em> steroids.</p>
<p>At the end of the day, the advice itself comes from a good place. They want the best for me.</p>
<p>But their experiences might be different from ours. Thus the radical-sounding advice from my pov.</p>
<hr />
<p>That wasn't the only case though. There was a time when I was talking about financial stuff with my dad and he straight up said "don't take loans to invest (with ASBF)".</p>
<blockquote>
<p>For those who don't know, ASBF is an investment instrument in Malaysia where we took a loan from banks and use that money to invest.</p>
<p>I know it sounds super fishy especially if you're not Malaysian but I assure you it's legit. It's one thing unique about Malaysia.</p>
</blockquote>
<p>And that really raised my eyebrows after hearing that.</p>
<p>While I don't claim myself as a financial guru whatsoever, I have done my research about it and as always those instruments aren't inherently <em>bad</em>.</p>
<p>It depends on your financial goals, risk appetite, financial situation and so on if you're thinking about doing it – as do everything else.</p>
<p>But hearing my dad forbid me from even thinking about taking it is something that really puts me off.</p>
<p>So I asked why.</p>
<p>And he said "I've seen your uncle who's done that, stops halfway, and has lost a lot of money. I don't think it's something you should consider doing at all."</p>
<p>And again that's when I realized our experiences are different which causes our opinion of it to be very different.</p>
<p>And again, the same thing about where those bits of advice are coming from, it's from a good place.</p>
<p>My dad probably doesn't want to see me lose tons of money trying out risky "investments" that have been proven wrong time and time again, at least from his pov.</p>
<hr />
<p>So look, I'm not saying you should ignore everything that your parents are saying. I'm just saying you should be wary of where it's coming from and understand why it is that way.</p>
<p>Because not everything your parents say is 100% correct.</p>
<p>Sometimes the things they don't want you to do can be good for you.</p>
<p>They might be wrong, they might be right.</p>
<p>You as an adult should be able to evaluate it yourself and if you're not sure whether you're right or wrong – be curious.</p>
<p>You can ask your parents why they think of it that way, then you can re-evaluate your thoughts on it again until you are satisfied.</p>
<p>You can also just "test it out".</p>
<p>Say for example I'm not sure if taking steroids is good or bad for me (read: it's bad). I can simply try it out to see whether I'm right or not.</p>
<p>If I'm right then great.</p>
<p>If I'm wrong...that's great too.</p>
<p>You just need to be prepared to hear "I told you so" if you're wrong though, haha.</p>
<p>In both cases, I learned something new.</p>
<p>Now, before you think "testing it out" is irresponsible, you should remember that you should only "test" stuff out if you're not sure whether it's right or wrong.</p>
<p>...after you've done your research.</p>
<p>If you know something is obviously wrong, then don't do it.</p>
<p>If you're not sure but a lot of evidence is pointing towards "you're wrong", don't do it.</p>
<p>You should only "test" out stuff you're not sure about, and the goal is to get answers.</p>
<p>If you know or see a lot of evidence suggesting it's wrong and you still want to do it – that is irresponsible.</p>
<p>Also, when you're testing out stuff and turns out you're wrong and really bad stuff happen, don't feel bad.</p>
<p>You're not intentionally trying to harm anyone, you're just curious and trying to learn. I think you should be proud of it.</p>
<p>So yeah, don't listen to your parents' advice blindly, be curious, question it, and then make your own conclusions.</p>
<hr />
<p>And oh, this article is not just about advice from parents, it could be from anyone, about anything.</p>
<p>Including this very article, try to understand where my advice coming from, and do your own research.</p>
]]></content:encoded></item><item><title><![CDATA[How To Squash Commits Locally]]></title><description><![CDATA[If you're like me, you're probably familiar with "squash and merge" when merging pull requests on GitHub.
If you're also like me, you're now trying to figure out how to do this seemingly simple "squash and merge" thingy locally for some reason.
Wheth...]]></description><link>https://blog.afrieirham.com/how-to-squash-commits-locally</link><guid isPermaLink="true">https://blog.afrieirham.com/how-to-squash-commits-locally</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Git]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[version control]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Fri, 26 May 2023 07:05:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1685084799709/a94ec6d2-78d8-4cbf-92a2-69049d6d8091.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you're like me, you're probably familiar with "squash and merge" when merging pull requests on GitHub.</p>
<p>If you're also like me, you're now trying to figure out how to do this seemingly simple "squash and merge" thingy locally for some reason.</p>
<p>Whether you've been asked to do it because that's how your team has done it (read: my team) or you're curious how to do it just to learn – you've come to the right place.</p>
<h1 id="heading-the-mechanism">The Mechanism</h1>
<p>The main idea of squashing your commits is you need to reset or undo your commits until the very last one you want to squash. Then just git commit again.</p>
<h3 id="heading-1-reset-to-your-last-n-commit"><strong>1. Reset to your last N commit</strong></h3>
<p>Where, N = number of commits you want to squash</p>
<p>For example, if you have 3 commits that you want to squash, you can simply <code>git reset --soft HEAD~3</code></p>
<p><strong>IMPORTANT</strong>: make sure it's a *<em>soft*</em> reset by using the <code>--soft</code> flag.</p>
<p>Otherwise, you will lose all of your progress. We don't want that.</p>
<h3 id="heading-2-re-commit"><strong>2. Re-commit</strong></h3>
<p>This is pretty straightforward, just <code>git commit -m ...</code></p>
<hr />
<p>And that's it, it's pretty simple when you know now but it was quite confusing if you're used to the 1-click squash and merge button on GitHub.</p>
<p>At least that was the case for me. 🥲</p>
]]></content:encoded></item><item><title><![CDATA[Understanding useEffect and dependencies array in React]]></title><description><![CDATA[I made a simple react app in CodeSandbox to demonstrate the different usage of useEffect below.
Note that the app is using Chakra UI for styling but it's not relevant in this article.
https://codesandbox.io/s/useeffect-demo-lgi9b8
 
The app can do 3 ...]]></description><link>https://blog.afrieirham.com/understanding-useeffect-and-dependencies-array-in-react</link><guid isPermaLink="true">https://blog.afrieirham.com/understanding-useeffect-and-dependencies-array-in-react</guid><category><![CDATA[React]]></category><category><![CDATA[useEffect]]></category><category><![CDATA[react hooks]]></category><category><![CDATA[Next.js]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Wed, 24 May 2023 08:51:31 GMT</pubDate><content:encoded><![CDATA[<p>I made a simple react app in CodeSandbox to demonstrate the different usage of <code>useEffect</code> below.</p>
<p>Note that the app is using Chakra UI for styling but it's not relevant in this article.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/useeffect-demo-lgi9b8">https://codesandbox.io/s/useeffect-demo-lgi9b8</a></div>
<p> </p>
<p>The app can do 3 things.</p>
<ol>
<li><p>Change the color of the background with the "Change Background" button.</p>
</li>
<li><p>Increment or decrement the number by using the +/- button.</p>
</li>
<li><p>Change the text color of "Hello" using the "Change Hello" button.</p>
</li>
</ol>
<p>The app has 3 states using <code>useState</code></p>
<ul>
<li><p>number</p>
</li>
<li><p>bg (store background color)</p>
</li>
<li><p>color (store text color for "hello")</p>
</li>
</ul>
<p>Now let's get into the demonstration.</p>
<h1 id="heading-1-useeffect-without-dependency-array">1. <code>useEffect</code> without dependency array</h1>
<pre><code class="lang-javascript">useEffect(<span class="hljs-function">() =&gt;</span> {
    setNumber(number + <span class="hljs-number">10</span>);
});
</code></pre>
<p>If you uncomment the first useEffect, you can see that the number is getting bigger and bigger infinitely.</p>
<p>That's because useEffect without dependency array runs on every render.</p>
<p>Let me show you what happens here chronologically.</p>
<ol>
<li><p>The app renders and initialize the <code>number</code> with the value of 1.</p>
</li>
<li><p><code>useEffect</code> will run the code <code>setNumber(number + 10)</code>.</p>
</li>
<li><p>This will then trigger the component to re-render since we've updated the state of this component – the <code>number</code> state.</p>
</li>
<li><p>And when the component re-renders, useEffect will run again, and we're back at step 2.</p>
</li>
</ol>
<p>So useEffect with no dependency arrays will run on every render.</p>
<h1 id="heading-2-useeffect-with-empty-dependency-array">2. <code>useEffect</code> with empty dependency array.</h1>
<pre><code class="lang-javascript">useEffect(<span class="hljs-function">() =&gt;</span> {
    setNumber(number + <span class="hljs-number">10</span>);
}, []);
</code></pre>
<p>Now let's comment the first useEffect and uncomment the second one.</p>
<p>Notice how the number is now 11 instead of infinitely getting bigger.</p>
<p>This is because when <code>useEffect</code> is declared with an empty dependency array, it will only run once – which is during the first render.</p>
<p>You can click on the other button to see what happens.</p>
<p>The number will only change if you click on the +/- button only. <code>Change Background</code> and <code>Change Hello</code> does nothing to the number.</p>
<p>Chronologically what happens is:</p>
<ol>
<li><p>The app renders and initialize the <code>number</code> with the value of 1.</p>
</li>
<li><p><code>useEffect</code> will run the code <code>setNumber(number + 10)</code>, which makes the number 11 now.</p>
</li>
<li><p>At this point, the component does re-render but <code>useEffect</code> does not run on the second render because of the dependency array.</p>
</li>
</ol>
<p>Remember: <strong>useEffect with an empty dependency array will only run on the first render.</strong></p>
<h1 id="heading-3-useeffect-with-1-variable-in-the-dependency-array">3. <code>useEffect</code> with 1 variable in the dependency array.</h1>
<pre><code class="lang-javascript">useEffect(<span class="hljs-function">() =&gt;</span> {
    setNumber(number + <span class="hljs-number">10</span>);
}, [bg]);
</code></pre>
<p>Now if you add <code>bg</code> into that dependency array, the same thing will happen as before.</p>
<p>But now if you click on the <code>Change Background</code> button, the background color will change but so does the number.</p>
<p>And notice that the number is incremented by 10, not by 1.</p>
<p>What happens here is the <code>useEffect</code> will run just like how it was when the array was empty.</p>
<p>But when you add <code>bg</code> into the array, it will also run whenever you update the value of <code>bg</code>.</p>
<p>It's like the <code>useEffect</code> is listening to the value of <code>bg</code> for any changes, and if it's updated, it will run the code.</p>
<h1 id="heading-4-useeffect-with-2-or-more-variables-in-the-dependencies-array">4. <code>useEffect</code> with 2 (or more) variables in the dependencies array.</h1>
<pre><code class="lang-javascript">useEffect(<span class="hljs-function">() =&gt;</span> {
    setNumber(number + <span class="hljs-number">10</span>);
}, [bg, color]);
</code></pre>
<p>Again, on the first render, it will be the same as the 2nd and the 3rd case.</p>
<p>Also, if you click on the <code>Change Background</code> button, same behavior is still there.</p>
<p>The difference now is the number will also be incremented if you click on the <code>Change Hello</code> button.</p>
<p>At this point, I think you'll understand why that is the case.</p>
<p>The <code>useEffect</code> here still listen for changes in the value of <code>bg</code> but it also listens for <code>color</code> now.</p>
<p>That is why when you click on the <code>Change Hello</code>, the number is added by 10. Same reason as the previous case.</p>
<p>You can also try to remove <code>bg</code> in the array and see what happens.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>I hope now you understand how <code>useEffect</code> and dependencies array works.</p>
<p>To summarize</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// runs on every render</span>
useEffect(<span class="hljs-function">() =&gt;</span> {
    setNumber(number + <span class="hljs-number">10</span>);
});

<span class="hljs-comment">// run once (only on the first render)</span>
useEffect(<span class="hljs-function">() =&gt;</span> {
    setNumber(number + <span class="hljs-number">10</span>);
}, []);

<span class="hljs-comment">// runs on first render and anytime value of bg is updated</span>
useEffect(<span class="hljs-function">() =&gt;</span> {
    setNumber(number + <span class="hljs-number">10</span>);
}, [bg]);

<span class="hljs-comment">// runs on first render and anytime value of bg and color is updated</span>
useEffect(<span class="hljs-function">() =&gt;</span> {
    setNumber(number + <span class="hljs-number">10</span>);
}, [bg, color]);
</code></pre>
]]></content:encoded></item><item><title><![CDATA[You can't out-market a bad product to grow.]]></title><description><![CDATA[When thinking about marketing your product you need to make sure what you're selling is valuable. Your product needs to actually deliver its promises.
I am currently thinking of a way to better market one of my product, CariKabel.com, and the best wa...]]></description><link>https://blog.afrieirham.com/you-cant-out-market-a-bad-product-to-grow</link><guid isPermaLink="true">https://blog.afrieirham.com/you-cant-out-market-a-bad-product-to-grow</guid><category><![CDATA[business]]></category><category><![CDATA[Startups]]></category><category><![CDATA[Indie Maker]]></category><category><![CDATA[SaaS]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Mon, 22 May 2023 14:19:28 GMT</pubDate><content:encoded><![CDATA[<p>When thinking about marketing your product you need to make sure what you're selling is valuable. Your product needs to actually deliver its promises.</p>
<p>I am currently thinking of a way to better market one of my product, CariKabel.com, and the best way to do marketing is to show proof that your product do indeed helps people achieve their goals.</p>
<p>But CariKabel has yet to have any success stories that I can use for my marketing.</p>
<p>That is when I realized I'm not comfortable just selling a "dream".</p>
<p>A dream is what it <em>can</em> do vs what it <em>has</em> achieved – it's not tangible.</p>
<hr />
<p>Yes, you could get sales selling a bad product and have some "success", but I don't think it's sustainable.</p>
<p>You probably should be thinking about your product's impact on your customers if you want a sustainable business.</p>
<p>CariKabel's main goal is to help job seekers have a better job-hunting experience vs the traditional way by giving you access to the referrer's email of the people in the company that you're interested in.</p>
<p>For example, if you want to work for Hashnode.</p>
<p>You would probably have a higher chance of getting called for an interview being referred by someone working there vs applying directly through their job portal.</p>
<p>At least that's the idea – that's CariKabel's "dream".</p>
<p>But until I can prove that is what's happening, it's really hard for me to spend more time and money marketing it without any success stories.</p>
<p>Plus I'll feel a lot better selling stuff that helps people. I won't be thinking about weird marketing tactics to get customers to compensate for a bad product.</p>
<p>However, you can't get any success stories without customers. So you'll still need marketing to start.</p>
<p>But after getting your first few customers, the next step is to get testimonies.</p>
<p>Then you can think about scaling.</p>
<p>I mean it makes more sense that way:</p>
<ol>
<li><p>Get the first few customers</p>
</li>
<li><p>See if they achieve what you're promising using your product</p>
</li>
<li><p>If yes, you can use their stories/testimonies to reach more people</p>
</li>
<li><p>If not then maybe your product does not make sense, or you need to change something about it</p>
</li>
</ol>
<p>So yeah, that is why I said you can't out-market a bad product. You'll eventually fail even if it seems you're doing great (i.e. sales are high in the beginning).</p>
]]></content:encoded></item><item><title><![CDATA[How to integrate mailchimp with React]]></title><description><![CDATA[I hope I make it clear enough what this article is all about based on the title. But to add on the title a little more, this article will work with any frontend JavaScript framework.
If you ever find yourself in the same position as me, ie. you want ...]]></description><link>https://blog.afrieirham.com/how-to-integrate-mailchimp-with-react</link><guid isPermaLink="true">https://blog.afrieirham.com/how-to-integrate-mailchimp-with-react</guid><category><![CDATA[React]]></category><category><![CDATA[Vue.js]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[HTML5]]></category><category><![CDATA[mailchimp]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Wed, 24 Aug 2022 04:38:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1661315774888/0Rc1lS31t.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I hope I make it clear enough what this article is all about based on the title. But to add on the title a little more, this article will work with any frontend JavaScript framework.</p>
<p>If you ever find yourself in the same position as me, ie. you want to use mailchimp to collect email and you want to connect it to a custom frontend project, this article will be useful to you.</p>
<p><strong>Note that I will be using React in this article as an example, but this should work with any JavaScript project.</strong></p>
<p>If you want to have a look at my implementation, this is the <a target="_blank" href="https://github.com/afrieirham/react-mailchimp">source code</a>. Also, this article will assume that you've already setup your project.</p>
<p>With that out of the way, let's get into the article.</p>
<hr />
<p>What you'll need:</p>
<ul>
<li><a target="_blank" href="https://login.mailchimp.com/signup/">Mailchimp</a> account</li>
<li><a target="_blank" href="https://www.npmjs.com/package/jsonp">jsonp</a></li>
</ul>
<h3 id="heading-1-get-request-url-link-from-mailchimp">1. Get request URL link from Mailchimp</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661310476931/r6FEDOB1V.png" alt="Screenshot 2022-08-24 at 11.04.02 AM.png" />
Go to your Mailchimp dashboard, on the sidebar, go to <code>Audience &gt; Signup forms</code>. And then, click on <code>Embeded forms</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661310200618/6hGkkbB__.png" alt="Screenshot 2022-08-24 at 11.02.31 AM.png" />
You can add more fields by clicking on the <code>Form Fields</code> and enable all the fields that you need. Then click on <code>Continue</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661310805046/nU80Kp0kI.png" alt="Screenshot 2022-08-24 at 11.10.38 AM.png" />
Find the <code>form</code> tag in the code, and copy the <code>action</code> URL.</p>
<p>Also, look for <code>input</code> tag and find the fields that you've added. Take note the <code>name</code> of the <code>input</code> tag. We will be using it to submit our form later.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"email"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">""</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"EMAIL"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"required email"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"mce-EMAIL"</span> <span class="hljs-attr">required</span>&gt;</span>
</code></pre>
<p>In this case, the <code>name</code> is <code>EMAIL</code>.</p>
<h3 id="heading-2-setup-the-onsubmit-handler">2. Setup the <code>onSubmit</code> handler</h3>
<p><strong>Before we proceed:</strong> Don't forget to install <a target="_blank" href="https://www.npmjs.com/package/jsonp">jsonp</a> package in your project.</p>
<p>First, we need to replace the <code>/post?</code> with <code>/post-json?</code> in our url. Then add this code in your <code>onSubmit</code> handler. I'll explain what we did later.</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> onSubmit = <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {
    e.preventDefault();
    <span class="hljs-keyword">const</span> url = <span class="hljs-string">'your-mailchimp-url'</span>;
    jsonp(<span class="hljs-string">`<span class="hljs-subst">${url}</span>&amp;EMAIL=<span class="hljs-subst">${email}</span>`</span>, { <span class="hljs-attr">param</span>: <span class="hljs-string">'c'</span> }, <span class="hljs-function">(<span class="hljs-params">_, data</span>) =&gt;</span> {
        <span class="hljs-keyword">const</span> { msg, result } = data
        <span class="hljs-comment">// do something with response</span>
        alert(msg);
    });
};
</code></pre>
<p>We use the <code>jsonp</code> function to make the request. We then append <code>&amp;EMAIL=&lt;your-input-email&gt;</code> to include the email that we want to submit.</p>
<p>If you have more fields, just use the <code>name</code> value you've listed out from Mailchimp code before, and append it accordingly.</p>
<p>Then we add the <code>{ param: 'c' }</code> as the second parameter, but I don't really know why we need this to be honest. </p>
<p>Lastly, we add a callback function to handle the response. The relevant response data will be available to you in the second argument. That's why I use <code>_</code> for the first argument.</p>
<p>From there, I just alert the user with the response message.</p>
<p>And that's it, you should be able to submit the email to Mailchimp now.</p>
<hr />
<h3 id="heading-for-more-context">For more context</h3>
<p>I write this article to share my learning when I was building "Coming Soon" page for my upcoming project <a target="_blank" href="https://sea-techjobs.com">sea-techjobs.com</a>. (shameless plug here ✊)</p>
<p>I want to collect emails using Mailchimp but I don't want to use their form builder. I think I can do a better job with React and ChakraUI to design the website but I wasn't sure how to exactly get this two connected.</p>
<p>I first stumbled upon this <a target="_blank" href="https://youtu.be/kNiHE-FoA1c">video</a> on how to setup Mailchimp newsletter with React. And in that video, they were using this library called <a target="_blank" href="https://www.npmjs.com/package/react-mailchimp-subscribe">react-mailchimp-subscribe</a> but I couldn't get the state working right.</p>
<p>I looked into the source code and figure out exactly how it works under the hood. I realized that I don't need that library for it to work. I can just copy how it works and tweak it to suit my needs.</p>
<p>Then I thought, why not write an article to hopefully help other people who might be facing the same issue – thus this article.</p>
<p>So I guess that's it from me. Thank you for reading and have a good day.</p>
<p>p/s - If you're curious about the project that I'm working on, you can read this <a target="_blank" href="https://twitter.com/afrieirham_/status/1561369652067938304">twitter thread</a> to learn more. It's in Malay though, I'm sorry if you're english reader. 🤧</p>
]]></content:encoded></item><item><title><![CDATA[Stop buying templates, create your own instead.]]></title><description><![CDATA[I used to look for templates on Notion for hours, trying to replicate them for days, setting up the perfect dashboard that's ✨ aesthetically pleasing ✨ but never got to use them even once – sounds familiar? 😜
Why? Because I was using someone else's ...]]></description><link>https://blog.afrieirham.com/stop-buying-templates-create-your-own-instead</link><guid isPermaLink="true">https://blog.afrieirham.com/stop-buying-templates-create-your-own-instead</guid><category><![CDATA[templates]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[tools]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Sat, 23 Apr 2022 06:18:25 GMT</pubDate><content:encoded><![CDATA[<p>I used to look for templates on Notion for hours, trying to replicate them for days, setting up the perfect dashboard that's ✨ aesthetically pleasing ✨ but never got to use them even once – sounds familiar? 😜</p>
<p>Why? Because I was using someone else's system.</p>
<p>A system that</p>
<ul>
<li><p>they come up with</p>
</li>
<li><p>only works for them</p>
</li>
<li><p>not mine</p>
</li>
</ul>
<p>Now what I did instead is, I use Notion however I feel I like it. And yes it is messy, but it's my mess.</p>
<p>What's important is it works for me – whether it's an expense tracker or a to-do list.</p>
<p>And I keep using it until eventually, after using it multiple times, I saw a pattern. From there, I start to systematize it and came up with my own template.</p>
<p>I am a huge believer that in order for you to do things systematically, you need to do it <strong>messily</strong> first, then after you have done it enough, you can <strong>tidy it up</strong>.</p>
<p>This not only applies to Notion templates, it applies to everything.</p>
<p>I saw the same thing in my work when I'm coding. We don't start coding by trying to write the most efficient code first, we start by making it work – then we refactor.</p>
<p>Anyway, I digress.</p>
<hr />
<p>Look, I'm not saying you should never look for inspiration in other people's work. What I'm saying is, you should not just blindly copy it.</p>
<p>In fact, I encourage people to look for inspiration and try experimenting with it and don't be afraid to customize it according to your needs.</p>
<p>So go do stuff first, and then you can worry about making it systematic/beautiful.</p>
]]></content:encoded></item><item><title><![CDATA[How to Contribute to Open-Source Project on GitHub]]></title><description><![CDATA[So you've been reading articles about how to become a better software developer on the internet and inevitably, you've stumbled upon one common advice across the articles – contribute to an open-source project.
And you’re thinking, “Sure but how? How...]]></description><link>https://blog.afrieirham.com/how-to-contribute-to-open-source-project-on-github</link><guid isPermaLink="true">https://blog.afrieirham.com/how-to-contribute-to-open-source-project-on-github</guid><category><![CDATA[Open Source]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Thu, 07 Apr 2022 00:01:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1649205712140/hyY7vE95-.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So you've been reading articles about how to become a better software developer on the internet and inevitably, you've stumbled upon one common advice across the articles – contribute to an open-source project.</p>
<p>And you’re thinking, “Sure but how? How do I contribute exactly?”</p>
<p>Well in this article, I'm going to walk you through a step-by-step process on contributing to your first open-source project. This article is meant to teach you the "how" part, the technical part. </p>
<p>Or in other words, this is a technical tutorial on how to contribute to a public repo on GitHub, exciting stuff.</p>
<p>The project that you are going to contribute to is a small little project of mine called the <a target="_blank" href="https://guestbook.afrieirham.com/">Guestbook</a>. It's basically a website where you can leave some comments, maybe an advice, some quotes that inspires you, a joke – anything at all.</p>
<p>Hopefully by the time you read this, there are some comments made by other people and not just me 🥲</p>
<h1 id="heading-gentle-reminder">Gentle reminder</h1>
<p>Before we proceed to the steps, I want to talk about contributing to an open-source project. Specifically, what can you contribute because it is one of the most if not the most important steps to all this.</p>
<p>While contributing to an open-source project is a great thing to do, there are some contributions that are made just for the sake of making a contribution.</p>
<p>You don't want to spam the maintainer with bad contribution because it does not help anyone, and you should not be proud of that.</p>
<p>If you think you can contribute meaningfully to a project by fixing a bug, adding new features, or even improve the documentation – by all means go for it.</p>
<p>With that out of the way, let's get into the tutorial.</p>
<h1 id="heading-forking-the-repository">Forking the repository</h1>
<p>The first step if you want to contribute to an open-source project on GitHub is to <code>fork</code> the repo that you want to contribute to.</p>
<p>Now you may be wondering, why do we have to fork the repo? Why can't I just clone it?</p>
<p>Well, it all depends on what you're trying to do.</p>
<p>In some cases, you might just want to run the project locally and see how things are done, without the intention of making any changes to the original repo – if that's the case, you can just clone it.</p>
<p>In our case however, we want to run it locally. But we also want to make some changes, and contribute back to the original repo with our changes, which is why we need to fork it.</p>
<p><strong>Forking vs Cloning</strong></p>
<p>When you clone a repo, you will have a copy of the repo locally but it is still pointing to the original GitHub repo. </p>
<p>With cloning, you will run into a problem when you try pushing your code back to GitHub. You won't be able to do that because you don't have a <strong>write permission</strong> to that particular repo.</p>
<p>By forking however, you kinda clone it into your GitHub repo, in which you will have the write permission. </p>
<p>Technically it is your repo now, and when you clone, edit, and try to push new updates back to GitHub, it will succeed – because it's your repo.</p>
<p>That's why you need to fork it first, so that you will have the write permission.</p>
<blockquote>
<p>So go ahead and fork <a target="_blank" href="https://github.com/afrieirham/guestbook">this</a> repository.</p>
</blockquote>
<h1 id="heading-clone-the-forked-repository-locally">Clone the forked repository locally</h1>
<p>Now that you have <a target="_blank" href="https://github.com/afrieirham/guestbook">this</a> repo under your name, you can clone it as usual and try to run it locally.</p>
<p>Note that this project is a <a target="_blank" href="https://nextjs.org/">Next.js</a> project. You will need to install <code>node</code> and run <code>npm install</code> or <code>yarn</code> to install the dependencies.</p>
<p>Once the dependencies are installed, you can try to run it by running <code>npm run dev</code> or <code>yarn dev</code> and hopefully you will see this in your terminal.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649203921529/pb3nNWHcM.png" alt="Untitled.png" /></p>
<p>By now you should be able to go to your <a target="_blank" href="http://localhost:3000">localhost</a> and see the guestbook page.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649203942724/wCW64aTVQZ.png" alt="Untitled 1.png" /></p>
<p>If everything went well, you can proceed to the next step.</p>
<h1 id="heading-create-a-new-branch">Create a new branch</h1>
<p>Now that you can run the project locally in your machine, you should be able to make some changes to it.</p>
<p>But before you start doing any changes, you should create a new branch and name it <code>&lt;your_github_username&gt;</code> . For example if I want to create a new branch, I will name it <code>afrieirham</code> .</p>
<p>You can create a branch however you want but the way I usually do it is using VS Code. At the bottom left your VS Code, you will see a <code>main</code> text.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649203960648/XbopIdHkH.png" alt="Untitled 2.png" /></p>
<p>You can click the <code>Create new branch from...</code> and enter your branch name.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204002123/dXO1MlJW4.png" alt="Untitled 3.png" /></p>
<p>Then select the <code>main</code> branch for this.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204013527/LK4fxIjq2.png" alt="Untitled 4.png" /></p>
<p>This will create a new branch called <code>afrieirham</code> from the main branch.</p>
<p>Now if you notice, it will change it to <code>afrieirham</code> which means I have successfully create a new branch. Hopefully yours will display your GitHub username.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204036905/erONBCiMP.png" alt="Untitled 5.png" /></p>
<p>If you find this method a bit tedious, you can always use the command line. </p>
<pre><code class="lang-bash">git checkout -b &lt;your-github-username&gt;
</code></pre>
<p><strong>Quick Note</strong> ✍️</p>
<p>If you're contributing to a real project, usually you will name your branch based on what you're trying to do.</p>
<p>For example it might be a new feature called <code>feature/upload-photo</code> or a bug fix called <code>fix/form-not-working</code> .</p>
<p>It all depends on the project maintainer if they have a guideline for branch name. For this tutorial, you just have to use your GitHub username, that’ll makes it easier for me, thanks. 🙇🏻‍♀️</p>
<h1 id="heading-making-your-changes">Making your changes</h1>
<p>Now that you're on a new branch, you can start making your changes safely. To sign the guestbook, you need to create a new file in the <code>sign-here</code> folder located in the <code>public</code> folder.</p>
<p>You’ll need add a new <code>JSON</code> file with your GitHub username as the title. In my case for example, I will create a new file called <code>afrieirham.json</code>. Yours would be <code>your-github-username.json</code>.</p>
<p>Then you can copy the template I provided in the README or copy the code below.</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"body"</span>: <span class="hljs-string">"Change this with your comment"</span>,
  <span class="hljs-attr">"date"</span>: <span class="hljs-string">""</span>
}
</code></pre>
<p>Paste the code into the <code>JSON</code> file you’ve created and add your comment accordingly. </p>
<p>To add the date, you’ll need to go to <a target="_blank" href="https://greenwichmeantime.com/articles/clocks/iso/">this link</a> and click on the “Copy to clipboard” button.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204072138/zPGn9RhDr.png" alt="Untitled 6.png" /></p>
<p>You can then paste it into the date section of the template and it will look something like this.</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"body"</span>: <span class="hljs-string">"Your comment"</span>,
  <span class="hljs-attr">"date"</span>: <span class="hljs-string">"2022-04-04T23:25:49Z"</span>
}
</code></pre>
<p>I hope my instructions are clear.</p>
<p>You can also refer the README file in the repo on how to get started, the instructions should be similar to this article.</p>
<h1 id="heading-committing-your-changes">Committing your changes</h1>
<p>Once you've made your changes, you can proceed into the next step which is to commit your changes. </p>
<p>If you already know how to do this, go ahead and commit the <code>JSON</code> file you've created, you can skip this part.</p>
<p>If you don't, I will show you step by step on how to commit your changes with VS Code.</p>
<p>First, you need to go to the git tab in VS Code, it's the icon with the blue number badge.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204090383/ttdD3MPoG.png" alt="Untitled 7.png" /></p>
<p>When you click it, you should see something like this.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204101564/DZUHVITc9.png" alt="Untitled 8.png" /></p>
<p>By right it should show that you’ve added a new <code>JSON</code> file. It's fine if it shows more than that, you probably have explored the other files and make other changes if that's the case.</p>
<p>However, you will only need to commit the <code>JSON</code> file that you just made, that's the only file you should be contributing in this tutorial. </p>
<p>Feel free to do any other changes for yourself, just don't include it when you want to contribute for this tutorial.</p>
<p>You should write a commit message in the input box. Just write anything to be honest, this message will be stored in the GitHub repo though, so be sensible.</p>
<p>Then you can click on the <code>+</code> plus sign when you hover on the <code>JSON</code> file. This step is called staging your changes.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204112118/S_JrfFLz0.png" alt="Untitled 9.png" /></p>
<p>It should show something like this. This means that the changes you've made is ready to be committed into the repo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204124332/fKiWNUSko.png" alt="Untitled 10.png" /></p>
<p>From here, you can either click on the ☑️ icon or press <code>command + enter</code> for Mac or <code>control + enter</code> for Windows.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204136540/hi7u0_uFh.png" alt="Untitled 11.png" /></p>
<p>You might need to setup your Git config if you've never used Git before, but I hope you know how to do that.</p>
<p>If the <code>JSON</code> file is gone from the git tab in VS Code, you now have successfully make a git commit, yeay! ✨</p>
<p>But there's still more steps need to be done.</p>
<h1 id="heading-pushing-your-changes-to-github">Pushing your changes to GitHub</h1>
<p>This step is pretty easy and should be a quick one. All you have to do is just click on the cloud icon at the bottom left of VS Code.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204149394/CH5gQ6u8G.png" alt="Untitled 12.png" /></p>
<p>If the icons changed to this icon, you're all good.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204161602/_qGR41vml.png" alt="Untitled 13.png" /></p>
<h1 id="heading-making-a-pull-request-pr">Making a Pull Request (PR)</h1>
<p>Pull Request is arguably the most important step to all this. It is a way for you to make a merge request to my GitHub repo so that your code will be reflected on the website once I approve it.</p>
<p>To make a PR, you need to go to your forked repo, or the <a target="_blank" href="https://github.com/afrieirham/guestbook">original repo</a> and you might see something like this. Just click on the <code>Compare &amp; pull request</code> button.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204172349/GnIrB8RDn.png" alt="Untitled 14.png" /></p>
<p>If you don't, you can click on the <code>Pull Request</code> tab and then click on the <code>New Pull Request</code> button. You should be on this page after you click on the button.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204181016/TjWsidAzO.png" alt="Untitled 15.png" /></p>
<p>When you're on that page, you can write something if you want. Ideally in a real open-source project, you should write about the changes you've made and what are the PR is all about.</p>
<p>It will help the maintainer or the owner of the repo to review your PR and understand what you're trying to do.</p>
<p>Before you click on the <code>Create pull request</code> button, you should make sure that you are trying to merge the correct branch to the main branch.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649204201936/f5KKAbUZw.png" alt="Untitled 16.png" /></p>
<p>Things you should double check:</p>
<ul>
<li>Base repository is <code>afrieirham/guestbook</code> and the base is <code>main</code></li>
<li>Head repository is <code>&lt;your_github_username&gt;/guestbook</code> and the compare is <code>&lt;your_github_username&gt;</code></li>
</ul>
<p>If everything is correct, you can now go ahead and click on the <code>Create pull request</code> button. If this is your first PR – congrats! 🥳</p>
<p>The whole process you just went through is how you would do it in any “real” project, and possibly in your job too.</p>
<p>It will not be exactly the same because different organization have different workflows but generally it is the same.</p>
<p>Starting from cloning the project, making your changes locally, making your first commit, pushing your code to GitHub, and finally make a PR for that – this workflow is generally the same across all organization.</p>
<p>From here, all you can do is just wait for me to merge your code into the main branch. I will try my best to merge your PR as soon as possible. </p>
<p>After that, hopefully your comment will appear on the <a target="_blank" href="http://guestbook.afrieirham.com">guestbook.afrieirham.com</a>, you can always check if your code has been merged or not by going to the PR page again.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>By now I really hope you've learned something from this mini project. I hope that you have a clearer vision on how people use GitHub to contribute to an open-source project.</p>
<p>I would also like to point out that it is not necessarily only applicable to an open-source project. You can use the same method in your own project, and you might find some similarity when you start working in a real project.</p>
<p>There might be extra or less steps involved, but I hope this tutorial will be a good foundation for you to learn a more complicated workflows in your organization.</p>
]]></content:encoded></item><item><title><![CDATA[How to use your domain and subdomain with Hashnode and Vercel]]></title><description><![CDATA[Yesterday I ran into a problem when I try to connect my domain to Hashnode and use a subdomain on Vercel. Thankfully, everything is resolved after I reach out to Sandeep on Twitter.
Here's the tweet.
https://twitter.com/afrieirham_/status/14181743815...]]></description><link>https://blog.afrieirham.com/how-to-use-your-domain-and-subdomain-with-hashnode-and-vercel</link><guid isPermaLink="true">https://blog.afrieirham.com/how-to-use-your-domain-and-subdomain-with-hashnode-and-vercel</guid><category><![CDATA[Hashnode]]></category><category><![CDATA[domain]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Fri, 23 Jul 2021 06:20:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1627021228123/FfG5tS1Nz.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Yesterday I ran into a problem when I try to connect my domain to Hashnode and use a subdomain on Vercel. Thankfully, everything is resolved after I reach out to Sandeep on Twitter.</p>
<p>Here's the tweet.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/afrieirham_/status/1418174381533003779">https://twitter.com/afrieirham_/status/1418174381533003779</a></div>
<p>If you're planning to use your naked domain (or root domain) on Hashnode and you have a project on Vercel using a subdomain from the same domain – please read this first.</p>
<h1 id="the-issue">The Issue</h1>
<p>Hashnode uses Vercel, and when you want to connect your root domain to your Hashnode blog, you will need to delegate it to Hashnode's Vercel account.</p>
<p>Again, if you're not planning to use any subdomain (on Vercel) from the domain you use on Hashnode, there's no problem.</p>
<p>However, I want to use afrieirham.com for my Hashnode blog, and I want to use bukugraduan.afrieirham.com on my Vercel project.</p>
<p>But I get this error 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1627019309729/fQA9_qIVo.png" alt="image.png" /></p>
<p>Because what essentially happens is you're trying to use the same domain with 2 different Vercel account; Hashnode's and yours.</p>
<h1 id="the-solution">The solution</h1>
<p>If you've already facing the same issue, you might want to contact Hashnode to delete your domain from their Vercel account, then follow these steps.</p>
<ol>
<li>Use www subdomain for your Hashnode account.</li>
<li>Redirect your root domain to point to your www subdomain.</li>
<li>You can now use any subdomain on your Vercel account.</li>
</ol>
<p>This way, you'll only delegate www subdomain to Hashnode and you'll keep your root domain on your Vercel account.</p>
<h1 id="conclusion">Conclusion</h1>
<p>I want to again thank <a target="_blank" href="https://twitter.com/Sandeepg33k">Sandeep</a> for his help. He's the one who get in touch with Vercel regarding this issue.</p>
<p>The solution I'm sharing here today is the suggestion from Vercel's team, so I would like to thank them as well.</p>
<p>This is what they have to say,</p>
<blockquote>
<p>It will be supported in the future. At this moment, however, it is indeed an edge case that we are not prepared yet. –Vercel</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[What is Full Stack Development?]]></title><description><![CDATA[The Problem
New developers find it hard to decide on what to use and/or learn when starting a new full-stack project.
The project might be a side-project, university assignments, final year project, business idea, or hackathon project.
Not only that,...]]></description><link>https://blog.afrieirham.com/what-is-full-stack-development</link><guid isPermaLink="true">https://blog.afrieirham.com/what-is-full-stack-development</guid><category><![CDATA[learning]]></category><category><![CDATA[full stack]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Sat, 10 Jul 2021 10:50:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/qAjJk-un3BI/upload/v1669559496919/U0IQQJ8iEp.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-the-problem">The Problem</h1>
<p>New developers find it hard to decide on what to use and/or learn when starting a new full-stack project.</p>
<p>The project might be a side-project, university assignments, final year project, business idea, or hackathon project.</p>
<p>Not only that, but when I was starting, I was struggling thinking about what does it takes to create a full stack app. </p>
<ul>
<li>What do I need to learn?</li>
<li>How does it all work together?</li>
<li>Is my skills currently enough or do I need to learn more?</li>
<li>Is using Bootstrap okay? Or am I cheating?</li>
</ul>
<h1 id="heading-understading-the-big-picture">Understading the big picture</h1>
<p>Before you start developing or creating an app, you need to understand the big picture first, so that you know what does it take and what are things you need to learn.</p>
<p>There might be things that you have already understand and know how to do, but you don't know how do these skills play in the big picture.</p>
<p>So what does an app needs? </p>
<p>Generally speaking, a full-stack app have a few components that are working together.</p>
<ul>
<li>Database ⇒ to store data</li>
<li>Storage ⇒ to store assets</li>
<li>API ⇒ to process request</li>
<li>User Interface ⇒ to let users interact with your app</li>
</ul>
<p>One thing to note is hosting won't be covered in this article. While it is an essential aspect in distributing or sharing your apps to your users, it is not something you need to worry about when you're in development. </p>
<p>Most likely, you'll be developing on a local machine (i.e. your laptop) in a localhost. However, the main thing you need to know about hosting is – it's a place where all of the components live.</p>
<p>You probably have heard of the term frontend and backend. In this case, the database, the storage, and the API collectively is called the backend, and the user interface is called the frontend.</p>
<p>Most, if not all, full-stack app must have at least a database, an API, and a user interface. Storage is optional depending on the requirements of the system you're building.</p>
<p>So what are these components? Let's start with the easy one, the user interface. </p>
<h3 id="heading-user-interface-ui">User Interface (UI)</h3>
<p>A user interface is the thing that users interact with. This might be a website, a mobile app, or a desktop app.</p>
<p>I'm sure many of you here have a pretty good idea of what a user interface is and what role does it play. So let's move on to the next one.</p>
<h3 id="heading-database">Database</h3>
<p>Again a pretty straightforward one.</p>
<p>A database is the component that stores the data of the app. It can be the user's email and password, the price of an item, user's address and so on.</p>
<p>This one is also pretty easy to understand. You might not know how to use and set it up, but most probably you know how it works — it stores data. Next is API.</p>
<h3 id="heading-application-programming-interface-api">Application Programming Interface (API)</h3>
<p>This is a big one. You might have heard of it but you have no idea what it is and how does it work. If that's the case, don't worry because I was in the same spot when I was starting.</p>
<p>In the context of building a full-stack app, an API usually is the server-side code where it handles the request made by the client (i.e. the user interface of your project). For example, if a user wants to buy an item in an e-commerce store, the transaction needs to be processed by the API or the server-side code. This process is done through HTTP protocol.</p>
<blockquote>
<p>If you have no idea what HTTP protocol is, you can watch this <a target="_blank" href="https://www.youtube.com/watch?v=iYM2zFP3Zn0">HTTP Crash Course</a> video by Traversy Media. I highly recommend you watch the video to understand this topic.</p>
</blockquote>
<p>Processes that can be handled by the API may include updating the stock count of an item, creating a new order for the purchase, send a confirmation email to the customer, notify the seller, and many more. </p>
<p>In a nutshell, the API acts like the operator of the app. It does all of the work.</p>
<h3 id="heading-storage">Storage</h3>
<p>You might be confused with this one because it seems like the role is the same as the database right?</p>
<p>Well, not exactly.</p>
<p>Storage is a place to store assets such as photos, files, and videos. All of these assets can't be stored in a database because it is not in a text or string format. The database usually stores the location reference of the assets in the storage.</p>
<p>To understand what I meant by a location reference is, try to go to this link of a <a target="_blank" href="https://www.vets4pets.com/globalassets/close-up-of-cat-looking-up.jpg">cat photo</a>, the URL of the photo is the location reference. This URL is the thing that will be stored in the database. I'll explain how you can use this link to show it in your app later.</p>
<p>An example of a storage is simply the folder on your Desktop right now, which is called file system. There is usually a dedicated folder in the project that is used to store user generated assets.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625911053209/dnV6vidOo.gif" alt="storage.gif" /></p>
<p>The GIF above shows where does the photo goes after you upload it.</p>
<p>Apps like Instagram and YouTube needs a place to store those files that will be fetched later. However, with big platforms like Instagram and YouTube, they usually will use an external cloud storage.  </p>
<p>Services like <a target="_blank" href="https://s3.amazonaws.com/">AWS S3</a>, <a target="_blank" href="https://firebase.google.com/products/storage">Firebase Cloud Storage</a>, and <a target="_blank" href="https://cloudinary.com/">Cloudinary</a>, are some of the examples of it. These services offer a dedicated server just to manage and store assets. You can explore and learn more about them later, but all of those are a part of the storage component.</p>
<p>The most common use case for a storage is to store user generated assets. If you app does not have a feature that allow the user to upload files, photos, or videos. You can get away with having no storage.</p>
<p>I hope that clear things up.</p>
<h1 id="heading-but-how-does-everything-works-together">But how does everything works together?</h1>
<p>When I was starting, I do know some of the components needed to build an app. But I really have no clue how does it work together.</p>
<p>To explain this, I will use the MERN stack as an example. MERN stands for <strong>M</strong>ongoDB, <strong>E</strong>xpress, <strong>R</strong>eact, and <strong>N</strong>ode.js</p>
<p>This stack consists all of the components I talked about previously except for the storage.</p>
<ul>
<li>Database ⇒ MongoDB</li>
<li>API ⇒ Express &amp; Node.js</li>
<li>User Interface ⇒ React</li>
</ul>
<p>Imagine a to-do list app built with this stack. Features includes; users can add, delete, edit, and view a task. They can also see a list of all the tasks.</p>
<p>When a user opens your app for the first time, the React app will make a <code>GET</code> request to the API to fetch all of the user's tasks. The API will then fetch all of the data needed from the database, process it, and send it back to the React app.</p>
<p>From here, the React app will render the data provided by the API and the user will see their task on the home page.</p>
<p>The user can also add, delete, and edit by making a <code>POST</code>, <code>DELETE</code>, and <code>PUT</code> request respectively.</p>
<p>As you can see from the example, every component have its own role. </p>
<p>Now imagine the to-do app that lets the user to upload a photo to a task. The React app will need to send the photo to the API via <code>POST</code> request, the API will then store it in the file system or upload it to an external file storage. The API will also store the location reference of the photo in the database.</p>
<p>Next, to display the photo in the UI, the React app will reference it using the location reference stored by the database and fetch the photo from the storage. It may look something like this in a React app.</p>
<pre><code class="lang-jsx">&lt;image src=<span class="hljs-string">"https://www.vets4pets.com/globalassets/close-up-of-cat-looking-up.jpg"</span> /&gt;
</code></pre>
<p>I hope by now you have a clearer understanding of how everything works together. By the way, you can always replace the MERN stack with any framework combination of your choice. The important thing to note is you know which components does the framework satisfy.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>Learning how to create a full-stack app is a long journey, it will take time to master every aspect of it. Even then, you won't be able to catch up with all the available technologies and services provided.</p>
<p>Good news is, you don't need to know everything!</p>
<p>Just understand the core principle of how it works, then pick and choose whatever frameworks, technologies, or services that you need to make it work. </p>
<p>Remember that the important thing is your ability to put things together, and solve a problem – tools are not important.</p>
<p>Finally, I wish you all the best in your journey to learn building a full-stack app. If you have any questions, feel free to <a target="_blank" href="https://twitter.com/afrieirham_">dm me on Twitter</a> or leave a comment, I will try my best to answer your questions.</p>
]]></content:encoded></item><item><title><![CDATA[Job Hunting Sebagai Graduan Software Engineering]]></title><description><![CDATA[Baru baru ni, saya berjaya graduate sebagai pelajar Sains Komputer di Universiti Malaya pada Januari 2021. Setelah hampir 5 tahun di universiti termasuk asasi, akhirnya saya bersedia untuk memasuki alam pekerjaan.
Jika anda seorang pelajar lepasan SP...]]></description><link>https://blog.afrieirham.com/job-hunting-sebagai-graduan-software-engineering</link><guid isPermaLink="true">https://blog.afrieirham.com/job-hunting-sebagai-graduan-software-engineering</guid><category><![CDATA[Job Hunting]]></category><category><![CDATA[malaysia]]></category><category><![CDATA[malay]]></category><category><![CDATA[fresh grad]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Mon, 24 May 2021 06:47:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1621780722089/o43jmJ09T.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Baru baru ni, saya berjaya graduate sebagai pelajar Sains Komputer di Universiti Malaya pada Januari 2021. Setelah hampir 5 tahun di universiti termasuk asasi, akhirnya saya bersedia untuk memasuki alam pekerjaan.</p>
<p>Jika anda seorang pelajar lepasan SPM atau pelajar tahun pertama, yang ingin mengetahui pengalaman seorang "fresh grad" sains komputer mencari kerja, ini adalah artikel yang mungkin dapat membantu anda.</p>
<p>Dalam artikel kali ini, saya nak kongsikan sedikit experience job hunting saya sebagai graduan sains komputer pada tahun 2021. </p>
<p>Sebelum anda teruskan membaca, saya ingin maklumkan kepada anda yang artikel ini agak panjang, jadi bagi memudahkan anda, saya telah membahagikan artikel ini kepada 4 bahagian.</p>
<ol>
<li><strong>Fasa Persediaan</strong></li>
<li><strong>Sesi Interview</strong></li>
<li><strong>Kronologi Job Hunting</strong></li>
<li><strong>Kesimpulan</strong></li>
</ol>
<h1 id="heading-fasa-persediaan">Fasa Persediaan</h1>
<p>Sebelum saya mulakan job hunting, ada beberapa perkara yang saya lakukan sebagai persediaan. </p>
<p>Antara perkara tersebut ialah:</p>
<ul>
<li>Membuka akaun LinkedIn</li>
<li>Bina portfolio atau side-project</li>
<li>Sediakan resume</li>
<li>Senaraikan company yang menarik</li>
</ul>
<p>2 perkara yang pertama adalah perkara yang saya lakukan sebelum atau sepanjang pengajian saya dan 2 perkara yang seterusnya merupakan perkara yang saya lakukan setelah saya tamatkan pengajian. Mari saya explainkan satu per satu.</p>
<h2 id="heading-membuka-akaun-linkedin">Membuka Akaun LinkedIn</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621780211323/2bz1Z_eXo.png" alt="linkedin.png" /></p>
<p>Saya membuka akaun LinkedIn pada akhir tahun 2016. Setahun sebelum saya memulakan pengajian ijazah. </p>
<p>Saya mengetahui kewujudan LinkedIn ini daripada ayah saya yang mencadangkan saya untuk membuka akaun LinkedIn. Dia percaya LinkedIn merupakan sebuah platform yang bakal membantu saya untuk mencari kerja kelak.</p>
<p>Spoiler alert, ayah saya 100% tepat.</p>
<p>Pada masa itu saya masih tidak mengetahui apa apa tentang LinkedIn, tapi saya mengikut sahaja apa yang dicadangkan dan register akaun LinkedIn. Seingat saya, saya seterusnya mula membaca artikel dan menonton video di YouTube tentang mengapa students perlu membuka akaun LinkedIn. </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/malissaali/status/1351915938459734019?s=20">https://twitter.com/malissaali/status/1351915938459734019?s=20</a></div>
<p>Pada masa itu juga saya terjumpa beberapa perkongsian di Twitter daripada <a target="_blank" href="https://twitter.com/malissaali">@malissaali</a>, <a target="_blank" href="https://twitter.com/lukmankhiruddin">@lukmankhiruddin</a>, dan juga <a target="_blank" href="https://twitter.com/azwant">@azwant</a> tentang kebaikan LinkedIn.</p>
<p>Selepas saya lebih faham tentang kebaikan LinkedIn, saya sangat excited. Saya nampak pengalaman orang lain yang menunjukkan LinkedIn ini merupakan sebuah platform yang dapat membantu mereka dalam job hunting. </p>
<p>Ada juga antara mereka yang di-offer kerja tanpa mereka memohon. Ini membuatkan saya sangat optimis tentang peluang pekerjaan saya. Dan itulah juga antara pengalaman saya bersama LinkedIn, saya akan kongsikan dengan lebih detail dalam artikel ini.</p>
<p>Nasihat saya, jika anda masih belum mempunyai akaun LinkedIn, silakan daftar sekarang. </p>
<h2 id="heading-bina-portfolio-atau-side-projects">Bina Portfolio atau Side-Projects</h2>
<p><img src="https://images.unsplash.com/photo-1555421689-d68471e189f2?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1555421689-d68471e189f2?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Sebagai seorang graduan Sains Komputer, terutamanya kepada anda yang ingin menjadi seorang programmer atau software developer. Amatlah digalakkan untuk anda membina sebuah portfolio atau side-projects yang boleh digunakan sebagai bukti kemahiran anda. </p>
<blockquote>
<p>Jika anda tidak faham kenapa anda perlu membina portfolio, anda boleh tonton video ini daripada Coder Foundry, <em><a target="_blank" href="https://www.youtube.com/watch?v=BSblaB6Nkl8">"How to get your first software development job"</a>.</em> </p>
</blockquote>
<p>Sepanjang tempoh pengajian, saya telah membina beberapa buah aplikasi web yang saya jadikan sebagai portfolio. </p>
<p>Antaranya ialah:</p>
<ul>
<li>WhatsAppIt</li>
<li>Proshop eCommerce</li>
<li>Student Management System</li>
<li>Buku Graduan</li>
</ul>
<p>Side-project pertama saya merupakan sebuah website utiliti yang bernama <a target="_blank" href="https://whatsappit.afrieirham.com">WhatsAppIt</a> yang saya bina pada tahun kedua pengajian. Ianya merupakan beberapa bulan setelah saya mulakan initiatif #100DaysOfCode saya.</p>
<p>Proshop eCommerce merupakan sebuah web app hasil daripada saya mengikuti online course <a target="_blank" href="https://www.udemy.com/course/mern-ecommerce/">MERN stack eCommerce</a> daripada Brad Traversy. </p>
<p>Walaupun ianya adalah sebuah projek hasil mengikuti online course, saya ada menggunakan projek ini sebagai starting point untuk assignment saya, dimana kami ditugaskan untuk menambah beberapa feature baru.</p>
<p>Disebabkan projek ini telah diubah dari hasil asal, saya decide untuk gunakan ia sebagai portfolio saya.</p>
<p>Tujuan asal saya membeli online course tersebut adalah kerana saya ingin belajar tentang library Redux untuk diimplementasikan dalam Final-Year Project (FYP) saya. FYP saya merupakan sebuah projek terbesar dalam portfolio saya.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/afrieirham_/status/1359941750782009344?s=20">https://twitter.com/afrieirham_/status/1359941750782009344?s=20</a></div>
<p>Selepas saya menamatkan pengajian ijazah, saya mengambil masa ini untuk membina sebuah website bernama <a target="_blank" href="https://bukugraduan.afrieirham.com">Buku Graduan</a> yang saya jadikan sebagai portfolio. Ini merupakan sebulan sebelum saya mulakan sesi job hunting saya.</p>
<p>Kesemua projek yang telah saya bina sepanjang dan selepas pengajian ijazah, merupakan projek yang saya gunakan sebagai portfolio bagi membuktikan kemahiran development saya. Saya telah memasukkan Proshop eCommerce, Student Management System, dan Buku Graduan di dalam resume saya.</p>
<p>Which brings us to the next point.</p>
<h2 id="heading-membuat-resume">Membuat Resume</h2>
<p><img src="https://images.unsplash.com/photo-1434030216411-0b793f4b4173?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1434030216411-0b793f4b4173?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Sebelum kita mula memohon pekerjaan, resume merupakan perkara yang paling utama yang kita perlu sediakan. </p>
<p>Sepanjang bulan Februari, saya telah mengambil masa untuk menyediakan resume saya supaya ianya lebih <em>up-to-date.</em> Pada masa itu saya telah pun melancarkan Buku Graduan secara live.</p>
<p>Perkara pertama yang saya lakukan untuk menyediakan resume ni adalah dengan merujuk semula resume saya yang lama. Resume yang paling latest saya ada pada masa itu adalah resume internship saya.</p>
<p>Dari situ saya guna semula general structure yang saya telah gunakan semasa permohonan internship. Saya juga update beberapa section penting seperti work experience dan projects. </p>
<blockquote>
<p>Jika anda ingin mandapatkan tips membina resume dengan lebih lanjut, saya cadangkan anda membaca artikel ini yang ditulis oleh rakan saya, Aliaa' Ramzani, iaitu <em><a target="_blank" href="https://medium.com/theumhack/intern-resume-guide-db405b7452ea">"Students’ Resume: What and How to Write?"</a>.</em></p>
</blockquote>
<p>Saya juga kongsikan resume saya kepada beberapa rakan untuk mendapatkan feedback dari mereka. Feedback dan nasihat daripada orang lain merupakan perkara yang penting untuk anda dapatkan dalam proses penyediaan resume.</p>
<p>Saya ada kemungkinan untuk melakukan kesilapan seperti typo dan terlepas pandang beberapa perkara yang boleh ditemui oleh orang lain. Maka proses ini adalah sangat penting supaya saya dapat menyediakan resume yang berkualiti.</p>
<p>Setelah saya berpuas hati dengan resume yang disediakan, saya mula bersedia untuk melakukan step seterusnya yang saya rasa amat penting untuk anda semua lakukan.</p>
<h2 id="heading-senaraikan-company-menarik">Senaraikan Company Menarik</h2>
<p><img src="https://images.unsplash.com/photo-1507925921958-8a62f3d1a50d?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1507925921958-8a62f3d1a50d?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Sebelum saya mula membuat apa apa permohonan kerja, saya mulakan dengan survey dulu company yang saya rasa menarik. Saya ingin lebih memahami dan mengenali dahulu syarikat tersebut sebelum membuat permohonan.</p>
<p>Saya ada buat satu excel spreadsheet dimana saya gunakan untuk keep track permohonan saya. Tapi untuk peringkat awal ni, saya hanya mencatat beberapa maklumat penting tentang company tersebut seperti nama dan emel company, jawatan yang ditawarkan, link kepada permohonan tersebut, dan juga company website.</p>
<p>Setelah saya sediakan senarai company tersebut, saya kemudiannya memulakan proses permohonan kerja. Saya mula dengan memohon company yang paling saya berminat terlebih dahulu, dan saya cuba untuk fokuskan kepada satu atau dua permohonan pada satu satu masa.</p>
<p>Ini kerana ada sesetengah permohonan yang saya perlu mengambil masa untuk menjawab soalan soalan mereka. Saya akan kongsikan dengan lebih detail tentang perkara ini dalam bahagian temuduga. Excel ni juga merupakan tempat saya update status permohonan seperti Applied, Review, Interview, Offered, Rejected atau Accepted.</p>
<h1 id="heading-sesi-interview">Sesi Interview</h1>
<p><img src="https://images.unsplash.com/photo-1573497491208-6b1acb260507?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1573497491208-6b1acb260507?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Untuk bahagian ini, saya akan bahagikan mengikut company. Secara keseluruhan, terdapat 6 company yang saya apply, dan right off the bat, 3 company tidak memberi apa apa respond. Tapi yang menariknya ada 3 company yang panggil saya untuk interview tanpa saya memohon.</p>
<p>Dalam bahagian ini, saya akan ceritakan cara saya mendapat panggilan ke interview, sesi interview, dan kesimpulan dan harapan setelah selesai interview bersama syarikat berkenaan.</p>
<p>Senarai ini tidak mengikut urutan kronologi panggilan interview sebenar saya.</p>
<h3 id="heading-maevi">Maevi</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621779758080/D_OqEK5iQ.jpeg" alt="maevi.jpeg" /></p>
<p>Maevi merupakan sebuah company subsidiari TNB. Mereka merupakan anak syarikat TNB pertama yang memfokuskan kepada perkhidmatan software. </p>
<p>Maevi mempunyai 2 bisnes utama yang dibahagikan kepada B2B dan B2C. Jika anda melawat laman web mereka, <a target="_blank" href="https://maevi.my/">maevi.my</a>, itu merupakan business B2C mereka dimana mereka menjual peralatan smart home devices kepada konsumer. Business utama mereka merupakan business B2B mereka dimana mereka membantu SMEs untuk mengurus electical consumption.</p>
<p>Cara saya mengenali dan mendapat interview daripada company ini agak menarik. Ianya bermula semasa saya masih didalam tahun akhir pengajian saya, semester 7. Ketika itu, seorang Product Manager daripada Lazada yang ada membuat request untuk menjadi connection saya di LinkedIn.</p>
<p>Setelah saya accept request tersebut, beliau message saya di LinkedIn mengenai peluang part-time. Pada masa itu saya masih berkerja di Digi-X secara part-time sambil belajar dan saya menolak tawaran beliau.</p>
<p>Saya accept request beliau kerana mempunyai connection dengan Product Manager daripada Lazada merupakan satu perkara yang baik. Peluang networking dengan seseorang seperti beliau adalah perkara yang positif untuk saya.</p>
<p>Dan dari situlah saya mula mengenali Maevi.</p>
<h3 id="heading-cara-mendapat-interview">Cara Mendapat Interview</h3>
<p>Pada awal bulan Februari tahun ini, beliau membuat post di LinkedIn dimana beliau sedang mencari seorang Software Engineer. Tetapi pada masa itu, saya perasan yang beliau tidak lagi bekerja di Lazada. Walaubagaimanapun saya tetap message beliau berkenaan peluang pekerjaan tersebut.</p>
<p>Beliau meminta resume saya dan setelah beberapa hari kami bersetuju untuk melakukan sesi temuduga.</p>
<h3 id="heading-sesi-interview-1">Sesi Interview</h3>
<p>Sesi interview bersama Maevi mempunya 3 interviewer, dimana salah seorang daripada mereka merupakan Product Manager tersebut. Secara general-nya saya merasakan interview tersebut lebih casual. </p>
<p>Semasa interview, saya perasan yang mereka amat berminat tentang pengalaman saya di Digi-X. Mereka juga ada mengatakan yang TNB perlu cuba untuk mengikut langkah Digi yang menubuhkan Digi-X sebagai venture builder.</p>
<p>Bagi soalan teknikal, mereka ada menguji pengetahuan Git saya semasa interview, dimana mereka meminta saya untuk menerangkan perbezaan <code>git merge</code> dan <code>git rebase</code>. Selain itu mereka ada juga meminta saya mengongsikan workflow saya menggunakan Git secara kolaborasi. Ini termasuk penggunaan <code>git branch</code>.</p>
<h3 id="heading-refleksi">Refleksi</h3>
<p>Secara keseluruhannya, pengalaman interview bersama Maevi ini lebih kepada sesi networking. Secara jujurnya saya tidaklah begitu excited untuk bekerja di syarikat mereka tetapi lebih kepada ingin berkenalan secara profesional.</p>
<h2 id="heading-ifca">IFCA</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621779788459/YEZGwP_-B.png" alt="ifca.png" /></p>
<h3 id="heading-cara-mendapat-interview-1">Cara Mendapat Interview</h3>
<p>IFCA merupakan salah satu syarikat yang menghubungi saya melalui aplikasi <a target="_blank" href="https://my.wobbjobs.com/">Wobb</a>. Saya ada menggunakan Wobb sebagai platform job hunting saya dimana saya perlu membuka akaun sebelum saya dapat menggunakannya.</p>
<p>Secara jujurnya saya tidak berminat untuk bekerja di syarikat tersebut tetapi saya tetap ke sesi temuduga for the experience.</p>
<h3 id="heading-sesi-interview-2"><strong>Sesi interview</strong></h3>
<p>Saya dijadualkan untuk menghadiri sesi temuduga tersebut pada 23 Mac. Saya diberikan beberapa soalan terlebih dahulu sebelum saya bermulanya sesi temuduga tersebut. Beliau meminta saya untuk menjawab soalan tersebut dalam 30 minit.</p>
<p>Antara topik yang ditanya adalah soalan algorithm, SQL, dan konsep Object-Oriented Programming. Terus terang saya tidak dapat menjawab kesemuanya dalam masa yang diberikan dah hanya mampu menjawab soalan berkaitan algorithm.</p>
<p>Saya ada cuba untuk menjawab soalan yang lain tetapi masa yang diberi adalah amat singkat. Selepas 30 minit tamat, saya menghantar jawapan saya.</p>
<p>Setelah itu, penemuduga tersebut mungkin sedang membaca jawapan saya sebab ketika itu saya tidak mendapat apa apa respond. Namun dalam 10 minit kemudian, sesi temuduga bermula.</p>
<p>Sesi temuduga tersebut berjalan seperti biasa namun ada satu perkara yang saya ingin highlight-kan. Jika anda masih ingat, saya pada mulanya tidak begitu berminat untuk bekerja di syarikat tersebut tetapi semasa sesi temuduga, saya amat tertarik dengan tech-stacks yang mereka gunakan.</p>
<p>Mereka ada katakan yang mereka sentiasa akan cuba menggunakan tech-stack terbaru seperti TypeScript dan GraphQL. Skillset utama saya adalah React dan penggunaan TypeScript dan GraphQL bersama React merupakan perkara yang menarik minat saya.</p>
<p>Selain itu, penemuduga tersebut juga mengatakan pengalaman saya bekerja di Digi-X dimana saya terlibat dengan development aplikasi berkaitan HR merupakan perkara yang menarik bagi mereka. Ini kerana mereka juga mempunyai sebuah aplikasi yang berkaitan HR.</p>
<h3 id="heading-refleksi-1">Refleksi</h3>
<p>Secara kesimpulannya, IFCA merupakan sebuah company yang agak menarik setelah saya pergi ke sesi interview mereka. Penggunaan tech-stack yang menarik seperti GraphQL merupakan penarik untuk saya bekerja di syarikat mereka.</p>
<p>Walaupun pada mulanya saya tidak berminat, peluang untuk menpelajari perkara baru boleh mempengaruhi keputusan saya dan saya perlu mengambil kira segala pros and cons sesebuah company tersebut.</p>
<h2 id="heading-digi-x">Digi-X</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621779806367/UG4PR_BFT.jpeg" alt="digi-x.jpeg" /></p>
<p>Digi-X merupakan tempat intern saya semasa semester 5 selama 6 bulan. Saya sambung bekerja dengan mereka secara part-time dari Mac 2020 sehingga Disember 2020 selama lebih kurang 9 bulan.</p>
<h3 id="heading-cara-mendapat-interview-2">Cara Mendapat Interview</h3>
<p>Saya dipanggil ke sesi temuduga bersama Digi-X adalah melalui manager saya semasa intern. Selepas saya update status LinkedIn saya kepada #OpenToWork, manager saya segera menghubungi saya untuk mengatur sesi temuduga.</p>
<p>Saya berasa amat rendah hati dengan tawaran tersebut.</p>
<h3 id="heading-sesi-interview-3">Sesi Interview</h3>
<p>Proses interview Digi merupakan antara proses yang terpanjang bagi saya. Saya telah menjalani 4 peringkat interview bersama mereka dalam masa 2 minggu.</p>
<p>Pada peringkat yang pertama saya di-interview oleh 2 developer dari Digi-X yang saya kenali. Sesi interview tersebut dimulakan dengan saya memberitahu "update" kehidupan saya selepas intern dan pengalaman FYP saya.</p>
<p>Kami banyak berbincang tentang FYP saya kerana mereka ingin mengetahui proses saya ketika mengumpul requirements projek, tindakan saya ketika menghadapi masalah seperti pemilihan tech-stacks, penentuan scope projek, dan sebagainya.</p>
<p>Saya juga ada memberi beberapa feedback kepada mereka tentang pengalaman saya bekerja secara part-time dan beberapa perkara yang saya ingin ketahui tentang future planning mereka.</p>
<p>Perkara yang sama berlaku semasa sesi interview peringkat yang kedua dan ketiga, dimana saya di-interview oleh business team dan juga senior developer.</p>
<p>Pada peringkat keempat merupakan sesi interview bersama management Digi-X. Ketika sesi ini saya ditanya tentang plan career saya dan apakah yang saya cari dalam pekerjaan pertama saya. Saya juga ditanya soalan cepumas seperti, sejauh manakah saya ingin bekerja di Digi dan adakah saya mencari pekerjaan secara long-term atau short-term. </p>
<p>Secara jujurnya saya tidak menyangka akan ditanya soalan sebegitu dan saya memang tidak bersedia untuk memberikan jawapan yang baik.</p>
<h3 id="heading-refleksi-2">Refleksi</h3>
<p>Sesi interview yang saya jalani secara overall berjalan dengan lancar, terutamanya pada peringkat awal interview. Satu kelebihan jika saya memulakan career full-time saya di sini adalah familiarity. Saya sudah bekerja dan mengenali mereka selama lebih setahun. </p>
<p>Memang tidak dinafikan, saya suka bekerja dengan rakan sekerja saya di sana tetapi familiarity ini juga merupakan antara sebab saya kurang berminat bekerja di Digi-X.</p>
<p>Saya risau jika saya sambung bekerja di tempat yang saya sudah selesa saya akan menjadi terlampau selesa di situ. Saya merasakan saya tidak mahu bekerja di sesebuah syarikat untuk jangka masa yang lama, terutamanya di peringkat awal career saya.</p>
<p>Walaubagaimanapun saya tetap akan mempertimbangkan Digi-X jika diberi tawaran untuk bekerja.</p>
<h2 id="heading-shopee-singapore">Shopee (Singapore)</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621779823379/2eBbuzyLd.png" alt="shopee.png" /></p>
<h3 id="heading-cara-mendapat-interview-3">Cara Mendapat Interview</h3>
<p>Sekali lagi LinkedIn merupakan permulaan saya mendapat interview bersama Shopee. Seorang recruiter daripada Shopee membuat connection request kepada saya dan sedang mencari Frontend Developer.</p>
<p>Apa yang menarik tentang Shopee Singapore adalah ianya merupakan peluang oversea. Saya perlu berpindah ke Singapore jika saya ingin bekerja di Shopee Singapore. Ketika itu saya agak excited tetapi masih tidak bersedia secara mental untuk berpindah.</p>
<p>Saya tidak merancang untuk ke luar negara buat masa sekarang walaupun jika saya ditawarkan kerja. Namun saya tidak mahu menutup kemungkinan tawaran. Saya juga masih berada di peringkat temuduga, maka saya terima tawaran temuduga tersebut.</p>
<h3 id="heading-sesi-interview-4">Sesi Interview</h3>
<p>Pada peringkat pertama, saya diberikan satu online test berdurasi selama satu jam. Mereka memberi link kepada saya untuk menjawab test tersebut dan saya boleh access soalan tersebut dalam masa 48 jam. Saya juga perlu menyiapkan dalam satu sesi.</p>
<p>Online test Shopee teramatlah strict. Saya diwajibkan untuk share screen, buka mic dan webcam, dan platform tersebut memasang software eye tracking untuk memastikan saya tidak memandang ke tempat lain sepanjang test. </p>
<p><strong>Peringkat Pertama - Online Test</strong></p>
<p>Dari segi soalan, test tersebut mempunyai 8 soalan programming. Jika anda pernah menyertai mana-mana competitive programming, anda mungkin familiar dengan format soalan tersebut. </p>
<p>Saya dapat menyelesaikan 7 soalan pertama dalam 30 minit yang pertama, dan baki masa 30 minit yang ada saya habiskan untuk soalan terakhir yang agak mencabar. Soalan terakhir memerlukan saya untuk menggunakan konsep recursive function.</p>
<p>Secara overall saya confident dengan performance saya walaupun agak kekok dengan monitoring yang dilakukan. Namun alhamdulillah saya layak untuk ke peringkat seterusnya, iaitu temuduga bersama senior developer.</p>
<p><strong>Peringkat Kedua - Technical Interview with Senior Developer</strong></p>
<p>Untuk peringkat kedua, ianya berlangsung selama 90 minit. Topik yang ditanya adalah Web Frontend Development dan JavaScript. Interview tersebut dilakukan melalui Zoom.</p>
<p>Pada awal interview, seperti biasa saya perlu mengenalkan diri saya dan menceritakan serba sedikit latar belakang dan pengalaman saya. Kemudian penemuduga saya terus memasuki topik pertama tanpa saya sedar.</p>
<p>Ketika itu saya sedang menceritakan pengalaman saya terlibat dalam projek automation. Saya menyangkakan bahawa beliau ingin mengetahui lebih mendalam tentang apa yang saya sedang ceritakan, tetapi beliau sebaliknya sudah memulakan sesi teknikal interview.</p>
<p>Beliau menanya bagaimanakah saya mendapatkan element daripada web seperti button dan input box, dimana saya menjawab saya menggunakan attribute id atau class. Kemudian beliau meneruskan bertanya tentang topik yang lebih mendalam.</p>
<p>Saya diminta untuk menerangkan apakah yang berlaku dari mulanya seorang user menaip URL ke dalam browser sehinggalah user tersebut dapat menggunakan laman web yang diingini. </p>
<p>Ketika itu saya menjawab secara high level apa yang berlaku seperti browser tersebut akan menghantar request tersebut kepada server dan server kemudiannya akan menghantar semula dengan file yang diminta oleh browser.</p>
<p>Tidak berpuas hati dengan jawapan saya, beliau memberi soalan yang lebih spesifik kepada saya. </p>
<p>Bagaimanakah browser tersebut mengetahui server mana yang perlu request tersebut dihantar. Ketika ini saya mula merasakan bahawa beliau ingin jawapan yang lebih detail. </p>
<p>Maka saya menerangkan tentang DNS server dimana browser akan mendapatkan IP adress sesebuah server berdasarkan domain name yang didaftar.</p>
<p>Begitulah sesi interview saya berlalu untuk bahagian pertama. Beliau ada menyentuh beberapa topik seperti apakah perbezaan HTTPS dan HTTP, bagaimanakah browser membaca dan "render" file HTML, CSS, dan JavaScript, dan bermacam-macam lagi.</p>
<p>Secara jujurnya memang saya tidak dapat menjawab sebahagian besar daripada soalan yang ditanya kerana ianya agak advance berbanding dengan apa yang saya ketahui.</p>
<p>Setelah tamat bahagian pertama, beliau teruskan sesi interview tersebut kepada bahagian kedua, iaitu sesi coding JavaScript. Bahagian kedua ini mempunyai 2 soalan, dan spoiler alert, ianya amat sukar. </p>
<p>Soalan pertama saya diminta untuk membuat satu function dimana function tersebut boleh menerima beberapa argument atau parameter dan me-return sebuah value. Value yang dipulangkan perlu diambil dari cache jika ianya adalah panggilan kedua.</p>
<p>Contoh situasi mengikut urutan:</p>
<ol>
<li>add(1,1) ⇒ 2 (computed value)</li>
<li>add(1,1) ⇒ 2 (cached value)</li>
<li>add(1,2) ⇒ 3 (computed value)</li>
<li>add(1,1) ⇒ 2 (computed value)</li>
</ol>
<p>Sehingga sekarang saya masih tidak tahu bagaimana untuk menyelesaikan masalah tersebut.</p>
<p>Soalan kedua merupakan soalan yang lebih saya familiar tetapi saya masih tidak faham dengan solusi yang saya berikan.</p>
<p>Beliau memberikan saya beberapa code snippet yang berbentuk seperti dibawah.</p>
<pre><code class="lang-jsx"><span class="hljs-built_in">Array</span>.prototype.all([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>] =&gt; isGreaterThanZero)  <span class="hljs-comment">// return true</span>
<span class="hljs-built_in">Array</span>.prototype.any([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>] =&gt; isGreaterThanZero)  <span class="hljs-comment">// return true</span>
<span class="hljs-built_in">Array</span>.prototype.none([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>] =&gt; isGreaterThanZero) <span class="hljs-comment">// return false</span>

<span class="hljs-built_in">Array</span>.prototype.all([<span class="hljs-number">-1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">-3</span>] =&gt; isLessThanZero)   <span class="hljs-comment">// return false</span>
<span class="hljs-built_in">Array</span>.prototype.any([<span class="hljs-number">1</span>, <span class="hljs-number">-2</span>, <span class="hljs-number">3</span>] =&gt; isLessThanZero)    <span class="hljs-comment">// return true</span>
<span class="hljs-built_in">Array</span>.prototype.none([<span class="hljs-number">-1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>] =&gt; isLessThanZero)   <span class="hljs-comment">// return false</span>
</code></pre>
<p>Sekali pandang saya ianya nampak mudah. Tetapi dengan apa yang diberikan saya keliru dengan cara beliau menulis code JavaScript. Saya juga tidak dapat run code tersebut ketika itu, yang membuatkan ianya menjadi lebih mencabar.</p>
<p>Sekali lagi secara jujurnya saya cakap, saya masih tidak faham dengan apa yang berlaku dengan sesi interview kedua ini.</p>
<p><strong>UPDATE (27/5/21):</strong> Saya terjumpa video ini and it all makes sense now. Jika saya terjumpa bentuk soalan yang sama seperti ini pada masa akan datang, saya yakin saya akan dapat menjawab dengan lebih baik.</p>
<p>Ini juga bukti kenapa pengalaman itu berharga. Anda mungkin akan belajar perkara baru yang berkait dengan apa yang anda tidak faham sebelum ini.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=yU0Gh9T7sq8">https://www.youtube.com/watch?v=yU0Gh9T7sq8</a></div>
<h3 id="heading-refleksi-3">Refleksi</h3>
<p>Pengalaman interview bersama Shopee adalah sangat unik. Dari cara saya ditawar untuk ditemuduga, kepada sesi interview online test yang agak strict, dan sesi technical interview yang sangat mencabar.</p>
<p>Ianya sebuah pengalaman yang sangat menarik yang perlu saya hargai. Tidak semua company yang melakukan sesi hiring process seperti mereka. Walau apa pun keputusan mereka, saya berharap pengalaman ini akan membantu saya pada masa hadapan di dalam sesi interview yang lain.</p>
<h2 id="heading-moneylion">MoneyLion</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621779857866/NLqQ6rYFb.png" alt="moneylion.png" /></p>
<p>MoneyLion adalah sebuah syarikat daripada US yang mempunyai office di Kuala Lumpur. Saya mengenali syarikat ini melalui career fair di fakulti saya. Secara amnya MoneyLion hampir menyerupai sebuah bank tetapi mereka lebih memfokuskan kepada mobile app.</p>
<h3 id="heading-cara-mendapat-interview-4">Cara Mendapat Interview</h3>
<p>Pada mulanya, saya sudahpun berhajat untuk apply position Mobile Engineer di MoneyLion. Tetapi saya teragak-agak kerana saya merasakan peluang untuk mendapat panggilan interview itu rendah.</p>
<p>Namun begitu, seorang daripada rakan sekerja saya semasa intern menghubungi saya melalui WhatsApp untuk bertanya khabar dan ingin mengambil tahu tentang status job hunting saya. Beliau ada memberi beberapa nasihat dan tips kepada saya untuk mencari kerja, </p>
<p>Beliau juga ada bertanya jika saya berminat untuk bekerja di MoneyLion, dimana beliau mempunyai seorang kenalan disana dan beliau boleh membantu saya untuk merujuk terus kepada HR. </p>
<p>Saya terus terima tawaran tersebut dan beliau kemudiannya memberikan saya sebuah special link untuk saya apply position Mobile Engineer tersebut. Dari sini saya mula lebih serious untuk teruskan permohonan saya.</p>
<p>Saya merasakan bahawa saya mempunyai peluang yang lebih tinggi jika saya dirujuk oleh seseorang. Maka dari situlah saya mendapat panggilan temuduga bersama MoneyLion.</p>
<h3 id="heading-sesi-interview-5">Sesi Interview</h3>
<p>Bagi sesi interview MoneyLion, saya menjalani sebanyak 3 peringkat bersama mereka secara total. Peringkat pertama merupakan sebuah online test sama seperti Shopee. Seterusnya saya perlu menyiapkan take-home assignment yang diberi mereka dalam masa 24 jam. Akhir sekali merupakan sesi temuduga bersama Mobile Lead dan Engineering Lead mereka.</p>
<p><strong>Peringkat Pertama - Online Test</strong></p>
<p>Online test mereka tidaklah se-strict Shopee. Mereka hanya memberikan saya sebuah link dan saya perlu menyelesaikan test tersebut dalam masa satu jam. Test tersebut merangkumi 3 soalan programming dan 2 soalan subjektif.</p>
<p>Saya tidak mengalami sebarang masalah bagi soalan programming tetapi 2 soalan subjektif mereka agak mencabar. Bagi soalan pertama, saya diminta untuk "propose" satu solusi untuk sebuah case study dan bagi soalan kedua saya diminta untuk menerangkan perbezaan teknik imperative programming dan functional programming.</p>
<p>Memang ketika itu saya membuat research on-the-spot kerana saya tidak begitu familiar dengan 2 konsep tersebut. Tapi secara overall ianya berjalan dengan lancar.</p>
<p>Dan saya layak ke peringkat kedua.</p>
<p><strong>Peringkat Kedua - Take-Home Assignment</strong></p>
<p>Saya diminta untuk develop sebuah mobile app menggunakan React Native. Saya diminta untuk membuat aplikasi klon mirip Google Form, tetapi tidaklah merangkumi segala aspek. Saya hanya perlu membuat 2 screen utama iaitu Builder screen dan Viewer screen.</p>
<p>Builder screen merupakan screen dimana user boleh Add Question dan memilih jenis Question tersebut sama ada Checkbox, Text, Number atau Boolean. Viewer screen pula adalah screen untuk mengisi soalan tersebut.</p>
<p>Secara overall saya agak yakin dengan peringkat ini kerana saya amat familiar dengan React. Tetapi saya agak struggle untuk setup project React Native. Cara untuk setup sebuah aplikasi mobile app menggunakan React Native adalah lebih rumit berbanding setup web app menggunakan <code>create-react-app</code> </p>
<p>Tapi apa apa pun saya dapat menyiapkan assignment tersebut dengan jaya berserta beberapa requirement bonus yang diberi. Cuma saya tidak dapat run mobile app tersebut di emulator android.</p>
<p>Anda boleh merujuk repository <a target="_blank" href="https://github.com/afrieirham/lionform">ini</a> di GitHub jika anda berminat untuk melihat project tersebut.</p>
<p><strong>Peringkat Ketiga - Interview</strong></p>
<p>Sesi temuduga ini adalah lebih kepada membentangkan source code dan perbincangan tentang approach saya untuk membina mobile app tersebut. </p>
<p>Mereka juga ada meminta saya untuk menambah satu lagi feature dalam masa satu jam. Feature yang ditambah adalah data persistence. Saya hanya menggunakan <code>localstorage</code> untuk menambah feature ini.</p>
<p>Selepas itu ianya berjalan seperti sesi interview yang lain dimana kami berbincang tentang pengalaman dan expectation saya, dan juga sesi soalan jawab dimana saya bertanya tentang MoneyLion secara lebih mendalam.</p>
<p>Saya dapat rasakan sesi tersebut berlangsung dengan baik dan mereka kagum dengan performance saya. Satu perkara yang boleh diperbaiki adalah masalah saya tidak dapat run mobile app tersebut di Android.</p>
<h3 id="heading-refleksi-4">Refleksi</h3>
<p>Secara peribadi, saya merasakan yang saya telah lakukan yang terbaik disemua peringkat interview mereka. Saya mendapat respond yang positif daripada mereka dan diakhir interview juga saya dipuji "Good Job!" oleh Mobile Lead mereka.</p>
<p>Saya mempunyai harapan yang tinggi kerana saya berjaya ke semua peringkat dengan baik. Saya diberitahu yang mereka akan memberi maklum balas dalam masa seminggu dan jika tiada apa apa respond saya boleh menganggap ianya tidak berjaya.</p>
<h2 id="heading-snappymob">Snappymob</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621779874867/6ZfHkUK8I.png" alt="snappymob.png" /></p>
<h3 id="heading-cara-mendapat-interview-5">Cara Mendapat Interview</h3>
<p>Snappymob merupakan syarikat pertama yang saya apply melalui JobStreet. Ketika itu saya memang target untuk bekerja disitu sekiranya saya diberikan tawaran. Ianya merupakan first choice saya dan the only company yang saya apply.</p>
<p>Saya berminat dengan syarikat ini disebakan oleh kecantikan website mereka. Overall vibe didalam gambar mereka juga adalah satu faktor saya berminat untuk bekerja di sini. Saya tahu ianya bukanlah perkara yang paling penting untuk menilai sesebuah company.</p>
<p>Dan saya juga merasakan anda tidak patut buat apa yang saya lakukan, haha.</p>
<p>Sebelum saya apply di JobStreet, saya ada berminat dengan 2 posisi yang ditawarkan iaitu React Native Developer dan Fullstack Developer. Saya merancang untuk apply posisi React Native terlebih dahulu di JobStreet dan memberitahu mereka yang saya juga berminat untuk posisi Fullstack semasa interview. </p>
<h3 id="heading-sesi-interview-6">Sesi Interview</h3>
<p>Snappymob mempunyai hiring process yang ringkas. Saya hanya melalui 2 peringkat – boleh dikatakan juga mereka hanya mempunyai 1 peringkat technical interview. Selepas saya apply di JobStreet, saya mendapat panggilan daripada HR mereka untuk mengatur sesi interview. </p>
<p>Sesi technical interview mereka boleh dibahagikan kepada 2 bahagian, general programming concept dan JavaScript. Technical interview mereka hanyalah dilakukan diatas talian melalui Zoom. Mereka tidak melakukan sebarang hands-on test seperti take-home assignment dan online test.</p>
<p><strong>General Programming Concept</strong></p>
<p>Bahagian ini sedikit mencabar bagi saya, topik yang ditanya adalah konsep Object-Oriented Programming. Walaupun saya familiar dengan konsep OOP, saya tidak dapat menerangkan kesemua konsep dengan baik.</p>
<p>Saya diminta untuk menerangkan perbezaan <code>interface</code> dan <code>abstract class</code> . Saya cuba sebaik mungkin tetapi memang saya tidak dapat menjawab segala persoalan yang ditanya.</p>
<p><strong>Bahagian JavaScript</strong></p>
<p>Untuk bahagian ini, saya merasakan ianya berjalan dengan lebih baik kerana saya lebih yakin dengan knowledge JavaScript saya. Penemuduga tersebut ada menyentuh konsep JavaScript seperti Promise dan Callback Functions. </p>
<p>Beliau ada juga menyentuh topik yang lebih berkaitan dengan React Native seperti penggunaan Redux sebagai state management solution. Saya diminta untuk menerangkan sebab sebab kenapa Redux diperlukan dan apakah masalah yang Redux selesaikan.</p>
<p>Topik yang dibincangkan adalah antara tools dan technology yang saya gunakan semasa membuat FYP saya yang membuatkan saya lebih yakin dengan jawapan saya.</p>
<h3 id="heading-refleksi-5">Refleksi</h3>
<p>Secara overall saya merasakan ianya berjalan dengan lancar dan saya mempunyai harapan yang tinggi untuk mendapat tawaran dari mereka. </p>
<p>Saya juga ada menghantar email follow up setelah selesai interview untuk menunjukkan yang saya amat berminat dan excited untuk mendengar maklum balas dari pihak mereka.</p>
<h1 id="heading-kronolgi-job-hunting">Kronolgi Job Hunting</h1>
<p><img src="https://images.unsplash.com/photo-1506784365847-bbad939e9335?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1506784365847-bbad939e9335?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Setelah anda membaca kesemua sesi interview di atas, mungkin anda sudah boleh agak keputusan bagi setiap interview tersebut. Anda juga mungkin sudah mengetahui dimana saya bekerja sekarang sekiranya anda melawati akaun LinkedIn saya.</p>
<p>Tetapi jika anda masih belum mengetahuinya, dalam bahagian ini saya akan menceritakan kronologi job hunting saya selama hampir 2 bulan.</p>
<h3 id="heading-25-februari-2021"><strong>25 Februari 2021</strong></h3>
<p>Ini merupakan tarikh saya memohon kerja Snappymob. Saya mendapat panggilan daripada mereka pada keesokan harinya dan kami mengatur sesi temuduga pada 2 Mac 2021.</p>
<h3 id="heading-2-mac-2021"><strong>2 Mac 2021</strong></h3>
<p>Sesi interview pertama saya bersama Snappymob. Seperti yang anda ketahui saya mempunyai harapan yang tinggi untuk mendapat tawaran bekerja. Ianya juga merupakan company first choice saya ketika ini dan saya memang target untuk bekerja disini jika mendapat tawaran.</p>
<p>Namun begitu, setelah seminggu selepas interview iaitu pada 8 Mac 2021, saya tidak mendapat apa apa respond dari mereka. Saya kemudiannya membuat follow-up melalui WhatsApp dan mereka mengatakan bahawa permohonan saya masih diproses.</p>
<p>Ketika ini saya merasakan yang saya tidak berjaya dan mungkin sudah ditolak. Pada minggu seterusnya juga saya tidak mendapat apa apa respond dan saya mula memohon di syarikat lain.</p>
<h3 id="heading-15-mac-2021"><strong>15 Mac 2021</strong></h3>
<p>Saya mulakan sesi permohonan kerja saya dengan membuat sebuah post di LinkedIn dan menukar status saya kepada #OpenToWork. Pada hari yang sama juga saya approach Product Manager Maevi untuk mengetahui dengan lebih lanjut tentang job opening yang diiklankan. </p>
<p>Hari tersebut juga merupakan hari dimana manager Digi-X saya menghubungi saya untuk mengatur sesi interview bersama Digi.</p>
<h3 id="heading-17-mac-2021"><strong>17 Mac 2021</strong></h3>
<p>Saya menjalani sesi interview bersama Maevi 2 hari selepas saya approach mereka. Rakan sekerja saya dari Digi-X juga ada menghubungi saya untuk mengetahui status job hunting saya. Ketika inilah beliau menawarkan untuk merujuk saya ke MoneyLion.</p>
<h3 id="heading-19-mac-2021"><strong>19 Mac 2021</strong></h3>
<p>Saya mengambil masa 2 hari untuk menyediakan cover letter dan menjawab soalan MoneyLion sebelum apply setelah saya diberikan special link oleh rakan sekerja saya. </p>
<p>Pada hari yang sama juga recruiter daripada IFCA menghubungi saya untuk mengatur sesi interview pada 23 Mac 2021.</p>
<h3 id="heading-22-mac-2021"><strong>22 Mac 2021</strong></h3>
<p>Secara tidak disangka, setelah hampir 3 minggu selepas sesi interview, saya mendapat tawaran pertama saya daripada Snappymob. Ketika ini saya agak conflicted kerana saya sudahpun mula untuk mencari pekerjaan di syarikat lain dan first choice saya sudah bertukar kepada MoneyLion.</p>
<p>Namun saya diberikan masa seminggu untuk memberikan jawapan saya, dan saya ingin fokus untuk sesi interview yang akan datang.</p>
<p>Pada hari yang sama juga merupakan sesi interview pertama saya bersama Digi-X.</p>
<h3 id="heading-23-mac-2021"><strong>23 Mac 2021</strong></h3>
<p>Saya menghadiri sesi interview bersama IFCA pada hari ini dan selepas sesi temuduga tersebut,  saya terus mendapat tawaran kerja. Ini merupakan hiring process yang paling cepat pernah saya alami. Saya mendapat tawaran pada hari yang sama saya ditemuduga.</p>
<p>Ketika ini saya sudahpun mendapat 2 tawaran. Saya masih tidak membuat apa apa keputusan kerana saya masih ada masa dan tidak mahu terburu-buru.</p>
<h3 id="heading-25-mac-2021"><strong>25 Mac 2021</strong></h3>
<p>Pada hari ini saya mempunyai 2 sesi interview, iaitu bersama MoneyLion untuk sesi pertama dan sesi kedua bersama Digi-X. MoneyLion kemudiannya memberi saya sebuah link untuk menjawab online test mereka.</p>
<p>Ini juga merupakan hari terakhir untuk saya memberi respond kepada tawaran IFCA dan saya decide untuk menolak tawaran mereka. Ini adalah kerana saya mungkin akan terima tawaran Snappymob.</p>
<p>Pada hari yang sama juga, seorang recruiter daripada Shopee approach saya di LinkedIn mengenai peluang pekerjaan di Singapore. Kami mengatur sesi interview yang pertama pada keesokan harinya.</p>
<h3 id="heading-26-mac-2021"><strong>26 Mac 2021</strong></h3>
<p>Recruiter daripada Shopee menerangkan kepada saya tentang hiring process mereka dan memberitahu saya untuk menjawab online test mereka pada hujung minggu.</p>
<p>Setelah beberapa hari memikirkan tawaran daripada Snappymob, saya decide untuk menerima tawaran mereka walaupun saya masih mempunyai banyak sesi interview. Saya akan mula bekerja pada 19 April 2021. </p>
<p>Saya tidak mahu menolak tawaran mereka walaupun ketika ini saya target untuk bekerja di MoneyLion. Tetapi saya juga tidak mahu untuk cancel semua interview yang saya dah booked. </p>
<p>Saya mengangap tawaran ini merupakan backup plan saya jika saya tidak mendapat apa apa tawaran lain.</p>
<p>Harapan saya adalah untuk mendapatkan tawaran lain sebelum 19 April. Sekiranya saya berjaya mendapat tawaran lain sebelum tarikh tersebut, saya boleh menolak semula tawaran Snappymob dan menerima tawaran baru jika ianya lebih menarik.</p>
<h3 id="heading-30-mac-2021"><strong>30 Mac 2021</strong></h3>
<p>Saya mendapat rejection saya yang pertama iaitu daripada Maevi. Respond yang diberikan adalah agak lewat tetapi saya amat menghargai respond tersebut. Mereka mengatakan yang mereka ingin mengambil saya tetapi atas sebab sebab tertentu mereka terpaksa menolak saya.</p>
<h3 id="heading-1-april-2021"><strong>1 April 2021</strong></h3>
<p>Saya menjalani 2 sesi interview pada hari ini iaitu sesi kedua bersama MoneyLion dan sesi kedua bersama Shopee.</p>
<p>Bagi MoneyLion, ianya merupakan sesi penerangan take-home assignment saya. Saya diminta untuk develop sebuah mobile app dalam masa 24 jam.</p>
<h3 id="heading-2-april-2021"><strong>2 April 2021</strong></h3>
<p>Ini merupakan sesi interview terakhir saya bersama Digi-X namun saya tidak berjaya ke peringkat seterusnya. Saya merasakan bahawa mereka nampak hesitation saya untuk bekerja bersama mereka.</p>
<p>Walaupun saya tidak berjaya, saya merasakan sekiranya saya betul betul berminat untuk bekerja di situ, saya akan berjaya ke peringkat yang terakhir.</p>
<p>Maka pada ketika ini, hanya MoneyLion dan Shopee sahaja yang masih mempunyai harapan.</p>
<h3 id="heading-5-april-2021"><strong>5 April 2021</strong></h3>
<p>Saya menjalani sesi inteview ketiga bersama Shopee. Setelah tamat interview tersebut, saya mendapat email mengatakan yang saya tidak berjaya ke peringkat seterusnya. Saya tidak terkejut tetapi agak kecewa.</p>
<p>Saya sangat yakin dengan performance saya semasa sesi online test tetapi untuk sesi interview teknikal, ianya adalah sangat mencabar bagi saya.</p>
<p>Walaubagaimanapun, saya bersyukur saya tidak menolak tawaran untuk interview bersama mereka dan saya menganggap ini merupakan pengalaman yang saya hargai.</p>
<p>Maka hanya tinggal MoneyLion yang saya masih berpeluang untuk mendapat tawaran.</p>
<h3 id="heading-7-april-2021"><strong>7 April 2021</strong></h3>
<p>Hari ini merupakan sesi interview peringkat terakhir saya bersama MoneyLion. Seperti yang anda tahu, saya merasakan yang saya mempunyai peluang yang tinggi setelah tamat interview. Saya juga diberitahu yang saya akan mendapat maklum balas daripada mereka dalam masa seminggu.</p>
<p>Saya masih ada masa sebelum 19 April dan sangat mengharapkan untuk mendapat tawaran daripada mereka.</p>
<h3 id="heading-15-april-2021"><strong>15 April 2021</strong></h3>
<p>Seminggu kemudian, saya mendapat email daripada MoneyLion yang mengatakan bahawa saya tidak berjaya mendapat tawaran. Walaupun agak kecewa saya tidaklah begitu sedih dengan keputusan tersebut.</p>
<p>Saya bangga dengan usaha yang saya telah lakukan dan pengalaman bertemuduga dengan MoneyLion merupakan suatu perkara yang saya hargai. </p>
<p>Berdasarkan apa yang saya telah lalui, saya mungkin akan cuba sekali lagi untuk bekerja disini pada masa akan datang.</p>
<p>Maka dengan itu, saya dah tak ada pilihan lain selain Snappymob. Don't get me wrong, walaupun saya pernah menganggap Snappymob sebagai backup plan, saya tetap mahu bekerja dengan mereka.</p>
<p>Snappymob merupakan first choice saya pada asalnya.</p>
<h3 id="heading-19-april-2021">19 April 2021</h3>
<p><img src="https://images.unsplash.com/photo-1521791055366-0d553872125f?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1521791055366-0d553872125f?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Maka pada 19 April 2021, saya mula bekerja di Snappymob setelah hampir 2 bulan sesi job hunting saya.</p>
<h1 id="heading-kesimpulan">Kesimpulan</h1>
<p>Walaupun sesi job hunting saya bermula dengan agak baik, lebih-lebih lagi setelah mendapat 2 tawaran pada minggu yang sama, yang memberi harapan tinggi kepada saya. Little did I know yang 2 tawaran tersebut merupakan the only tawaran yang saya akan dapat.</p>
<p>Saya bersyukur saya tidak menolak tawaran Snappymob ketika saya berada di peringkat interview bersama company lain. Walaupun saya meletakkan harapan yang tinggi, saya tetap tidak mendapat apa-apa selain 2 tawaran tersebut.</p>
<p>Jika saya menolak mentah atas sebab ingin "target" company lain, saya mungkin perlu mula semula sesi job hunting saya pada 15 April 2021.</p>
<p>Walaubagaimanapun, saya tidak juga menolak mentah invitation untuk di-interview oleh company lain walaupun saya telah secure satu tempat.</p>
<p>Apa yang saya ingin sampaikan adalah, take your time untuk membuat keputusan. Anda tidak perlu terburu-buru kerana most likely anda mempunyai masa untuk consider segala aspek.</p>
<p>Saya akhiri dengan sedikit tips dan lesson learned daripada pengalaman saya iaitu untuk <strong>allocate at least dua bulan untuk sesi job hunting anda.</strong></p>
<p>Ini termasuk tarikh anda mula bekerja atau tarikh masuk office, beri mereka tarikh yang lebih jauh supaya anda ada buffer time untuk memikirkan pilihan anda.</p>
<p>Anda mungkin akan mendapat tawaran terlalu awal dan sekiranya tarikh masuk office anda adalah pada bulan hapadan, anda boleh menerima dahulu tawaran tersebut dan cancel jika anda mendapat tawaran yang lebih baik.</p>
<p>Tidak semua company mempunyai hiring process yang sama. Company besar terutamanya mungkin mengambil masa sehingga 2-3 minggu untuk memproses permohonan anda.</p>
<h2 id="heading-akhir-kata">Akhir kata</h2>
<p>Saya ingin mengucapkan terima kasih banyak-banyak kepada anda yang membaca artikel ini. Tidak kiralah anda hanya membaca beberapa bahagian atau membaca sepenuhnya dari awal sehingga habis, terima kasih kerana membaca.</p>
<p>Saya tahu artikel ini sangatlah panjang dan tujuan saya menulis artikel ini adalah untuk anda mendapat sedikit "insights" tentang perjalanan seorang fresh graduate sains komputer memohon kerja setelah tamat belajar.</p>
<p>Sekiranya anda ada apa-apa soalan tentang mana mana bahagian artikel ini, atau anda ingin mengetahui dengan lebih lanjut, anda sangatlah dialu-alukan untuk menulis komen di bawah atau hubungi saya di Twitter, <a target="_blank" href="http://twitter.com/afrieirham_">@afrieirham_</a></p>
<p>Saya akan cuba sebaik mungkin untuk menjawab soalan anda.</p>
<p>Sekali lagi saya ingin mengucapkan jutaan terima kasih kepada anda yang membaca dan ingin meminta anda untuk share artikel ini kepada rakan anda sekiranya anda rasa ianya bermanfaat. </p>
<p>Itu saja daripada saya, thank you! ✨</p>
]]></content:encoded></item><item><title><![CDATA[Kenapa Programmer Perlu Menulis Blog]]></title><description><![CDATA[Sejak beberapa tahun ini, semakin ramai pelajar di Malaysia yang berminat untuk belajar coding atau programming. Antara sebab utama ramai yang berminat untuk belajar coding adalah peluang pekerjaan yang tinggi, kebolehan membina aplikasi sendiri, pel...]]></description><link>https://blog.afrieirham.com/kenapa-programmer-perlu-menulis-blog</link><guid isPermaLink="true">https://blog.afrieirham.com/kenapa-programmer-perlu-menulis-blog</guid><category><![CDATA[Blogging]]></category><category><![CDATA[Developer Blogging]]></category><category><![CDATA[malaysia]]></category><category><![CDATA[malay]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Sat, 17 Apr 2021 13:38:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618666542759/rnB2tSxwH.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sejak beberapa tahun ini, semakin ramai pelajar di Malaysia yang berminat untuk belajar <em>coding</em> atau <em>programming</em>. Antara sebab utama ramai yang berminat untuk belajar <em>coding</em> adalah peluang pekerjaan yang tinggi, kebolehan membina aplikasi sendiri, peluang kerjaya secara <em>freelancing,</em> dan banyak lagi. Memang tidak dinafikan, skill <em>programming</em> ni adalah satu skill yang sangat berharga dan mempunyai permintaan yang tinggi dalam industri.</p>
<p>Namun begitu, anda juga akan memperoleh pelbagai manfaat sekiranya anda mula menulis blog atau artikel sebagai seorang <em>software developer</em> atau pelajar sains komputer. Dalam artikel ini, saya ingin berkongsi dengan anda, 3 faktor, mengapa anda perlu mula menulis blog.</p>
<h2 id="heading-melatih-skill-komunikasi">Melatih Skill Komunikasi 🗣</h2>
<p><img src="https://images.unsplash.com/photo-1531537571171-a707bf2683da?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1531537571171-a707bf2683da?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Menulis artikel atau blog yang berkualiti bukanlah perkara yang mudah. Ianya memerlukan skill penulisan dan komunikasi yang tinggi. Menerangkan sesuatu perkara, terutamanya topik yang kompleks seperti <em>programming</em> memerlukan seseorang itu berkomunikasi dengan bahasa yang mudah difahami. Ini merupakan skill komunikasi yang penting untuk diasah oleh seorang <em>programmer</em> kerana tugas mereka bukanlah hanya untuk menulis <em>code</em> tetapi <em>programmer</em> juga perlu menyuarakan pendapat dan idea supaya dapat menjalankan tugas dengan lebih efektif.</p>
<p>Dalam sesebuah <em>Software Development team</em>, <em>programmer</em> perlu berkomunikasi dengan pelbagai jenis orang dimana tidak semua orang akan memahami <em>jargon</em> atau <em>technical term</em> yang digunakan oleh <em>programmer</em>. Melalui penulisan artikel dan blog, ia membolehkan seseorang <em>programmer</em> itu melatih skill komunikasi mereka dengan lebih berkesan, lebih lebih lagi jika mereka konsistent menulis blog yang berkualiti.</p>
<h2 id="heading-belajar-dengan-mengajar">Belajar Dengan Mengajar 👨🏻‍🏫</h2>
<p><img src="https://images.unsplash.com/photo-1605711285791-0219e80e43a3?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1605711285791-0219e80e43a3?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Sebagai seorang <em>Software Developer</em>, anda pasti akan belajar perkara baru hampir setiap hari. Samada <em>programming language</em> baru, <em>library</em> baru, <em>framework</em> baru, atau konsep <em>programming</em> yang baru. Apa pun topik yang anda belajar, anda akan lebih memahami topik tersebut jika anda mengajar semula kepada orang lain.</p>
<p>Malah, konsep "Belajar Dengan Mengajar" boleh diimplementasi oleh sesiapa sahaja kerana anda perlu memahami perkara tersebut secara menyeluruh sebelum anda yakin dan boleh mengajar seseorang tentang sesuatu perkara.</p>
<p><em>Blogging</em> merupakan salah satu platform yang sangat <em>accessible</em> untuk anda mengajar melalui penulisan. Zaman sekarang ni, sesiapa pun boleh <em>start</em> blogging dengan mudah samada di platform seperti <em><a target="_blank" href="https://hashnode.com/">Hashnode</a></em> dan <em><a target="_blank" href="https://medium.com/">Medium</a>,</em> ataupun di website anda sendiri jika anda mahir membangunkan sebuah website.</p>
<h2 id="heading-membina-personal-branding">Membina <em>Personal Branding</em> 👨🏻‍💻</h2>
<p><img src="https://images.unsplash.com/photo-1489370603040-dc6c28a1d37a?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" alt="https://images.unsplash.com/photo-1489370603040-dc6c28a1d37a?ixlib=rb-1.2.1&amp;q=85&amp;fm=jpg&amp;crop=entropy&amp;cs=srgb" /></p>
<p>Jika anda seorang pelajar sains komputer yang aktif di Twitter, saya pasti anda amat mengenali saudara <a target="_blank" href="https://omvr.io/">Omar Mokhtar</a>. Omar merupakan seorang <em>FullStack Software Developer</em> yang dikenali ramai melalui penulisan bebenang beliau di Twitter di mana beliau berkongsi tips dan pengalaman beliau berkaitan sains komputer, programming, dan tips belajar coding kepada <em>beginners</em>.</p>
<p>Populariti Omar bukanlah perkara yang berlaku secara tiba tiba, ramai yang mengenali beliau melalui Twitter apabila bebenang beliau di-<em>retweet</em> banyak kali oleh pengguna Twitter. Saya yakin saudara Omar sendiri tahu tentang perkara ini, dimana, dengan berkongsi ilmu dan pengalaman berkaitan topik <em>programming</em> dan sains komputer, ianya dapat menjadikan beliau berada di posisi yang dikenali orang sebagai <em>Software Developer</em> yang mahir dan berpengalaman.</p>
<p>Baru baru ini saudara Omar telah menulis sebuah ebook <a target="_blank" href="http://kitabfullstack.dev/">Kitab FullStack</a> dan mendapat sambutan yang hangat. Penjualan Kitab FullStack itu merupakan bukti kejayaan <em>Personal Branding</em> beliau. Ramai yang membeli buku tersebut (termasuk saya haha) kerana beliau telah mendapat kepercayaan dan kredibiliti sebagai seorang yang berpengalaman.</p>
<p>Semua ini tidak akan terjadi jika Omar tidak bermula dengan menulis bebenang di Twitter secara percuma dan memberi <em>value</em> kepada orang ramai sebelum beliau melancarkan ebook pertama beliau.</p>
<h2 id="heading-konklusi">Konklusi</h2>
<p>Tiga perkara yang dah saya terangkan tu adalah antara kelebihan yang saya ingin <em>highlight</em>-kan dalam artikel ni. Saya yakin jika anda <em>search "Why developers should start blogging"</em> di Google, anda akan jumpa lebih banyak artikel yang ditulis oleh <em>developers</em> dari pelbagai jenis latar belakang yang menerangkan dengan lebih terperinci tentang perkara ini.</p>
<p>Akhir kata, saya nak <em>recommend</em> satu video daripada <em>Traversy Media</em> yang bertajuk <em><a target="_blank" href="https://youtu.be/oAoYFZvMQEs">"Why Developers Should Have a YouTube Channel"</a>.</em> Walaupun dalam video tu beliau menerangkan tentang kenapa <em>Developers</em> perlu start YouTube Channel, tapi saya rasa ada beberapa <em>point</em> yang boleh dikaitkan dengan <em>blogging</em>. Itu sahaja dari saya dalam artikel ni, <em>thank you for reading!</em></p>
]]></content:encoded></item><item><title><![CDATA[How to know if you're ready for internship?]]></title><description><![CDATA[Recently I just completed my 6-months internship at Digi-X. It was a great experience for me, I went from using XAMPP to setup a simple PHP website to knowing how to use Laravel and deploy it on AWS on top of NGINX web server.
I think everyone knows ...]]></description><link>https://blog.afrieirham.com/how-to-know-if-youre-ready-for-internship</link><guid isPermaLink="true">https://blog.afrieirham.com/how-to-know-if-youre-ready-for-internship</guid><category><![CDATA[internships]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Thu, 20 Feb 2020 09:50:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1622539772649/e5aU6wnSX.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently I just completed my 6-months internship at Digi-X. It was a great experience for me, I went from using XAMPP to setup a simple PHP website to knowing how to use Laravel and deploy it on AWS on top of NGINX web server.</p>
<p>I think everyone knows the benefits of internship, especially for new developers. But often time we hesitate to even apply for it.</p>
<p><strong>So ,  am I ready for internship?</strong>
Absolutely not – that is what your mind will tell you.</p>
<p>Truth is, you're never ready. That's why you do internship, to get more experience.</p>
<p>But you need to know "something" right? To answer that – yes</p>
<p>To be honest, I also didn't feel like I was ready for internships, that's why I only did it when I <em>need</em> to do it. It was in my uni curriculum, we are <em>required</em> to do internship on our fifth semester.</p>
<p>I knew internship will be beneficial for me but I didn't feel ready.</p>
<p>I also don't know what should I know, what do companies expect from interns, what if I am <em>actually</em> not ready, like I need to know something first right? A framework, maybe a certain language.</p>
<p>And the list goes on, and I believe that some of you are experiencing the same thing too.</p>
<p>But truth is – none of that matters.</p>
<p>The only thing you need to have is a <strong>strong programming fundamental</strong>. You know what and how to use a loop, if else statement, functions, class and maybe Object-oriented programming.</p>
<p>But the most important thing is you need be resourceful a.k.a. knowing how to "figure it out".</p>
<p>That is the most important skill and mindset that you need to have as an intern – heck, it's the most important mindset to have as a developer in general.</p>
<h1 id="my-portfolio-before-internship">My portfolio before internship</h1>
<p>To give you more context about how much I knew before my internship, here are some of my works. Talk is cheap right?</p>
<h3 id="1-command-line-blackjack-school-project">1. Command line Blackjack – school project</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1622540538569/n_XA0J42d.png" alt="image.png" /></p>
<p>Not this one, mine was this without all the interface.</p>
<p>If I have to pinpoint a moment where I experience real development, this is the project that I would choose.</p>
<p>Sure, I know how to write a simple command line calculator before, I know what a function is, I know the concept of Object-oriented programming, I know how to use loops, if else, and switch.</p>
<p>But this project is the moment where I apply all those knowledge into practice, this is the project that I actually build something from nothing.</p>
<p>Where I pulled off an all nighter just to fix an unknown bug cause by a simple typo.</p>
<blockquote>
<p>The moment where I copy paste the error message into google, and search it because I have no idea what else should I do.</p>
</blockquote>
<p>The project that forced me to learn Blackjack itself because I have no idea how to play it.</p>
<p>This is, for me, where it all started. My first experience building a software, a game I might add.</p>
<p>And if any of you have done or experience something like this before. Just stop reading this already and start applying for that intern position for god's sake.</p>
<p>I'm not sure if you can still run the game but here's the <a target="_blank" href="https://github.com/afrieirham/WIX1002-Fundamentals-of-Programming-Assignment/tree/master/src/blackjack/pkg7/pkg0">source code</a> , it's written in Java.</p>
<h3 id="2-css-image-challenge-personal-project">2. CSS image challenge – personal project</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1622540602539/XKOYctYhg.png" alt="image.png" /></p>
<p>Somewhere in June of 2018 I decided to do the #100daysofcode challenge where I try to learn the fundamentals of web development - HTML and CSS.</p>
<p>I learn it on FreeCodeCamp and I also actually document the journey on Twitter - here's the <a target="_blank" href="https://twitter.com/afrieirham_/status/1022767509814964224">thread</a> </p>
<p>The purpose of the challenge is for me to be more consistent with coding. I also wanted to learn web development more seriously.</p>
<p>After completing the course on FCC and do all the projects, I still didn't feel comfortable with my CSS – here's <a target="_blank" href="https://codepen.io/afrieirham/pens/public?cursor=ZD0wJm89MSZwPTEmdj0yNjg1NDE5MQ==">why</a> .</p>
<p>Then I decided to do more CSS focused project to get more familiar with it.</p>
<p>Personally, the Nintendo Switch was my proudest project after Rick and Morty. It was a fun project that is also easy to showcase.</p>
<h3 id="3-whatsapp-it-personal-project">3. WhatsApp It!  –  personal project</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1622540632740/DfdGD72Ea.png" alt="image.png" /></p>
<p>Yep ,  that's it.</p>
<p>WhatsApp It! is a pure JavaScript application that takes the input from the interface and redirect the user to its respective user based on WhatsApp  <a target="_blank" href="https://faq.whatsapp.com/general/chats/how-to-use-click-to-chat">click to chat API</a>.</p>
<p>It is a very simple web page that is surprisingly <strong>very useful</strong> to a lot of people. I may have taken too much credit from it.</p>
<p>This project came from my own frustration being a treasurer of an event selling t-shirts. My task was to contact all the people who placed an order to confirm their orders.</p>
<p>And if you didn't know already, WhatsApp app itself doesn't let you to chat with an unknown number.</p>
<p>You can technically do it with the click to chat API, or using  <a target="_blank" href="https://whatsappit.afrieirham.com/">WhatsApp It! </a> (shameless plug) but it's not available within the app itself, even today.</p>
<p>I also decided to make it a Progressive Web App (PWA) because for me it is the perfect use case for it to be a PWA.</p>
<p>I managed to do it but after a while it's a simple web page again because I felt like I was over-engineering it at that point, and the implementation was not the best, it keeps on breaking.</p>
<h3 id="4-critical-thinking-test-website-school-project">4. Critical Thinking Test website – school project</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1622540661704/3wYhItMB7.png" alt="image.png" /></p>
<p>This project is the most exciting for me. I see it as an opportunity for me to make it as my first full stack web app portfolio. Though I know nothing about backend stuff apart from database, it was very exciting for me.</p>
<p>I thought it was going to be a Google Forms clone. But it wasn't that.</p>
<p>It is still a great project to showcase as a full stack web app but it wasn't really how I envision it initially - it was much simpler.</p>
<p>It still a great project, don't get me wrong but I think if, a) i had more time, and b) i can focus on it throughout the semester, it would be a much better product in the end.</p>
<p>Nonetheless, it was my first experience with PHP though, this project was built with pure PHP and MySQL using XAMPP. It was fun, but it could be better.</p>
<p>And of course, here's the  <a target="_blank" href="https://github.com/afrieirham/WIF2003-CTS/">source code</a> .</p>
<h3 id="all-in-all">All in all -</h3>
<p>As you can see, these aren't the most impressive projects, but it's better than nothing – and that's the point.</p>
<p>It shows that you have some experience in development, you have built something from nothing.</p>
<blockquote>
<p>The experience of fixing unknown bugs, reading documentation, looking for answers in StackOverflow, and googling the heck out of everything - this is all valuable skills.</p>
</blockquote>
<p>You might be surprised but this is how programmers and developers work, either you're a junior developer, an intern, or a senior developer - we all google things we don't know.</p>
<p>And that's okay, it is encouraged in fact.</p>
<p>Nobody expecting you to know everything, they expect you to know how to figure things out.</p>
<h1 id="conclusion">Conclusion</h1>
<p>Now that you've seen my portfolio before my internship, I hope it will help you in terms of having more context to help you evaluate yourself whether you are ready for internship or not.</p>
<p>You might still feel like you're not ready, but if you've done something like I did, you are more than ready.</p>
<p>If you feel like you barely know anything about programming or coding in general, my advice is to start creating personal projects.</p>
<p>Anything would do, be it a clone of Twitter login page with only HTML and CSS, be it a simple calculator mobile apps, a personal website - whatever.</p>
<p><strong>As long as you are coding, programming, and learning. That is all that matters.</strong></p>
<p>Good luck and go apply for that internship.</p>
<p>I wish you the best! Thanks for reading.</p>
]]></content:encoded></item><item><title><![CDATA[Why I stop caring about CGPA]]></title><description><![CDATA[Tl;dr  –  it doesn't matter for me.

Before I explain why I don't care about CGPA, I want to give out some context about where I came from. So please read the first few paragraphs before raging. ;)
When I was in high school, I cared a lot about good ...]]></description><link>https://blog.afrieirham.com/why-i-stop-caring-about-cgpa</link><guid isPermaLink="true">https://blog.afrieirham.com/why-i-stop-caring-about-cgpa</guid><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Mon, 19 Aug 2019 09:24:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1622539475393/6P2d9c93k.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>Tl;dr  –  it doesn't matter for me.</p>
</blockquote>
<p>Before I explain why I don't care about CGPA, I want to give out some context about where I came from. So please read the first few paragraphs before raging. ;)</p>
<p>When I was in high school, I cared a lot about good grades and examinations. And I did pretty well, I get "flying colors" for most of my major exams. All straight As from my primary school year until the very end of high school. I especially worked hard for the last one, the Malaysian Certificate of Education or in Malay "Sijil Pelajaran Malaysia", SPM.</p>
<p>I did all the past years questions, from MRSM trial to SBP trial  –  all of it. I love it, I felt like I'm the genius who knows everything, I was pretty humble though but I felt like I can do anything. I want to learn more complex physics, change the world with chemistry, and considering the holy grail of an Asian family career – becoming a Doctor. I started my "research" about universities, scholarships, high demand jobs that I am supposed to have because I was an "exceptional" student.</p>
<p>I started to apply for scholarship offers (read: tuition fee waiver) at Taylor's University and managed to secure the interview. My life seems to be on the right path. Until I was there.</p>
<p>I got insecure immediately after I look at the people there; others look way matured than me, wearing formal business attire with suits, shiny polished shoes, talking about their achievements in school, going all over the world for conferences, science fair, sports competition, and more. I feel like I was barely at their level. They were more confident, speaks English better, and more well-rounded students, I have no chance.</p>
<p>It crippled me down, I was only there for about 15 minutes and I already fucked up my insecurity, I felt like a failure. But fake it til you make it is all that I have in mind. I tried acting professional and it failed miserably. I stuttered when I speak, I couldn't explain myself when the interviewers asked me questions. I wasn't prepared because I have no idea what kind of career do I want in the future. I settled for Actuarial Science course for my answers because I thought I want to be an Actuary since I'm good at it and enjoyed doing math a lot.</p>
<p>And this self-esteem issue doesn't end here. After my SPM, I research a lot about scholarships, looking for opportunities while also learning more about the best careers that I need to have. I applied to a lot of scholarships, got 2 or 3 interviews out of it and that was it, up until today. I failed most of them and I'm glad now.</p>
<blockquote>
<p>All of that teaches me that good grades don't matter, there's more to life than just grades.</p>
</blockquote>
<p>Soon I secure a place for my studies at my local universities, I felt great because my expectations were lowered and it's the University of Malaya, no. 1 uni in Malaysia as they said. At this point, I still didn't give up. I am still actively looking for scholarships, bursaries, convertible loans, etc. But I failed, again. Didn't even secure any interviews.</p>
<p>But also at this time, I discovered Computer Science, and I started to consider it as my target for my Bachelor's degree. I watched a lot of YouTube videos about programming jobs, life as developers, and how some people got developer jobs without any formal education. And that's refreshing, I started to worry less about my grades and GPAs and focus more on my actual skills and knowledge.</p>
<p>I don't care if I don't score A for every subject anymore, I don't care if I barely pass. In fact, I would be much happier if I pass rather than getting As.</p>
<blockquote>
<p>BUT  – this doesn't mean I neglect my studies, this doesn't mean I stopped learning.</p>
</blockquote>
<p>This is just a way for me to clear out my mind and focus on the more important things other than just my grade. It just didn't matter for me anymore.</p>
<p>As you know, I'm a CS student which is a skill-based field. My ability to code and create functional apps or website is much valuable than 4.00 and I found out that the way you get a job in this field, or in any skill-based industry really, is by having a portfolio. A portfolio of the things that you develop or create. In fact, I don't even need a degree to get into this field, but that's another topic.</p>
<p>The reason I said I was glad that I didn't get any scholarship offers, or any financial help really, besides from my parents, is because some of my friends need to maintain their CPGA. They can't afford to not care about their grades. It will cost them money in some cases. If I am a scholar right now, I might still care about my grades and not focusing on my skills. That would be bad for me.</p>
<p>Thanks for reading.</p>
]]></content:encoded></item><item><title><![CDATA[WhatsApp It! – My first useful app]]></title><description><![CDATA[Who is this apps for?
Anyone who always in need to contact other people through WhatsApp but have no interest in saving their contact details. All you need to do is just type in the number and it will direct you to WhatsApp.
It is essentially a click...]]></description><link>https://blog.afrieirham.com/whatsapp-it-my-first-useful-app</link><guid isPermaLink="true">https://blog.afrieirham.com/whatsapp-it-my-first-useful-app</guid><category><![CDATA[app development]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Wed, 31 Oct 2018 09:11:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1626772143947/YwsicwLGl.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="who-is-this-apps-for">Who is this apps for?</h1>
<p>Anyone who always in need to contact other people through WhatsApp but have no interest in saving their contact details. All you need to do is just type in the number and it will direct you to WhatsApp.</p>
<p>It is essentially a click to chat feature. Try it <a target="_blank" href="https://whatsappit.afrieirham.com">here</a>.</p>
<h1 id="the-inspiration">The inspiration</h1>
<p>When I was in charge of taking t-shirt orders for my college’s event which is the Software Engineering Day recently, I find out that it is unnecessary to save the customer’s phone number just to tell them about the payment.</p>
<p>I am a person who don’t like to keep my contact list full with unknown people or someone who I have contacted once. Thus, this app is made. :)</p>
<h1 id="click-to-chat-feature">Click to Chat feature</h1>
<p>I first found out about this feature when I was trying to shop online on Instagram. Most sellers provide a link on their bio for us to click and then it opens up WhatsApp with their number. Sometimes they even pre-filled it with some generic text, which I find really handy.</p>
<h1 id="how-it-works">How it works</h1>
<p>The logic behind it is pretty simple.</p>
<p>First, I save the input from the user in a Variable. Then I append it to the Click to Chat <a target="_blank" href="https://faq.whatsapp.com/general/chats/how-to-use-click-to-chat">Custom URL from WhatsApp</a> and save it in another Variable. When the user click the WhatsApp It! button, it will open up that link in a new tag.</p>
<p>For example, user type in 012324xxxx, the number will then append to the link Variable, creating <code>https://wa.me/012324xxxx</code>. Finally, the user will be directed to that link when they click on WhatsApp It!</p>
<h1 id="what-are-the-tools-that-i-use">What are the tools that I use?</h1>
<p>I use Bootstrap for the front-end and JavaScript for the logic. I also use GitHub to host it with GitHub page.</p>
<h1 id="new-features-that-i-have-in-mind">New features that I have in mind</h1>
<p>I am currently trying to add more country code into it so that you can use it to WhatsApp anyone, as long as they have WhatsApp account.</p>
<p>I have read some reviews about a similar app on Google PlayStores that gave me some ideas on other features that might be helpful. My friends and family also give me some feedback which helps a lot.</p>
<p>Thank you for reading, appreciate it!</p>
]]></content:encoded></item><item><title><![CDATA[What is Artificial Neural Network?]]></title><description><![CDATA[How Human works.
So let's first look at how we, as a human, make decisions.
Usually, we will gather as many information as possible first before we a decision is made.
When deciding what movie to watch, we usually decide it based on

reviews
past exp...]]></description><link>https://blog.afrieirham.com/what-is-artificial-neural-network</link><guid isPermaLink="true">https://blog.afrieirham.com/what-is-artificial-neural-network</guid><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Afrie Irham]]></dc:creator><pubDate>Sat, 02 Jun 2018 16:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1626772677035/AF1dcYHQH.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="how-human-works">How <em>Human</em> works.</h1>
<p>So let's first look at how we, as a human, make decisions.</p>
<p>Usually, we will gather as many information as possible first before we a decision is made.</p>
<p>When deciding what movie to watch, we usually decide it based on</p>
<ul>
<li>reviews</li>
<li>past experience (watched movies)</li>
<li>friends' opinions</li>
</ul>
<p>The key is, <em>gather as much data as we can</em>.</p>
<p>Then, based on all of those data, we decide which information is more important.</p>
<p>Say, if I trust the reviews more than my friends' opinions, I will add some sort of <em>"priority"</em> based on the reviews.</p>
<p>If the review tells me that it's a 2/10 and my friends tell me that it's a 100/10,</p>
<p>And because I trust the reviews <strong>MORE</strong> than I trust my friends, I decided not to watch the movie.</p>
<p>This concept of gathering data, prioritize which one is more important, and decide based on that, is exactly how ANN works.</p>
<p>But with numbers, and mathematics – because "robots".</p>
<h1 id="how-ann-works">How ANN works.</h1>
<p><img src="https://pbs.twimg.com/media/Des5V0YV4AAthe5.jpg" alt /></p>
<p>ANN works by getting the input data and filter it through each hidden layer by using mathematical formula to predict the output.</p>
<p>Essentially the same as our decision making algorithm.</p>
<p>Say you wanna build a machine that can recognize some written numbers.</p>
<p>Of course it is easy for us to do it but for a machine to recognize the written word, or in this case, numbers, is <strong>hard</strong>.</p>
<p><img src="https://pbs.twimg.com/media/Des5Wu5UcAAhvVL.jpg:small" alt />
Based on this photo, we can easily tell which number is which.</p>
<ul>
<li>2 is 2</li>
<li>3 is 3</li>
<li>0 is 0</li>
</ul>
<p>Effortlessly, because we recognize them. No matter how weird the handwriting is. Even if we have never seen it before, because we recognize patterns.</p>
<p>But to give a machine to do the same thing, they'll need to learn it first.</p>
<p>This is where ANN takes place.</p>
<p>And we are going to use the supervised learning method, as an example.</p>
<h1 id="how-machines-learn">How machines <em>learn</em></h1>
<p>First, we need data. <strong>Lots of data.</strong></p>
<p>In this case, we are going to take each individual pixel value of the image.</p>
<p>If you have no idea about what I'm saying, it is basically a value in hexadecimal to represent the color.</p>
<p>But in this case, we're going to make it simple.</p>
<hr />
<p>If it's white, the value will be 1.</p>
<p>If it's black, the value will be 0.</p>
<p>And anything else from off-white to dark gray will be valued within that range.</p>
<p>Off white might be 0.12.</p>
<p>Dark gray might be 0.86.</p>
<hr />
<p>You get the idea.</p>
<p>And let's say this image is 10 by 10 pixels wide. So we have a total of 100 inputs.</p>
<p>Each carrying its own value. </p>
<p>And then we are going to feed it to the input layer, in this case, it's 100 different values. </p>
<p>Thus 100 green circles, or called <em>nodes</em>.
<img src="https://pbs.twimg.com/media/Des5XrPUcAAT0iS.jpg:small" alt /></p>
<p>Let's say that the first hidden layer is responsible to recognize whether it is a <strong>line</strong>, <strong>a curve</strong>, or <strong>a loop</strong>.</p>
<p>Thus, there'll be 3 nodes in the first hidden layer.</p>
<p>The input value will be calculated with a mathematical formula here.</p>
<p>Usually the nodes will add all of the inputs and adjust it using a sigmoid function to make it within the range of 0 to 1 again.</p>
<p><img src="https://pbs.twimg.com/media/Des5YeRU0AAsZgU.jpg" alt /></p>
<p>So for example the summation of all 100 value of colours that we got before is 10,</p>
<p>Then 10 will be inserted into the sigmoid function and the output will be within 0 to 1. Say it's 0.2</p>
<p>That is for a single node in the hidden layer, we have to do it for all the other nodes too.</p>
<p><img src="https://pbs.twimg.com/media/Des5Y_zU0AAEl3q.jpg:large" alt /></p>
<p>You may be thinking.</p>
<p>"All of it will be the same because the input are all the same"</p>
<p>And yes, you are right.</p>
<p>But, there's more.</p>
<p>As I said before, the first hidden layer is responsible to predict whether it is a line, a curve, or a loop right?</p>
<p>If all of the formula and the inputs are the same, how on earth can you get a different output value?</p>
<p>Well, introducing "bias value", a number in which, it will be added to each summation.</p>
<p>And each node has a different bias value.</p>
<p>For example, the first node of the hidden layer's bias value is -10.</p>
<p>Second is 40
Third is 100</p>
<p>Now the output will be different.</p>
<p>The summation of all input was 10 before, now by adding the bias value, it will be different.</p>
<ul>
<li>Node 1: 10 + (-10) = 0</li>
<li>Node 2: 10 + 40 = 50</li>
<li>Node 3: 10 + 100 = 110</li>
</ul>
<p>You're welcome.</p>
<p>And ohh, before I forget, do you see all of those lines connecting the nodes from input layer to nodes from the hidden layer.</p>
<p>Yes, all of them. EVERY. SINGLE. ONE.</p>
<p>Carries a different values, that'll be multiplied with the input data.</p>
<p>For example, </p>
<ul>
<li>Input 1: 0.2</li>
<li>Input 2: 0.5</li>
<li>Input 3: 0.7</li>
</ul>
<p>Each line will alter the value of each input and effect the summation of all the inputs.</p>
<p>Here's the value at each line:</p>
<ul>
<li>Line 1: 4</li>
<li>Line 2: 2</li>
<li>Line 3: 3</li>
</ul>
<p>The input value now will be different.</p>
<p>Respective input after altered,</p>
<ul>
<li>Input 1: 0.2 x 4 = 0.8</li>
<li>Input 2: 0.5 x 2 = 1.0</li>
<li>Input 3: 0.7 x 3 = 2.1</li>
</ul>
<p>Now as you can see, the value will be massively altered due to the bias value of each node and alteration value from each line.</p>
<p>Maybe it is hard to understand it for now because I didn't organize my flow correctly.</p>
<h1 id="recap">Recap</h1>
<ul>
<li>The value of each pixel on our image of a handwritten value is retrieved.</li>
<li>Our image is 10 by 10 pixels, it means that we have a total of 100 input.</li>
<li>Each value is within the range of 0 to 1.</li>
<li>Each node has its own bias value.</li>
<li>Each line has its own value.</li>
</ul>
<hr />
<p>Now we have a completely different value for each node on the hidden layer after going through the mathematical formula;</p>
<p>Altered by the value from each line
Altered by the bias value in each node</p>
<p>Congratulations, we have just passed the first hidden layer.</p>
<p>There's like thousands more because the number of hidden layers depends on the goal we are trying to achieve.</p>
<p>But say for our handwritten number recognition, there are only 2 hidden layers.</p>
<p>We need to keep doing the math until we reach the output layer before we can even get the result.</p>
<p><img src="https://pbs.twimg.com/media/Des3kVcVQAAakeb.jpg:small" alt /></p>
<p>But thank god this is all done by a machine so it is pretty fast.</p>
<p>But wait, what if the prediction is not correct?</p>
<p>Simple answer, 
we need to change the value of the bias value and the value of each line.</p>
<p>How do we know which one to change you ask?</p>
<p>Well, that's the complicated answer. And that is actually the part where the machine actually learns.</p>
<p>Do you wonder, how does the machine even know that it gives the wrong answer?
Or how do they know which value to change?
How does the change affect the output?</p>
<p>If yes, then good. If no, then try to think about it.</p>
<p>Again I am sorry, that part needs another post. It is way too complicated and I think even this post needs time to be understood. </p>
<p>But good luck.</p>
<p>If you are confused with my explanation, you can watch the video below. It helps to make you understand better.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=ILsA4nyG7I0">https://www.youtube.com/watch?v=ILsA4nyG7I0</a></div>
]]></content:encoded></item></channel></rss>